Skip to content

网络配置 ​

网络是服务器和外界沟通的唯一通道。网络不通,服务再健康也没用。本篇覆盖从基本配置到高级诊断的完整流程。

ip 命令(替代 ifconfig) ​

ifconfig 和 netstat 已过时,现代 Linux 用 ip 和 ss 替代。

bash
# 查看所有网络接口及其 IP
ip addr show
ip a                    # 简写

# 查看特定接口
ip addr show eth0

# 激活/关闭网络接口
sudo ip link set eth0 up
sudo ip link set eth0 down

# 查看路由表
ip route show
ip r                   # 简写

# 添加/删除路由
sudo ip route add 10.0.0.0/24 via 192.168.1.1
sudo ip route del 10.0.0.0/24
sudo ip route add default via 192.168.1.1    # 加默认网关

# 查看 ARP 表
ip neigh

ss(替代 netstat) ​

bash
# 查看所有监听端口
ss -tlnp
# -t: TCP  -l: listening  -n: 数字格式  -p: 显示进程

# 查看所有连接(包括已建立的)
ss -tanp

# 按状态过滤
ss -tanp state established
ss -tanp state time-wait

# 统计连接数(排查 TIME_WAIT 堆积)
ss -s

# 等价 netstat 命令对照
# netstat -tlnp    →  ss -tlnp
# netstat -anp     →  ss -anp

Netplan(Ubuntu 18.04+) ​

bash
# 查看或编辑网络配置
ls /etc/netplan/
sudo vim /etc/netplan/00-installer-config.yaml

静态 IP 示例:

Netplan YAML 缩进必须用空格

YAML 对缩进极其敏感,必须用空格缩进(推荐 2 空格),绝不能混用 Tab。用 Tab 会导致 netplan apply 报错或静默失败。大部分编辑器可以设置「将 Tab 转换为空格」。

yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      addresses:
        - 192.168.1.100/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4
bash
# 应用配置
sudo netplan apply
# 如果语法有问题,先试运行
sudo netplan try    # 有 120 秒超时,网络不通会自动回滚

NetworkManager(桌面/部分服务器) ​

bash
# 两种管理工具:nmcli(命令行)和 nmtui(文本界面)

# 查看所有连接
nmcli connection show

# 修改 ens33 为静态 IP
nmcli con mod ens33 ipv4.addresses 192.168.1.100/24
nmcli con mod ens33 ipv4.gateway 192.168.1.1
nmcli con mod ens33 ipv4.dns "8.8.8.8 8.8.4.4"
nmcli con mod ens33 ipv4.method manual
nmcli con up ens33

# 或使用交互式文本界面
sudo nmtui

DNS 配置 ​

bash
# 传统方式(会被 DHCP 覆盖,RHEL6/7)
cat /etc/resolv.conf
# nameserver 8.8.8.8

# systemd-resolved(现代 Ubuntu/Debian)
systemd-resolve --status
resolvectl status                      # 更新版命令
resolvectl dns eth0 8.8.8.8 1.1.1.1

# 测试 DNS 解析
nslookup google.com
dig google.com
dig google.com +short                   # 只显示 IP
dig @8.8.8.8 google.com                # 指定 DNS 服务器

网卡绑定(Bonding) ​

生产环境中常用 bonding 组多网卡,提高带宽和容错。

bash
# /etc/netplan/01-bond.yaml
network:
  version: 2
  bonds:
    bond0:
      interfaces:
        - eth0
        - eth1
      parameters:
        mode: 802.3ad          # LACP 模式,需要交换机支持
        # mode: active-backup  # 主备模式,不需要交换机配合
        mii-monitor-interval: 100
      addresses:
        - 10.0.0.10/24
      routes:
        - to: default
          via: 10.0.0.1

网络诊断工具包 ​

链路层:ping / traceroute / mtr ​

bash
ping -c 4 8.8.8.8                    # 4 个包
ping -c 100 -i 0.2 8.8.8.8           # 快速 ping,测试丢包

traceroute 8.8.8.8                   # 看经过哪些跳
# 星号 * 表示该跳不响应 ICMP,不是故障

mtr 8.8.8.8                          # ping + traceroute 合体,实时刷新
mtr -r -c 10 8.8.8.8                 # 生成 10 轮报告

接口层:tcpdump ​

bash
# 抓取经过 eth0 的所有流量(Ctrl+C 停止)
sudo tcpdump -i eth0

# 只看端口 80
sudo tcpdump -i eth0 port 80

# 只看来自某 IP 的流量
sudo tcpdump -i eth0 src host 192.168.1.100

# 写文件(wireshark 可打开分析)
sudo tcpdump -i eth0 -w capture.pcap

# 读文件
sudo tcpdump -r capture.pcap

# 实用组合:抓 HTTP 请求
sudo tcpdump -i eth0 -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

端口测试:nc(netcat) ​

bash
# 测试端口是否通
nc -zv 10.0.0.5 3306          # 测试 MySQL 端口
nc -zv 10.0.0.5 22             # 测试 SSH 端口

# 启动临时 TCP 服务(测试用)
nc -l -p 8080                  # 在 8080 端口监听

# 端口扫描
nc -zv 10.0.0.5 20-100        # 扫描 20-100 端口

诊断网络不通三步法 ​

步骤1:本地网卡 → ip a 看网卡状态、IP 是否配了
步骤2:网关可达 → ping 网关 IP、ip route 看路由
步骤3:外部连通 → ping 8.8.8.8(IP 通但域名不通 = DNS 问题)
bash
# === 快速诊断脚本 ===

echo "=== 1. 网卡状态 ==="
ip a | grep -E "^\d:|inet "

echo "=== 2. 默认网关 ==="
ip route | grep default
GATEWAY=$(ip route | grep default | awk '{print $3}')

echo "=== 3. Ping 网关 ($GATEWAY) ==="
ping -c 2 -W 1 "$GATEWAY" 2>/dev/null && echo "网关: OK" || echo "网关: FAIL"

echo "=== 4. Ping 外网 IP ==="
ping -c 2 -W 1 8.8.8.8 2>/dev/null && echo "外网(IP): OK" || echo "外网(IP): FAIL"

echo "=== 5. DNS 解析 ==="
nslookup baidu.com >/dev/null 2>&1 && echo "DNS: OK" || echo "DNS: FAIL"

echo "=== 6. 连接统计 ==="
ss -s

常见坑 ​

坑 1:改了 resolv.conf 被覆盖 ​

bash
# 现代 Ubuntu 使用 systemd-resolved 管理 DNS
# 直接编辑 /etc/resolv.conf 改完就会被覆盖

# 正确方式:改 netplan 或 NetworkManager 的 DNS 配置
# 或修改 resolved 配置:
sudo vim /etc/systemd/resolved.conf
# DNS=8.8.8.8 1.1.1.1
sudo systemctl restart systemd-resolved

坑 2:端口监听但外部访问不了 ​

bash
# 99% 是防火墙或安全组
sudo ufw status              # Ubuntu 本地防火墙
sudo firewall-cmd --list-all # RHEL 防火墙
sudo iptables -L -n          # 直接看 iptables 规则

# 云服务器别忘了安全组/防火墙规则也要放行

坑 3:no route to host vs connection refused ​

  • no route to host:到不了目标(路由问题、防火墙 DROP)
  • connection refused:到了但端口没监听(服务没启动、端口不对)

生产环境经验 ​

  • 网络配置用配置管理:netplan / NetworkManager / systemd-networkd 选一个,别混用
  • DNS 冗余:至少配两个 DNS 服务器
  • 监控 SLA:监控丢包率、延迟、连接数,别等到用户投诉才知道网络有问题
  • MTU 问题:云环境/VPN 中常见,ping -M do -s 1472 8.8.8.8 测试路径 MTU
  • tcpdump 是网络问题终极武器:能抓到的都能分析

🎯 本章要点 ​

  • ip addr 替代 ifconfig,ss -tlnp 查看监听端口
  • DNS 出问题先用 dig +short 测试解析
  • MTU 问题在云/VPN 环境常见,用 ping 测试路径
加载练习题中...