4、网络故障排查:网络不通排查流程、DNS解析问题、路由问题、防火墙问题、ARP问题
做嵌入式Linux开发,网络不通是最让人头疼的问题之一。我见过不少同事,一遇到网络问题就抓瞎,上来就重启、换线、换板子。其实网络排查是有套路的,说白了就是一层一层往下查。今天我就把这几年积累的排查经验分享给你。
4.1 网络不通排查流程
我个人习惯用「从下往上」的思路。什么意思?就是从物理层开始,一层层往上查。你想想看,如果网线都没插好,你配再多的IP也没用。
我的排查口诀:「先看灯,再看IP,路由DNS最后查」
具体步骤是这样的:
- 检查物理连接——看网口灯亮不亮。我遇到过好几次,板子上的网口虚焊,灯不亮还以为是驱动问题。
- 检查IP配置——用
ifconfig或ip addr看IP有没有配上去。 - 检查网关——用
route -n看默认路由对不对。 - 检查DNS——用
nslookup或dig测试域名解析。 - 检查防火墙——用
iptables -L看有没有规则拦截。 - 检查ARP——用
arp -n看邻居表有没有学习到。
嗯,这里要注意:每一步都要确认「通了」再往下走。别跳步,跳步容易漏掉问题。
4.2 DNS解析问题
DNS问题在嵌入式设备上特别常见。我做过一个项目,设备能ping通IP,但就是打不开网页。查了半天,发现是DNS服务器地址写死了,而客户现场的网络环境变了。
排查DNS问题,我一般用这几招:
- 先确认能不能解析:
nslookup www.baidu.com或dig www.baidu.com - 检查配置文件:看
/etc/resolv.conf里的nameserver对不对 - 测试DNS服务器本身:直接ping DNS服务器IP,看通不通
小技巧:Yocto构建的系统里,/etc/resolv.conf 有时候会被systemd-resolved接管。你直接改文件可能没用,得用 systemd-resolve --status 查看实际配置。
我曾经踩过一个坑:在Yocto里配了静态DNS,但每次重启后配置就丢了。后来发现是 connman 这个网络管理工具在作怪,它会覆盖 /etc/resolv.conf。解决办法是在 connman 的配置里禁用DNS覆盖。
4.3 路由问题
路由问题说白了就是「数据包不知道往哪走」。我见过最典型的场景:设备能ping通网关,但ping不通外网。这种情况十有八九是默认路由没配好。
排查路由问题的命令:
# 查看路由表
route -n
# 或者用新的ip命令
ip route show
# 添加默认路由
route add default gw 192.168.1.1
# 或者
ip route add default via 192.168.1.1
这里有个坑要注意:嵌入式设备上可能有多个网口,比如eth0和wlan0。如果两个网口都配了默认路由,数据包就会乱走。我遇到过一台设备,同时接了有线和WiFi,结果路由表里两条默认路由,网络时通时断。
警告:Yocto里配置路由时,记得检查 /etc/network/interfaces 或 /etc/systemd/network/ 下的配置文件。有些发行版用不同的管理方式,别搞混了。
4.4 防火墙问题
防火墙问题最隐蔽。你ping得通,但应用连不上,八成是防火墙在搞鬼。我调试过一个MQTT设备,服务器端怎么都连不上,查了两天才发现是iptables把1883端口给DROP了。
排查防火墙的步骤:
- 查看当前规则:
iptables -L -n -v - 检查特定端口:
iptables -L -n | grep 1883 - 临时关闭防火墙:
iptables -P INPUT ACCEPT && iptables -P FORWARD ACCEPT && iptables -P OUTPUT ACCEPT
嗯,这里要提醒一下:Yocto构建的系统默认可能没有iptables,你得在 local.conf 里加上 IMAGE_INSTALL_append = " iptables"。不然排查时连命令都没有,那就尴尬了。
我的经验:嵌入式设备上防火墙规则别搞太复杂。我曾经见过一个项目,iptables规则写了上百条,结果设备启动要花30秒加载规则。后来全部精简到10条以内,启动时间降到2秒。
4.5 ARP问题
ARP问题比较底层,但一旦遇到就很棘手。ARP说白了就是「IP地址找MAC地址」的过程。如果ARP表里没有对方的MAC,数据包就发不出去。
排查ARP问题的命令:
# 查看ARP表
arp -n
# 或者
ip neigh show
# 手动添加ARP条目
arp -s 192.168.1.100 00:11:22:33:44:55
# 或者
ip neigh add 192.168.1.100 lladdr 00:11:22:33:44:55 nud permanent
我遇到过最奇葩的ARP问题:两台设备IP配成一样的,结果ARP表里MAC地址来回跳,网络时通时断。用 arp -n 一看,同一个IP对应两个不同的MAC,瞬间就明白了。
避坑指南:我曾经在Yocto里遇到过ARP缓存超时太短的问题。默认的 /proc/sys/net/ipv4/neigh/default/gc_stale_time 是60秒,对于某些实时性要求高的应用来说太长了。可以调小到30秒,加快ARP表更新。
知识体系总览
下面这张图是我自己总结的网络排查知识体系,你照着这个思路走,基本不会漏掉问题。
这张图把排查流程和五个核心模块串起来了。你从底部开始,一层层往上查,每个模块都有对应的命令和检查点。我建议你把这张图打印出来贴在工位上,遇到网络问题就照着查一遍。
好了,网络排查这块就讲这么多。记住一个原则:别慌,一层层查,总能找到问题。我这些年遇到的网络故障,90%以上都能用这套流程搞定。