以下是 5G 终端接入家庭局域网的示意图:
动机是一次手机测速过程中发现 5G 蜂窝网络约有 500Mbps 的速度,于是希望找到一种方式把蜂窝网络接入到家庭局域网,并且提供一种能够让家庭局域网的其它上网设备按需访问蜂窝网络的方式。
以下是大致思路或步骤:
在 Linux 上可以通过 usbmuxd 使操作系统访问到 iPhone 的 USB 个人热点,结合 kernel 的 ipheth 模块,iPhone 连接好之后系统会自动创建一个对应的虚拟网卡(可通过 ip link
命令查看,一般是 enx
开头的),可以通过 dhclient -v <网卡名称>
命令为其申请 IP 地址,之后 iPhone 应该会显示热点已处于被连接的状态。确保 iPhone 的个人热点功能已打开,如果 DHCP lease 申请失败,愿意继续尝试的可以手动还原 iPhone 的网络设置并重启后再试。
这时可以验证这块 ipheth 网卡能 ping 通因特网上的其它主机,例如:ping -I enx5204 www.baidu.com
,在某些运营商环境下这块网卡也会被分配到公网 IPv6 地址。如果这里失败了先回到第一步或者放弃。
经过上述步骤我们就已经成功把 iPhone 连接到了示意图中的 server 角色,并且 server 已经能借助于 usbmuxd 和 ipheth 软件功能访问到 iPhone 的蜂窝网络。
接下来要解决的是如何让局域网中的其它设备也能按需地使用这个蜂窝网络,可以在 server 上建立一个隧道端点,例如 Wireguard 、IPIP ,或者 VXLAN 等,然后局域网中的上网设备默认用有线宽带网络(示意图中的 ISP1 ),当需要使用蜂窝网络时,通过隧道连接到 server 。
示意图中列举的例子是 Wireguard 方案,客户端通过 Wireguard 连接到服务端之后,手动设定 wg0 网卡的 IP 地址例如 10.0.1.101 ,然后在 server 上进行以下关键配置:
# 启动 IP 封包转发功能,否则 kernel 会丢弃不是自己的包
sysctl -w net.ipv4.ip_forward=1
# 策略路由,根据源地址决定下一跳是哪个
ip rule add from 10.0.1.101/32 table 101
ip route add default via 172.16.10.1 dev enx5204 table 101
# 对 outgoing 流量进行 snat ,否则收不到回包。
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j MASQUERADE
在客户端上我们可以通过 curl 命令测试,假设它的 eth0 网卡接的是 ISP1 的有线宽带,wg0 网卡是连接到 server 的隧道端点,那么以下命令应该会输出不同的 IP:
curl --interface eth0 ifconfig.me # 应当回显自己在 ISP1 的 IP 地址
curl --interface wg0 ifconfig.me # 应当回显自己在 ISP2 (也就是蜂窝网络的 ISP )的 IP 地址
那么接下来客户端就可以通过这个 wg0 网卡来按需使用蜂窝网络。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.