• Linux nmcli控制NetworkManager的命令行工具


    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		禁止开机启动
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    注意: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...]
    
    • 1
    • 2

    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     # “--”表示当前没有激活的连接
    
    • 1
    • 2
    • 3
    • 4
    • 5

    每一行是一个连接,只是只有一个是激活状态
    第一列是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
    • 2
    • 3

    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       未管理  --  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    每一行表示一个网络设备的接口。
    第一列表示设备接口的名称,第二列表示设备接口的类型,第三列表示设备接口状态,最后一列表示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后就已经自动生效了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    这么做有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不要等待,而是立即退出,状态为成功。默认值取决于执行的命令。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    案例

    [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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

  • 相关阅读:
    excel中如何使用Replace函数?
    第十四届蓝桥杯 子串简写 | 树状数组解法
    20221205英语学习
    Blazor前后端框架Known-V1.2.5
    vs code 离线安装 CodeLLDB 包[Acquiring CodeLLDB platform package]
    Google Earth Engine(GEE)——导出的影像资产会改变原有的分辨率大小
    排序算法.
    2024年(上海) 集成软件及系统管理博览会
    充分理解ADC预充电缓冲器的重要性-运放缓存
    Prettier插件使用
  • 原文地址:https://blog.csdn.net/qq_50573146/article/details/126797116