努力
加油

Anolis OS网络配置正确但上不了网如何排查?

Anolis OS(龙蜥操作系统)作为阿里云主导研发的开源 Linux 发行版,底层与 RHEL/CentOS 高度兼容。当遇到“网络配置看起来正确但无法上网”的情况时,通常不是配置语法错误,而是路由、DNS、安全组或内核参数层面的问题。

以下是基于生产环境经验的排查思路,按从易到难、从应用层到底层的顺序进行:

1. 确认基础连通性分层测试

不要直接 ping 百度,要分层测试以定位故障点。

  • 物理/虚拟链路层:ping <网关IP>
    • 如果通:说明二层和三层基本链路没问题,问题出在路由、DNS或策略。
    • 如果不通:说明宿主机网络隔离、VPC路由表错误或网卡驱动异常。
  • 公网解析层:nslookup www.baidu.com 或 dig www.baidu.com
    • 如果解析失败(超时或 SERVFAIL):问题出在 DNS 配置或出口防火墙拦截了 UDP 53 端口。
    • 如果解析成功但 IP 不对:检查 /etc/resolv.conf 是否被 systemd-resolved 或其他服务覆盖。
  • 公网 TCP 连通性:curl -v http://www.baidu.com 或 telnet 8.8.8.8 443
    • 如果 DNS 正常但 curl 超时:可能是源地址 NAT 未生效、安全组出站规则限制、或运营商封禁了特定端口。

2. 检查路由表(最常见坑点)

很多用户只看了 IP 地址和子网掩码,忽略了默认网关的路由优先级。

ip route show
  • 重点检查:
    • 是否存在多条默认路由(default via …)?如果有,检查 metric 值,低 metric 优先。
    • 默认网关是否正确指向了 VPC 路由器或物理网关?
    • 是否有静态路由冲突?例如你手动添加了一条指向内网的其他路由,却意外覆盖了默认路由。
  • 修复示例:
    # 删除错误路由并重新添加
    ip route del default via <错误网关>
    ip route add default via <正确网关> dev eth0

3. 检查 DNS 配置陷阱

Anolis OS 默认可能使用 systemd-resolved 或传统的 NetworkManager,不同版本处理方式不同。

  • 查看当前生效的 DNS:
    resolvectl status
    # 或者
    cat /etc/resolv.conf
  • 常见误区:
    • 你在 /etc/sysconfig/network-scripts/ifcfg-eth0 里写了 DNS1=8.8.8.8,但系统实际使用的是 /run/systemd/resolve/stub-resolv.conf 中的 DNS。
    • 解决:确保 /etc/resolv.conf 是软链接指向正确的解析器,或者直接修改 systemd-networkd 的配置。
  • 测试方法:
    nslookup google.com 8.8.8.8

    如果能通,说明本地 DNS 服务有问题;如果不能通,说明网络 DNS 服务器不可达或被阻断。

4. 云厂商特有因素:安全组与 NACL

这是云服务器(ECS/CVM)最容易被忽视的地方。本地网络配置再完美,云平台的网络安全组也会拦截流量。

  • 安全组(Security Group):
    • 检查实例绑定的安全组,出站规则(Outbound) 是否允许 ICMP、TCP 80/443 等协议。
    • 有些云厂商默认出站是全开放的,但如果你自定义过规则,可能会误删。
  • 网络 ACL(NACL):
    • 如果使用了 VPC 的子网级 ACL,检查是否有入站/出站规则限制了所有流量。
  • 弹性公网 IP(EIP)绑定:
    • 确认实例是否绑定了 EIP?如果没有绑定,且没有通过 SNAT 网关,那么即使内网配置正确,也无法访问公网。

5. 内核参数与防火墙

  • iptables/firewalld:
    systemctl status firewalld
    iptables -L -n -v

    检查是否有 DROP 或 REJECT 规则影响了 OUTPUT 链。虽然少见,但在某些加固场景中会出现。

  • IP Forwarding:
    如果这台机器充当路由器或容器宿主,检查:

    sysctl net.ipv4.ip_forward

    应为 1。如果是 0,则无法转发流量。

  • MTU 问题:
    在 VPC 环境中,由于 VXLAN 封装等原因,有效 MTU 可能小于 1500。如果设置过大,会导致大包丢弃。

    ping -M do -s 1472 <网关IP>  # 尝试小包
    ping -M do -s 1500 <网关IP>  # 尝试大包

    如果大包不通而小包通,需调整网卡 MTU 或使用 PMTUD。

6. Anolis OS 特定组件:NetworkManager vs network-scripts

Anolis 8/9 系列默认推荐使用 NetworkManager,但许多老脚本仍依赖 /etc/sysconfig/network-scripts/。

  • 冲突检测:
    如果同时启用了 NetworkManager 和 network-scripts,可能导致配置不同步。

    nmcli device status
    nmcli connection show
  • 建议:
    统一使用 nmcli 管理网络,避免混用。如果使用传统方式,请确保 NM_CONTROLLED=no 在 ifcfg 文件中设置,否则 NetworkManager 会忽略你的配置。

7. 快速诊断脚本(一键排查)

你可以将以下脚本保存为 net_check.sh 并在目标机器上运行,它能自动输出关键信息:

#!/bin/bash
echo "=== 1. 网卡状态 ==="
ip addr show | grep -E "inet |state"
echo ""

echo "=== 2. 路由表 ==="
ip route show
echo ""

echo "=== 3. DNS 配置 ==="
cat /etc/resolv.conf
echo ""

echo "=== 4. DNS 解析测试 ==="
nslookup www.baidu.com 2>&1 | head -n 5
echo ""

echo "=== 5. 网关连通性 ==="
GATEWAY=$(ip route | grep default | awk '{print $3}')
if [ -n "$GATEWAY" ]; then
    ping -c 3 -W 2 $GATEWAY
else
    echo "No default gateway found!"
fi
echo ""

echo "=== 6. 公网连通性 (HTTP) ==="
curl -m 5 -o /dev/null -s -w "%{http_code}" http://www.baidu.com
echo ""

echo "=== 7. 防火墙状态 ==="
systemctl is-active firewalld || systemctl is-active iptables

总结排查路径

  1. 能 ping 通网关吗? → 不能:查物理链路、VPC 路由表、EIP 绑定。
  2. 能解析域名吗? → 不能:查 DNS 配置、UDP 53 端口开放情况。
  3. 能 curl 网页吗? → 不能:查安全组出站规则、SNAT 配置、防火墙策略。
  4. 配置对吗? → 查 NetworkManager 与 ifcfg 文件的冲突、MTU 设置。

在实际生产中,80% 的问题源于安全组出站规则缺失、DNS 解析异常或路由表错乱。建议优先检查这三项。