Linux 服务器网络配置与排错

Linux 服务器的网络问题在生产环境中出现频率极高:新机器上线连不上外网、突然丢包严重、DNS 解析异常、特定端口不通、流量不对称……这些问题如果没有系统化的配置和排查思路,往往会浪费大量时间。本文从现代 Linux(2025-2026 年主流发行版) 的网络配置方式入手,结合最实用的排错流程和命令,给出一套完整、可落地的方法论。适合云服务器、物理机、容器宿主机、Kubernetes 节点等多种场景。

一、现代 Linux 网络配置全景(不再用 ifconfig/route)

2025 年后,Linux 网络栈已经全面转向 iproute2 工具集(ip、ss、tc 等),旧的 net-tools(ifconfig、netstat、route)在大多数新发行版中已标记为 deprecated 或需额外安装。

主流配置后端对比:

发行版/场景默认/推荐工具配置文件位置热加载支持备注
Ubuntu Server 20.04+Netplan/etc/netplan/*.yaml是(netplan apply)YAML 声明式,最友好
Ubuntu DesktopNetworkManager通过 nmcli / GUI适合有桌面的环境
RHEL 9 / Rocky / AlmaNetworkManager + nmcli/etc/NetworkManager/system-connections/企业级首选
Debian 12+ / 服务器systemd-networkd/etc/systemd/network/*.network轻量、无 GUI 依赖
云厂商镜像(AWS/GCP/Azure)通常 Netplan 或 systemd-networkd视镜像而定常预配置 cloud-init

核心原则:先用 ip 命令临时调试,确认方案后再写入持久化配置文件。

1. 临时配置(生产常用,秒级生效)

Bash
# 查看所有接口状态(现代 ifconfig)
ip -c link show          # -c 带颜色,更易读
ip -c addr show

# 启用/禁用接口
ip link set eth0 up
ip link set eth0 down

# 配置静态 IP(临时)
ip addr add 192.168.1.100/24 dev eth0
ip addr del 192.168.1.100/24 dev eth0

# 添加默认路由
ip route add default via 192.168.1.1 dev eth0

# 查看路由表
ip route show
ip route get 8.8.8.8     # 看去往某个 IP 的实际路径

2. 永久配置示例(三种主流方式)

Netplan(Ubuntu Server 主流)

/etc/netplan/01-netcfg.yaml 示例:

YAML
network:
  version: 2
  renderer: networkd          # 或 NetworkManager
  ethernets:
    enp1s0:                   # 接口名(ip link 查看)
      dhcp4: no
      addresses: [10.0.0.5/24]
      routes:
        - to: default
          via: 10.0.0.1
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]

应用:sudo netplan generate && sudo netplan apply

systemd-networkd(轻量首选)

/etc/systemd/network/10-eth0.network:

ini
[Match]
Name=eth0

[Network]
Address=10.0.0.5/24
Gateway=10.0.0.1
DNS=8.8.8.8 1.1.1.1

重启服务:sudo systemctl restart systemd-networkd

nmcli(RHEL 系 / NetworkManager)

Bash
nmcli con add type ethernet ifname eth0 con-name eth0 ipv4.method manual ipv4.addresses 10.0.0.5/24 ipv4.gateway 10.0.0.1 ipv4.dns "8.8.8.8 1.1.1.1"
nmcli con up eth0

二、网络排错黄金流程(5-15 分钟定位 90% 问题)

遵循 “从近到远、从底层到上层” 的分层思路。

步骤 1:确认物理/链路层(1 分钟)

Bash
ip link show eth0          # 看 state 是否 UP,LOWER_UP 表示物理链路 OK
ethtool eth0               # 查看网卡协商速率、duplex 是否正常
dmesg | grep -i eth        # 看网卡驱动加载是否有错误

常见问题:网线松了、交换机端口 shutdown、协商失败(千兆 vs 百兆)。

步骤 2:确认 IP 配置层(2 分钟)

Bash
ip addr show               # 有没有 IP?是 DHCP 还是静态?
ip route show              # 默认路由是否存在?正确吗?
ping 127.0.0.1             # 本地 TCP/IP 栈是否正常
ping <本机 IP>             # 本机 IP 是否可达
ping <同网段其他 IP>       # 内网二层是否通
ping <网关 IP>             # 默认网关是否可达

无 IP → 检查 DHCP(dhclient eth0)或配置文件错误。

步骤 3:路由与外网连通性(3 分钟)

Bash
# 看去往外网的实际路径
ip route get 8.8.8.8

# 实时路径 + 丢包统计(神器)
mtr -r -c 100 8.8.8.8
traceroute -n 8.8.8.8     # -n 不解析域名,速度快

丢包从第几跳开始 → 基本能定位是本机房出口、运营商节点还是目标侧。

步骤 4:DNS 解析排查(最常见痛点)

Bash
cat /etc/resolv.conf       # DNS 服务器是否正确?
nslookup www.google.com 8.8.8.8   # 指定公共 DNS 测试
dig +short www.google.com         # 更详细

/etc/resolv.conf 被覆盖?常见于 systemd-resolved、NetworkManager、cloud-init。

临时修复:echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

步骤 5:传输层 / 服务端口(端口不通)

Bash
ss -tuln                   # 查看监听端口(现代 netstat)
ss -ant                    # 所有 TCP 连接状态

# 测试远程端口
nc -zv 目标IP 443          # 成功返回 succeeded!
telnet 目标IP 80           # 老工具,但很多机器还有
curl -v https://目标域名   # 看完整握手过程

步骤 6:防火墙 / SELinux / 云安全组(80% 的“端口不通”元凶)

Bash
# firewalld(RHEL/CentOS)
firewall-cmd --list-all
firewall-cmd --zone=public --add-port=443/tcp --permanent

# ufw(Ubuntu)
ufw status verbose

# iptables(老系统或自定义)
iptables -L -n -v

# SELinux 端口上下文(自定义端口常见坑)
semanage port -l | grep http
semanage port -a -t http_port_t -p tcp 8080

# 云厂商安全组 / 网络 ACL → 控制台检查(非服务器命令)

步骤 7:抓包确认(终极手段)

Bash
tcpdump -i eth0 -nn host 8.8.8.8    # 看是否有请求发出/返回
tcpdump -i any port 443 -nn -c 50   # 抓 HTTPS 流量

常见现象:

  • SYN 发出无响应 → 防火墙丢包 / 目标不存活
  • SYN-ACK 回来但 ACK 没发 → 本机防火墙阻挡
  • 重传严重 → MTU 问题 / 网络拥塞

三、高频场景快速定位表

现象优先检查命令组合常见根因
完全无网络ip link / ip addr / ping 127.0.0.1接口 down / 驱动问题
内网通外网不通ip route / ping 网关 / mtr 8.8.8.8默认路由丢失 / NAT / 出口防火墙
域名解析失败cat /etc/resolv.conf / dig @8.8.8.8DNS 配置错 / 53 端口被阻
端口不通(服务已 listen)ss -tuln / nc -zv / firewall-cmd --list-all防火墙 / SELinux / 云安全组
间歇性丢包 / 高延迟mtr -r / tcpdump / sar -n DEVMTU 不匹配 / 网卡 offload / 运营商
连接数爆 / SYN 队列满ss -s / sysctl net.ipv4.tcp_max_syn_backlogTIME_WAIT 过多 / backlog 太小

四、生产建议与最佳实践

  1. 统一配置模板:把 Netplan / systemd-networkd 的 yaml / network 文件做成 ansible 模板,避免手动改错。
  2. 监控先行:Prometheus + node_exporter 的 netclass 采集丢包、重传、错误包。
  3. DNS 冗余:至少配置 2-3 个 DNS(8.8.8.8 + 1.1.1.1 + 114.114.114.114)。
  4. MTU 一致性:云环境常见坑,建议统一 1500 或 9000(jumbo frame)。
  5. 日志保留:auditd 监控网络相关 syscall,rsyslog 远程备份防火墙日志。

结语

Linux 网络配置与排错的核心是“结构化 + 工具链”。记住这套流程:物理 → IP → 路由 → DNS → 端口 → 防火墙 → 抓包,大多数问题都能在 10-20 分钟内定位。

生产环境中,网络问题往往不是“配置错了”,而是“忘了某个环节”。养成每次改网络后立刻 ping + mtr + curl 验证的习惯,能避免 80% 的上线事故。

欢迎留言分享你最近一次网络故障的真实案例,是 DNS 坑了你还是安全组写反了?我们一起复盘。

THE END