---
title: "NetworKmanager"
date: 2019-10-29T18:26:17+08:00
lastmod: 2019-10-29T18:40:00+08:00
keywords: ["centos", "networkmanager", "network"]
tags: ["centos", "networkmanager", "network"]
categories: ["network"]
---

## 环境
- CentOS8 已废弃 network.service, 推荐使用 NetworkManager

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

## 配置连接
- 状态
    - 活跃(带颜色字体)：表示当前该connection生效
    - 非活跃(正常字体)：表示当前该connection不生效
- 创建 connection，配置静态 ip
    ```bash
    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
    ```bash
    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
    ```bash
    nmcli c add \
        type ethernet \
        con-name ethX \
        ifname ethX \
        ipv4.method auto
    ```
- 修改 ip
    ```bash
    # 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
    ```bash
    # ethX 是 connection name，也可以指定 connection UUID

    # 启动
    nmcli c up ethX

    # 停止
    nmcli c down ethX

    # 删除
    nmcli c delete ethX
    # 删除当前连接后，会自动选择同一个设备的其他连接来顶替生效
    ```
- 查看 connection
    ```bash
    # ethX 是 connection name，也可以指定 connection UUID

    # 查看列表
    nmcli c show
    # 查看活动连接列表
    nmcli c show -a

    # 查看指定 connection 详细信息
    nmcli c show ethX
    ```
- 重载配置但不立即生效
    ```bash
    # 重载全部 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
    ```
- 重载配置并立即生效
    ```bash
    # 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)
- 查看网卡列表
    ```bash
    nmcli d

    # 查看全部网卡的详细信息
    nmcli d show
    ```
- 操作网卡
    ```bash
    # 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
    ```
- 关闭无线网络(默认启动)
    ```bash
    nmcli r all off
    ```

## NM 状态
- 查看当前 nm 连接信息
    ```bash
    nmcli
    ```
- 查看当前 nm 全部状态
    ```bash
    nmcli general status
    ```
- 纳管状态
    ```bash
    # 查看
    nmcli n
    # 开启
    nmcli n on
    # 关闭
    nmcli n off
    ```
- 查看 nm 当前是否在线可用
    ```bash
    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 或者重启系统来生效

