Linux Network不同发行版配置方法不同,管理工具纷繁复杂,即使是同一种发行版不同版本管理工具也不断变化。作为系统管理员,环境里可能有各种版本的系统,所以要理一理关于Network的配置思路。

发行版配置工具

  • Centos6 使用 network.service。
  • Centos7 network.service 和 NetworkManager.service并存。
  • Centos8 之后只使用 NetworkManager.service。
  • Ubuntu 17.10之后使用 netplan 前端,NetworkManager/networkd 后端。

network.service

Centos7虽然引入了NetworkManager工具但是,依旧可以使用network.service,直到今年(2024)年centos7才彻底EOL,所以相信大部分系统管理人员包括我自己,依旧停留在network.service管理思路上。

# 开启Centos7上纯粹用network.service管理
systemctl stop NetworkManager
systemctl disable NetworkManager

网络配置修改 /etc/sysconfig/network-scripts 下的 ifcfg-*文件,之后执行 service network restart,配置即可生效。
network.service会执行 /etc/rc.d/init.d/network start 启动网络服务,启动的过程中,使用 ip 命令启动各 device,使用 route 配置系统路由,使用 sysctl 配置等。

ifcfg-*配置参考手册

NetworkManager

最近公司推动停用Centos7/6,推动升级到RockyLinux 8.x,便在自己机器上装了个RockyLinux 8.10作为Playground熟悉。分分钟装完系统,开机网卡没配置(装机时候特意没开,想着自己配),/etc/sysconfig/network-scripts/目录依旧熟悉,重启网络systemctl restart network报Unit network.service not found,傻了只有NetworkManager,这玩意咱不会啊,先Google条命令nmcli con reload搞定,看来这坑必须填了。

NetworkNanager有两个组件:

  • NetworkManager daemon, 管理连接和监听并报告网络变化。
  • 管理前端, 比如 nmcli,一些 GUI 程序等。

NetworkManager daemon 依赖于 D-Bus 实现了前端管理接口,底层使用 netlink 跟内核交互。nmcli 跟 D-Bus 交互连接 NetworkManager daemon,获得信息以及配置网络。

从NetworkManager的命令行工具nmcli开始:

# nmcli help
Usage: nmcli [OPTIONS] OBJECT { COMMAND | help }

OBJECT
  g[eneral]       NetworkManager's general status and operations
  n[etworking]    overall networking control
  r[adio]         NetworkManager radio switches
  c[onnection]    NetworkManager's connections
  d[evice]        devices managed by NetworkManager
  a[gent]         NetworkManager secret agent or polkit agent
  m[onitor]       monitor NetworkManager changes

所有的操作都针对OBJECT,别的对象按下不表,两个核心的对象必须整明白。

第一个对象是device,也就是设备,怎么理解呢,一个设备对应一个网口,基本上ip link里看到的那些都有对应的设备,基本上可以认为就是物理的网卡,每个物理网卡都会是一个device,当然,有些虚拟的网卡,也会是一个device,比如网桥bridge等。

另外一个对象是connection,也就是连接,就是一系列配置,比如IP地址获取方式是DHCP或者手动配置,如果是手动配置,则配置IP地址,网关,DNS等等信息。

连接最终要被apply到某个device上的,针对同一个device,可以有多个connection,但是有且只能有一个活动的connection被apply到一个device。

结合这个场景就很容易理解了:针对笔记本的无线网卡,在公司,连接的是公司的WIFI,这就需要一个connection,到了家里,连接家里的WIFI,这就是另外一个connection,这俩都是针对同一个device的配置,但是不会同时起作用。这种场景在服务器上不太常见,服务器上基本配置成一个connection对应一个device。

查看设备

nmcli dev
DEVICE  TYPE      STATE      CONNECTION
eth0    ethernet  connected  eth0
lo      loopback  unmanaged  --

可以看到两个设备eth0和lo,其中eth0是以太网类型被NetworkManager管理,对应的连接配置为eth0,状态为connected,lo是loopback目前不被NetworkManager所管理,状态为unmanaged。

查看连接

nmcli con
NAME  UUID                                  TYPE      DEVICE
eth0  4e4a729c-8303-4acf-a636-e8bb97184b14  ethernet  eth0

可以看到所有的连接列表。

查看连接详情

nmcli con show eth0
connection.id:                          eth0
...
ipv4.method:                            auto
...
ipv6.method:                            auto
...

可以看到大量的该连接的配置信息。

添加连接

# 对eth0添加一个静态IP配置的连接命名为eth0-static
nmcli con add type ethernet con-name eth0-static ifname eth0 ipv4.method manual ipv4.addresses "192.168.31.222/24" ipv4.gateway 192.168.31.1 ipv4.dns 192.168.31.1 ipv6.method auto
nmcli con
NAME         UUID                                  TYPE      DEVICE
eth0         4e4a729c-8303-4acf-a636-e8bb97184b14  ethernet  eth0
eth0-static  546f5039-130a-4ac7-af22-afdce2bc8a04  ethernet  --

对eth0添加了一个eth0-static连接,但是当前生效的仍为eth0连接。

切换连接

# 切换过程会导致ssh等连接断开
nmcli con up eth0-static
nmcli con
NAME         UUID                                  TYPE      DEVICE
eth0-static  546f5039-130a-4ac7-af22-afdce2bc8a04  ethernet  eth0
eth0         4e4a729c-8303-4acf-a636-e8bb97184b14  ethernet  --

可以看到现在eth0设备生效的连接为eth0-static。

配置持久化

命令行操作了一大堆,那么这些配置能持久化吗?重启了机器之后还会有么?如果有,那这些配置是保存在哪里的?我能不能不用nmcli这个命令行工具了,使用配置文件,能完成网络的配置么?

这些问题的答案都是肯定的!

首先呢,针对老版本network-scripts,也就是存放在/etc/sysconfig/network-scripts/目录下的那些ifcfg-*开头的配置文件,NetworkManager通过一个ifcfg-rh plugin去识别,这个插件在RHEL里是默认开启的,通过nmcli创建或者修改connections,都会同步到这个目录下对应的配置文件里。另外NetworkManager还会读取/etc/NetworkManager/system-connections/目录下的配置文件,通过nmcli创建和修改的其他类型的connections,比如ovs-bridge, dummy也会同步写入到对应目录下。

ll /etc/sysconfig/network-scripts
-rw-r--r--. 1 root root 269 Aug 16 22:45 ifcfg-eth0
-rw-r--r--  1 root root 349 Aug 17 07:07 ifcfg-eth0-static

所以可以到这两个目录下直接修改配置文件来配置网路,修改后需要手动执行nmcli connection load xxx手动重载单个配置或执行nmcli con reload重新加载所有的配置文件。加载完成后,要想配置真正生效,还需要执行nmcli con down xxx; nmcli con up xxx或者nmcli device reapply xxx来真正让配置生效。

删除连接

nmcli con del eth0-static
Connection 'eth0-static' (546f5039-130a-4ac7-af22-afdce2bc8a04) successfully deleted.
ll /etc/sysconfig/network-scripts
-rw-r--r--. 1 root root 269 Aug 16 22:45 ifcfg-eth0

可以看到命令行删除的eth0-static在/etc/sysconfig/network-scripts目录下的配置文件也同步删除了。

netplan

TODO

参考

https://exfly.github.io/linux_config_network/#netplan
https://www.ichenfu.com/2021/02/16/networkmanager-tutorial/