Android 具有多个地址和路由的 VpnService?

Android VpnService with multiple addresses and routes?

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

由于 Android 将您限制为单个 vpn 接口,我为每个虚拟网络调用一次 VpnService.Builder.addAddress()VpnService.Builder.addRoute(),然后调用 establish()。调用 establish() 后,我可以从两个虚拟网络上的其他设备对每个分配地址上的 Android 设备执行 ping 操作,但是我只能路由到 [=35] 中的一个虚拟网络=] OS。

是否可以使用 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条目都在路由中table

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

看来我 运行 遇到了 Android 中的错误。

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

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