diff --git a/README.md b/README.md index 27015c6..4889fb5 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,8 @@ Usage of ./vtun: protocol ws/wss/udp (default "wss") -s string server address (default ":3001") + -d string + dns address (default "8.8.8.8:53") -P enable pporf server on :6060 -S server mode -g client global mode diff --git a/common/config/config.go b/common/config/config.go index 5c2b775..7be515f 100644 --- a/common/config/config.go +++ b/common/config/config.go @@ -13,6 +13,7 @@ type Config struct { CIDR string Key string Protocol string + DNS string ServerMode bool GlobalMode bool Obfuscate bool diff --git a/common/netutil/netutil.go b/common/netutil/netutil.go index e4ab23b..0e96e89 100644 --- a/common/netutil/netutil.go +++ b/common/netutil/netutil.go @@ -40,6 +40,13 @@ func GetAddr(b []byte) (srcAddr string, dstAddr string) { } func ConnectServer(config config.Config) net.Conn { + net.DefaultResolver = &net.Resolver{ + PreferGo: true, + Dial: func(ctx context.Context, network, _ string) (net.Conn, error) { + var dialer net.Dialer + return dialer.DialContext(ctx, network, config.DNS) + }, + } scheme := "ws" if config.Protocol == "wss" { scheme = "wss" diff --git a/main.go b/main.go index a34b8f8..d1612a9 100644 --- a/main.go +++ b/main.go @@ -17,6 +17,7 @@ func main() { flag.StringVar(&config.ServerAddr, "s", ":3001", "server address") flag.StringVar(&config.Key, "k", "6w9z$C&F)J@NcRfWjXn3r4u7x!A%D*G-", "key") flag.StringVar(&config.Protocol, "p", "wss", "protocol ws/wss/udp") + flag.StringVar(&config.DNS, "d", "8.8.8.8:53", "dns address") flag.BoolVar(&config.ServerMode, "S", false, "server mode") flag.BoolVar(&config.GlobalMode, "g", false, "client global mode") flag.BoolVar(&config.Obfuscate, "o", false, "enable data obfuscation") diff --git a/tun/tun.go b/tun/tun.go index 1f38237..912cedd 100644 --- a/tun/tun.go +++ b/tun/tun.go @@ -40,8 +40,8 @@ func configTun(config config.Config, iface *water.Interface) { if physicalIface != "" && serverIP != "" { execCmd("/sbin/ip", "route", "add", "0.0.0.0/1", "dev", iface.Name()) execCmd("/sbin/ip", "route", "add", "128.0.0.0/1", "dev", iface.Name()) - execCmd("/sbin/ip", "route", "delete", strings.Join([]string{serverIP, "32"}, "/"), "via", gateway, "dev", physicalIface) execCmd("/sbin/ip", "route", "add", strings.Join([]string{serverIP, "32"}, "/"), "via", gateway, "dev", physicalIface) + execCmd("/sbin/ip", "route", "add", strings.Join([]string{strings.Split(config.DNS, ":")[0], "32"}, "/"), "via", gateway, "dev", physicalIface) } } @@ -54,6 +54,7 @@ func configTun(config config.Config, iface *water.Interface) { serverIP := netutil.LookupIP(strings.Split(config.ServerAddr, ":")[0]) if physicalIface != "" && serverIP != "" { execCmd("route", "add", serverIP, localGateway) + execCmd("route", "add", strings.Split(config.DNS, ":")[0], localGateway) execCmd("route", "add", "0.0.0.0/1", "-interface", iface.Name()) execCmd("route", "add", "128.0.0.0/1", "-interface", iface.Name()) execCmd("route", "add", "default", gateway.String())