使用VpnService来阻止某些IP(KitKat vs 4.3及以下版本)

时间:2014-09-03 10:12:47

标签: android networking vpn

早上的人,

我尝试修改VPN示例(ToyVPN)以作为简单的防火墙来阻止某些传出流量。我决定采用以下方式:

  • 仅为某些IP创建VPN连接
  • 在VPN处理代码中不执行任何操作:)

这似乎比评估数据包更容易,并根据其内容采取行动。

这似乎适用于Android 4.3,但在4.4我收到错误:

...
09-03 06:02:11.340    1806-1897/com.example.android.toyvpn E/ToyVpnService﹕ Got java.lang.IllegalStateException: command '43 interface fwmark rule add tun0' failed with '400 43 Failed to add fwmark rule (No such device)'command '43 interface fwmark rule add tun0' failed with '400 43 Failed to add fwmark rule (No such device)'
...

这是我的VpnService Builder代码:

    Builder builder = new Builder();
    builder.setMtu(30000);
    builder.addAddress("10.0.0.1",24);
    builder.addRoute("212.77.100.101",32); // this is a sample IP I use for tests 

    mInterface = builder.setSession(mServerAddress)
            .setConfigureIntent(mConfigureIntent)
            .establish();

运行代码我什么也没做:

while (true){
            Thread.sleep(1000);
            Log.e(TAG,"Running");
           }

结果我得到了我想要的东西 - 我手动输入的IP的流量被路由到/ dev / null类接口:)

我确信我的KitKat问题与Android 4.4中的一些错误/问题有关(例如https://code.google.com/p/android/issues/detail?id=63349但有更多与VPN相关的问题)。

但我知道我尝试实现的目标是可行的 - https://play.google.com/store/apps/details?id=com.netspark.firewall是一个在我的4.4手机上运行良好的证据。它通过VpnService完成,因为使用此应用程序时会出现相同的VPN弹出窗口。

你能帮我理解我做错了什么以及如何让VpnService在4.4上运行......不是真的要做VPN,而是做一些简单的防火墙。

这一切都适用于非root设备。

PS。我可以通过这种方式添加到VpnService的IP(IP子网)数量有限制吗?

1 个答案:

答案 0 :(得分:-1)

我hava做这个问题,首先你必须了解android VpnService给你ParcelFileDescriptor,在这个你可以获得ip包,它可以转换为Linux iphdr *指针,所以你得到包srcIP和dstIP dstPort,你可以选择丢弃或流量此数据包。如果您有其他问题,可以从ip数据包构建tcp或udp数据包,在此级别,您可以获得主机IP和网站。