项目场景
有AB两块开发板,其中A开发板有无线网卡可以连接到外网,B开发板无网卡,两个设备通过USB对接,需要实现两个开发板均可上网的需求
(以下解决方案同样也适合于AB两个开发板使用网口对接)
技术方案
基于USB的RNDIS功能在两个设备端虚拟出两块以太网卡,再通过网络的路由转发实现共享网络功能
实施方案
将可以连接外网的设备作为Host,另一个设备作为Device
Host
内核编译支持RNDIS功能。选择 USB_USBNET 和 USB_NET_RNDIS_HOST 宏
内核编译支持NAT功能
连接外网。启动wpa_supplicant服务并使用udhcpc获取IP
设置usb0虚拟网卡IP地址
1
ifconfig usb0 192.168.1.100 broadcast 192.168.1.255 netmask 255.255.255.0
执行以下内容脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# 使能开启路由转发参数
if [[ $(cat /proc/sys/net/ipv4/ip_forward) -ne 1 ]]; then
echo "Enabling IP forwarding..."
echo 1 | tee /proc/sys/net/ipv4/ip_forward
echo 'net.ipv4.ip_forward = 1' | tee -a /etc/sysctl.conf
fi
# 清除NAT表的配置
iptables -t nat -F
# 设置POSTROUTING链的SNAT规则
# 将内部网络的私有 IP 地址转换成公网 IP 地址,以实现内部网络访问互联网的功能。
public_ip="10.1.226.252"
iptables -t nat -A POSTROUTING -o wlan0 -j SNAT --to-source ${public_ip}
# 设置FORWARD链的放行规则(如果系统默认不允许转发)
iptables -A FORWARD -i wlan0 -o usb0 -j ACCEPT
iptables -A FORWARD -i usb0 -o wlan0 -j ACCEPT
echo "NAT forwarding has been configured successfully"
Device
改动脚本文件支持RNDIS功能。将/etc/init.d/S90usb脚本 /etc/init.d/usb/rndis 行的注释打开即可
设置usb0虚拟网卡IP地址
1
ifconfig usb0 192.168.1.101 broadcast 192.168.1.255 netmask 255.255.255.0
添加路由
1
2route add default gw 192.168.1.100
route -n成功连接到外网
iptables命令详解
iptables 是一个用于配置 Linux 内核中网络包过滤和 NAT 功能的命令行工具。它允许管理员定义规则,以控制进出系统的网络数据流量。
查看规则
1
2
iptables -L清空规则
1
iptables -F
添加规则
1
iptables -A <CHAIN> [OPTIONS] <MATCH> <TARGET>
这个命令用于向指定链 (
<CHAIN>
) 添加规则,其中<MATCH>
是匹配条件,**<TARGET>
** 是对匹配条件的动作。例如:1
2
3
# 命令允许来自 **192.168.1.0/24** 子网的数据包通过 INPUT 链
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPTNAT 网络地址
1
iptables -t nat -A POSTROUTING -o <OUT_IF> -j MASQUERADE
参数(简) | 参数(全) | 功能 |
---|---|---|
t | –table | 指定要操作的表,如 filter、nat、mangle |
A | –append | 向指定的链添加规则 |
D | –delete | 从指定的链删除规则 |
I | –insert | 在指定链的指定位置插入规则 |
s | –source | 指定数据包的源 IP 地址 |
d | –destination | 指定数据包的目标 IP 地址 |
p | –protocol | 指定要匹配的协议类型,如 TCP、UDP、ICMP 等 |
-sport | 指定数据包的源端口 | |
-dport | 指定数据包的目标端口 | |
j | –jump | 指定动作,即对匹配的数据包执行何种操作,如 ACCEPT、DROP、REJECT、LOG 等 |
i | –in-interface | 指定数据包进入的网络接口 |
o | –out-interface | 指定数据包离开的网络接口 |
-state | 匹配数据包的连接状态,如 NEW、ESTABLISHED、RELATED 等 |
Q&A
执行iptables命令报错?
1
can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
=⇒ NetWorking support
=⇒ NetWorking options
=⇒ Network packet filtering framework(Netfilter)
=⇒ Core Netfilter Configuration
=⇒ Netfilter connection tracking support(先选这个配置,否则后面的配置无法显示)
=⇒IP : Netfilter Configuration
=⇒ IP tables support(required for filtering / masq / MAT)
=⇒ iptables NAT support(NEW)
=⇒ MASQUREADE target support
执行iptables报错?
1
unkonwn protocol "forward" specified
命令执行的时候是 iptables -P FORWARD,应该是大写的P
参考资料
iptables工作原理及iptables命令行使用介绍_linux内核网络数据包的接收过程 iptables 工作原理-CSDN博客