From 0db4fc07fb43930345794c74b2be98954d1041ab Mon Sep 17 00:00:00 2001 From: Blizard Date: Wed, 26 Jan 2022 19:47:40 +0800 Subject: [PATCH] feat: support set local ip in client when connect server (#2774) * feat: support set local ip in client when connect server * fix: typo Co-authored-by: blizard863 <760076784@qq.com> --- client/control.go | 3 +++ client/service.go | 3 +++ conf/frpc_full.ini | 4 ++++ pkg/config/client.go | 4 ++++ 4 files changed, 14 insertions(+) diff --git a/client/control.go b/client/control.go index 99ae4755..f9af8958 100644 --- a/client/control.go +++ b/client/control.go @@ -246,6 +246,9 @@ func (ctl *Control) connectServer() (conn net.Conn, err error) { protocol = "tcp" dialOptions = append(dialOptions, libdial.WithAfterHook(libdial.AfterHook{Hook: frpNet.DialHookWebsocket()})) } + if ctl.clientCfg.ConnectServerLocalIP != "" { + dialOptions = append(dialOptions, libdial.WithLocalAddr(ctl.clientCfg.ConnectServerLocalIP)) + } dialOptions = append(dialOptions, libdial.WithProtocol(protocol), libdial.WithProxy(proxyType, addr), diff --git a/client/service.go b/client/service.go index 2d6536fd..815145b7 100644 --- a/client/service.go +++ b/client/service.go @@ -240,6 +240,9 @@ func (svr *Service) login() (conn net.Conn, session *fmux.Session, err error) { protocol = "tcp" dialOptions = append(dialOptions, libdial.WithAfterHook(libdial.AfterHook{Hook: frpNet.DialHookWebsocket()})) } + if svr.cfg.ConnectServerLocalIP != "" { + dialOptions = append(dialOptions, libdial.WithLocalAddr(svr.cfg.ConnectServerLocalIP)) + } dialOptions = append(dialOptions, libdial.WithProtocol(protocol), libdial.WithProxy(proxyType, addr), diff --git a/conf/frpc_full.ini b/conf/frpc_full.ini index 5aaaecb7..7be2608d 100644 --- a/conf/frpc_full.ini +++ b/conf/frpc_full.ini @@ -76,6 +76,10 @@ login_fail_exit = true # now it supports tcp, kcp and websocket, default is tcp protocol = tcp +# set client binding ip when connect server, default is empty. +# only when protocol = tcp or websocket, the value will be used. +connect_server_local_ip = 0.0.0.0 + # if tls_enable is true, frpc will connect frps by tls tls_enable = true diff --git a/pkg/config/client.go b/pkg/config/client.go index f2d1a07d..cfc262e9 100644 --- a/pkg/config/client.go +++ b/pkg/config/client.go @@ -38,6 +38,10 @@ type ClientCommonConf struct { // ServerPort specifies the port to connect to the server on. By default, // this value is 7000. ServerPort int `ini:"server_port" json:"server_port"` + // ConnectServerLocalIP specifies the address of the client bind when it connect to server. + // By default, this value is empty. + // this value only use in TCP/Websocket protocol. Not support in KCP protocol. + ConnectServerLocalIP string `ini:"connect_server_local_ip" json:"connect_server_local_ip"` // HTTPProxy specifies a proxy address to connect to the server through. If // this value is "", the server will be connected to directly. By default, // this value is read from the "http_proxy" environment variable.