手机页面,网站建设优化公司,化工企业网站jsp,热狗seo顾问1. 为什么你的开发板需要一个“软路由”#xff1f; 搞嵌入式开发的朋友#xff0c;尤其是经常和开发板打交道的#xff0c;肯定遇到过这个头疼的问题#xff1a;开发板本身没有无线网卡#xff0c;或者它的有线网口没法直接插到家里的路由器上。你想让它从互联网下载个软…1. 为什么你的开发板需要一个“软路由”搞嵌入式开发的朋友尤其是经常和开发板打交道的肯定遇到过这个头疼的问题开发板本身没有无线网卡或者它的有线网口没法直接插到家里的路由器上。你想让它从互联网下载个软件包、更新个系统或者调试一个需要联网的云服务结果发现它是个“信息孤岛”。我刚开始玩树莓派和各类ARM开发板的时候没少为这个事儿折腾要么得把板子搬到路由器旁边要么就得搞一堆复杂的网络配置。后来我发现其实手边最强大的工具就是那台每天都在用的、装着Ubuntu或者其它Linux发行版的开发电脑。它通常都有两块网卡一块无线网卡连着家里的Wi-Fi外网一块有线网卡空着。我们完全可以把这台电脑变成一个临时的“网关”或者叫“软路由器”让开发板通过它来上网。这个方案成本几乎为零只需要一根网线而且配置一次之后以后每次都能快速复用特别适合在实验室、工位或者任何没有现成路由器环境的场景下使用。这背后的核心原理其实就是网络地址转换NAT和IP转发。你可以把你的Ubuntu电脑想象成一个“翻译官”兼“中转站”。开发板位于一个独立的内部小网络里比如192.168.10.0/24它想访问百度服务器。它的请求包首先发到Ubuntu电脑上Ubuntu电脑识别出这个包是要去外网的于是它用自己的外网身份比如192.168.1.100这是你电脑从家里路由器获取的IP重新“包装”这个请求发出去。等百度的回应包回来时Ubuntu电脑再根据之前记录的“翻译笔记”把回应包正确转发给内网的开发板。整个过程对开发板和外面的服务器都是透明的开发板觉得自己直接上了网而百度服务器只知道是你的Ubuntu电脑在访问它。所以我们今天要做的就是激活Ubuntu/Linux系统的这个“翻译中转”能力。整个过程主要分三步第一在Ubuntu上配置好内网网卡并开启IP转发功能第二设置iptables防火墙规则实现NAT第三在开发板上配置网络把网关指向Ubuntu。下面我就手把手带你走一遍把我踩过的坑和验证过的稳定配置都分享给你。2. 动手前的准备硬件与网络拓扑工欲善其事必先利其器。我们先来看看需要哪些硬件以及它们是怎么连接在一起的。硬件清单一台运行Ubuntu/Linux的电脑这是我们的网关主机。台式机或笔记本都行我实测下来Ubuntu 20.04 LTS和22.04 LTS是最稳的但其他主流发行版如Debian、Fedora原理完全一样。你的开发板树莓派、Jetson Nano、RK3588开发板或者任何运行Linux或QNX等系统的嵌入式设备。两根USB转以太网适配器带网口的USB Hub这是关键因为很多笔记本只有一个有线网口而且可能已经被占用了。我们需要为Ubuntu电脑和开发板各准备一个这样的外接网卡。选购时不用追求高端几十块钱的RTL8153芯片方案的就很稳定在京东或淘宝搜“USB千兆网卡”一大把。注意确认一下你的系统内核是否自带驱动一般RTL8153和AX88179芯片的即插即用支持最好。一根普通的网线用来连接两个USB网卡。网络拓扑连接整个连接方式非常简单就像搭积木Ubuntu电脑用它的外接USB网卡通过网线连接到开发板的外接USB网卡。Ubuntu电脑同时通过自身的无线网卡Wi-Fi或有线网卡连接到互联网你的家庭或公司路由器。这样就形成了一个经典的“桥接”结构。Ubuntu电脑一脚踩在内网与开发板相连的192.168.10.0/24一脚踩在外网你的主网络比如192.168.1.0/24。它的任务就是把两个网络之间的数据包安全、正确地转发过去。注意在开始配置前请确保你的Ubuntu主机已经可以正常访问互联网。你可以先打开浏览器随便访问个网站测试一下。3. 第一步在Ubuntu系统上配置网关功能现在我们开始在Ubuntu电脑上进行操作。请打开一个终端Terminal我们需要用到一些命令行工具。3.1 识别与配置内网网卡首先把两个USB网卡分别插到Ubuntu电脑和开发板上然后用网线把它们连起来。接着在Ubuntu的终端里输入命令查看网络接口ip link show或者用老一点的命令ifconfig -a你会看到一堆网络接口。通常eth0或ens33可能是你电脑原有的有线网卡wlan0或wlp3s0是无线网卡。你需要找到那个新出现的、名字比较长的接口它可能就是enx开头的一串字符比如enxf8e43b913cd7这是根据网卡MAC地址生成的稳定名称。记下这个名字我们后面就叫它内部网卡。接下来给这个内部网卡设置一个固定的IP地址。我们创建一个和开发板通信的小局域网比如使用192.168.10.1作为网关地址Ubuntu在这个内网的地址。sudo ip addr add 192.168.10.1/24 dev enxf8e43b913cd7 sudo ip link set enxf8e43b913cd7 up第一行命令给网卡分配了IP地址192.168.10.1子网掩码是24位即255.255.255.0。第二行命令是启动这个网卡。你可以用ip addr show enxf8e43b913cd7来确认配置是否生效。3.2 开启内核的IP转发功能默认情况下Linux系统不会转发来自一个网卡、目的地是另一个网卡的IP数据包。我们需要打开这个“路由器”的核心开关。临时开启重启后失效sudo sysctl -w net.ipv4.ip_forward1为了永久生效避免每次开机都要设置我们需要编辑系统配置文件sudo nano /etc/sysctl.conf或者使用vim、gedit等你喜欢的编辑器找到或添加下面这一行net.ipv4.ip_forward1保存并退出编辑器在nano中是CtrlX然后按Y确认再按回车。最后让配置立即生效sudo sysctl -p /etc/sysctl.conf你可以用sysctl net.ipv4.ip_forward检查如果输出是net.ipv4.ip_forward 1就说明成功了。3.3 配置iptables实现NAT与转发这是最关键的一步我们要设置防火墙规则允许数据包转发并做地址转换。这里使用经典的iptables工具。请注意如果你用的是ufwUbuntu默认防火墙或者firewalld它们底层也是调用iptables但为了清晰我们直接操作iptables。首先我们设置默认策略并清空可能存在的旧规则新手操作注意如果在生产服务器上请谨慎sudo iptables -P FORWARD ACCEPT sudo iptables -F sudo iptables -t nat -F-P FORWARD ACCEPT设置了FORWARD链的默认策略为接受允许数据包在不同接口间转发。然后添加最重要的NAT规则。这条规则的意思是对所有从内网网卡进来、要从外网网卡出去的流量进行源地址伪装MASQUERADE。sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE这里有个巨坑我当年就栽在这-o参数后面跟的必须是你的“外网出口”网卡名称如果你的Ubuntu是通过Wi-Fi上网的那可能就是wlan0如果是通过有线网卡上网的那可能是eth0或ens33。你必须用ip route show default命令来确认你的默认路由走的是哪个接口。比如输出里有default via 192.168.1.1 dev wlan0那么-o后面就填wlan0。为了让开发板也能访问到Ubuntu上运行的服务比如SSH、Web服务器我们还需要允许已建立的连接和相关连接通过sudo iptables -A FORWARD -i enxf8e43b913cd7 -o wlan0 -j ACCEPT sudo iptables -A FORWARD -i wlan0 -o enxf8e43b913cd7 -m state --state RELATED,ESTABLISHED -j ACCEPT第一条允许从内网到外网的转发第二条允许从外网返回的、属于已建立连接的流量回到内网。提示以上iptables规则在重启后会丢失。如果你想永久保存可以安装iptables-persistent包sudo apt install iptables-persistent然后在配置完后运行sudo netfilter-persistent save。或者将你的iptables规则写入一个脚本让系统开机时自动执行。4. 第二步配置开发板网络以Linux系统为例现在轮到开发板了。假设你的开发板也运行着Linux比如Debian、Ubuntu Core、Buildroot构建的系统等。通过串口、SSH或者直接接上显示器键盘登录到开发板。4.1 配置开发板的内网IP和网关首先同样在开发板上用ip link或ifconfig -a找到你插入的USB网卡设备名我们假设它是eth1。给开发板的这个网卡配置一个和Ubuntu内网网卡在同一网段的IP比如192.168.10.100sudo ip addr add 192.168.10.100/24 dev eth1 sudo ip link set eth1 up接着测试一下到Ubuntu网关的连通性这是基础ping 192.168.10.1 -c 4如果能看到成功的回复说明物理连接和基础IP配置都没问题。如果ping不通请回头检查两边网线、USB网卡驱动、IP地址是否在同一网段。最关键的一步来了告诉开发板所有非本网段的流量都发给192.168.10.1也就是你的Ubuntu电脑去处理。这就是设置默认网关sudo ip route add default via 192.168.10.1 dev eth1你可以用ip route show或route -n查看路由表应该能看到一行default via 192.168.10.1 dev eth1。4.2 配置DNS解析服务器光有路由还不够开发板需要知道如何把“www.baidu.com”这样的域名转换成IP地址。我们需要配置DNS服务器。最直接的方法是修改/etc/resolv.conf文件。但注意在一些使用systemd-resolved或NetworkManager的系统上这个文件可能是自动生成的。一个比较通用的方法是sudo bash -c echo nameserver 114.114.114.114 /etc/resolv.conf sudo bash -c echo nameserver 8.8.8.8 /etc/resolv.conf这里设置了114DNS和Google DNS作为备用。如果你的Ubuntu主机本身能解析域名你也可以直接把开发板的DNS指向Ubuntu的内网IP192.168.10.1但这需要你在Ubuntu上配置DNS转发例如配置dnsmasq对于初次搭建直接用公共DNS更简单。4.3 终极测试连通外网现在激动人心的时刻到了。在开发板的终端里尝试ping一个外网地址ping -c 4 www.baidu.com如果能看到来自百度服务器的回复IP地址类似14.215.177.39那么恭喜你大功告成你的开发板已经通过Ubuntu网关成功访问了互联网。如果域名无法解析提示ping: www.baidu.com: Name or service not known那就是DNS配置有问题回头检查/etc/resolv.conf。如果能解析出IP但ping不通100%丢包那问题可能出在Ubuntu的iptables规则或IP转发没有正确开启请仔细核对每一步。5. 针对不同开发板系统的配置差异嵌入式开发板的系统五花八门除了主流的Linux你可能还会遇到像QNX、VxWorks这样的实时操作系统。配置思路完全一致只是命令语法稍有不同。5.1 QNX系统配置示例QNX是一个类Unix的实时操作系统在车载、工控领域很常见。它的网络配置命令和Linux很像但有自己的风格。假设USB网卡在QNX上识别为en1。配置IP和启动接口ifconfig en1 192.168.10.100 netmask 255.255.255.0 up这里直接使用netmask参数指定子网掩码。设置默认网关QNX的route命令语法和Linux不同route add default 192.168.10.1注意这里没有gw关键字直接跟网关地址。配置DNSQNX的DNS配置文件通常也是/etc/resolv.conf操作方式一样echo nameserver 114.114.114.114 /etc/resolv.conf测试连通性ping -c 4 192.168.10.1 # 测试到网关 ping -c 4 www.baidu.com # 测试外网和DNS5.2 其他系统与临时配置技巧对于其他系统核心就是找到对应的三条指令设置静态IP、添加默认路由、配置DNS。很多基于BusyBox的小型Linux系统命令和标准Linux几乎一样。另外如果你只是临时用一下不想永久修改开发板的网络配置因为开发板可能需要在不同网络环境切换你可以完全通过命令行临时设置重启后就会恢复原样。这对于调试来说非常方便。总结一下临时配置的命令流在开发板Linux上sudo ip addr flush dev eth1 # 清除原有配置 sudo ip addr add 192.168.10.100/24 dev eth1 sudo ip link set eth1 up sudo ip route add default via 192.168.10.1 dev eth1 sudo sh -c echo nameserver 114.114.114.114 /etc/resolv.conf6. 故障排查与性能优化指南配置过程中难免会遇到问题这里我总结几个最常见的坑和解决办法。问题一开发板能ping通网关但ping不通外网。检查Ubuntu的IP转发再次运行sysctl net.ipv4.ip_forward确认是1。检查iptables规则运行sudo iptables -t nat -L -v -n和sudo iptables -L -v -n查看POSTROUTING链和FORWARD链的规则包计数器是否在增加。重点确认MASQUERADE规则的-o接口是否正确。检查Ubuntu主机的防火墙如果你在Ubuntu上启用了ufw需要允许转发sudo ufw default allow FORWARD。更简单的方法是临时关闭ufw测试sudo ufw disable测试完记得开启。检查开发板路由表确保默认网关确实是192.168.10.1并且没有其他优先级更高的默认路由干扰。问题二DNS解析失败。检查/etc/resolv.conf确认文件内容正确并且文件权限没问题。在开发板上直接ping DNS服务器IPping -c 4 114.114.114.114。如果能通说明是DNS配置问题如果不通说明网络层仍有问题。尝试使用Ubuntu作为DNS服务器在开发板的/etc/resolv.conf中设置nameserver 192.168.10.1然后在Ubuntu上安装并配置dnsmasqsudo apt install dnsmasq编辑/etc/dnsmasq.conf取消注释listen-address127.0.0.1,192.168.10.1这一行并重启dnsmasq服务。问题三网络速度慢或不稳定。USB网卡性能瓶颈便宜的USB 2.0转百兆网卡是最大瓶颈。如果开发板和主机都支持可以考虑使用USB 3.0转千兆网卡并配合超五类或六类网线。Ubuntu主机性能如果主机配置很低同时进行大量网络转发可能会占用CPU。可以用top或htop命令观察ksoftirqd进程的CPU占用率。优化iptables过于复杂的iptables规则会影响转发性能。我们的基础规则已经足够精简。如果还追求极致可以考虑使用iptables的-m conntrack模块来优化状态跟踪但这属于进阶内容了。一个实用的诊断命令组合在Ubuntu主机上打开两个终端窗口。 窗口1实时监控转发流量watch -n 1 sudo iptables -L FORWARD -v -n窗口2跟踪NAT转换watch -n 1 sudo iptables -t nat -L POSTROUTING -v -n然后在开发板上尝试访问外网比如ping www.qq.com观察这两个窗口中的packets和bytes计数器是否在持续增长。这是判断数据包是否被正确转发和NAT的最直观方法。配置完成后你的Ubuntu电脑就成为了一个非常可靠的开发板网络网关。我自己的Jetson Xavier NX开发板通过这个方式连接网络已经稳定运行了几个月用于下载大型数据集和进行在线模型推理测试从未掉过链子。记住这个方案的核心在于理解“网关”和“NAT”这两个概念一旦理解了无论面对什么系统你都能快速举一反三地配置出来。下次再遇到开发板“与世隔绝”的情况不妨试试自己动手搭一个软路由你会发现这比找一根超长的网线或者折腾无线网卡驱动要优雅和强大得多。