Fork me on GitHub
0%

两个设备NAT共享网络

项目场景

有AB两块开发板,其中A开发板有无线网卡可以连接到外网,B开发板无网卡,两个设备通过USB对接,需要实现两个开发板均可上网的需求

(以下解决方案同样也适合于AB两个开发板使用网口对接)

技术方案

基于USB的RNDIS功能在两个设备端虚拟出两块以太网卡,再通过网络的路由转发实现共享网络功能

实施方案

将可以连接外网的设备作为Host,另一个设备作为Device

Host

  1. 内核编译支持RNDIS功能。选择 USB_USBNET 和 USB_NET_RNDIS_HOST 宏

  2. 内核编译支持NAT功能

  3. 连接外网。启动wpa_supplicant服务并使用udhcpc获取IP

    image

  4. 设置usb0虚拟网卡IP地址

    1
    ifconfig usb0 192.168.1.100 broadcast 192.168.1.255 netmask 255.255.255.0

image

  1. 执行以下内容脚本

    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

  1. 改动脚本文件支持RNDIS功能。将/etc/init.d/S90usb脚本 /etc/init.d/usb/rndis 行的注释打开即可

  2. 设置usb0虚拟网卡IP地址

    1
    ifconfig usb0 192.168.1.101 broadcast 192.168.1.255 netmask 255.255.255.0

    image

  3. 添加路由

    1
    2
    route add default gw 192.168.1.100
    route -n
  4. 成功连接到外网

    image

iptables命令详解

iptables 是一个用于配置 Linux 内核中网络包过滤和 NAT 功能的命令行工具。它允许管理员定义规则,以控制进出系统的网络数据流量。

  1. 查看规则

    1
    2

    iptables -L
  2. 清空规则

    1
    iptables -F
  3. 添加规则

    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 ACCEPT
  4. NAT 网络地址

    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

  1. 执行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

  2. 执行iptables报错?

    1
    unkonwn protocol "forward" specified

    命令执行的时候是 iptables -P FORWARD,应该是大写的P

参考资料

iptables工作原理及iptables命令行使用介绍_linux内核网络数据包的接收过程 iptables 工作原理-CSDN博客