开发板借助Ubuntu/Linux实现外网访问:从零搭建简易网关

开发板借助Ubuntu/Linux实现外网访问:从零搭建简易网关 1. 为什么需要为开发板搭建简易网关很多嵌入式开发板在设计时为了控制成本和功耗往往不会内置Wi-Fi模块或蜂窝网络模块。这时候如果开发板需要访问外部网络资源比如软件包更新、云服务调用或远程调试就需要借助其他设备作为网络出口。我遇到过不少这样的情况实验室里的开发板明明连着网线却死活ping不通百度最后发现是路由配置出了问题。把一台运行Ubuntu或Linux的电脑变成网关本质上就是让它充当网络中转站。开发板通过网线连接到这台电脑电脑再通过Wi-Fi或有线网卡连接互联网所有数据包都会经过电脑转发。这种方案成本极低只需要一根网线和一台普通电脑特别适合以下场景物联网设备开发调试阶段需要临时联网工厂环境中不具备无线网络条件的设备测试需要隔离开发板与主网络的特殊实验环境2. 硬件准备与物理连接2.1 选择合适的网络设备根据我的实测经验最稳定的连接方式是使用USB转以太网适配器。现在市面上常见的方案有两种USB 2.0转RJ45价格约30-50元带宽足够开发使用USB 3.0转RJ45价格约80-120元适合高带宽需求我强烈建议购买带有AX88179芯片的适配器这个方案在Linux下的驱动支持最好。曾经贪便宜买过某品牌的RTL8153方案结果在Ubuntu 20.04上死活识别不出来最后不得不退货重买。2.2 物理连接拓扑典型的连接方式如下[开发板] ←网线→ [USB网卡A] ↔ [Ubuntu主机] ↔ [Wi-Fi/有线] → 互联网这里有个容易踩坑的地方很多开发板的网口是自适应MDI/MD-X的但有些廉价USB网卡不支持自动翻转。如果发现两边网卡灯亮了但就是不通可以尝试换根网线或者手动指定网卡速率# 在Ubuntu端强制设置100M全双工 sudo ethtool -s enxf8e43b913cd7 speed 100 duplex full3. Ubuntu网关配置详解3.1 网络接口识别与配置首先用ip link命令确认新增的USB网卡设备名。在较新的Ubuntu版本中网卡命名规则可能会变成类似enxMAC地址的形式$ ip link show 1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ens33: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:3a:5b:7c brd ff:ff:ff:ff:ff:ff 3: enxf8e43b913cd7: BROADCAST,MULTICAST mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether f8:e4:3b:91:3c:d7 brd ff:ff:ff:ff:ff:ff给内网网卡配置静态IP假设我们使用192.168.10.0/24网段sudo nmcli con add type ethernet ifname enxf8e43b913cd7 ipv4.addresses 192.168.10.1/24 ipv4.method manual sudo nmcli con up ethernet-enxf8e43b913cd73.2 内核转发与防火墙设置启用IP转发功能并配置NAT规则# 临时生效 echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward # 永久生效 echo net.ipv4.ip_forward1 | sudo tee -a /etc/sysctl.conf sudo sysctl -p # 配置iptables规则 sudo iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE sudo iptables -A FORWARD -i enxf8e43b913cd7 -o ens33 -j ACCEPT sudo iptables -A FORWARD -i ens33 -o enxf8e43b913cd7 -m state --state RELATED,ESTABLISHED -j ACCEPT为了让配置重启后依然有效建议安装iptables-persistentsudo apt install iptables-persistent sudo netfilter-persistent save4. 开发板网络配置实战4.1 Linux开发板配置以常见的ARM开发板为例配置静态IP和默认路由# 设置IP地址 sudo ifconfig eth1 192.168.10.100 netmask 255.255.255.0 up # 添加默认网关 sudo route add default gw 192.168.10.1 # 配置DNS建议使用公共DNS echo nameserver 223.5.5.5 | sudo tee /etc/resolv.conf测试网络连通性时建议按以下顺序排查先ping网关IP192.168.10.1再ping外网IP如114.114.114.114最后测试域名解析ping www.baidu.com4.2 特殊系统的配置差异对于运行QNX、VxWorks等实时操作系统的开发板配置命令有所不同QNX示例# 设置IP ifconfig eth1 192.168.10.100 netmask 255.255.255.0 up # 添加路由 route add default 192.168.10.1 # DNS配置 echo nameserver 223.5.5.5 /etc/resolv.conf常见问题排查如果开发板能ping通网关但无法访问外网检查Ubuntu的iptables规则是否正确遇到DNS解析失败时尝试在开发板上直接ping 8.8.8.8测试基础网络对于某些嵌入式系统可能需要额外配置路由metric值5. 高级配置与优化技巧5.1 持久化网络配置在开发板上每次重启后网络设置都会丢失。对于Linux开发板可以通过修改网络配置文件实现持久化# Ubuntu/Debian系 sudo nano /etc/network/interfaces.d/eth1添加以下内容auto eth1 iface eth1 inet static address 192.168.10.100 netmask 255.255.255.0 gateway 192.168.10.1 dns-nameservers 223.5.5.55.2 带宽限制与QoS为了防止开发板占用全部带宽可以在Ubuntu上使用tc工具进行限速# 限制内网网卡上传速度为1Mbps sudo tc qdisc add dev enxf8e43b913cd7 root tbf rate 1mbit burst 32kbit latency 400ms # 查看当前限制 sudo tc -s qdisc show dev enxf8e43b913cd75.3 防火墙增强配置建议添加以下安全规则到Ubuntu网关# 禁止内网发起的异常包 sudo iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j DROP sudo iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP # 限制ICMP洪水攻击 sudo iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT6. 实际项目中的经验分享在去年一个工业物联网项目中我们遇到了一个棘手问题开发板通过网关联网后每过几小时就会断连。经过抓包分析发现是TCP连接没有正确关闭导致的。最终通过调整以下参数解决# 在Ubuntu网关添加 echo 30 /proc/sys/net/ipv4/tcp_fin_timeout echo 1800 /proc/sys/net/ipv4/tcp_keepalive_time另一个常见问题是开发板时钟不同步导致的HTTPS证书验证失败。可以在开发板上配置NTP同步# 对于支持ntpdate的设备 sudo ntpdate pool.ntp.org # 或者使用chrony推荐 sudo chronyc -a burst 4/4 sudo chronyc -a makestep对于需要频繁更换网络环境的开发板建议编写自动化配置脚本。这是我常用的一个模板#!/bin/bash IFACEeth1 GW_IP192.168.10.1 ifconfig $IFACE down ifconfig $IFACE $GW_IP netmask 255.255.255.0 up route add default gw $GW_IP echo nameserver 223.5.5.5 /etc/resolv.conf在完成所有配置后建议用iperf3测试实际带宽用tcpdump检查数据包转发情况。这些工具在定位网络问题时非常有用# 在Ubuntu上启动iperf3服务器 iperf3 -s # 在开发板上测试带宽 iperf3 -c 192.168.10.1 -t 20