From 1a09f8d1c3b91b909cbf2cd33beafab2d2ab1b17 Mon Sep 17 00:00:00 2001 From: Max Lv Date: Thu, 10 Apr 2014 19:36:37 +0800 Subject: [PATCH] bypass system dns --- src/main/java/com/github/shadowsocks/System.java | 1 + src/main/jni/system.cpp | 11 ++++++++++- .../github/shadowsocks/ShadowsocksNatService.scala | 4 ++-- .../github/shadowsocks/ShadowsocksVpnService.scala | 4 ++-- .../com/github/shadowsocks/utils/ConfigUtils.scala | 6 +++--- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/github/shadowsocks/System.java b/src/main/java/com/github/shadowsocks/System.java index 0f17bcaf..0a9cdd70 100755 --- a/src/main/java/com/github/shadowsocks/System.java +++ b/src/main/java/com/github/shadowsocks/System.java @@ -45,4 +45,5 @@ public class System { public static native void exec(String cmd); public static native String getABI(); + public static native String getDNS1(); } diff --git a/src/main/jni/system.cpp b/src/main/jni/system.cpp index 4e491eb2..940d4bef 100644 --- a/src/main/jni/system.cpp +++ b/src/main/jni/system.cpp @@ -6,11 +6,18 @@ #include #include #include +#include #define LOGI(...) do { __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__); } while(0) #define LOGW(...) do { __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__); } while(0) #define LOGE(...) do { __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__); } while(0) +jstring Java_com_github_shadowsocks_system_getdns1(JNIEnv *env, jobject thiz) { + char dns1[PROP_VALUE_MAX]; + __system_property_get("net.dns1", dns1); + return env->NewStringUTF(dns1); +} + jstring Java_com_github_shadowsocks_system_getabi(JNIEnv *env, jobject thiz) { AndroidCpuFamily family = android_getCpuFamily(); uint64_t features = android_getCpuFeatures(); @@ -45,7 +52,9 @@ static JNINativeMethod method_table[] = { { "exec", "(Ljava/lang/String;)V", (void*) Java_com_github_shadowsocks_system_exec }, { "getABI", "()Ljava/lang/String;", - (void*) Java_com_github_shadowsocks_system_getabi } + (void*) Java_com_github_shadowsocks_system_getabi }, + { "getDNS1", "()Ljava/lang/String;", + (void*) Java_com_github_shadowsocks_system_getdns1 } }; /* diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala index 915e0da3..9ae5f9a7 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala @@ -120,7 +120,7 @@ class ShadowsocksNatService extends Service with BaseService { } else { val conf = { if (config.isGFWList) - ConfigUtils.PDNSD_BYPASS.format("127.0.0.1", getString(R.string.exclude)) + ConfigUtils.PDNSD_BYPASS.format("127.0.0.1", System.getDNS1, getString(R.string.exclude)) else ConfigUtils.PDNSD.format("127.0.0.1") } @@ -313,8 +313,8 @@ class ShadowsocksNatService extends Service with BaseService { init_sb.append(cmd_bypass.replace("0.0.0.0", "127.0.0.1")) if (config.isGFWList) { // Bypass DNS in China + init_sb.append(cmd_bypass.replace("-p tcp -d 0.0.0.0", "-d " + System.getDNS1)) init_sb.append(cmd_bypass.replace("-p tcp -d 0.0.0.0", "-d 114.114.114.114")) - init_sb.append(cmd_bypass.replace("-p tcp -d 0.0.0.0", "-d 114.114.115.115")) } if (hasRedirectSupport) { init_sb diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala index 3f518e34..70018599 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala @@ -77,7 +77,7 @@ class ShadowsocksVpnService extends VpnService with BaseService { def isByass(net: SubnetUtils): Boolean = { val info = net.getInfo - info.isInRange(config.proxy) || info.isInRange("114.114.114.114") || info.isInRange("114.114.115.115") + info.isInRange(config.proxy) || info.isInRange("114.114.114.114") || info.isInRange(System.getDNS1) } def startShadowsocksDaemon() { @@ -92,7 +92,7 @@ class ShadowsocksVpnService extends VpnService with BaseService { def startDnsDaemon() { val conf = { if (config.isGFWList) - ConfigUtils.PDNSD_BYPASS.format("0.0.0.0", getString(R.string.exclude)) + ConfigUtils.PDNSD_BYPASS.format("0.0.0.0", System.getDNS1, getString(R.string.exclude)) else ConfigUtils.PDNSD.format("0.0.0.0") } diff --git a/src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala b/src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala index f936b9b8..3cfa56b1 100644 --- a/src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala +++ b/src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala @@ -110,12 +110,12 @@ object ConfigUtils { | |server { | label = "china-servers"; - | ip = 114.114.114.114, 114.114.115.115; + | ip = %s, 114.114.114.114; | uptest = none; | preset = on; | include = %s; | policy = excluded; - | timeout = 3; + | timeout = 2; |} | |server { @@ -197,4 +197,4 @@ object ConfigUtils { new Config(isGlobalProxy, isGFWList, isBypassApps, isTrafficStat, isUdpDns, profileName, proxy, sitekey, encMethod, proxiedAppString, remotePort, localPort) } -} \ No newline at end of file +}