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 数据包执行相同的操作。
我正在开发 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 数据包执行相同的操作。