将Linux板卡配置为交换机或路由器,提供类似路由器的上网功能。这里以4G网卡作为WAN进行上网。
先配置好4G模块为默认路由网关。
这里需要先将4G模块配置为路由模式。4G模块路由模式和网卡模式的区别在于,拨号成功后,路由模式下usb0网卡分配到的IP地址是局域网IP(192.168.x.x),而网卡模式分配的IP是公网IP地址(10.21.26.197)。
断开板卡的有线和无限网络连接,使用ping baidu.com
测试,如果能上网说明4G模块网络配置已经正常。否则,需要使用ip route
配置4G模块为默认网关,并保证4G模块已经拨号能正常上网。
参考: https://blog.csdn.net/duapple/article/details/127001192?spm=1001.2014.3001.5501
将4G模块的usb0
网卡和其它网口桥接。我这里板卡上有两个以太网口,实验只是用一个网口,因此只桥接一个,用于连接电脑进行测试。
brctl addbr br0
brctl addif br0 usb0
brctl addif br0 eth0
ifconfig eth0 0.0.0.0
ifconfig usb0 0.0.0.0
ifconfig br0 up
然后需要将br0的IP配置成和4G模块在一个网段。第一步骤中usb0上网会有一个局域网IP:192.168.43.100
。这里可以将br0的IP配置为这个:
ifconfig br0 192.168.43.100/24
再将br0网卡设置为默认路由:
ip route add default via 192.168.43.1 dev br0
然后应该能ping通4G模块网关192.168.43.1
,再ping baidu.com应该也是能通的。
这里通过以太网将电脑和Linux板卡连接,将PC以太网适配的地址配置为和br0一个网段,网关地址配置为4G模块的网关地址192.168.43.1
。DNS地址配置114.114.114.114
。注意禁掉其它能上网的网络适配器,比如无线网卡,防止影响测试。
这个时候可能还无法上网。先在windows上ping Linux板卡的br0网卡地址192.168.43.100
,通了以后再ping网关地址192.168.43.1
。通了以后再ping baidu.com。通了以后整个网络就通了。开始网络不通的原因可能是地址学习才开始进行导致网络不稳定,开始反复ping baidu.com网络都是时好时坏,甚至丢包。后面稳定了就好了。
这个时候,只要使用网线连接Linux板卡,在手动配置一下IP,就可以使用Linux板卡上的4G模块进行上网了。
参考:https://codeantenna.com/a/4ZBrXkM9Zy
需要使用iptables来配置NAT,完成转发。
NAT由内核模块netfilter
来完成,iptables
是用户空间的工具,两者需要搭配使用。
先在内核中配置netfilter
。
注意需要开启:<*> IPv4 connection tracking support (required for NAT)
才能看到-*- IPv4 NAT
和<*> iptables NAT support
。
配置完成后重新编译烧录内核。
这个文件系统一般自带有。如果没有,使用交叉编译工具链自己编译,再放到开发板。为避免其它库libmnl
的引入,交叉编译配置加参数--disable-nftables
。
配置地址转发,先开启转发:
echo "1" > /proc/sys/net/ipv4/ip_forward
然后配置:
iptables -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o usb0 -j MASQUERADE
不报错即可。
依然需要保证4G模块能正常上网。
这里将4G模块配置为网卡模式。以quectel
的4G模块为例,AT指令为AT+QCFG="NAT",1
,配置完成后需要重启才能生效。重启,完成拨号后,4G模块会分配到类似公网IP的IP地址(10段开头的地址)。
然后将4G模块的usb0
网卡配置为默认路由。一般在上面的拨号完成后,系统会自动配置路由表。
root@ATK-IMX6U:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.40.163.52 0.0.0.0 UG 0 0 0 usb0
10.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 usb0
10.40.163.52 0.0.0.0 255.255.255.255 UH 0 0 0 usb0
183.230.126.224 10.40.163.52 255.255.255.255 UGH 0 0 0 usb0
183.230.126.225 10.40.163.52 255.255.255.255 UGH 0 0 0 usb0
192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
我的系统就被自动配置了多条规则。
然后ping baidu.com
没有问题,那么就算是成功了。
root@ATK-IMX6U:~# ping baidu.com
PING baidu.com (110.242.68.66) 56(84) bytes of data.
64 bytes from 110.242.68.66: icmp_seq=1 ttl=48 time=59.1 ms
64 bytes from 110.242.68.66: icmp_seq=2 ttl=48 time=57.4 ms
64 bytes from 110.242.68.66: icmp_seq=3 ttl=48 time=55.5 ms
64 bytes from 110.242.68.66: icmp_seq=4 ttl=48 time=67.4 ms
^C
--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 55.571/59.903/67.421/4.522 ms
如果ping不同baidu,那么修改/etc/resolv.conf
,添加如下内容:
nameserver 114.114.114.114
nameserver 127.0.0.1
再ping就应该没有问题了。
除了4G模块的网络配置,还需要配置客户机和客户机相连的网口。
需要将Linux板卡和客户机相连的网口(eth0)配置网关地址,如192.168.10.1
。否则,客户机无法上网。
这里客户机使用PC Windows。客户机需要和Linux板卡相连的IP设置在同一个网段,如192.168.10.200
,网关地址设置为192.168.10.1
。此时已经可以上网,qq能网络是通的。
但是ping baidu不成功,浏览器访问baidu也不成功,这里把DNS地址设置一下,设置成114.114.114.114
。然后再ping baidu,发现已经可以通了,浏览器访问也没有问题了。
C:\Users\28328>ping baidu.com
正在 Ping baidu.com [110.242.68.66] 具有 32 字节的数据:
来自 110.242.68.66 的回复: 字节=32 时间=58ms TTL=47
来自 110.242.68.66 的回复: 字节=32 时间=79ms TTL=47
来自 110.242.68.66 的回复: 字节=32 时间=73ms TTL=47
来自 110.242.68.66 的回复: 字节=32 时间=55ms TTL=47
110.242.68.66 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 55ms,最长 = 79ms,平均 = 66ms
注意:一样的,测试时需要禁用掉其他能上外网的网卡,防止影响测试。