1. 安装工具

1
2
$ sudo apt-get update
$ sudo apt-get install iptables

2. 开启AP热点

img

img

img

点击Turn On开启AP热点

img

通过手机输入WiFi热点密码正常连接(此时还未共享4G网络)

3. 将4G网络共享至AP热点

3.1. 4G拨号

执行以下命令,等待4G成功拨号

1
$ quectel-CM &

img

img

确认拨号成功后,4G模块可以成功ping通外网

img

注:这里需要先将4G模块配置为路由模式。4G模块路由模式和网卡模式的区别在于,拨号成功后,路由模式下usb0网卡分配到的IP地址是局域网IP(192.168.x.x),而网卡模式分配的IP是公网IP地址(10.21.26.197)。

这里使用的4G模块为EC20,默认为开发板的/dev/ttyUSB2节点。

EC20有4种上网模式,可以通过如下指令切换模式。

1
2
3
$ cat /dev/ttyUSB2 &
$ echo -e "AT+QCFG=\"usbnet\",0\r\n" > /dev/ttyUSB2 #设定模式0-3
$ echo -e "AT+CFUN=1,1\r\n" >/dev/ttyUSB2 #重启模块

四种模式分别为:

  • 0 RMNET接口,通过QMI工具发的QMI命令,获取公网IP。
  • 1 ECM接口,通过标准的CDC-ECM发起data call,是发送标准的ECM命令,获取局域网ip。
  • 2 MBIM接口,Mobile Broadband Interface Model,正宗的移动宽带接口模型,专门用于3G/4G/5G模块的,只在win8以上的windows上使用。
  • 3 RNDIS接口,基于USB实现RNDIS实际上就是TCP/IP over USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡获取局域网ip。

也可以通过以下命令查看当前模块为哪种模式下:

1
2
$ cat /dev/ttyUSB2 &
$ echo -e "AT+QCFG=\"usbnet\"\r\n" > /dev/ttyUSB2 #设定模式0-3

若要将4G模块配置为路由模式,可以指定4G模块上网模式为ECM模式。

1
2
3
$ cat /dev/ttyUSB2 &
$ echo -e "AT+QCFG=\"usbnet\",1\r\n" > /dev/ttyUSB2 #配置为模式1
$ echo -e "AT+CFUN=1,1\r\n" >/dev/ttyUSB2 #重启模块

等待模块重启,在ECM模式下不需要执行quectel-CM命令手动拨号。

模块成功重启,4G网卡名称可能变为enxxx,执行以下命令可以解决4G网卡名称变为enxxx问题。

1
2
3
4
$ ln -srf /dev/null /etc/udev/rules.d/80-net-setup-link.rules
# 执行完以上命令后重启开发板生效
$ reboot
# 成功重启完4G模块自动拨号,4G网卡名称变为USB0

3.2. 共享网络

将wwan0网口的数据转发到wlan0,使AP设备能通过以太网上网:

1
2
3
4
5
6
7
8
9
10
11
12
13
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -t nat -A POSTROUTING -o wwan0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

若执行iptables命令有如下报错信息iptables/1.8.7 Failed to initialize nft: Protocol not supported,通常是因为系统默认使用了nftables而不是 iptables,但内核并不支持 nftables

解决方法:

可以通过切换到iptables-legacy来解决这个问题。

1
2
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy

切换成功后,回到起初报错的指令重新执行即可。

完成以上步骤,4g热点即可共享至wifi热点,重新连接WiFi后也可访问外网。

img