android vpn pptp 自动切换VPN

来源:互联网 发布:js 组合式继承 编辑:程序博客网 时间:2024/04/30 13:30

因为项目需求,需要自动切换各种IP,本想利用android原生的VPN代码。

只能说各种坑爹,各种反射,结果让人失望。

查看andorid系统的C代码,有个mtpd,有必要了解下。


以下,是在获得ROOT的情况下执行的

下面是部分命令

mtpd wlan0 pptp a.hkgjsq.com 1723 linkname vpn require-mppe-128 usepeerdns lcp-echo-failure 20 lcp-echo-interval 4 mtu 1396 mru 1396 unit 100 nodetach user 'xxxxx' password 'xxxxxxxx' ipparam vpn  &

这个命令,因平台而有小异.


再次是设置DNS之类的设置

ip -4 ro flush dev ppp100 |ip ro add 0.0.0.0/1 dev ppp100 |ip ro add 128.0.0.0/1 dev ppp100 |ip ru add from all table vpn |ip ro add default dev ppp100 table vpn |


最后是IP的设置

10.0.32.53
12-02 19:22:49.620: I/(25412): dns before 202.96.134.33 202.96.128.86
12-02 19:22:49.620: I/(25412): incercam sa aflam dns de la pppoe varianta 1
12-02 19:22:49.625: I/(25412): We found DNS using case 1
12-02 19:22:49.625: I/(25412): DNS dnsfound=true
12-02 19:22:49.625: I/(25412): dns found
12-02 19:22:49.625: I/(25412): DNS1 8.8.8.8
12-02 19:22:49.625: I/(25412): DNS2 8.8.4.4
12-02 19:22:49.685: I/(25412): DNS set: iptables -t nat -I OUTPUT -d 202.96.134.33 -p udp --dport 53 -j DNAT --to 8.8.8.8:53
12-02 19:22:49.685: I/(25412): DNS set: iptables -t nat -I OUTPUT -d 202.96.128.86 -p udp --dport 53 -j DNAT --to 8.8.4.4:53


以下是部分核心代码

localStringBuffer2.append("mtu " + this.mtu.toString().trim() + " ");
      localStringBuffer2.append("mru " + this.mru.toString().trim() + " ");
      localStringBuffer2.append("unit 100 ");
      if (this.ipv6enable.booleanValue()) {
        localStringBuffer2.append("+ipv6 ");
      }
      localStringBuffer2.append("nodetach ");
      localStringBuffer2.append("user '" + this.username.toString() + "' ");
      localStringBuffer2.append("password '" + this.password.toString() + "' ");
      localStringBuffer2.append("ipparam vpn ");
      String str3 = "mtpd";
      this.android_version = Build.VERSION.SDK_INT;
      Log.i(TAG,"VpnRoot found device=" + getDeviceName() + " android SDK=" + String.valueOf(this.android_version));
      if ((!getDeviceName().startsWith("Samsung SM-N910")) && (!getDeviceName().startsWith("blablalba")) && ((getDeviceName().startsWith("GT-I95")) || (getDeviceName().startsWith("GT-I96")) || (getDeviceName().startsWith("GT-I97")) || (getDeviceName().startsWith("Samsung"))) && (this.android_version >= 19))
      {
        if (!new File("/system/bin/mtpd2").exists()) {
             localStringBuffer1.append("mount -o remount,rw /system \ncp /system/bin/mtpd /system/bin/mtpd2\nmount -o remount,ro /system\n");
             str3 = "mtpd2";
        }
        else {
            str3 = "mtpd2";
        }
      }
      String str4 = Build.VERSION.RELEASE;
      Log.i(TAG,"VpnRoot : Android OS " + str4);
      if ((str4.startsWith("5.")) && (!getDeviceName().startsWith("Samsung")) && (!getDeviceName().startsWith("OnePlus")))
      {
        StringBuffer localStringBuffer3 = new StringBuffer();
        localStringBuffer3.append("mount -o remount,rw /system \nchcon u:object_r:system_file:s0 /system/bin/mtpd \nchcon u:object_r:system_file:s0 /system/bin/pppd \nchcon u:object_r:tun_device:s0 /dev/ppp \nchmod 666 /dev/ppp \nmount -o remount,ro /system\n");
        Log.i(TAG, "cmd vpn_connect cmd = " +localStringBuffer3.toString());
        runCommand localrunCommand2 = new runCommand(localStringBuffer3, 0);
        localrunCommand2.setDaemon(true);
        localrunCommand2.start();
        try
        {
          Thread.sleep(1000L);
        }
        catch (InterruptedException localInterruptedException)
        {
            localInterruptedException.printStackTrace();
        }
      }
        if (this.android_version <= 10)
        {
          localStringBuffer1.append(str3 + " pptp ");
          localStringBuffer1.append(this.host.toString().trim() + " ");
          localStringBuffer1.append(str2.toString().trim() + " '' ");
        }
        else {
            localStringBuffer1.append(str3 + " " + this.inter.toString().trim() + " pptp ");
            localStringBuffer1.append(this.host.toString().trim() + " ");
            localStringBuffer1.append(str2.toString().trim() + " ");
        }
          localStringBuffer2.append(" &\n");
          localStringBuffer1.append(localStringBuffer2);
       
          if (!(((!str4.equals("L")) && (!str4.startsWith("5."))) || (getDeviceName().startsWith("Samsung")) || (getDeviceName().startsWith("OnePlus")))) {
         runCommandAndroidL localrunCommandAndroidL = new runCommandAndroidL(localStringBuffer1, 0);
              localrunCommandAndroidL.setDaemon(true);
              localrunCommandAndroidL.start();
          }
          else {
              runCommand localrunCommand1 = new runCommand(localStringBuffer1, 0);
              localrunCommand1.setDaemon(true);
              localrunCommand1.start();
          }





0 0
原创粉丝点击