可以使用VpnService实现来捕获和发送数据包吗?

时间:2012-02-08 18:49:05

标签: android

我正在考虑使用新的android(4.0)VpnService接口来实现简单的数据包捕获和分析的可能性。有谁知道是否可以在VpnService实现中获取您收到的数据包并将其写入活动/默认网络设备?当然,要接收数据,我必须能够从网络设备中读取数据。如果可能,可以使用哪些API写入网络设备?

2 个答案:

答案 0 :(得分:8)

tPacketCapture为远程计算机创建第二个套接字以转发数据包。我使用tPacketCapture查看了adb shell netstat

Proto Recv-Q Send-Q Local Address              Foreign Address            State 
tcp        0      0 192.168.1.126:49828        97.74.42.79:80             ESTABLISHED
tcp6       0      0 ::ffff:127.0.0.1:5000      :::*                       LISTEN
tcp6       0    522 ::ffff:10.8.0.1:50294      ::ffff:97.74.42.79:80      ESTABLISHED
tcp6       0      0 ::ffff:192.168.1.126:34210 ::ffff:74.125.141.188:5228 ESTABLISHED
tcp6       0      1 ::ffff:192.168.1.126:43379 ::ffff:74.125.224.174:80   CLOSE_WAIT
tcp6       0      1 ::ffff:192.168.1.126:60217 ::ffff:74.125.239.14:443   CLOSE_WAIT

注意97.74.42.79:80两次。

猜猜除非有人有更好的主意,否则我必须这样做。

答案 1 :(得分:6)

我使用过VPN API。您有一个tun设备,您可以在其中指定路由。但阅读完之后,你需要自己处理这些数据包。通常这意味着将它们交给VPN服务器。 Android SDK提供了一个简单的ToyVPNServer示例。

但是,如果没有实现VPN,那么简单的类似pcap的接口很难(甚至可能)实现。

可以解析TCP / UDP标头创建一个具有相同src / dest端口/ ip的自己的套接字,在此套接字上使用protect(),以便它不通过tun0路由。由于tPacketCapture仅支持udp / tcp而不支持icmp,因此可能会使用此方法。