最近捣鼓了一阵Android提供的VPNService这个api,以及各种IP/TCP/UDP/DNS/HTTP协议,搞了这么久,最后以这个app作为收尾吧😄
写在前面
- 杂七杂八 - 新春大杂烩
Java Http文件服务器DemoJava Http/Https代理Demo (上)Java Http/Https代理Demo (下)- Java 本地DNS服务器Demo
- Android VpnService初探
Java 本地TCPServer Demo- 为了实现PureHost,前期做了一定的铺垫准备(部分划掉的有的是
便于拓展热身,有的是原计划需要实现,结果并不需要),一步一步从易到难慢慢捣鼓出来的。
坑s
- 关于DNS报文
- 似乎如果不在Builder生成时指定DNS服务器,手机本身另有一套机制,使得系统默认的DNS查询不会经过虚拟网卡。故而必须要加上一条:
builder.addDnsServer("xx.xx.xx.xx")
- 似乎如果不在Builder生成时指定DNS服务器,手机本身另有一套机制,使得系统默认的DNS查询不会经过虚拟网卡。故而必须要加上一条:
- 关于默认DNS的获取
- WiFi上网 - 默认DNS的获取
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); if(wifi != null){ DhcpInfo info = wifi.getDhcpInfo(); String dns = intToIp(info.dns1); if(!"0.0.0.0".equals(dns)){ dnsList.add(dns); } }
- 流量上网 - 默认DNS的获取
这里没有啥好的办法,只能从系统的prop参数中获取,但是网传的net.dns1/net.dns2不是很靠谱,故而直接过滤了所有关键词为dns的配置,然后从中匹配。
这里要注意: Runtime传管道符只能用字符串形式;final static Pattern patternDNS = Pattern.compile(":[ ]*\\[([0-9]+.[0-9]+.[0-9]+.[0-9]+)\\]"); public static List<String> getLocalDNS(){ Process cmdProcess = null; BufferedReader reader = null; dnsList.clear(); try { String[] cmd = new String[]{"sh","-c","getprop | grep dns"}; cmdProcess = Runtime.getRuntime().exec(cmd); reader = new BufferedReader(new InputStreamReader(cmdProcess.getInputStream())); String dnsIP = reader.readLine(); while(dnsIP != null){ Matcher matcher = patternDNS.matcher(dnsIP); if(matcher.find()){ dnsList.add(matcher.group(1)); } dnsIP = reader.readLine(); } return dnsList; } catch (IOException e) { e.printStackTrace(); return null; } finally{ try { reader.close(); } catch (IOException e) { } cmdProcess.destroy(); } }
- WiFi上网 - 默认DNS的获取
- 关于Builder的Route设置
因为仅仅用于DNS相关的设置,也就没有必要过滤所有ip包,没有必要builder.addRoute(“0.0.0.0”, 0),直接抓取DNS服务器地址的包就行了。for(String dns :ConfigReader.dnsList){ builder.addDnsServer(dns); builder.addRoute(dns, 32); }
最后的最后
- FileEncrypter
- 说一句题外话,上面这个链接 + 写在前面的链接,再拓展一下下,似乎组成了什么了不得的东西..(大雾😂