diff --git a/client/control.go b/client/control.go index f9af8958..81aaf7be 100644 --- a/client/control.go +++ b/client/control.go @@ -251,6 +251,7 @@ func (ctl *Control) connectServer() (conn net.Conn, err error) { } dialOptions = append(dialOptions, libdial.WithProtocol(protocol), + libdial.WithTimeout(time.Duration(ctl.clientCfg.DialServerTimeout)*time.Second), libdial.WithProxy(proxyType, addr), libdial.WithProxyAuth(auth), libdial.WithTLSConfig(tlsConfig), diff --git a/client/proxy/proxy.go b/client/proxy/proxy.go index 23e62e53..0fdececd 100644 --- a/client/proxy/proxy.go +++ b/client/proxy/proxy.go @@ -787,7 +787,10 @@ func HandleTCPWorkConnection(ctx context.Context, localInfo *config.LocalSvrConf return } - localConn, err := libdial.Dial(net.JoinHostPort(localInfo.LocalIP, strconv.Itoa(localInfo.LocalPort))) + localConn, err := libdial.Dial( + net.JoinHostPort(localInfo.LocalIP, strconv.Itoa(localInfo.LocalPort)), + libdial.WithTimeout(10*time.Second), + ) if err != nil { workConn.Close() xl.Error("connect to local service [%s:%d] error: %v", localInfo.LocalIP, localInfo.LocalPort, err) diff --git a/client/service.go b/client/service.go index 815145b7..d0dda158 100644 --- a/client/service.go +++ b/client/service.go @@ -245,6 +245,7 @@ func (svr *Service) login() (conn net.Conn, session *fmux.Session, err error) { } dialOptions = append(dialOptions, libdial.WithProtocol(protocol), + libdial.WithTimeout(time.Duration(svr.cfg.DialServerTimeout)*time.Second), libdial.WithProxy(proxyType, addr), libdial.WithProxyAuth(auth), libdial.WithTLSConfig(tlsConfig), diff --git a/conf/frpc_full.ini b/conf/frpc_full.ini index 7be2608d..01c04043 100644 --- a/conf/frpc_full.ini +++ b/conf/frpc_full.ini @@ -6,6 +6,9 @@ server_addr = 0.0.0.0 server_port = 7000 +# The maximum amount of time a dial to server will wait for a connect to complete. Default value is 10 seconds. +# dial_server_timeout = 10 + # if you want to connect frps by http proxy or socks5 proxy or ntlm proxy, you can set http_proxy here or in global environment variables # it only works when protocol is tcp # http_proxy = http://user:passwd@192.168.1.128:8080 diff --git a/go.mod b/go.mod index fd5759bf..98398d51 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 github.com/coreos/go-oidc v2.2.1+incompatible github.com/fatedier/beego v0.0.0-20171024143340-6c6a4f5bd5eb - github.com/fatedier/golib v0.1.1-0.20220119075718-78e5cf8c00ee + github.com/fatedier/golib v0.1.1-0.20220218075713-264f72dfbfd9 github.com/fatedier/kcp-go v2.0.4-0.20190803094908-fe8645b0a904+incompatible github.com/go-playground/validator/v10 v10.6.1 github.com/google/uuid v1.2.0 diff --git a/go.sum b/go.sum index 95ba6744..a42b905f 100644 --- a/go.sum +++ b/go.sum @@ -88,8 +88,10 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatedier/beego v0.0.0-20171024143340-6c6a4f5bd5eb h1:wCrNShQidLmvVWn/0PikGmpdP0vtQmnvyRg3ZBEhczw= github.com/fatedier/beego v0.0.0-20171024143340-6c6a4f5bd5eb/go.mod h1:wx3gB6dbIfBRcucp94PI9Bt3I0F2c/MyNEWuhzpWiwk= -github.com/fatedier/golib v0.1.1-0.20220119075718-78e5cf8c00ee h1:iS0wlj2uZPxh3pciAf/HTzi88Kqu7DPh1jNKgJaFhtI= -github.com/fatedier/golib v0.1.1-0.20220119075718-78e5cf8c00ee/go.mod h1:fLV0TLwHqrnB/L3jbNl67Gn6PCLggDGHniX1wLrA2Qo= +github.com/fatedier/golib v0.1.1-0.20220218073251-9509a597216b h1:5r5/G3NFsFK+7svxvxZYA8yy8Ubs4hWIq+QYYMgEBe8= +github.com/fatedier/golib v0.1.1-0.20220218073251-9509a597216b/go.mod h1:fLV0TLwHqrnB/L3jbNl67Gn6PCLggDGHniX1wLrA2Qo= +github.com/fatedier/golib v0.1.1-0.20220218075713-264f72dfbfd9 h1:AOGf9Z1ri+3MiyGIAYXe+shEXx6/uVGJlufb6ZfnZls= +github.com/fatedier/golib v0.1.1-0.20220218075713-264f72dfbfd9/go.mod h1:fLV0TLwHqrnB/L3jbNl67Gn6PCLggDGHniX1wLrA2Qo= github.com/fatedier/kcp-go v2.0.4-0.20190803094908-fe8645b0a904+incompatible h1:ssXat9YXFvigNge/IkkZvFMn8yeYKFX+uI6wn2mLJ74= github.com/fatedier/kcp-go v2.0.4-0.20190803094908-fe8645b0a904+incompatible/go.mod h1:YpCOaxj7vvMThhIQ9AfTOPW2sfztQR5WDfs7AflSy4s= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= diff --git a/pkg/config/client.go b/pkg/config/client.go index cfc262e9..9a0786fa 100644 --- a/pkg/config/client.go +++ b/pkg/config/client.go @@ -38,6 +38,8 @@ 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"` + // The maximum amount of time a dial to server will wait for a connect to complete. + DialServerTimeout int64 `ini:"dial_server_timeout" json:"dial_server_timeout"` // 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. @@ -157,6 +159,7 @@ func GetDefaultClientConf() ClientCommonConf { ClientConfig: auth.GetDefaultClientConf(), ServerAddr: "0.0.0.0", ServerPort: 7000, + DialServerTimeout: 10, HTTPProxy: os.Getenv("http_proxy"), LogFile: "console", LogWay: "console", diff --git a/pkg/config/client_test.go b/pkg/config/client_test.go index c78e3294..a64b9ee7 100644 --- a/pkg/config/client_test.go +++ b/pkg/config/client_test.go @@ -261,6 +261,7 @@ func Test_LoadClientCommonConf(t *testing.T) { }, ServerAddr: "0.0.0.9", ServerPort: 7009, + DialServerTimeout: 10, HTTPProxy: "http://user:passwd@192.168.1.128:8080", LogFile: "./frpc.log9", LogWay: "file", diff --git a/test/e2e/basic/client_server.go b/test/e2e/basic/client_server.go index c7faa421..c19077c4 100644 --- a/test/e2e/basic/client_server.go +++ b/test/e2e/basic/client_server.go @@ -268,5 +268,4 @@ var _ = Describe("[Feature: Client-Server]", func() { }) } }) - })