diff --git a/client/control.go b/client/control.go index 99ae475..f9af895 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 2d6536f..815145b 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 5aaaecb..7be2608 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 f2d1a07..cfc262e 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.