网络配置的演化与调试思路

在调试linux网络时,经常会因为配置错误导致无法上网,而随着linux的发行版本迭代,配置的方法也发生了很多改变。本文将介绍 Linux 网络配置的演变过程,并总结常见的调试思路和排坑技巧。以下多以Ubuntu为例。

时间线

1、ifupdown

早期linux系统发行版,如(Debian/Ubuntu 旧版)都用的是 ifupdown,配置文件是” /etc/network/interfaces”。这个路径你在查资料的时候,经常看到,但是在新版的linux系统是找不到。

它需要配合 ifup/ifdown 命令,配置方式较底层,灵活但复杂。目录 /etc/network/ 下的钩子脚本可以在接口状态切换时执行:

  • /etc/network/if-pre-up.d:接口启用前执行

  • /etc/network/if-up.d:接口启用后执行

  • /etc/network/if-down.d:接口关闭后执行

  • /etc/network/if-post-down.d:接口关闭前执行

缺点:对现代场景(桥接、VLAN、容器、cloud-init)支持不足,逐渐被替代。

2、NetworkManager

随着WiFi流行和宽带升级,很多网络使用场景变的更复杂,2004 年由 Red Hat 发起,目标是给桌面(尤其无线、流动场景)一个“自动化/策略化”的连接管理器,用于简化网络连接的管理,就有了 NetworkManager。

它适合笔记本、平板电脑等桌面环境。支持图形界面(GNOME、KDE)和命令行(nmcli, nmtui)

3、systemd-networkd

虽然NetworkManager,能够很方便的通过UI界面管理网络,但是现实中很多服务器是不带显示屏的,也没有WiFi这类硬件,主要是静态IP管理。

使用的systemd-networkd 轻量的网络后端,设计上更适合服务器、容器、initramfs、云镜像等场景(轻量、快速、无 GUI)。常配合 networkctl / journalctl -u systemd-networkd 做调试,一个查看状态,一个查看日志。

4、Netplan

Canonical/Ubuntu 在 17.10 引入 netplan,目的不是再发明一个运行时后端,而是提供一个“声明式(YAML)”且能渲染到多种后端的统一配置层:将抽象的网络配置(/etc/netplan/*.yaml)翻译成后端可读的具体配置(如 systemd-networkd 的 .network 文件或 NetworkManager 的配置)。它解决了 ifupdown 表达能力不足、以及不同后端配置格式不统一的问题。

以上就是linux网络配置的大致演变。

调试思路

方案差异

首先简单梳理下各类配置优劣

工具 适合 不适合
ifupdown 旧版 Debian/Ubuntu,简单网络 现代复杂网络
NetworkManager 桌面、Wi-Fi、VPN、动态切换 无显示的纯服务器
systemd-networkd 服务器、容器、云环境 Wi-Fi、VPN
Netplan (抽象层) Ubuntu 17.10+,统一配置入口 Ubuntu 系,跨发行版不可用

排坑方法

  • 查看配置方式

查看系统版本:老系统还在用 “/etc/network/interfaces”,新系统则是”netplan”。

硬件类型:桌面与服务器不同Ubuntu Desktop 默认 NetworkManager,Server 默认 systemd-networkd。

  • 查看管理方式

Desktop 的 netplan ,所有网卡都交给 NetworkManager 管理。

桌面环境:默认 renderer: NetworkManager用 nmcli 管理接口,别直接改 netplan 里的静态 IP(改了也会被覆盖)。

服务器环境:netplan 默认 renderer: networkd,用 netplan YAML 管理即可。

  • 安全修改

远程调试时,避免网络掉线:

1
sudo netplan try   # 有 120 秒回滚机制

临时添加 IP 保障连接:

1
2
sudo ip addr add 192.168.1.123/24 dev eth0
sudo ip route add default via 192.168.1.1
  • 查看日志

systemd-networkd 日志排错

1
2
networkctl 查看状态。
journalctl -u systemd-networkd 查详细日志
  • WiFi排查

WiFi最好是用NetworkManager管理,systemd-networkd 对 Wi-Fi/VPN 支持有限。

桌面/笔记本:用 NetworkManager。

服务器: 需要在 netplan 配置里把 Wi-Fi 接口 renderer 指定为 NetworkManager

  • 容器 / 云镜像差异

Docker 容器里多数不跑 NetworkManager,用 systemd-networkd 或直接 ip 命令。

云环境(AWS/Azure/OpenStack)会结合 cloud-init + netplan,一般别手动改 /etc/netplan,而是通过 cloud-init 元数据注入

配置方法示例

NetworkManager(nmcli)
通过安装NetworkManager来获取工具
apt-get install NetworkManager

查看设备状态:

1
nmcli device status(或 nmcli dev status)。

列出连接配置:

1
nmcli connection show(或 nmcli con show)。

添加一个静态有线连接(示例):

1
2
sudo nmcli con add type ethernet con-name my-eth ifname enp0s3 ip4 192.168.100.100/24 gw4 192.168.100.1
sudo nmcli con up my-eth

连接 Wi-Fi(交互或直接带密码):

1
nmcli device wifi connect "SSID" password "PASSWORD"。

Netplan 配置

  • 配置静态 IP 地址

对于 Ubuntu 20.04 及以后版本,在 /etc/netplan/01-network-manager-all.yaml 中设置静态 IP:

1
2
3
4
5
6
7
8
9
10
11
network:
version: 2
renderer: NetworkManager
ethernets:
eth0: // 修改网卡名字
dhcp4: no
addresses:
192.168.0.123/24 // 设置的ip地址
gateway4: 192.168.0.1 // 网关
nameservers:
addresses: [8.8.8.8, 1.1.1.1] // dns解析
  • 配置 DHCP 自动获取 IP
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    network:
    ethernets:
    eth0:
    dhcp4: true
    eth1:
    dhcp4: true
    nameservers:
    addresses: [8.8.8.8, 1.1.1.1]
    version: 2

    应用:
    1
    2
    3
    4
    sudo netplan generate   # 生成后端配置(到 /run/...)
    sudo netplan try # 安全尝试(若在远程修改时不确认会回滚)
    sudo netplan apply # 正式应用