Browse Source

frpc: support specify default dns server, close #700

fatedier 7 years ago
parent
commit
00b9ba95ae
3 changed files with 24 additions and 0 deletions
  1. 15 0
      cmd/frpc/sub/root.go
  2. 3 0
      conf/frpc_full.ini
  3. 6 0
      models/config/client_common.go

+ 15 - 0
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.

+ 3 - 0
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

+ 6 - 0
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 {