带有VpnService的Android防火墙

时间:2013-11-27 08:55:54

标签: java android networking packet-capture tun

我正在尝试使用VpnService为BS项目实现一个简单的Android防火墙。我选择VpnService是因为它将在非root设备上运行。它将记录连接并让您过滤连接。 (基于IP)

有一个应用程序这样做是可能的。

Google play app store

我做了一些研究,发现VpnService创建了一个Tun接口。而已。 (没有VPN实现只是一个隧道)它允许您为此接口添加地址并添加路由。它返回一个文件描述符。您可以读取传出的包并写入传入的包。

我创建了一个VpnService派生类,我开始服务。我可以使用VpnService.Builder类配置tun0。当我查看与mobiwol's的{​​{1}}连接时,它会创建一个带有10.2.3.4/32地址的adb shell netcfg接口。它将所有程序包路由到此专用网络并发送到Internet。我也在尝试。创建了10.0.0.2/32地址的接口。添加了具有addRoute功能的路由。 0.0.0.0/0所以据我所知,我可以从所有网络捕获所有包。 (我对这个主题很新,还在学习。我在互联网上找到了作品,所以我不太确定。如果我错了,请纠正我。)

我在服务中创建了2个线程。一个从文件描述符读取并使用受保护的套接字将其写入127.0.0.1。 (我不确定我是否应该读/写127.0.0.1。也许这就是问题。)

我分析了从文件描述符中读取的数据包。例如:

tun0

我没有在其余数据中找到任何其他IP标头。我认为应该在10.0.0.2网络到本地网络(192.168.2.1)和互联网之间进行封装。我不确定。

我真正的问题是我坚持传入的包线程。我看不懂任何东西。没有反应。正如您在屏幕截图中看到的,没有传入数据:

screenshot

我正在尝试从我用于写入带有受保护套接字的127.0.0.1的相同连接中读取。

Android< - > Tun接口(tun0)< - >互联网连接

所有套餐< - > 10.0.0.2< - > 127.0.0.1? < - > 192.168.2.1< - >因特网?

我找不到任何关于VpnService的帮助。 (ToyVPN示例是无用的)我阅读有关Linux Tun / Tap的文档,但它关于主机和远程之间的隧道。我想在同一设备上使用主机和远程设备。不喜欢隧道。

我该怎么做?

编辑:请求的代码。现在还处于初期阶段。正如我之前提到的,它是一个VpnService派生类。在服务线程中创建了2个线程(读写)。

01000101    byte:69     //ipv4 20byte header
00000000    byte:0      //TOS
00000000    byte:0      //Total Length
00111100    byte:60     //Total Length
11111100    byte:-4     //ID
11011011    byte:-37    //ID
01000000    byte:64     //fragment
00000000    byte:0      //"
01000000    byte:64     //TTL
00000110    byte:6      //Protocol 6 -> TCP
01011110    byte:94     //Header checksum
11001111    byte:-49    //Header checksum
00001010    byte:10     //10.0.0.2
00000000    byte:0
00000000    byte:0
00000010    byte:2
10101101    byte:-83    //173.194.39.78 //google
00111110    byte:-62
00100111    byte:39
********    byte:78

10110100    byte:-76    // IP option
01100101    byte:101
00000001    byte:1
10111011    byte:-69
                //20byte IP haeder
01101101    byte:109
.       .       //40byte data (i couldnt parse TCP header, 
                    I think its not needed when I route this in IP layer)
.       .
.       .
00000110    byte:6

2 个答案:

答案 0 :(得分:17)

A similar question was asked a few months ago,虽然答案并不十分有洞察力,但已接受答案中的评论会对可能出现的问题有所了解。

你应该记住你的逻辑所在的the OSI model中的哪一层:

  • VpnService的传入和传出流都在网络层;您正在接收(并且应该继续传输)原始IP数据包,正如您在问题中所描述的那样。

    在您的示例字节流中,您可以看到传入的字节流是IPv4数据报,因为前四位是0100(4)。有关IPv4的详细信息,请参阅this packet structure specification

  • 转发请求时,您处于应用程序层;你应该分别使用DatagramSocket或Socket传输UDP或TCP有效载荷的内容(即只有它们的数据,而不是标题本身)。

    请记住,这会跳过传输层,因为这些实现负责构建UDP头(如果是DatagramSocket)和TCP头和选项(如果是Socket)。

您的应用程序基本上需要能够解释和构建IPv4和IPv6标头和选项,以及IP有效负载,UDP标头和TCP标头和选项。

答案 1 :(得分:0)

也许最好寻找像OpenVpn 这样的开源项目。它适用于没有Root Access的API级别14+(Ice Cream Sandwhich)。