通过 USB 反向绑定多个 Android 设备

Reverse tethering of several Android devices via USB

我正在尝试为我的 android 应用程序设置一个测试环境,其中单独的设备需要互联网连接,但没有无线功能。

所以我决定使用 USB 反向网络共享。我的主机是 运行 Ubuntu。我已经设法为一台设备设置反向网络共享,连接正常,我可以从该设备的 adb shell.

ping google.com

当我连接第二个设备时,第一个网络共享停止工作。 两个设备在其内部 USB0 接口上配置了相同的 IP 地址。

这是我目前的情况:

  1. 主机上的端口转发已激活

    echo 1 > /proc/sys/net/ipv4/ip_forward
    
  2. 主机上用于路由流量的 Iptables 规则:

    iptables -t nat -A POSTROUTING -s 169.254.255.2/24 -j MASQUERADE
    
  3. 插件第一台设备:

    ifconfig shows the device on usb0 @ ip 169.254.255.2/30
    
  4. 在第一台设备上(使用 adb shell)

    > route add default gw 169.254.255.2 dev usb0
    > setprop net.dns1 8.8.8.8
    > ping google.com --> is giving results
    
  5. 插件第二个设备

    ifconfig shows this device on usb1 @ ip 169.254.255.2/30 
    
  6. 在第二台设备上

    Add gw, set DNS like above
    

现在第二个设备可以ping google.com,但是第一个不行。

当我更改内部 IP 或分配给主机 usb0、usb1 接口的 IP 时,我无法再通过 adb 连接到设备。

我怀疑这是网络问题,而不是 ADB 的问题?有任何想法吗?

经过大量谷歌搜索和反复试验,我终于找到了适合我的特定设置的解决方案。

我最后所做的,也是我在第一次尝试中遗漏的,是将每个连接的 USB 设备放入一个单独的子网中(参见 this answer on serverfault)。

说清楚一点,现在的设置如下:

  1. iptables 包含以下规则

    iptables -t nat -A POSTROUTING -j MASQUERADE
    
  2. 主机的 usb0 和 usb1 接口,现在在不同的子网中

    usb0: inet addr:169.254.0.1  Bcast:169.254.15.255  Mask:255.255.240.0
    usb1: inet addr:169.254.16.1  Bcast:169.254.31.255  Mask:255.255.240.0
    
  3. Android 设备的内部 usb0 iface 连接到主机的 usb0:

    - usb0 169.254.0.2/20
    - default gw 169.254.0.1 (so the host's usb0 iface)
    
  4. Android 设备的内部 usb0 iface 连接到主机的 usb1:

    - usb0 169.254.16.2/20
    - default gw 169.254.16.1 (so the host's usb1 iface)
    

这样我现在可以从每个连接到我主机上的 USB 接口的 android 设备访问互联网(在 adb shell setprop net.dns1 8.8.8.8 之后)。

您需要一个具有 root 访问权限的 linux 系统、root android phone 和 USB 数据线。

步数

  1. 在您的 linux 系统中安装 adb 和 fastboot。

    sudo apt-get install android-tools-adb android-tools-fastboot

  2. 通过 USB 将您的 android phone 连接到您的 PC,并从 phone.
  3. 的设置中启用 USB 网络共享
  4. 在您的 PC 中打开终端并输入下面给出的命令。
  5. 找出在您的 PC 上创建的新网络接口。

    ifconfig

    一般新的网络接口是usb0或usb1。让我们考虑 usb0.

  6. 现在为这个新接口 usb0 创建一些静态 IP 地址。

    sudo ifconfig usb0 10.42.0.1 netmask 255.255.255.0

  7. 现在将这个新接口 usb0 设为共享连接。

    echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

  8. 现在对 iptables 防火墙进行一些更改。

    sudo iptables -t nat -F sudo iptables -t nat -A POSTROUTING -j MASQUERADE

  9. 现在我们要在androidphone中输入一些命令。我们可以使用 adb 或通过安装在 phone 中的终端仿真器直接键入 android phone 中的命令。我用的是adb方式

  10. 在androidphone中找到网络接口。

    adb shell busybox ifconfig

    我的是 rndis0.

  11. 设置静态 IP、网络掩码和网关。

    adb shell ifconfig rndis0 10.42.0.2 netmask 255.255.255.0 adb shell route add default gw 10.42.0.1 dev rndis0

  12. 验证您 phone 上的互联网连接。

    adb shell ping 8.8.8.8

    如果能 ping 通,则说明您的手机网络正常。

此互联网连接不适用于 opera mini 和 paytm 等应用程序,但适用于 whatsapp。