环境

  • CentOS8 已废弃 network.service, 推荐使用 NetworkManager

概念

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

配置连接

  • 状态
    • 活跃(带颜色字体):表示当前该connection生效
    • 非活跃(正常字体):表示当前该connection不生效
  • 创建 connection,配置静态 ip
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    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 \
        autoconnect yes
    # type ethernet:创建连接时候必须指定类型,类型有很多,可通过 "nmcli c add type -h" 看到
    # con-name ethX: 表示连接(connection)的名字,可任意定义,无需和网卡名相同
    # ifname ethX: 表示网卡名,这个 ethX 必须是在 nmcli d里能看到的
    # ipv4.addr: 指定一个或多个 ip 地址
    # ipv4.gateway: 网关
    # ipv4.method: 对应ifcfg文件内容的BOOTPROTO
    # ipv4.method 默认为auto,对应为BOOTPROTO=dhcp,这种时候如果指定ip,就可能导致网卡同时有dhcp分配的ip和静态ip
    # ipv4.method 设置为manual表示BOOTPROTO=none,即只有静态ip
    # 如果这是为ethX创建的第一个连接,则自动生效
    # 如果此时已有连接存在,则该连接不会自动生效,可以执行 nmcli c up ethX-test来切换生效
    # autoconnect: 开机后自动连接
    
  • 创建 connection,配置多个静态 ip
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    nmcli c add \
        type ethernet \
        con-name ethX-X \
        ifname ethX \
        ipv4.addr '192.168.1.100/24,192.10.0.3.100/25' \
        ipv4.routes '192.168.0.0/16 192.168.1.10,10.0.0.0/8 10.0.3.1' \
        ipv4.gateway 192.168.1.254 \
        ipv4.dns '8.8.8.8,4.4.4.4' \
        ipv4.method manual
    # ipv4.routes: 设置自定义路由
    # ipv4.dns: 设置 dns
    
  • 创建 connection,配置动态 ip
    1
    2
    3
    4
    5
    
    nmcli c add \
        type ethernet \
        con-name ethX \
        ifname ethX \
        ipv4.method auto
    
  • 修改 ip
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    # ethX 是 connection name,也可以指定 connection UUID
    
    # 直接替换
    nmcli c modify ethX \
        ipv4.addr '192.168.1.200/24'
    nmcli c up ethX
    # 通过nmcli c modify修改con-name,只会对应修改ifcfg文件中的NAME,而不会更改ifcfg文件名
    
    # 增加 ip
    nmcli c modify ethX \
        +ipv4.addr '192.168.2.200/24'
        +ipv4.routes '10.1.0.0/16 192.168.2.1'
    nmcli c up ethX
    
    # 删除 ip
    nmcli c modify ethX \
        -ipv4.addr '192.168.2.200/24'
        -ipv4.routes '10.1.0.0/16 192.168.2.1'
    nmcli c up ethX
    
  • 操作 connection
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    # ethX 是 connection name,也可以指定 connection UUID
    
    # 启动
    nmcli c up ethX
    
    # 停止
    nmcli c down ethX
    
    # 删除
    nmcli c delete ethX
    # 删除当前连接后,会自动选择同一个设备的其他连接来顶替生效
    
  • 查看 connection
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    # ethX 是 connection name,也可以指定 connection UUID
    
    # 查看列表
    nmcli c show
    # 查看活动连接列表
    nmcli c show -a
    
    # 查看指定 connection 详细信息
    nmcli c show ethX
    
  • 重载配置但不立即生效
    1
    2
    3
    4
    5
    6
    
    # 重载全部 connection 的所有 ifcfg-xxxx 和 route-xxxx
    nmcli c reload
    
    # 重载指定 ifcfg-ethX 和 route-ethX
    nmcli c load /etc/sysconfig/network-scripts/ifcfg-ethX
    nmcli c load /etc/sysconfig/network-scripts/route-ethX
    
  • 重载配置并立即生效
    1
    2
    3
    4
    5
    6
    
    # ethXX 是 connection name,也可以指定 connection UUID
    nmcli c up ethXX
    
    # ethX 是 device name
    nmcli d reapply ethX
    nmcli d connect ethX
    

配置网卡设备

  • 状态
    • connected: 已被NM纳管,并且当前有活跃的connection
    • disconnected: 已被NM纳管,但是当前没有活跃的connection
    • unmanaged: 未被NM纳管
    • unavailable: 不可用,NM无法纳管,通常出现于网卡link为down的时候(比如ip link set ethX down)
  • 查看网卡列表
    1
    2
    3
    4
    
    nmcli d
    
    # 查看全部网卡的详细信息
    nmcli d show
    
  • 操作网卡
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    # ethX 是 device name
    
    # 设置 nm 管理网卡 ethX
    # 并刷新该网卡对应的活跃 connection(如果之前有修改过connection配置)
    # 如果有connection但是都处于非活跃状态,则自动选择一个connection并将其活跃
    # 如果没有connection,则自动生成一个并将其活跃
    nmcli d connect ethX
    
    # 设置 nm 不管理网卡 ethX
    # 此操作不会变更实际网卡的link状态,只会使对应的connection变成非活跃
    # 若重启系统则又会自动connect
    # 另外,如果手工将该网卡的connection全部删掉,该网卡状态也会自动变为disconnected
    nmcli d disconnect ethX
    
    # 设置 nm 是否自动启动网卡
    nmcli d set ethX autoconnect yes|no
    # 设置 nm 是否自动管理网卡
    nmcli d set ethX managed yes|no
    
  • 关闭无线网络(默认启动)
    1
    
    nmcli r all off
    

NM 状态

  • 查看当前 nm 连接信息
    1
    
    nmcli
    
  • 查看当前 nm 全部状态
    1
    
    nmcli general status
    
  • 纳管状态
    1
    2
    3
    4
    5
    6
    
    # 查看
    nmcli n
    # 开启
    nmcli n on
    # 关闭
    nmcli n off
    
  • 查看 nm 当前是否在线可用
    1
    
    nm-oncline
    

注意事项

  • 如果希望NM不要纳管网卡,只有一个办法最彻底最靠谱,就是自己写ifcfg,内容加上 NM_CONTROLLED=no,这样该device的状态就会始终保持unmanaged。nmcli c up、nmcli c reload、nmcil c load都不会对其起任何作用
  • NM只能对link状态为up的网卡进行操作,如果手动 ip link set ethX down,那么NM就无法对该网卡做任何操作(即使nmcli d connect也没有用)
  • NetworkManager支持3种获取dhcp的方式:dhclient、dhcpcd、internal,当/etc/NetworkManager/NetworkManager.conf配置文件中的[main]部分没配置 dhcp=时候,默认使用internal(rhel7/centos7默认是dhclient)。internal是NM内部实现的dhcp客户端
  • NM默认会从dhcp里获取dns信息,并修改/etc/resolv.conf,如果不想让NM管理/etc/resolv.conf,则只需在/etc/NetworkManager/NetworkManager.conf里的[main]里增加 dns=none即可
  • 如果想让NM不要自动管理新网卡(比如不要给新网卡获取ip地址),则只需在/etc/NetworkManager/NetworkManager.conf里的[main]里增加 no-auto-default=* 即可,改完后通过 systemctl restart NetworkManager 或者重启系统来生效