【问题标题】:Android VpnService with multiple addresses and routes?具有多个地址和路由的 Android VpnService?
【发布时间】:2015-08-29 18:16:28
【问题描述】:

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

由于 Android 将您限制为单个 vpn 接口,我为每个虚拟网络调用一次 VpnService.Builder.addAddress()VpnService.Builder.addRoute(),然后调用 establish()。调用establish() 后,我可以从两个虚拟网络上的其他设备对每个分配的地址ping Android 设备,但是我只能路由到Android 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 条目都在路由表中

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 vpn


    【解决方案1】:

    看来我在 Android 中遇到了错误。

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

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

    【讨论】:

      猜你喜欢
      • 2019-01-11
      • 2017-12-03
      • 2020-05-06
      • 1970-01-01
      • 2020-08-08
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      相关资源
      最近更新 更多