NiceLeeのBlog 用爱发电 bilibili~

Android PureHost - 类似PC端Host功能的实现

2019-02-14
nIceLee

阅读:


最近捣鼓了一阵Android提供的VPNService这个api,以及各种IP/TCP/UDP/DNS/HTTP协议,搞了这么久,最后以这个app作为收尾吧😄

写在前面

坑s

  • 关于DNS报文
    • 似乎如果不在Builder生成时指定DNS服务器,手机本身另有一套机制,使得系统默认的DNS查询不会经过虚拟网卡。故而必须要加上一条:
      builder.addDnsServer("xx.xx.xx.xx")
  • 关于默认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();
        }
      }
      
  • 关于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
  • 说一句题外话,上面这个链接 + 写在前面的链接,再拓展一下下,似乎组成了什么了不得的东西..(大雾😂

源代码


内容
隐藏