RHEL7 与 CentOS 7 以上的版本中默认的网络服务由 NetworkManager 提供(简称NM),这是动态控制及配置网络的守护进程,它用于保持当前网络设备及连接处于工作状态,同时也支持传统的 ifcfg 类型的配置文件。NetworkManager 可以用于以下类型的连接:Ethernet,VLANS,Bridges,Bonds,Teams,Wi-Fi,mobile boradband(如移动3G)以及 IP-over-InfiniBand。 针对与这些网络类型,NetworkManager 可以配置他们的网络别名,IP 地址,静态路由,DNS,VPN连接以及很多其它的特殊参数。可以用命令行工具 nmcli 来控制 NetworkManager。nmcli的功能要比 ifconfig 强大、复杂的多。
nmcli是命令行的NetworkManager工具,自动把配置写到/etc/sysconfig/network-scripts/目录下面。RHEL7 与 CentOS 7之前的网络管理是通过 ifcfg 文件配置管理接口(device),而现在是通过NetworkManager服务管理连接(connection)。一个接口(device)可以有多个连接(connection),但是同时只允许一个连接(connection)处于激活(active)状态。但有一个问题,重启服务器后默认激活那个连接,我没查到相关的资料,如果是服务器建议一个网口对于一个连接。
简单理解就是,一个连接就是(connection)就是/etc/sysconfig/network-scripts/目录下的一个配置文件,接口(device)是物理设备,一个物理设置可以拥有多个配置文件,但只能有一个配置文件属于使用(active)状态;配置文件的生成与使用状态均由NetworkManager控制。当然,依旧支持ifcfg文件配置管理网络,但不推荐。
典型用途包括:
Scripts: 通过nmcli利用NetworkManager,而不是手动管理网络连接。nmcli支持更适合脚本处理的简洁输出格式。请注意,NetworkManager还可以执行称为“调度程序脚本”的脚本来响应网络事件。
Servers, headless machines, and terminals: nmcli可用于在没有GUI的情况下控制NetworkManager,包括创建、编辑、启动和停止网络连接以及查看网络状态。

NetworkManager服务

使用 nmcli 时,NetworkManager 必须保持开启。
NetworkManager 的相关命令:

systemctl status NetworkManager			查看运行状态
ystemctl start NetworkManager			启动
ystemctl restart NetworkManager			重启
systemctl stop NetworkManager			关闭
systemctl is-enabled NetworkManager		查看是否开机启动
systemctl enable NetworkManager			开机启动
systemctl disable NetworkManager		禁止开机启动

注意:NetworkManager 中开头的 N 和中间的 M 必须大写。

nmcli使用方法

man手册网络管理器参考手册 nmcli使用方法非常类似linux ip命令、cisco交换机命令,并且支持tab补全,也可在命令最后通过-h、–help、help查看帮助。在nmcli中有2个命令最为常用:
nmcli语法:

nmcli [ OPTIONS ] OBJECT { COMMAND | help }
nmcli [OPTIONS...] { help | general | networking | radio | connection | device | agent | monitor } [COMMAND] [ARGUMENTS...]

OBJECT和COMMAND可以用全称也可以用简称,最少可以只用一个字母,建议用头三个字母。OBJECT里面我们平时用的最多的就是connection和device,还有其他的选项在里暂时不介绍,这里需要简单区分一下connection和device。

1、nmcli connection

连接,偏重于逻辑设置,可理解为配置文件,相当于ifcfg-ethX。可以简写为nmcli c
多个connection可以应用到同一个device,但同一时间只能启用其中一个connection。这样的好处是针对一个网络接口,我们可以设置多个网络连接,比如静态IP和动态IP,再根据需要up相应connection,这样可以方便的切换网络配置,比如笔记本电脑移动办公,到不同的环境同一个网卡可以切换到不同的网络配置,配置好以后不需要每次都从新配置。

2、nmcli device

设备,是网络设备的接口,可理解为实际存在的网卡(包括物理网卡和虚拟网卡)。可以简写为nmcli d
在NM里,有2个维度:连接(connection)和设备(device),这是多对一的关系。想给某个网卡配ip,首先NM要能纳管这个网卡。设备里存在的网卡(即 nmcli d可以看到的),就是NM纳管的。接着,可以为一个设备配置多个连接(即 nmcli c可以看到的),每个连接可以理解为一个ifcfg配置文件。同一时刻,一个设备只能有一个连接活跃。可以通过 nmcli c up切换连接。

3、connection有2种状态:

▷ 活跃(带颜色字体):表示当前该connection生效
▷ 非活跃(正常字体):表示当前该connection不生效

4、device有4种常见状态:

▷ connected:已被NM纳管,并且当前有活跃的connection
▷ disconnected:已被NM纳管,但是当前没有活跃的connection
▷ unmanaged:未被NM纳管
▷ unavailable:不可用,NM无法纳管,通常出现于网卡link为down的时候(比如ip link set ethX down)

nmcli connection说明

[root@master ~]# nmcli c show						显示所有活动链接
名称    UUID                                  类型            设备   
ens33   51a4ba6c-0635-400b-a1c6-f9e87d55c303  802-3-ethernet  ens33        # 这是当前激活的连接带颜色字体,只是文章里体现不出来
virbr0  0d2e6f20-0044-49f9-80ec-cbe19c31df42  bridge          virbr0 
10.97.17.90      93e8cf06-bd0b-4b69-b802-f3c8c602e000    ethernet     # “--”表示当前没有激活的连接

每一行是一个连接,只是只有一个是激活状态
第一列是connection名字(连接名称)简称con-name,简称con-name(注意con-name不是网卡名)
第二列是connection的UUID
第三列是connection的网络类型
最后一列才是网卡名(标准说法叫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

1、nmcli connection名字(连接名称)
同时对应ifcfg的文件名以及内容中的NAME=,该参数表示连接(connection)的名字,无需和网卡名相同,可以为一个设备(device)创建多个连接,但同一时刻只能有一个连接生效。当有多个连接时候,可以通过nmcli c delete删除当前连接,就会自动选择同一个设备的其他连接来顶替生效。可以通过nmcli c up来将指定连接切换生效。
注意:通过nmcli c modify修改连接名称,只会对应修改ifcfg文件中的NAME,而不会更改ifcfg文件名。
2、nmcli c的ipv4.method
对应ifcfg文件内容的BOOTPROTO,ipv4.method默认为auto,对应为BOOTPROTO=dhcp,这种时候如果指定ip,就可能导致网卡同时有dhcp分配的ip和静态ip。设置为manual表示BOOTPROTO=none,即只有静态ip。

nmcli device说明

[root@master ~]# nmcli d status               #查看设备接口简略信息
设备        类型      状态    CONNECTION 
virbr0      bridge    连接的  virbr0     
ens33       ethernet  连接的  ens33      
lo          loopback  未管理  --         
virbr0-nic  tun       未管理  --

每一行表示一个网络设备的接口。
第一列表示设备接口的名称,第二列表示设备接口的类型,第三列表示设备接口状态,最后一列表示connection的名字,“–”表示设备为使用!

1、nmcli d connect ethX
由NM对指定网卡进行管理,同时刷新该网卡对应的活跃connection(如果之前有修改过connection配置);如果有connection但是都处于非活跃状态,则自动选择一个connection并将其活跃;如果没有connection,则自动生成一个并将其活跃。
2、nmcli d disconnect ethX
让NM暂时不管理指定网卡,此操作不会变更实际网卡的link状态,只会使对应的connection变成非活跃。若重启系统则又会自动connect。另外,如果手工将该网卡的connection全部删掉,该网卡状态也会自动变为disconnected。
3、nmcli d reapply ethX
专门用于刷新connection,前提是网卡的device处于connected状态,否则会报错。
4、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是多对一的关系。

  1. 手工配置ifcfg,通过NM来生效
  2. 通过NM自带工具配ip,比如nmcli
  3. 手工配置ifcfg,通过传统network.service来生效

建议: 推荐使用上述第1种网络配置方法(手工配置ifcfg,通过NM生效),因为这样既兼容了传统的ifcfg配置,又能熟悉nmcli。举例:
vi /etc/sysconfig/network-scripts/ifcfg-eth0

# 注:这些参数值不区分大小写,不区分单引号和双引号,甚至可以不用引号。
NAME=eth0
DEVICE=eth0					  # 网络接口名称
ONBOOT=yes
BOOTPROTO=none				  # 网卡获取ip地址方式
TYPE=Ethernet				  # 配置文件接口类型
IPADDR=192.168.1.10
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
HWADDR/MACADDR                # 只需设置其中一个,同时设置时不能相互冲突。MAC地址
PEERDNS:是否指定DNS			   # 如果使用DHCP协议,默认为yes。 静态配置就需要手动指定
    yes:如果DNS设置,修改/etc/resolv.conf中的DNS
    no:不修改/etc/resolv.conf中的DNS
DNS{1, 2}=					  # 当PEERDNS为yes时会被写入/etc/resolv.conf中。DNS可以设置多个,在DNS后面加数字依次排序
# 修改保存后立即生效,无需重启。被其坑过几次,建议一般设为no。
NM_CONTROLLED:是否由Network Manager控制该网络接口。
    yes:由Network Manager控制
    no:不由Network Manager控制
USERCTL:用户权限控制(yes:非root用户允许控制该网络接口  no:非root用户不运行控制该网络接口)
IPV6INIT:是否执行IPv6
IPV6ADDR:IPv6地址/前缀长度

nmcli c reload           # 重载所有ifcfg到connection(不会立即生效)
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. 对于RHEL8,可以通过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是不被推荐的参数。

Options

-a | --ask
使用此选项时,nmcli将停止并询问任何缺少的必需参数,因此不要将此选项用于脚本等非交互目的。例如,此选项控制在连接到网络时是否提示您输入密码。

-c | --colors { yes | no | auto }
此选项控制颜色输出(使用终端转义序列)。“是”启用颜色,“否”禁用颜色,“自动”仅在标准输出指向终端时产生颜色。默认值为自动。 所用的实际颜色按照terminal-colors.d(5)中的描述进行配置。有关nmcli支持的颜色名称列表,请参考颜色部分。 如果设置了环境变量NO_COLOR(设置为任意值),则使用“自动”模式禁用着色。显式启用颜色会覆盖环境变量。

--complete-args
nmcli将列出最后一个参数的可能完成方式,而不是执行所需的操作。这对于在shell中实现参数补全非常有用。 退出状态将指示成功或返回代码65,指示最后一个参数是文件名。 NetworkManager附带了对GNU Bash的命令完成支持。

-e | --escape { yes | no }
是否转义:和\字符。转义符是\。 如果省略默认值为yes。

-f | --fields { field1,field2... | all | common }
该选项用于指定应该打印哪些字段(列名)。对于特定的命令,有效的字段名称会有所不同。通过向- fields选项提供无效值来列出可用字段。all用于打印命令的所有有效字段值。common用于打印命令的公共字段值。 如果省略,默认为通用。

-g | --get-values { field1,field2... | all | common }
此选项用于打印特定字段的值。它基本上是模式表格式字段的快捷方式,是检索特定字段值的便捷方式。每行打印一个值,不带标题。 如果指定了一个部分而不是一个字段,将打印部分名称,后跟属于该部分的字段的冒号分隔值,所有这些都在同一行上。

-h | --help
打印帮助信息

-m | --mode { tabular | multiline }
在表格和多行输出之间切换:
tabular			输出是一个表格,其中每行描述一个条目。列定义了条目的特定属性。
multiline		每个条目包含多行,每个属性占一行。这些值以属性名为前缀。
如果省略,则大多数命令的默认值为表格。对于产生更多结构化信息的命令,这些信息不能在一行中显示,默认为multiline。目前,它们是:
nmcli connection show ID
nmcli device show

-p | --pretty
输出很漂亮。这导致nmcli生成易于阅读的输出,即值对齐、标题打印等。

-s | --show-secrets
使用此选项时,nmcli将显示可能出现在操作输出中的密码和机密。此选项还会影响回显用户作为输入键入的密码。

-t | --terse
输出简洁。这种模式是为计算机(脚本)处理而设计的,并且适合于计算机(脚本)处理。

-v | --version
显示nmcli版本。

-w | --wait seconds
此选项设置nmcli等待NetworkManager完成操作的超时时间。这对于可能需要较长时间才能完成的命令特别有用,例如连接激活。 指定值0指示nmcli不要等待,而是立即退出,状态为成功。默认值取决于执行的命令。

案例

[root@servera ~]# nmcli connection show 
NAME                UUID                                  TYPE      DEVICE 
Wired connection 1  6bc56692-0f3b-3bf9-941f-8bc9f5ff7941  ethernet  enp1s0 
[root@servera ~]# nmcli connection add type ethernet ifname enp1s0 con-name enp1sp
[root@servera ~]# nmcli con modify enp1sp ipv4.method manual ipv4.address 172.25.250.10/24 ipv4.gat 172.25.250.254 ipv4.dns 172.25.250.254 connection.autoconnect yes
[root@servera ~]# nmcli connection show 
NAME                UUID                                  TYPE      DEVICE 
Wired connection 1  6bc56692-0f3b-3bf9-941f-8bc9f5ff7941  ethernet  enp1s0 
enp1sp              c2d0b77e-dbbb-4bf4-8e5a-efb14899b16c  ethernet  --     
[root@servera ~]# nmcli con down Wired\ connection\ 1 
Connection 'Wired connection 1' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
[root@servera ~]# ifconfig enp1s0

Backer mountain would pour, by everybody will be run, only your most reliable.