针对部分网络受限的情况,需要将Linux的网络反向共享给移动设备。对于Android,可以通过gnirehtet等软件实现反向共享网络。但iPhone相对封闭,无法通过类似的软件实现该功能。下文将基于此背景,介绍几种Linux反向共享网络给iPhone的方式。
一、方案选型
在“路由器 –> Linux –> iPhone”的网络链路中,Linux作为网络的客户端和服务端,有不同的接入和共享网络的方式,如下所示:
- Linux作为网络客户端(路由器 –> Linux):【有线以太网】、【无线WiFi】。
- Linux作为网络服务端(Linux –> iPhone):【无线WiFi】、【USB】、【蓝牙】。
| 连接方式 | 协议 | 服务端角色 | 客户端角色 | 传输方向 |
|---|---|---|---|---|
| 有线以太网 | IEEE 802.3 | - | - | 路由器 → Linux |
| 无线WiFi | IEEE 802.11 | AP | Station | 路由器 → LinuxLinux → iPhone |
| USB | CDC-ECM / CDC‑NCM | Device | Host | Linux → iPhone |
| 蓝牙 | PAN | NAP | PANU | Linux → iPhone |
对于上述连接方式:
- USB方式暂不考虑:因为Linux的USB口不支持服务端Device模式,无法模拟成iPhone的网卡设备。再加上,iPhone对CDC-ECM/CDC‑NCM的支持情况有待进一步验证。
- 蓝牙方式暂不考虑:因为iPhone不再支持PAN的客户端PANU模式,无法通过蓝牙获取Linux提供的网络。再加上,蓝牙网络传输速率较低。
综上,Linux作为网络服务端,共享网络的方式的有效方式只有一种:无线WiFi。所以讨论的主题开始从“Linux反向共享网络给iPhone”的多种方式,限定为“Linux开启WiFi热点”这一种方式。最终可供选择的连接组合为:
- 有线输入无线输出:Linux连接有线以太网,通过WiFi热点将网络共享给iPhone。
- 无线输入无线输出:Linux连接无线WiFi,通过WiFi热点将网络共享给iPhone。
二、有线输入无线输出
Linux连接有线以太网,通过WiFi热点将网络共享给iPhone。该方式设置起来相对简单,因为不涉及网卡冲突:有线网卡用于Linux的网络输入、无线网卡用于Linux的网络输出。
安装wifi热点工具linux-wifi-hotspot:
sudo pacman -S linux-wifi-hotspot
随后,使用下述命令创建WiFi热点:
sudo create_ap wlan0 enp0s31f6 access_point_ssid passphrase
或者,也可以按照下述流程创建并连接WiFi热点:
- 打开
linux-wifi-hotspot软件。 - 填入【SSID】和【Password】,【Wifi interface】选择【wlan0】,【Internet interface】选择【enp0s31f6】。
- 点击【create hotspot】,左下角显示【Running as PID: xxx】,说明启动成功
- 点击【Open QR】,显示二维码。
- 打开iPhone相机,扫码后点击【加入xxx网络】,访问iPhone上的任意网络应用,验证网络是否正常。
三、无线输入无线输出
Linux连接无线WiFi,通过WiFi热点将网络共享给iPhone。该方式需要同时运行无线网卡的Station模式和AP模式,即:无线网卡同时用于网络的输入和输出。
(1)检查硬件是否支持Station和AP并行模式
# 查看网卡支持模式:输出结果有AP,则说明支持AP模式
iw list | grep -A 8 "Supported interface modes"
# 查看有效网卡组合模式:managed和AP在同一个组里面并且各自的数量>=1,则说明支持Station和AP并行模式
iw list | grep -A 4 "valid interface combinations"
(2)启动Station:关闭NetworkManager并使用wpa_supplicant手工联网
NetworkManager与linux-wifi-hotspot存在冲突,临时关闭NetworkManager:
sudo systemctl stop NetworkManager
使用wpa_supplicant手工联网:
wpa_passphrase HUAWEI-AB5KMB_2.4G 12345678 > /tmp/wpa.conf
sudo wpa_supplicant -B -i wlan0 -c /tmp/wpa.conf
验证网络情况(查看wlan0是否UP,IP是否正常显示):
ip a
另外,后续若需要还原NetworkManager,只需杀掉wpa_supplicant进程,并重新启用NetworkManager即可:
sudo killall wpa_supplicant
sudo systemctl start NetworkManager
(3)启动AP:使用create_ap或linux-wifi-hotspot创建WiFi热点
如果没有安装wifi热点工具linux-wifi-hotspot,安装它:
sudo pacman -S linux-wifi-hotspot
创建WiFi热点:
sudo create_ap wlan0 wlan0 Hotspot666 12345678
或者,也可使用linux-wifi-hotspot界面创建WiFi热点。
随后,可以在iPhone等任意设备WiFi列表中连接该WiFi热点。
(4)不支持5GHz频段的情况说明
由于硬件限制,Linux接入5GHz频段的WiFi网络后,linux-wifi-hotspot/create_ap可能无法创建5Ghz频段的热点,建议切换到2.4GHz频段创建热点。官方说明如下所示:
Support both 2.4GHz and 5GHz (Need to be compatible with your wifi adapter). Ex: You have connected to the 5GHz network and share a connection with 2.4GHz.
Sometimes there are troubles with 5Ghz bands due to some vendor restrictions. If you cannot start the hotspot while you are connected to the 5Ghz band, Unselect Auto and select 2.4Ghz in frequency selection.
但与此同时,根据iw list | grep -A 4 "valid interface combinations"的结果channels <= 1,硬件又要求managed(Station)和 AP共用同一个channel,5GHz和2.4GHz必定不在同一个channel。
因此,针对接入WiFi网络频段是5GHz的场景,如果想开启WiFi热点,只能使用外置网卡,或使用有线接入方式。