Android VpnService,包转发

时间:2014-02-20 14:02:33

标签: android tcp vpn packet packet-capture

我正在创建基于ToyVPN的应用程序来捕获tcp / udp数据包。 我在我的应用程序中获取传出数据包后,我想将它们转发到原始目标。我已设法从标头获取目标IP和端口,但我不知道如何与远程服务器通信,然后将响应写回源。我认为这是可能的,因为有app。这是我的第一次尝试:

private void runVpnConnection() throws Exception {
configure();

FileInputStream in = new FileInputStream(mInterface.getFileDescriptor());
FileOutputStream out = new FileOutputStream(
        mInterface.getFileDescriptor());

// Allocate the buffer for a single packet.
ByteBuffer packet = ByteBuffer.allocate(32767);
boolean ok = true;

while (ok) {
    Socket tcpSocket = SocketChannel.open().socket();
    try {
        // Read the outgoing packet from the input stream.
        int length = in.read(packet.array());
        if (length > 0) {

            Log.i(TAG, "-------------------New packet: " + length);
            packet.limit(length);

            // here i get destIP and destIP

            InetAddress serverAddr = InetAddress.getByName(destIP);
            SocketAddress socketadd = new InetSocketAddress(serverAddr,
                    destPort);

            protect(tcpSocket);

            OutputStream outBuffer = tcpSocket.getOutputStream();

            outBuffer.write(packet.array());
            outBuffer.flush();
            // outBuffer.close();
            packet.clear();
        }

        if (tcpSocket.isConnected()) {
            InputStream inBuffer = tcpSocket.getInputStream();
            DataInputStream inStream = new DataInputStream(inBuffer);
            Log.i(TAG, "Response length " + inStream.available());
            if (inStream.available() > 0) {
                Log.i(TAG, "Server says " + inStream.readUTF());
                inStream.readFully(packet.array());
                out.write(packet.array());
                inBuffer.close();
            }
            out.flush();
        }
        packet.clear();
        // Thread.sleep(50);
    } catch (Exception e) {
        e.printStackTrace();
        Log.e(TAG, e.toString());
        ok = false;
    }
    tcpSocket.close();
}
in.close();
out.close();
}

1 个答案:

答案 0 :(得分:3)

显然tPacketCapture将流量路由到手机上运行的另一个界面,并将所有这些流量发送到互联网(这与使用VPNService的mobiwol,greyshirts和其他应用程序相同)。

如果您运行(并了解)ToyVPN,您知道手机的所有流量都会进入服务器(您的计算机),您可以在其中配置iptables以将所有流量发送到互联网。

如果你想在没有服务器的情况下运行,你必须在手机上做同样的事情。来自another question:

  

当我看到mobiwol与" adb shell netcfg"的联系时。它创建一个10.2.3.4/32地址的tun0接口。它将所有程序包路由到此专用网络并发送到Internet。

因此,基本上从您的应用中,您必须将手机配置为充当其自己的服务器。