从VPN Service + Packets阻止[Android]检测应用程序请求

时间:2014-11-06 18:13:35

标签: java android vpn

我试图弄清楚我的设备上的哪个应用程序已经发出了任何互联网使用请求(称为任何api等)。为此我创建了一个扩展自" VpnService"的类。我只是为了确保我的设备流量通过我的路线,虽然我实际上并没有连接到VPN,而是假装它并让流量通过我到0.0.0.0。代码如下,它工作正常,但我想弄清楚哪个应用程序已启动使用互联网的请求或其数据包是在下面的主循环中进/出。此外,有没有办法可以停止来自任何应用程序的请求 - 无论是[传入和传出]?

    *private Thread mThread;
private ParcelFileDescriptor mInterface;
//a. Configure a builder for the interface.
Builder builder = new Builder();
// Services interface
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    this.getApplicationInfo();
    // Start a new session by creating a new thread.
    mThread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                //a. Configure the TUN and get the interface.
                mInterface = builder.setSession("MyVPNService")
                        .setMtu(1500)
                        .addAddress("192.168.1.66", 32)
                        .addRoute("0.0.0.0", 0).establish();
                //b. Packets to be sent are queued in this input stream.
                FileInputStream in = new FileInputStream(
                        mInterface.getFileDescriptor());
                //b. Packets received need to be written to this output stream.
                FileOutputStream out = new FileOutputStream(
                        mInterface.getFileDescriptor());
                //c. The UDP channel can be used to pass/get ip package to/from server
                DatagramChannel tunnel = DatagramChannel.open();

                // Connect to the server, localhost is used for demonstration only.
                tunnel.connect(new InetSocketAddress("127.0.0.1", 8087));
                //d. Protect this socket, so package send by it will not be feedback to the vpn service.
                protect(tunnel.socket());               
//                  ByteBuffer packet = ByteBuffer.allocate(32767);



//e. Use a loop to pass packets.
                    while (true) {
//---> Here in this loop the packets are coming in and out..
                        }
                    }
                } catch (Exception e) {
                    // Catch any exception
                    e.printStackTrace();
                } finally {
                    try {
                        if (mInterface != null) {
                            mInterface.close();
                            mInterface = null;
                        }
                    } catch (Exception e) {
                    }
                }
            }
        }, "MyVpnRunnable");
        //start the service
        mThread.start();
        return START_STICKY;
    }*

Reno Jones

3 个答案:

答案 0 :(得分:1)

我担心只有在VpnService的帮助下才能做到这一点。您无法使用普通的VpnService API获取必要的信息。

然而,这对于iptables(当然还有根电话......)来说是微不足道的:这样:

iptables -t mangle -A PREROUTING -m owner --uid-owner bad_app_uid -j DROP

您需要

  1. 根电话
  2. 使用所有必要的扩展编译自己的iptables二进制文件
  3. 在Java中构建iptables命令行
  4. run iptables
  5. 我不知道阻止每个应用的传入流量 - 但似乎没有必要。

    如果您想尝试一下,https://github.com/shadowsocks/shadowsocks-android编译iptables,我猜也可能会为您运行。顺便说一句,我与上述应用程序无关。

    编辑:Android 5.0 VpnService有几个新的API,例如addAllowedApplicationaddDisallowedApplication,但是"禁止"这里只表示指定的应用程序将绕过VPN。

答案 1 :(得分:0)

TrafficStats可以告诉您一段时间内哪个应用访问了互联网。然后使用iptables阻止特定应用的互联网访问。

答案 2 :(得分:0)

我能够在" StrongSwan"的帮助下解决这个问题。码。

感谢Strongswan团队。