共计 8236 个字符,预计需要花费 21 分钟才能阅读完成。
➡ 在 rhel8(含 CentOS8)上,没有传统的 network.service,在 /etc/sysconfig/network-scripts/ 里也看不到任何脚本文件,那么该如何进行网络配置呢。
➡ 本文详细阐述基于 rhel8 的网络配置,包含多种配置方法。
➡ 事先声明:本文提及的所有内容,仅适用 rhel8/centos8,因为不同 linux 系统的 NetworkManager 行为存在部分差异。
小慢哥的原创文章,欢迎转载
目录
▪ rhel8 与 7 的区别
▪ NetworkManager 介绍
▪ nmcli 使用方法
▪ nmcli 常用命令一览
▪ nmcli connection 重点
▪ nmcli device 重点
▪ 3 种网络配置方法
▪ Tips
rhel8 与 7 的区别
在 rhel7 上,同时支持 network.service 和 NetworkManager.service(简称 NM)。默认情况下,这 2 个服务都有开启,但许多人都会将 NM 禁用掉。
在 rhel8 上,已废弃 network.service,因此只能通过 NM 进行网络配置,包括动态 ip 和静态 ip。换言之,在 rhel8 上,必须开启 NM,否则无法使用网络。
rhel8 依然支持 network.service,只是默认没安装,详见本文最后的 Tips。
NetworkManager 介绍
NetworkManager 是 2004 年 Red Hat 启动的项目,旨在能够让 Linux 用户更轻松地处理现代网络需求,尤其是无线网络,能自动发现网卡并配置 ip 地址。
类似在手机上同时开启 wifi 和蜂窝网络,自动探测可用网络并连接,无需手动切换。
虽然初衷是针对无线网络,但在服务器领域,NM 已大获成功。
NM 能管理各种网络
▷ 有线网卡、无线网卡
▷ 动态 ip、静态 ip
▷ 以太网、非以太网
▷ 物理网卡、虚拟网卡
使用方法
▷ nmcli:命令行。这是最常用的工具,本文将详细讲解该工具使用。
▷ nmtui:在 shell 终端开启文本图形界面。示意图见本文最后的 Tips
▷ Freedesktop applet:如 GNOME 上自带的网络管理工具
▷ cockpit:RedHat 自带的基于 web 图形界面的 ” 驾驶舱 ” 工具,具有 dashborad 和基础管理功能。示意图见本文最后的 Tips
为什么要用 NM
▷ 工具齐全:命令行、文本界面、图形界面、web
▷ 广纳天地:纳管各种网络,有线、无线、物理、虚拟
▷ 参数丰富:多达 200 多项配置参数(包括 ethtool 参数)
▷ 一统江湖:RedHat 系、SUSE 系、Debian/Ubuntu 系,均支持
▷ 大势所趋:下一个大版本的 rhel 只能通过 NM 管理网络
nmcli 使用方法
nmcli 使用方法非常类似 linux ip 命令、cisco 交换机命令,并且支持 tab 补全(详见本文最后的 Tips),也可在命令最后通过 -h、–help、help 查看帮助。在 nmcli 中有 2 个命令最为常用:
➡ nmcli connection
译作 连接,可理解为配置文件,相当于 ifcfg-ethX。可以简写为 nmcli c
➡ nmcli device
译作 设备,可理解为实际存在的网卡(包括物理网卡和虚拟网卡)。可以简写为 nmcli d
在 NM 里,有 2 个维度:连接(connection)和 设备(device),这是多对一的关系。想给某个网卡配 ip,首先 NM 要能纳管这个网卡。设备里存在的网卡(即 nmcli d
可以看到的),就是 NM 纳管的。接着,可以为一个设备配置多个连接(即 nmcli c
可以看到的),每个连接可以理解为一个 ifcfg 配置文件。同一时刻,一个设备只能有一个连接活跃。可以通过 nmcli c up
切换连接。
connection 有 2 种状态:
▷ 活跃(带颜色字体):表示当前该 connection 生效
▷ 非活跃(正常字体):表示当前该 connection 不生效
device 有 4 种常见状态:
▷ connected:已被 NM 纳管,并且当前有活跃的 connection
▷ disconnected:已被 NM 纳管,但是当前没有活跃的 connection
▷ unmanaged:未被 NM 纳管
▷ unavailable:不可用,NM 无法纳管,通常出现于网卡 link 为 down 的时候(比如 ip link set ethX down)
nmcli 常用命令一览
# 查看 ip(类似于 ifconfig、ip addr)
nmcli
# 创建 connection,配置静态 ip(等同于配置 ifcfg,其中 BOOTPROTO=none,并 ifup 启动)
nmcli c add type ethernet con-name ethX ifname ethX ipv4.addr 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.method manual
# 创建 connection,配置动态 ip(等同于配置 ifcfg,其中 BOOTPROTO=dhcp,并 ifup 启动)
nmcli c add type ethernet con-name ethX ifname ethX ipv4.method auto
# 修改 ip(非交互式)
nmcli c modify ethX ipv4.addr '192.168.1.200/24'
nmcli c up ethX
# 修改 ip(交互式)
nmcli c edit ethX
nmcli> goto ipv4.addresses
nmcli ipv4.addresses> change
Edit 'addresses' value: 192.168.1.200/24
Do you also want to set 'ipv4.method' to 'manual'? [yes]: yes
nmcli ipv4> save
nmcli ipv4> activate
nmcli ipv4> quit
# 启用 connection(相当于 ifup)
nmcli c up ethX
# 停止 connection(相当于 ifdown)
nmcli c down
# 删除 connection(类似于 ifdown 并删除 ifcfg)
nmcli c delete ethX
# 查看 connection 列表
nmcli c show
# 查看 connection 详细信息
nmcli c show ethX
# 重载所有 ifcfg 或 route 到 connection(不会立即生效)
nmcli c reload
# 重载指定 ifcfg 或 route 到 connection(不会立即生效)
nmcli c load /etc/sysconfig/network-scripts/ifcfg-ethX
nmcli c load /etc/sysconfig/network-scripts/route-ethX
# 立即生效 connection,有 3 种方法
nmcli c up ethX
nmcli d reapply ethX
nmcli d connect ethX
# 查看 device 列表
nmcli d
# 查看所有 device 详细信息
nmcli d show
# 查看指定 device 的详细信息
nmcli d show ethX
# 激活网卡
nmcli d connect ethX
# 关闭无线网络(NM 默认启用无线网络)
nmcli r all off
# 查看 NM 纳管状态
nmcli n
# 开启 NM 纳管
nmcli n on
# 关闭 NM 纳管(谨慎执行)
nmcli n off
# 监听事件
nmcli m
# 查看 NM 本身状态
nmcli
# 检测 NM 是否在线可用
nm-online
本文提及的 ifcfg 均指代 /etc/sysconfig/network-scripts/ifcfg-ethX 及 /etc/sysconfig/network-scripts/route-ethX
nmcli connection 重点
➡ nmcli c show
▪ 第一列是 connection 名字,简称 con-name(注意 con-name 不是网卡名)
▪ 第二列是 connection 的 UUID
▪ 最后一列才是网卡名(标准说法叫 device 名),可通过 nmcil d 查看 device
对 connection 做操作时需要指定标识,标识可以是 con-name、UUID、如果存在 ifcfg 文件则也可以用 ifcfg 的完整路径,即 /etc/sysconfig/network-scripts/ifcfg-ethX
nmcli c show ethX
nmcli c show cae3f1ef-e79a-46c3-8e0c-946b91a65e11
nmcli c show /etc/sysconfig/network-scripts/ifcfg-ethX
➡ nmcli c 的 con-name
同时对应 ifcfg 的文件名以及内容中的 NAME=,该参数表示连接(connection)的名字,无需和网卡名相同,可以为一个设备(device)创建多个连接,但同一时刻只能有一个连接生效。当有多个连接时候,nmcli c delete
删除当前连接,就会自动选择同一个设备的其他连接来顶替生效。可以通过 nmcli c up
来将指定连接切换生效。
注意:通过 nmcli c modify 修改 con-name,只会对应修改 ifcfg 文件中的 NAME,而不会更改 ifcfg 文件名。
➡ nmcli c 的 ipv4.method
对应 ifcfg 文件内容的 BOOTPROTO,ipv4.method 默认为 auto,对应为 BOOTPROTO=dhcp,这种时候如果指定 ip,就可能导致网卡同时有 dhcp 分配的 ip 和静态 ip。设置为 manual 表示 BOOTPROTO=none,即只有静态 ip。
例子:创建一个连接(connection)
nmcli c add type ethernet con-name ethX-test ifname ethX ipv4.addresses '192.168.1.100/24,192.168.1.101/32' ipv4.routes '10.0.0.0/8 192.168.1.10,192.168.0.0/16 192.168.1.11' ipv4.gateway 192.168.1.254 ipv4.dns '8.8.8.8,4.4.4.4' ipv4.method manual
▪ type ethernet:创建连接时候必须指定类型,类型有很多,可以通过 nmcli c add type -h
看到,这里指定为 ethernet。
▪ con-name ethX ifname ethX:第一个 ethX 表示连接(connection)的名字,这个名字可以任意定义,无需和网卡名相同;第二个 ethX 表示网卡名,这个 ethX 必须是在 nmcli d
里能看到的。
▪ ipv4.addresses ‘192.168.1.100/24,192.168.1.101/32’:配置 2 个 ip 地址,分别为 192.168.1.100/24 和 192.168.1.101/32
▪ ipv4.gateway 192.168.1.254:网关为 192.168.1.254
▪ ipv4.dns ‘8.8.8.8,4.4.4.4’:dns 为 8.8.8.8 和 4.4.4.4
▪ ipv4.method manual:配置静态 IP
对应的 ifcfg 和 dns 就是
# /etc/sysconfig/network-scripts/ifcfg-ethX-test
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.1.100
PREFIX=24
IPADDR1=192.168.1.101
PREFIX1=32
GATEWAY=192.168.1.254
DNS1=8.8.8.8
DNS2=4.4.4.4
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ethX-test
UUID=9a10ad89-437c-4caa-949c-a394a6d28c8d
DEVICE=ethX
ONBOOT=yes
# /etc/resolv.conf
nameserver 8.8.8.8
nameserver 4.4.4.4
此时,通过 nmcli c
应该可以看到增加了一条连接
注意:如果这是为 ethX 创建的第一个连接,则自动生效;如果此时已有连接存在,则该连接不会自动生效,可以执行
nmcli c up ethX-test
来切换生效
nmcli device 重点
➡ nmcli d connect ethX
由 NM 对指定网卡进行管理,同时刷新该网卡对应的活跃 connection(如果之前有修改过 connection 配置);如果有 connection 但是都处于非活跃状态,则自动选择一个 connection 并将其活跃;如果没有 connection,则自动生成一个并将其活跃。
➡ nmcli d disconnect ethX
让 NM 暂时不管理指定网卡,此操作不会变更实际网卡的 link 状态,只会使对应的 connection 变成非活跃。若重启系统则又会自动 connect。另外,如果手工将该网卡的 connection 全部删掉,该网卡状态也会自动变为 disconnected。
➡ nmcli d reapply ethX
专门用于刷新 connection,前提是网卡的 device 处于 connected 状态,否则会报错。
➡ nmcli d set ethX autoconnect yes|no managed yes|no
可以设置是否自动连接和是否自动管理,但经测试只能用于当前开机状态,如果这 2 个参数都设置为 no,然后重启系统,又会自动恢复成 connected 和 managed yes 的状态。所以该命令用途不大。注意事项:如果 managed 设置为 no,那么 nmcli c reload
会读取配置文件,但是不会立即生效,接着如果执行 nmcli c up ethX,就会立即生效,同时 managed 自动变为 yes。
重启系统自动恢复成 connected 和 managed yes 的状态,这种逻辑并不实用也不够合理,笔者已将此问题提交给 redhat,据回复,这么设计是因为目前没有一个有效的手段来证明“我是我”,比如当网卡重新拔插到其他插槽时候,网卡名有很大可能性会发生变化,因此无法确定关机前设置的是对应开机后的哪个网卡,目前暂无办法解决,笔者将持续跟进。
3 种网络配置方法
在讲 3 种配置方法前,需要先明白 ifcfg 和 NM connection 的关联:虽然 network.service 被废弃了,但是 redhat 为了兼容传统的 ifcfg,通过 NM 进行网络配置时候,会自动将 connection 同步到 ifcfg 配置文件中。也可以通过 nmcli c reload
或者 nmcli c load /etc/sysconfig/network-scripts/ifcfg-ethX
的方式来让 NM 读取 ifcfg 配置文件到 connection 中。因此 ifcfg 和 connection 是一对一的关系,另外上面有提到,connection 和 device 是多对一的关系。
在 rhel8 上,有 3 种方法进行网络配置
▷ 1. 手工配置 ifcfg,通过 NM 来生效
▷ 2. 通过 NM 自带工具配 ip,比如 nmcli
▷ 3. 手工配置 ifcfg,通过传统 network.service 来生效
建议:
推荐使用上述第 1 种网络配置方法(手工配置 ifcfg,通过 NM 生效),因为这样既兼容了传统的 ifcfg 配置,又能熟悉 nmcli。举例:
cat > /etc/sysconfig/network-scripts/ifcfg-eth0 <<EOF
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
IPADDR=192.168.1.10
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
EOF
nmcli c reload
# nmcli c up eth0 # 如果之前没有 eth0 的 connection,则上一步 reload 后就已经自动生效了
这么做有 2 个好处:
▷ 按官方建议使用 NM 而不是 network.service
▷ 当还不太熟悉 nmcli 命令时候,这样最稳妥
Tips
➡ 1. nmcli 命令支持 tab 补全,但是需要yum install bash-completion
➡ 2. 如果希望 NM 不要纳管网卡,只有一个办法最彻底最靠谱,就是自己写 ifcfg,内容加上NM_CONTROLLED=no
,这样该 device 的状态就会始终保持 unmanaged。nmcli c up、nmcli c reload、nmcil c load 都不会对其起任何作用。
➡ 3. NM 只能对 link 状态为 up 的网卡进行操作,如果手动ip link set ethX down
,那么 NM 就无法对该网卡做任何操作(即使 nmcli d connect 也没有用)。
➡ 4. 可以通过 yum install network-scripts
来安装传统的 network.service,不过 redhat 说了,在下一个 rhel 的大版本里将彻底废除,因此不建议使用 network.service。
➡ 5. 手工创建新的 ifcfg 或者在 ifcfg 里修改 ip 等配置,NM 不会自动读取,需要手工执行 nmcli c reload
或者nmcli c load /etc/sysconfig/network-scripts/ifcfg-ethX
。这一点可能和其他系统的 NM 行为不太一样,但这种做法实则更适合服务器。
➡ 6. 不手工配置 ifcfg,使用默认的 dhcp 情况下,网卡的增减是不会自动生成 ifcfg,此时 nmcli c 看到的 con-name 将类似 ’System ethX’ 或者 ’Wired connection 1’。
➡ 7. NetworkManager 支持 3 种获取 dhcp 的方式:dhclient、dhcpcd、internal,当 /etc/NetworkManager/NetworkManager.conf 配置文件中的 [main] 部分没配置 dhcp=
时候,默认使用 internal(rhel7/centos7 默认是 dhclient)。internal 是 NM 内部实现的 dhcp 客户端。
➡ 8. 关于手动指定网关 ip 的方法,经过实测,/etc/sysconfig/network 中的 GATEWAY 仅在 3 种情况下有效:NM_CONTROLLED=no
或 ipv4.method manual
或从 ipv4.method manual 第一次转到 ipv4.method auto 时候
。建议:当 NM_CONTROLLED=no 时,将网关写在 /etc/sysconfig/network(GATEWAY);当使用 NM 时候,使用 nmcli c 命令配置网关(比如nmcli c modify ethX ipv4.gateway 192.168.1.1
)。
➡ 9. NM 默认会从 dhcp 里获取 dns 信息,并修改 /etc/resolv.conf,如果不想让 NM 管理 /etc/resolv.conf,则只需在 /etc/NetworkManager/NetworkManager.conf 里的 [main] 里增加 dns=none
即可。
➡ 10. 如果想让 NM 不要自动管理新网卡(比如不要给新网卡获取 ip 地址),则只需在 /etc/NetworkManager/NetworkManager.conf 里的 [main] 里增加 no-auto-default=*
即可,改完后通过 systemctl restart NetworkManager
或者重启系统来生效。除了手工在 NetworkManager.conf 里加配置,也可以yum install NetworkManager-config-server
,这会生成 /usr/lib/NetworkManager/conf.d/00-server.conf,内容为如下截图。建议使用前者方案,因为后者的 ingore-carrier 是不被推荐的参数。
➡ 11. 更多 NetworkManager 参数详见 man NetworkManager.conf
➡ 12. nmtui 示意图:
➡ 13. cockpit 示意图:
在 rhel8.0 beta 时候,必须要先将浏览器语言设置为英语,才可以使用,如果为中文,在登陆后是空白页面。笔者已将该 bug 提交给 redhat,据回复会在 RHEL8.0 正式版修复,笔者将持续跟进。