Linux 系统使用 HTC Internet pass-through

HTC 手机有三种类型的 Tether:Usb Tether (使用 USB 连接线使得PC通过手机上网)、Wifi Tether (使用 Wifi 连接使得PC通过手机上网)、Usb Internet pass-through (通过 USB 连接线使用手机通过PC上网)。

Usb Tether 在 Linux 系统上的支持很好,只要内核编译了 rndis_host 模块,PC上就会多出一个网络接口,手机将会通过 DHCP 协议为接口分配地址,设置网关与 DNS 等等。Wifi Tether 就更简单一些,基本上等同于 Usb Tether。

Usb Internet pass-through 就显得复杂了一些,基本的工作原理是这样的,在手机端启用这个模式后与 Usb Tether 类似,PC上就会多出一个网络接口(这时需要配置PC的网络管理器只使用 DHCP 协议分配地址,而不需要设置网关与DNS等等),手机将需要 PC 给它提供网关与 DNS 服务。在 PC 端完成这些服务的启动工作后,要通过激活协议,通知手机已经完毕,然后向手机端的 IP:6000 地址端口对发送一个 UDP 协议的激活指令,手机收到后即会使用这个命令的源地址作为网关与DNS服务器。

网关服务在 Linux 系统中非常容易实现的,两条命令即可完成:

sudo sysctl net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE # ppp0 是 PC 端 Internet 出口网络接口名称

DNS 服务在 Linux 系统中也有很多实现,不过如果是访问 Internet 的话,还是使用 Iptables 转到 8.8.8.8 解决更简便:

sudo iptables -t nat -A PREROUTING -i usb0 -p udp -m udp --dport 53 -j DNAT --to-destination 8.8.8.8:53

最后是一个简单的 htcnat 激活程序:https://github.com/heiher/htcnat

这个程序有一个参数 -a,即是指令手机的 IP 地址,这个地址可以通过 usb0 接口的 DHCP lease 信息表中获得或是查看 arp 表(/proc/net/arp),属于 usb0 接口的记录应该只有一条,即是手机的地址。如果是使用的 NetworkManager,那个就:

ps aux | grep usb0
# Example
cat /var/lib/dhclient/dhclient-701960d9-cad4-4f6d-acd9-fdc40a0ff89f-usb0.lease
# option dhcp-server-identifier 192.168.99.200; 即是手机的IP

PHONE_IP=`grep -e "usb0" /proc/net/arp | grep -oP "\d+\.\d+\.\d+\.\d+"`
 
./htcnat -a ${PHONE_IP}

Over!

2 thoughts on “Linux 系统使用 HTC Internet pass-through”

Leave a Reply

Your email address will not be published. Required fields are marked *