diff --git a/project/Build.scala b/project/Build.scala index a228e835..e90d096d 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -5,8 +5,8 @@ import sbtandroid._ import sbtandroid.AndroidPlugin._ object App { - val version = "2.1.3" - val versionCode = 64 + val version = "2.1.4" + val versionCode = 65 } object General { diff --git a/src/main/res/values/configs.xml b/src/main/res/values/configs.xml new file mode 100644 index 00000000..11d39f81 --- /dev/null +++ b/src/main/res/values/configs.xml @@ -0,0 +1,5 @@ + + + ".cn",".07073.com",".10010.com",".100ye.com",".114la.com",".115.com",".120ask.com",".126.com",".126.net",".1616.net",".163.com",".17173.com",".1778.com",".178.com",".17u.com",".19lou.com",".1o26.com",".1ting.com",".21cn.com",".2345.com",".265.com",".265g.com",".28.com",".28tui.com",".2hua.com",".2mdn.net",".315che.com",".3366.com",".360buy.com",".360buyimg.com",".360doc.com",".36kr.com",".39.net",".3dmgame.com",".4399.com",".4738.com",".500wan.com",".51.com",".51.la",".5173.com",".51auto.com",".51buy.com",".51cto.com",".51fanli.com",".51job.com",".52kmh.com",".52pk.net",".52tlbb.com",".53kf.com",".55bbs.com",".55tuan.com",".56.com",".58.com",".591hx.com",".5d6d.net",".61.com",".70e.com",".777wyx.com",".778669.com",".7c.com",".7k7k.com",".88db.com",".91.com",".99bill.com",".a135.net",".abang.com",".abchina.com",".ad1111.com",".admin5.com",".adnxs.com",".adobe.com",".adroll.com",".ads8.com",".adsame.com",".adsonar.com",".adtechus.com",".aibang.com",".aifang.com",".aili.com",".aipai.com",".aizhan.com",".ali213.net",".alibaba.com",".alicdn.com",".aliexpress.com",".alimama.com",".alipay.com",".alipayobjects.com",".alisoft.com",".alivv.com",".aliyun.com",".allyes.com",".amazon.com",".anjuke.com",".anzhi.com",".aol.com",".apple.com",".arpg2.com",".atdmt.com",".b2b168.com",".babytree.com",".baidu.com",".baihe.com",".baixing.com",".bankcomm.com",".baomihua.com",".bdimg.com",".bdstatic.com",".bendibao.com",".betrad.com",".bilibili.tv",".bing.com",".bitauto.com",".blog.163.com",".blogchina.com",".blueidea.com",".bluekai.com",".booksky.org",".caixin.com",".ccb.com",".ccidnet.com",".cctv*.com",".china.com",".chinabyte.com",".chinahr.com",".chinanews.com",".chinaunix.net",".chinaw3.com",".chinaz.com",".chuangelm.com",".ci123.com",".cmbchina.com",".cnbeta.com",".cnblogs.com",".cncn.com",".cnhubei.com",".cnki.net",".cnmo.com",".cnxad.com",".cnzz.com",".cocoren.com",".compete.com",".comsenz.com",".coo8.com",".cqnews.net",".crsky.com",".csdn.net",".ct10000.com",".ctrip.com",".dangdang.com",".daqi.com",".dayoo.com",".dbank.com",".ddmap.com",".dedecms.com",".dh818.com",".diandian.com",".dianping.com",".discuz.net",".doc88.com",".docin.com",".donews.com",".dospy.com",".douban.com",".douban.fm",".doubleclick.com",".doubleclick.net",".duba.net",".duote.com",".duowan.com",".dzwww.com",".eastday.com",".eastmoney.com",".ebay.com",".elong.com",".ename.net",".etao.com",".exam8.com",".eye.rs",".fantong.com",".fastcdn.com",".fblife.com",".fengniao.com",".fenzhi.com",".flickr.com",".fobshanghai.com",".ftuan.com",".funshion.com",".fx120.net",".game3737.com",".gamersky.com",".gamestlbb.com",".gamesville.com",".ganji.com",".gfan.com",".gongchang.com",".google-analytics.com",".gougou.com",".gtimg.com",".hao123.com",".haodf.com",".harrenmedianetwork.com",".hc360.com",".hefei.cc",".hf365.com",".hiapk.com",".hichina.com",".homeinns.com",".hotsales.net",".house365.com",".huaban.com",".huanqiu.com",".hudong.com",".hupu.com",".iask.com",".iciba.com",".icson.com",".ifeng.com",".iloveyouxi.com",".im286.com",".imanhua.com",".img.cctvpic.com",".imrworldwide.com",".invitemedia.com",".ip138.com",".ipinyou.com",".iqilu.com",".iqiyi.com",".irs01.com",".irs01.net",".it168.com",".iteye.com",".iyaya.com",".jb51.net",".jiathis.com",".jiayuan.com",".jing.fm",".jinti.com",".jqw.com",".jumei.com",".jxedt.com",".jysq.net",".kaixin001.com",".kandian.com",".kdnet.net",".kimiss.com",".ku6.com",".ku6cdn.com",".ku6img.com",".kuaidi100.com",".kugou.com",".l99.com",".lady8844.com",".lafaso.com",".lashou.com",".legolas-media.com",".lehecai.com",".leho.com",".letv.com",".liebiao.com",".lietou.com",".linezing.com",".linkedin.com",".live.com",".longhoo.net",".lusongsong.com",".lxdns.com",".lycos.com",".lygo.com",".m18.com",".m1905.com",".made-in-china.com",".makepolo.com",".mangocity.com",".manzuo.com",".mapbar.com",".mathtag.com",".mediaplex.com",".mediav.com",".meilele.com",".meilishuo.com",".meishichina.com",".meituan.com",".meizu.com",".miaozhen.com",".microsoft.com",".miercn.com",".mlt01.com",".mmstat.com",".mnwan.com",".mogujie.com",".mookie1.com",".moonbasa.com",".mop.com",".mosso.com",".mplife.com",".msn.com",".mtime.com",".mumayi.com",".mydrivers.com",".net114.com",".netease.com",".newsmth.net",".nipic.com",".nowec.com",".nuomi.com",".oadz.com",".oeeee.com",".onetad.com",".onlinedown.net",".onlylady.com",".oschina.net",".otwan.com",".paipai.com",".paypal.com",".pchome.net",".pcpop.com",".pengyou.com",".php100.com",".phpwind.net",".pingan.com",".pixlr.com",".pp.cc",".ppstream.com",".pptv.com",".pubmatic.com",".q150.com",".qianlong.com",".qidian.com",".qingdaonews.com",".qire123.com",".qiushibaike.com",".qiyou.com",".qjy168.com",".qq.com",".qq937.com",".qstatic.com",".quantserve.com",".qunar.com",".rakuten.co.jp",".readnovel.com",".renren.com",".rtbidder.net",".scanscout.com",".scorecardresearch.com",".sdo.com",".seowhy.com",".serving-sys.com",".sf-express.com",".shangdu.com",".si.kz",".sina.com",".sinahk.net",".sinajs.com",".smzdm.com",".snyu.com",".sodu.org",".sogou.com",".sohu.com",".soku.com",".sootoo.com",".soso.com",".soufun.com",".sourceforge.net",".staticsdo.com",".stockstar.com",".sttlbb.com",".suning.com",".szhome.com",".sznews.com",".tangdou.com",".tanx.com",".tao123.com",".taobao.com",".taobaocdn.com",".tdimg.com",".tenpay.com",".tgbus.com",".theplanet.com",".thethirdmedia.com",".tiancity.com",".tianji.com",".tiao8.info",".tiexue.net",".titan24.com",".tmall.com",".tom.com",".toocle.com",".tremormedia.com",".tuan800.com",".tudou.com",".tudouui.com",".tui18.com",".tuniu.com",".twcczhu.com",".u17.com",".ucjoy.com",".ulink.cc",".uniontoufang.com",".up2c.com",".uuu9.com",".uuzu.com",".vancl.com",".verycd.com",".vipshop.com",".vizu.com",".vjia.com",".weibo.com",".weiphone.com",".west263.com",".whlongda.com",".wrating.com",".wumii.com",".xiami.com",".xiaomi.com",".xiazaiba.com",".xici.net",".xinhuanet.com",".xinnet.com",".xitek.com",".xiu.com",".xunlei.com",".xyxy.net",".yaolan.com",".yesky.com",".yieldmanager.com",".yihaodian.com",".yingjiesheng.com",".yinyuetai.com",".yiqifa.com",".ykimg.com",".ynet.com",".yoka.com",".yolk7.com",".youboy.com",".youdao.com",".yougou.com",".youku.com",".youshang.com",".yupoo.com",".yxlady.com",".yyets.com",".zhaodao123.com",".zhaopin.com",".zhenai.com",".zhibo8.cc",".zhihu.com",".zhubajie.com",".zongheng.com",".zoosnet.net",".zqgame.com",".ztgame.com",".zx915.com",".miui.com",".mi-idc.com",".qhimg.com",".wandoujia.com" + + diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala index d749d4b7..915e0da3 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala @@ -118,7 +118,12 @@ class ShadowsocksNatService extends Service with BaseService { Path.BASE + "ss-local.pid") .format(config.proxy, config.remotePort, 8153, config.sitekey, config.encMethod) } else { - val conf = ConfigUtils.PDNSD.format("127.0.0.1") + val conf = { + if (config.isGFWList) + ConfigUtils.PDNSD_BYPASS.format("127.0.0.1", getString(R.string.exclude)) + else + ConfigUtils.PDNSD.format("127.0.0.1") + } ConfigUtils.printToFile(new File(Path.BASE + "pdnsd.conf"))(p => { p.println(conf) }) @@ -306,6 +311,11 @@ class ShadowsocksNatService extends Service with BaseService { init_sb.append(cmd_bypass.replace("-d 0.0.0.0", "-d " + config.proxy)) } 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 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 .append(Utils.getIptables + " -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to " diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala index 1f7c1ade..3f518e34 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala @@ -75,6 +75,11 @@ class ShadowsocksVpnService extends VpnService with BaseService { val handler: Handler = new Handler() + 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") + } + def startShadowsocksDaemon() { val cmd: String = (Path.BASE + "ss-local -b 127.0.0.1 -s \"%s\" -p \"%d\" -l \"%d\" -k \"%s\" -m \"%s\" -u -f " + @@ -85,7 +90,12 @@ class ShadowsocksVpnService extends VpnService with BaseService { } def startDnsDaemon() { - val conf = ConfigUtils.PDNSD.format("0.0.0.0") + val conf = { + if (config.isGFWList) + ConfigUtils.PDNSD_BYPASS.format("0.0.0.0", getString(R.string.exclude)) + else + ConfigUtils.PDNSD.format("0.0.0.0") + } ConfigUtils.printToFile(new File(Path.BASE + "pdnsd.conf"))(p => { p.println(conf) }) @@ -108,8 +118,6 @@ class ShadowsocksVpnService extends VpnService with BaseService { def startVpn() { - val proxy_address = config.proxy - val builder = new Builder() builder .setSession(config.profileName) @@ -128,8 +136,8 @@ class ShadowsocksVpnService extends VpnService with BaseService { } } gfwList.foreach(cidr => { - val net = new SubnetUtils(cidr).getInfo - if (!net.isInRange(proxy_address)) { + val net = new SubnetUtils(cidr) + if (!isByass(net)) { val addr = cidr.split('/') builder.addRoute(addr(0), addr(1).toInt) } @@ -139,9 +147,9 @@ class ShadowsocksVpnService extends VpnService with BaseService { if (i != 26 && i != 127) { val addr = i.toString + ".0.0.0" val cidr = addr + "/8" - val net = new SubnetUtils(cidr).getInfo + val net = new SubnetUtils(cidr) - if (!net.isInRange(proxy_address)) { + if (!isByass(net)) { if (!InetAddress.getByName(addr).isSiteLocalAddress) { builder.addRoute(addr, 8) } @@ -149,8 +157,8 @@ class ShadowsocksVpnService extends VpnService with BaseService { for (j <- 0 to 255) { val subAddr = i.toString + "." + j.toString + ".0.0" val subCidr = subAddr + "/16" - val subNet = new SubnetUtils(subCidr).getInfo - if (!subNet.isInRange(proxy_address)) { + val subNet = new SubnetUtils(subCidr) + if (!isByass(subNet)) { if (!InetAddress.getByName(subAddr).isSiteLocalAddress) { builder.addRoute(subAddr, 16) } diff --git a/src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala b/src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala index 9914bd76..f936b9b8 100644 --- a/src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala +++ b/src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala @@ -78,8 +78,49 @@ object ConfigUtils { |} | |server { - | label = "root-servers"; - | ip = 8.8.8.8, 8.8.4.4, 208.67.222.222, 208.67.220.220; + | label = "google-servers"; + | ip = 8.8.8.8, 8.8.4.4; + | timeout = 5; + |} + | + |rr { + | name=localhost; + | reverse=on; + | a=127.0.0.1; + | owner=localhost; + | soa=localhost,root.localhost,42,86400,900,86400,86400; + |} + """.stripMargin + + val PDNSD_BYPASS = + """ + |global { + | perm_cache = 2048; + | cache_dir = "/data/data/com.github.shadowsocks"; + | server_ip = %s; + | server_port = 8153; + | query_method = tcp_only; + | run_ipv4 = on; + | min_ttl = 15m; + | max_ttl = 1w; + | timeout = 10; + | daemon = on; + | pid_file = "/data/data/com.github.shadowsocks/pdnsd.pid"; + |} + | + |server { + | label = "china-servers"; + | ip = 114.114.114.114, 114.114.115.115; + | uptest = none; + | preset = on; + | include = %s; + | policy = excluded; + | timeout = 3; + |} + | + |server { + | label = "google-servers"; + | ip = 8.8.8.8, 8.8.4.4; | timeout = 5; |} |