Linux系统--网络配置的演化与调试思路
网络配置的演化与调试思路
在调试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 | sudo ip addr add 192.168.1.123/24 dev eth0 |
- 查看日志
systemd-networkd 日志排错
1 | networkctl 查看状态。 |
- 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 | sudo nmcli con add type ethernet con-name my-eth ifname enp0s3 ip4 192.168.100.100/24 gw4 192.168.100.1 |
连接 Wi-Fi(交互或直接带密码):
1 | nmcli device wifi connect "SSID" password "PASSWORD"。 |
Netplan 配置
- 配置静态 IP 地址
对于 Ubuntu 20.04 及以后版本,在 /etc/netplan/01-network-manager-all.yaml 中设置静态 IP:
1 | network: |
- 配置 DHCP 自动获取 IP应用:
1
2
3
4
5
6
7
8
9
10network:
ethernets:
eth0:
dhcp4: true
eth1:
dhcp4: true
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
version: 21
2
3
4sudo netplan generate # 生成后端配置(到 /run/...)
sudo netplan try # 安全尝试(若在远程修改时不确认会回滚)
sudo netplan apply # 正式应用