人人都会AI编程

29.3 网络不通:网卡、路由、防火墙、DNS 逐层排查

更新时间:2026-07-12

当服务器无法访问外部网络或外部无法访问服务器时,盲目猜测原因非常低效。网络问题的根源通常分布在 网卡链路层、IP 路由层、传输层防火墙和 DNS 应用层 这几个层级。采用从下往上的逐层排查策略,可以在最短时间内定位问题所在。

第 1 层:网卡和链路层
首先要确认物理连接和网卡本身是否正常工作。

  • 检查网卡是否被系统识别:ip link showifconfig -a。如果相应接口(如 eth0ens33)根本未出现在列表中,可能是驱动未加载或硬件未识别。
  • 查看链路状态:ip link show eth0 的输出中若出现 state UP 且不含 NO-CARRIER,则物理连通性正常;若为 DOWN,可通过 ip link set eth0 up 尝试手动激活。
  • 检查是否有 IP 配置:ip addr show eth0。若没有 IP 地址,可能因为 DHCP 未获取到地址,或者静态配置缺失。可以使用 dhclient eth0 重新获取,或检查 /etc/network/interfaces/etc/netplan/*.yaml 等配置文件。
  • 简单测试本地链路:ping 其他局域网内主机或网关;若不通,检查网线、交换机、VLAN 配置等。

第 2 层:路由和 IP 层
当链路层正常后,排查 IP 层的路由配置。

  • 查看当前路由表:ip routeroute -n。确认是否存在默认路由(例如 default via 192.168.1.1)且路由接口正确。
  • 使用 ping 8.8.8.8 测试与外部 IP 的连通性。若能通,说明三层网络基本没问题,很可能是 DNS 解析故障。若不通,继续深入。
  • 执行 traceroute -n 8.8.8.8(或 tracepath)查看数据包在哪一跳开始丢失,可帮助判断是本地网关问题、运营商上游断线还是目标主机不可达。
  • 检查路由策略和 IP 转发:若本机充当路由器,需确认 /proc/sys/net/ipv4/ip_forward 是否为 1,以及 iptables 的 FORWARD 链是否放行。

第 3 层:防火墙和传输层
很多时候,有路有地址,却因为防火墙规则而导致数据被丢弃。

  • 检查本地防火墙规则:iptables -L -nv(或 nft list ruleset)查看 INPUT、OUTPUT、FORWARD 链。查找是否 REJECTDROP 了所需端口(如 22 端口的 SSH、80 端口的 HTTP)。尤其注意 -j DROP 规则是否排在允许规则之前。
  • 临时关闭防火墙以快速验证:systemctl stop iptablessystemctl stop firewalld,然后重试连通性。若问题消失,说明需要调整防火墙策略,不要永久关闭防火墙。
  • 若服务绑定在特定 IP 上(如 127.0.0.1:8080),外部无法访问。用 ss -tlnpnetstat -tlnp 检查服务监听地址,确保是 0.0.0.0 或本机对外 IP,而非仅本地回环。
  • 云服务器还需检查“安全组”规则,这是宿主机层面的防火墙,通常在云平台控制台配置,与操作系统内的防火墙并行生效。

第 4 层:DNS 应用层
如果 ping 8.8.8.8 通,但 ping www.baidu.com 不通,则问题出在 DNS 解析。

  • 测试 DNS 解析:nslookup www.baidu.comdig www.baidu.com。若返回 server can't find 或超时,检查 /etc/resolv.confnameserver 条目是否正确(如 8.8.8.8114.114.114.114)。注意 systemd-resolved 管理的系统可能需查看 resolvectl status
  • 确认 DNS 服务器的连通性:ping 8.8.8.8 已通,不代表 UDP 53 端口可通。使用 dig @8.8.8.8 www.baidu.comnslookup www.baidu.com 8.8.8.8 直接测试。若失败,很可能是防火墙阻断了 DNS 查询(UDP 53 端口),需要相应放行。
  • 有时候 /etc/hosts 文件的错误条目会覆盖 DNS 解析,导致解析到错误 IP。可以检查是否有与目标域名相关的条目。
  • 应用自身缓存也可能滞留过期的解析结果,可重启应用或清空解析缓存(如 systemctl restart nscd 或浏览器缓存)。

排错练习参考
当遇到“网站无法访问”时,典型排查顺序为:

  1. ip link → 接口是否 UP
  2. ip addr → IP 是否有
  3. ping 网关IP → 局域网是否通
  4. ping 8.8.8.8 → 互联网三层是否通
  5. dig www.example.com → DNS 是否正常
  6. curl -v http://www.example.com → 应用层 HTTP 是否被阻或返回错误

逐层推进,绝大部分网络故障都会在几分钟内现出原形。记录下每一步的结果,也便于在请求他人协助时提供精确信息。