diff --git a/cmd/frpc/sub/root.go b/cmd/frpc/sub/root.go index bbb4c96..7f09c03 100644 --- a/cmd/frpc/sub/root.go +++ b/cmd/frpc/sub/root.go @@ -15,8 +15,10 @@ package sub import ( + "context" "fmt" "io/ioutil" + "net" "os" "os/signal" "strconv" @@ -188,6 +190,19 @@ func runClient(cfgFilePath string) (err error) { func startService(pxyCfgs map[string]config.ProxyConf, visitorCfgs map[string]config.ProxyConf) (err error) { log.InitLog(g.GlbClientCfg.LogWay, g.GlbClientCfg.LogFile, g.GlbClientCfg.LogLevel, g.GlbClientCfg.LogMaxDays) + if g.GlbClientCfg.DnsServer != "" { + s := g.GlbClientCfg.DnsServer + if !strings.Contains(s, ":") { + s += ":53" + } + // Change default dns server for frpc + net.DefaultResolver = &net.Resolver{ + PreferGo: true, + Dial: func(ctx context.Context, network, address string) (net.Conn, error) { + return net.Dial("udp", s) + }, + } + } svr := client.NewService(pxyCfgs, visitorCfgs) // Capture the exit signal if we use kcp. diff --git a/conf/frpc_full.ini b/conf/frpc_full.ini index 844ed0e..25e1c2b 100644 --- a/conf/frpc_full.ini +++ b/conf/frpc_full.ini @@ -43,6 +43,9 @@ login_fail_exit = true # now it supports tcp and kcp, default is tcp protocol = tcp +# specify a dns server, so frpc will use this instead of default one +dns_server = 8.8.8.8 + # proxy names you want to start divided by ',' # default is empty, means all proxies # start = ssh,dns diff --git a/models/config/client_common.go b/models/config/client_common.go index 726352d..95a383a 100644 --- a/models/config/client_common.go +++ b/models/config/client_common.go @@ -40,6 +40,7 @@ type ClientCommonConf struct { PoolCount int `json:"pool_count"` TcpMux bool `json:"tcp_mux"` User string `json:"user"` + DnsServer string `json:"dns_server"` LoginFailExit bool `json:"login_fail_exit"` Start map[string]struct{} `json:"start"` Protocol string `json:"protocol"` @@ -64,6 +65,7 @@ func GetDefaultClientConf() *ClientCommonConf { PoolCount: 1, TcpMux: true, User: "", + DnsServer: "", LoginFailExit: true, Start: make(map[string]struct{}), Protocol: "tcp", @@ -166,6 +168,10 @@ func UnmarshalClientConfFromIni(defaultCfg *ClientCommonConf, content string) (c cfg.User = tmpStr } + if tmpStr, ok = conf.Get("common", "dns_server"); ok { + cfg.DnsServer = tmpStr + } + if tmpStr, ok = conf.Get("common", "start"); ok { proxyNames := strings.Split(tmpStr, ",") for _, name := range proxyNames {