Linux 网络配置:netplan、ip 命令与常见故障

ifconfig 已经过时了,现在该用 ip。这篇把网络配置的常用操作和排错顺序整理出来。

一、看网络状态

bash
ip a                     # 所有网卡与地址(替代 ifconfig)
ip -4 a                  # 只要 IPv4
ip link                  # 二层链路状态
ip -s link               # 带统计(收发包、错误、丢包)
ip r                     # 路由表(替代 route -n)
ip neigh                 # ARP 邻居表(替代 arp -a)

ss -lntp                 # 监听端口(替代 netstat)
ss -antp                 # 所有 TCP 连接
ss -s                    # 汇总统计

ip -s link 里的错误统计很有用:

字段含义
RX errors收包错误
RX dropped收包丢弃(可能是缓冲区满)
TX errors发包错误
collisions冲突(半双工才有)

二、netplan 配静态地址

Ubuntu 18.04+ 用 netplan,配置文件在 /etc/netplan/(YAML):

yaml
# /etc/netplan/00-installer-config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      addresses:
        - 192.168.1.10/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses: [223.5.5.5, 119.29.29.29]
bash
sudo netplan try         # 试应用,120 秒内不确认会自动回滚(强烈推荐)
sudo netplan apply       # 确认应用
sudo netplan generate    # 只生成后端配置,不应用

远程改网络一定要用 netplan try。直接 apply 写错了,你就和服务器失联了。

Debian 传统写法是 /etc/network/interfaces

bash
auto eth0
iface eth0 inet static
    address 192.168.1.10/24
    gateway 192.168.1.1
    dns-nameservers 223.5.5.5 119.29.29.29

三、DNS 怎么配的

bash
cat /etc/resolv.conf
# nameserver 127.0.0.53    ← systemd-resolved 的存根

# 现代系统用 systemd-resolved
resolvectl status
sudo resolvectl flush-caches

# 改 DNS(netplan 里配 nameservers 是正道)

/etc/resolv.conf 通常是个软链接,直接改会被覆盖。要改就在 netplan 或 resolved 配置里改。

bash
# 测试解析用了多久、走哪个服务器
dig www.bzii.cn
resolvectl query www.bzii.cn

四、主机名与 hosts

bash
hostnamectl set-hostname baize-node-1
cat /etc/hosts
bash
127.0.0.1   localhost
127.0.1.1   baize-node-1
::1         localhost ip6-localhost ip6-loopback

很多程序(尤其是 Java、数据库)启动时会反查主机名,hosts 里没有对应条目会导致启动慢几秒。这是个很隐蔽的坑。

五、连不上的排查顺序

从下往上,一层层排除:

bash
# 1. 网卡有地址吗
ip a

# 2. 链路通吗
ip link show eth0        # 看 state 是否 UP

# 3. 同网段通吗
ping -c 3 192.168.1.1

# 4. 有默认路由吗
ip r | grep default

# 5. 公网 IP 通吗
ping -c 3 223.5.5.5

# 6. DNS 解析对吗
dig +short www.bzii.cn

# 7. 端口通吗(ping 不通不代表端口不通)
nc -zv www.bzii.cn 443
curl -v https://www.bzii.cn

# 8. 逐跳看在哪断
mtr --report www.bzii.cn

六、端口相关的坑

bash
# 端口被谁占了
ss -lntp | grep :80
sudo lsof -i :80
sudo fuser -k 80/tcp        # 直接杀掉占用者

# 本机能不能连自己的服务
curl -v http://127.0.0.1:3000

# 服务只监听 127.0.0.1 会导致外网访问不了
ss -lntp | grep 3000
# 0.0.0.0:3000  ← 监听所有地址,正确
# 127.0.0.1:3000 ← 只监听本机,外网连不上

「本机 curl 通、外网不通」90% 是这两个原因:服务只监听 127.0.0.1,或者防火墙/安全组没放行。

七、防火墙查看

bash
sudo ufw status verbose
sudo iptables -L -n -v
sudo nft list ruleset        # nftables,新系统默认

注意云服务器有两层:厂商安全组 + 系统内防火墙,都要放行。

八、网卡改名(可选)

新系统用 ens33enp0s3 这种可预测命名。想改回 eth0:

bash
sudo vim /etc/default/grub
# GRUB_CMDLINE_LINUX 加 net.ifnames=0 biosdevname=0
sudo update-grub && sudo reboot

网络排错的核心方法就是从底层往上逐层验证,别一上来就怀疑运营商。