From d8f721db3be698d1d13c34dac885ed92137fdf7e Mon Sep 17 00:00:00 2001 From: Max Lv Date: Mon, 19 Sep 2016 09:58:36 +0800 Subject: [PATCH] Refine DNS resolve of GFWList and ChinaList, #887 --- src/main/jni/Android.mk | 4 +- src/main/jni/pdnsd | 2 +- .../shadowsocks/ShadowsocksNatService.scala | 16 ++++++-- .../shadowsocks/ShadowsocksVpnService.scala | 10 ++++- .../github/shadowsocks/utils/Constants.scala | 41 +++++++++++++++++++ 5 files changed, 67 insertions(+), 6 deletions(-) diff --git a/src/main/jni/Android.mk b/src/main/jni/Android.mk index 5d129fdb..ccd200af 100755 --- a/src/main/jni/Android.mk +++ b/src/main/jni/Android.mk @@ -371,7 +371,9 @@ PDNSD_SOURCES := $(wildcard $(LOCAL_PATH)/pdnsd/src/*.c) LOCAL_MODULE := pdnsd LOCAL_SRC_FILES := $(PDNSD_SOURCES:$(LOCAL_PATH)/%=%) LOCAL_CFLAGS := -DANDROID -Wall -O2 -I$(LOCAL_PATH)/pdnsd \ - -I$(LOCAL_PATH)/include/pdnsd + -I$(LOCAL_PATH)/include/pdnsd -I$(LOCAL_PATH)/libancillary +LOCAL_STATIC_LIBRARIES := libancillary +LOCAL_LDLIBS := -llog include $(BUILD_EXECUTABLE) diff --git a/src/main/jni/pdnsd b/src/main/jni/pdnsd index 7a769627..69827590 160000 --- a/src/main/jni/pdnsd +++ b/src/main/jni/pdnsd @@ -1 +1 @@ -Subproject commit 7a769627959ab2e27f0eadafcc89aed14d364ffd +Subproject commit 698275907b0c038b4eb40acbc067c8bf143e548f diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala index a23f4f33..c602097e 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala @@ -190,10 +190,18 @@ class ShadowsocksNatService extends BaseService { def startDnsDaemon() { val conf = profile.route match { - case Route.BYPASS_CHN | Route.BYPASS_LAN_CHN | Route.GFWLIST => { + case Route.BYPASS_CHN | Route.BYPASS_LAN_CHN => { ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir, "127.0.0.1", profile.localPort + 53, getBlackList, profile.localPort + 63, "") } + case Route.GFWLIST => { + ConfigUtils.PDNSD_UDP.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir, + "0.0.0.0", profile.localPort + 53, "119.29.29.29, 1.2.4.8", profile.localPort + 63, "") + } + case Route.CHINALIST => { + ConfigUtils.PDNSD_UDP.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir, + "0.0.0.0", profile.localPort + 53, "8.8.8.8, 208.67.222.222", profile.localPort + 63, "") + } case _ => { ConfigUtils.PDNSD_LOCAL.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir, "127.0.0.1", profile.localPort + 53, profile.localPort + 63, "") @@ -284,8 +292,10 @@ class ShadowsocksNatService extends BaseService { init_sb.append(cmd_bypass.replace("-p tcp -d 0.0.0.0", "-m owner --uid-owner " + myUid)) init_sb.append(cmd_bypass.replace("-d 0.0.0.0", "--dport 53")) - init_sb.append("iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:" - + (profile.localPort + 53)) + if (profile.route != Route.GFWLIST && profile.route != Route.CHINALIST) { + init_sb.append("iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:" + + (profile.localPort + 53)) + } if (!profile.proxyApps || profile.bypass) { http_sb.append(CMD_IPTABLES_DNAT_ADD_SOCKS) diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala index f22d692b..e4214e09 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala @@ -309,10 +309,18 @@ class ShadowsocksVpnService extends VpnService with BaseService { def startDnsDaemon() { val ipv6 = if (profile.ipv6) "" else "reject = ::/0;" val conf = profile.route match { - case Route.BYPASS_CHN | Route.BYPASS_LAN_CHN | Route.GFWLIST => { + case Route.BYPASS_CHN | Route.BYPASS_LAN_CHN => { ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir, "0.0.0.0", profile.localPort + 53, getBlackList, profile.localPort + 63, ipv6) } + case Route.GFWLIST => { + ConfigUtils.PDNSD_UDP.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir, + "0.0.0.0", profile.localPort + 53, "119.29.29.29, 1.2.4.8", profile.localPort + 63, ipv6) + } + case Route.CHINALIST => { + ConfigUtils.PDNSD_UDP.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir, + "0.0.0.0", profile.localPort + 53, "8.8.8.8, 208.67.222.222", profile.localPort + 63, ipv6) + } case _ => { ConfigUtils.PDNSD_LOCAL.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir, "0.0.0.0", profile.localPort + 53, profile.localPort + 63, ipv6) diff --git a/src/main/scala/com/github/shadowsocks/utils/Constants.scala b/src/main/scala/com/github/shadowsocks/utils/Constants.scala index 7cb3812b..f142340d 100644 --- a/src/main/scala/com/github/shadowsocks/utils/Constants.scala +++ b/src/main/scala/com/github/shadowsocks/utils/Constants.scala @@ -141,6 +141,47 @@ object ConfigUtils { | soa=localhost,root.localhost,42,86400,900,86400,86400; |} """.stripMargin + + val PDNSD_UDP = + """ + |global { + | perm_cache = 2048; + | cache_dir = "%s"; + | server_ip = %s; + | server_port = %d; + | query_method = udp_tcp; + | run_ipv4 = on; + | min_ttl = 15m; + | max_ttl = 1w; + | timeout = 10; + | daemon = off; + |} + | + |server { + | label = "remote-servers"; + | ip = %s; + | timeout = 5; + | uptest = none; + | preset = on; + |} + | + |server { + | label = "local-server"; + | ip = 127.0.0.1; + | port = %d; + | %s + | reject_policy = negate; + | reject_recursively = on; + |} + | + |rr { + | name=localhost; + | reverse=on; + | a=127.0.0.1; + | owner=localhost; + | soa=localhost,root.localhost,42,86400,900,86400,86400; + |} + """.stripMargin } object Key {