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/