Android VpnService有多个地址和路由?

时间:2015-06-14 01:01:19

标签: android vpn

我正在开发Android应用程序版本以连接到软件定义的网络。它背后的本机代码支持一次连接多个虚拟网络,我正在将其改编为Android的VpnService。

由于Android将您限制为单个vpn界面,因此我为每个虚拟网络拨打VpnService.Builder.addAddress()VpnService.Builder.addRoute()一次,然后致电establish()。调用establish()后,我可以在两个虚拟网络上的其他设备上为每个分配的地址ping Android设备,但是我只能路由到Android操作系统中的某个虚拟网络。

是否可以使用VpnService.Builder为tun接口分配多个地址和路由?

更新:2015年6月15日

事情似乎正在正确配置。在日志和adb shell中查看,我有tun0和tun0:1

# ifconfig tun0
tun0: ip 10.248.13.87 mask 255.255.240.0 flags [up point-to-point running]
# ifconfig tun0:1
tun0:1: ip 29.182.13.87 mask 254.0.0.0 flags [up point-to-point running]

两个TUN条目都在路由表中

Iface   Destination     Gateway         Flags   RefCnt  Use     Metric  Mask            MTU     Window  IRTT

eth0    00000000        0202000A        0003    0       0       0       00000000        0       0   0

eth0    0002000A        00000000        0001    0       0       0       00FFFFFF        0       0   0

tun0    0000F80A        00000000        0001    0       0       0       00F0FFFF        0       0   0

tun0    0000001C        00000000        0001    0       0       0       000000FE        0       0   0

然而,只有两条路线中的一条可以到达。这是对VPN连接另一端的两台主机的ping:

ping -c 4 10.248.4.247
PING 10.248.4.247 (10.248.4.247) 56(84) bytes of data.
64 bytes from 10.248.4.247: icmp_seq=1 ttl=128 time=126 ms
64 bytes from 10.248.4.247: icmp_seq=2 ttl=128 time=93.5 ms
64 bytes from 10.248.4.247: icmp_seq=3 ttl=128 time=73.5 ms
64 bytes from 10.248.4.247: icmp_seq=4 ttl=128 time=53.4 ms

--- 10.248.4.247 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3029ms
rtt min/avg/max/mdev = 53.492/86.826/126.702/27.026 ms
root@generic_x86:/proc/net # ping -c 4 29.95.148.247
ping -c 4 29.95.148.247
PING 29.95.148.247 (29.95.148.247) 56(84) bytes of data.

--- 29.95.148.247 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3013ms

1 个答案:

答案 0 :(得分:0)

我似乎遇到了Android中的错误。

在挖掘连接两端的tcpdump日志后,我发现路由到tun0:1的数据包将IP Header中的源IP设置为tun0的IP地址。

在编写代码以替换IP数据包中的源IP和校验和之后,ICMP ping现在可以正常工作。我还需要对TCP和UDP数据包执行相同的操作。