4、网络故障排查:网络不通排查流程、DNS解析问题、路由问题、防火墙问题、ARP问题

做嵌入式Linux开发,网络不通是最让人头疼的问题之一。我见过不少同事,一遇到网络问题就抓瞎,上来就重启、换线、换板子。其实网络排查是有套路的,说白了就是一层一层往下查。今天我就把这几年积累的排查经验分享给你。

4.1 网络不通排查流程

我个人习惯用「从下往上」的思路。什么意思?就是从物理层开始,一层层往上查。你想想看,如果网线都没插好,你配再多的IP也没用。

我的排查口诀:「先看灯,再看IP,路由DNS最后查」

具体步骤是这样的:

  1. 检查物理连接——看网口灯亮不亮。我遇到过好几次,板子上的网口虚焊,灯不亮还以为是驱动问题。
  2. 检查IP配置——用 ifconfig 或 ip addr 看IP有没有配上去。
  3. 检查网关——用 route -n 看默认路由对不对。
  4. 检查DNS——用 nslookup 或 dig 测试域名解析。
  5. 检查防火墙——用 iptables -L 看有没有规则拦截。
  6. 检查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表更新。

知识体系总览

下面这张图是我自己总结的网络排查知识体系,你照着这个思路走,基本不会漏掉问题。

网络故障排查知识体系 排查流程(从下往上) 物理连接 网口灯、网线 IP配置 ifconfig/ip addr 路由 route -n/ip route DNS解析 nslookup/dig 防火墙 iptables -L ARP arp -n/ip neigh 口诀:先看灯,再看IP,路由DNS最后查

这张图把排查流程和五个核心模块串起来了。你从底部开始,一层层往上查,每个模块都有对应的命令和检查点。我建议你把这张图打印出来贴在工位上,遇到网络问题就照着查一遍。

好了,网络排查这块就讲这么多。记住一个原则:别慌,一层层查,总能找到问题。我这些年遇到的网络故障,90%以上都能用这套流程搞定。