diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
index 4beaa3c9..e8a90333 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -68,6 +68,8 @@
NAT 模式 (仅限调试)
从 VPN 模式切换为 NAT 模式,需要 ROOT 权限
+ 远程 DNS
+ 用于远程域名解析的 DNS 服务器 (默认为 8.8.8.8)
UDP 转发
由远程服务器转发 UDP 协议的数据包
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
index 0d1d7e26..434e5f7f 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -69,6 +69,8 @@
NAT 模式 (已過時)
使用 NAT 模式代替 VPN 模式,需要 ROOT 權限
+ 遠程 DNS
+ 用於遠程域名解析的 DNS 伺服器 (默認為 8.8.8.8)
UDP 轉送
向遠端轉送 UDP 封包
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 8d896677..937e00fe 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -10,6 +10,8 @@
Switch to another profile or add new profiles
NAT mode (deprecated)
Use NAT mode instead of VPN mode. Requires ROOT permission.
+ Remote DNS
+ DNS server for remote hostname resolution. (Default 8.8.8.8)
Network Traffic
Sent: \t\t\t\t\t%3$s\t↑\t%1$s/s\nReceived: \t%4$s\t↓\t%2$s/s
\n%1$s↑\t%2$s↓
diff --git a/src/main/res/xml/pref_all.xml b/src/main/res/xml/pref_all.xml
index d4df4e23..0efe9261 100644
--- a/src/main/res/xml/pref_all.xml
+++ b/src/main/res/xml/pref_all.xml
@@ -60,6 +60,10 @@
android:entryValues="@array/route_value"
android:summary="%s"
android:title="@string/route_list"/>
+
+
+
diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala
index 6fd24209..2d372e25 100644
--- a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala
+++ b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala
@@ -123,10 +123,11 @@ class ShadowsocksNatService extends BaseService {
, "-c" , getApplicationInfo.dataDir + "/ss-tunnel-nat.conf")
cmd += "-L"
- if (profile.route == Route.CHINALIST)
- cmd += "114.114.114.114:53"
- else
+
+ if (profile.remoteDns == null)
cmd += "8.8.8.8:53"
+ else
+ cmd += profile.remoteDns + ":53"
if (profile.auth) cmd += "-A"
diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala
index d858e44e..97e9f2af 100644
--- a/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala
+++ b/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala
@@ -42,7 +42,7 @@ object ShadowsocksSettings {
private final val TAG = "ShadowsocksSettings"
private val PROXY_PREFS = Array(Key.name, Key.host, Key.remotePort, Key.localPort, Key.password, Key.method,
Key.auth, Key.kcp, Key.kcpPort, Key.kcpcli)
- private val FEATURE_PREFS = Array(Key.route, Key.proxyApps, Key.udpdns, Key.ipv6)
+ private val FEATURE_PREFS = Array(Key.route, Key.remoteDns, Key.proxyApps, Key.udpdns, Key.ipv6)
// Helper functions
def updateDropDownPreference(pref: Preference, value: String) {
@@ -76,6 +76,10 @@ object ShadowsocksSettings {
case Key.password =>
updateEditTextPreference(pref, profile.password)
pref.setSummary(if (demo) "\u2022" * 32 else "%s")
+ case Key.remoteDns =>
+ updateEditTextPreference(pref, profile.remoteDns)
+ if (profile.remoteDns != null)
+ pref.setSummary(if (demo) "8.8.8.8" else "%s")
case Key.method => updateDropDownPreference(pref, profile.method)
case Key.route => updateDropDownPreference(pref, profile.route)
case Key.proxyApps => updateSwitchPreference(pref, profile.proxyApps)
@@ -129,6 +133,10 @@ class ShadowsocksSettings extends PreferenceFragment with OnSharedPreferenceChan
profile.route = value.asInstanceOf[String]
app.profileManager.updateProfile(profile)
})
+ findPreference(Key.remoteDns).setOnPreferenceChangeListener((_, value) => {
+ profile.remoteDns = value.asInstanceOf[String]
+ app.profileManager.updateProfile(profile)
+ })
findPreference(Key.kcp).setOnPreferenceChangeListener((_, value) => {
profile.kcp = value.asInstanceOf[Boolean]
diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala
index 9b7e4c03..e035f235 100644
--- a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala
+++ b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala
@@ -274,10 +274,11 @@ class ShadowsocksVpnService extends VpnService with BaseService {
, "-c", getApplicationInfo.dataDir + "/ss-tunnel-vpn.conf")
cmd += "-L"
- if (profile.route == Route.CHINALIST)
- cmd += "114.114.114.114:53"
- else
+
+ if (profile.remoteDns == null)
cmd += "8.8.8.8:53"
+ else
+ cmd += profile.remoteDns + ":53"
if (profile.auth) cmd += "-A"
diff --git a/src/main/scala/com/github/shadowsocks/database/DBHelper.scala b/src/main/scala/com/github/shadowsocks/database/DBHelper.scala
index a7c73dca..145a18a9 100644
--- a/src/main/scala/com/github/shadowsocks/database/DBHelper.scala
+++ b/src/main/scala/com/github/shadowsocks/database/DBHelper.scala
@@ -46,7 +46,7 @@ object DBHelper {
}
class DBHelper(val context: Context)
- extends OrmLiteSqliteOpenHelper(context, DBHelper.PROFILE, null, 20) {
+ extends OrmLiteSqliteOpenHelper(context, DBHelper.PROFILE, null, 21) {
import DBHelper._
lazy val profileDao: Dao[Profile, Int] = getDao(classOf[Profile])
@@ -125,6 +125,10 @@ class DBHelper(val context: Context)
} else if (oldVersion < 19) {
profileDao.executeRawNoArgs("UPDATE `profile` SET kcpPort = 8399 WHERE kcpPort = 0;")
}
+
+ if (oldVersion < 21) {
+ profileDao.executeRawNoArgs("ALTER TABLE `profile` ADD COLUMN remoteDns VARCHAR DEFAULT '8.8.8.8';")
+ }
} catch {
case ex: Exception =>
app.track(ex)
diff --git a/src/main/scala/com/github/shadowsocks/database/Profile.scala b/src/main/scala/com/github/shadowsocks/database/Profile.scala
index 74d5e487..585f59f5 100644
--- a/src/main/scala/com/github/shadowsocks/database/Profile.scala
+++ b/src/main/scala/com/github/shadowsocks/database/Profile.scala
@@ -52,6 +52,9 @@ class Profile {
@DatabaseField
var route: String = "all"
+ @DatabaseField
+ var remoteDns: String = "8.8.8.8"
+
@DatabaseField
var proxyApps: Boolean = false
diff --git a/src/main/scala/com/github/shadowsocks/utils/Constants.scala b/src/main/scala/com/github/shadowsocks/utils/Constants.scala
index cc11dd7b..31fb551c 100644
--- a/src/main/scala/com/github/shadowsocks/utils/Constants.scala
+++ b/src/main/scala/com/github/shadowsocks/utils/Constants.scala
@@ -149,6 +149,7 @@ object Key {
val method = "encMethod"
val remotePort = "remotePortNum"
val localPort = "localPortNum"
+ val remoteDns = "remoteDns"
val profileTip = "profileTip"