背景
最近在给 IMX6ULL Pro 开发板配网时,遇到了一个问题:
WiFi 已经成功连接,
wlan0也拿到了 IP 地址,但无论如何就是 ping 不通外网,www.baidu.com和8.8.8.8全都无法访问。
经过一番排查,最终发现竟然是路由表优先级——eth0的默认路由优先级高于wlan0,导致所有网络流量都错误地涌向了没有插网线的eth0。
这篇文章记录一下完整的排查思路和解决过程,希望能帮到遇到类似问题的朋友。
一、问题现象
Wi-Fi 连接成功,ifconfig输出如下:
wlan0 Link encap:Ethernet HWaddr C8:FE:0F:E6:9A:42 inet addr:192.168.246.151 Bcast:192.168.246.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:34 errors:0 dropped:299 overruns:0 frame:0 TX packets:15 errors:0 dropped:0 overruns:0 carrier:0
IP 地址已正常获取,但:
[root@100ask:~]# ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8): 56 data bytes ^C --- 8.8.8.8 ping statistics --- 9 packets transmitted, 0 packets received, 100% packet loss [root@100ask:~]# ping www.baidu.com ping: bad address 'www.baidu.com'连网关都 ping 不通:
ping 192.168.246.1 # 100% packet loss二、原因导致
Step 1:网关不是192.168.246.1
在连接热点的时候,可能直接将热点的IP当成了网关
Step 2:查看路由表,发现问题根源
route -n输出如下:
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.5.1 0.0.0.0 UG 0 0 0 eth0 0.0.0.0 192.168.246.154 0.0.0.0 UG 100 0 0 wlan0 192.168.5.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.246.0 0.0.0.0 255.255.255.0 U 100 0 0 wlan0eth0有一条默认路由,网关是192.168.5.1,Metric 为 0(最高优先级)wlan0也有一条默认路由,网关是192.168.246.154,Metric 为 100(较低优先级)
虽然我连接的是 Wi-Fi,但由于eth0的优先级更高,系统把所有外网流量都优先送往eth0。而eth0根本没插网线,数据包自然石沉大海。
三、解决方案
删除错误的默认路由,重新指定网关
# 1. 删除 eth0 的默认路由 route del default gw 192.168.5.1 # 2. 查看当前路由表确认 route -n此时路由表只剩wlan0的路由,再测试一下:
[root@100ask:~]# ping 8.8.8.8 -c 4 PING 8.8.8.8 (8.8.8.8): 56 data bytes 64 bytes from 8.8.8.8: seq=0 ttl=106 time=392.287 ms 64 bytes from 8.8.8.8: seq=1 ttl=106 time=279.379 ms 64 bytes from 8.8.8.8: seq=2 ttl=106 time=248.894 ms还有一个问题就是DNS 解析失败
虽然8.8.8.8能 ping 通了,但ping www.baidu.com还是失败:
ping www.baidu.com # ping: bad address检查/etc/resolv.conf:
ls -l /etc/resolv.conf # lrwxrwxrwx 1 root root 32 ... -> /var/run/resolv.conf发现它是一个损坏的软链接(指向的目标文件不存在),导致 DNS 配置没有生效。
修复 DNS:
rm /etc/resolv.conf echo "nameserver 114.114.114.114" > /etc/resolv.conf echo "nameserver 8.8.8.8" >> /etc/resolv.conf再次测试:
[root@100ask:~]# ping www.baidu.com -c 4 PING www.baidu.com (183.2.172.177): 56 data bytes 64 bytes from 183.2.172.177: seq=0 ttl=51 time=48.446 ms 64 bytes from 183.2.172.177: seq=1 ttl=51 time=37.025 ms 64 bytes from 183.2.172.177: seq=2 ttl=51 time=95.887 ms 64 bytes from 183.2.172.177: seq=3 ttl=51 time=35.516 ms四、总结
问题根因
路由表冲突:
eth0与wlan0同时存在默认路由,且eth0的 Metric 值更小(优先级更高),导致流量错误地走入了没有网线的eth0。DNS 配置损坏:
/etc/resolv.conf是一个指向不存在目标的软链接,导致域名解析失败。