# 常见网络配置工具包

配置「Linux 操作系统」的网络有以下几款主流的配置工具可供选择:

配置工具说明
ifupdown用来启动 / 关闭网络的标准工具(Debian 及部分衍生版本特有),配置文件在 /etc/network/interfaces
systemd-networkdsystemd 是许多发行版默认的 kernel 程序,其中 systemd-networkd 组件可用于网络配置管理,配置文件在 /etc/systemd/network/
NetworkManager一个为桌面版提供的图形化前端工具,也可以使用内嵌的 nmclinmtui 进行配置。
netplan通过 YAML 文件管理网络配置,支持 systemd-networkd 和 NetworkManager 作为后端程序,配置文件在 /etc/netplan/*.yaml

# ifupdown

ifupdown 网络管理器一直以来都是 Debian 默认使用的网络管理器。大多数教程描述的配置 /etc/network/interfaces 文件就是来自于对 ifupdown 网络的管理。

与早期版本的 Red Hat 发行版类似,Debian 把网络配置写在一个文件内,并从文件内加载配置。

但与 Red Hat 系发行版不同的是,Red Hat 发行版将不同的网卡配置文件保存在 /etc/sysconfig/network-scripts/ 文件夹中,而 Debian 则将网卡配置统一写在 /etc/network/interfaces 文件中。

同样的,像 Debian 的衍生版本也会延续将网络配置文件统一写在 /etc/network/interfaces 文件中,例如早期的 Ubuntu 系统,而在 Ubuntu 18.04 LTS 后将使用 netplan 命令和基于 /etc/netplan/*.yaml 文件的配置方法;如果在 Ubuntu 18 上打开 /etc/network/interfaces 文件将会看到提示,而 Ubuntu 20 上则已经完全移除了 /etc/network/interfaces 文件。

对于 ifupdown 的文件配置,虽然系统默认的网络配置文件是在 /etc/network/interfaces 文件中,但 Debian 给出的最佳实现是将网络配置保存到 /etc/network/interface.d/ 下;一些常规的配置如下:

  • 使用 DHCP 自动配置接口

    auto eth0
    allow-hotplug eth0
    iface eth0 inet dhcp	# ipv4 DHCP 模式
    # iface eth0 inet6 dhcp/auto	# ipv6 DHCP 或 Auto 模式
  • 使用静态 IP 配置接口

    ipv4:

    auto eth0
    iface eth0 inet static
    	address 192.0.2.7/24
    	netmask 255.255.255.0
    	gateway 192.0.2.254

    ipv6:

    auto eth0
    iface eth0 inet6 static
    	address 2001:db8::c0ca:1eaf/64
    	netmask 64
    	gateway 2001:db8::1ead:ed:beef
  • 设置 DNS

    如果你要直接 ping 域名就需要开启 DNS 服务,在这里有两种方法:

    一种是修改 /etc/resolv.conf 文件,添加需要配置的 DNS,例如添加两个 DNS 服务:

    nameserver 8.8.8.8
    nameserver 114.114.114.114

    另一种是直接编辑 /etc/network/interfaces 文件,但这种需要 resolvconf 程序的支持:

    auto eth0
    iface eth0 inet static
    	address 192.0.2.7/24
    	netmask 255.255.255.0
    	gateway 192.0.2.254
    	dns-nameservers 8.8.8.8 114.114.114.114	# 此行便是用作 DNS 解析,对于多个解析地址,应共用一行并用空格区分

    note:这两种方法各有缺点, /etc/resolv.conf 中的 DNS 配置将会被 C 库或其它解析器库所查找并解析 DNS 服务,同时该文件还会被 resolvconf、network-manager 及 DHCP 客户端修改所覆盖;而在 /etc/network/interfaces 上编辑,则需要提供 resolvconf 程序,可以使用 which resolvconf 命令查看是否存在,否者将要进行下载才可使用。

  • 网络接口生效

    systemctl restart networking
    ifdown eth0 && ifup eth0

tips:

/etc/network/interfaces 文件中一般用 auto 或者 allow-hotplug 来定义接口的启动行为。

  • auto:在系统启动的时候启动网络接口,无论网络接口有无连接(插入网线);如果该接口配置了 DHCP,则无论有无网线,系统都会去执行 DHCP,如果没有插入网线,则等该接口超时后才会继续。
  • allow-hotplug:只有当内核从该接口检测到热插拔事件后才启动该接口。如果系统开机时该接口没有插入网线,则系统不会启动该接口,系统启动后,如果插入网线,系统会自动启动该接口(也就是将网络接口设置为热插拔模式),但是值得注意的是,重启 networking 之后网卡不能自动重启。

# systemd-networkd

systemd-networkd 网络管理器是 systemd 软件包其中的一个组件,目前一些主流的 Linux 系统都内置着 systemd 包,像 Arch、Debian、Ubuntu 等。

  • 静态 IP 配置

    # 启动 "ens37" 接口并配置一个静态地址。 此处设置的网关将被用作默认路由。
    cat > /etc/systemd/network/10-static-ens37.network << EOF
    [Match]
    Name=ens37
    [Network]
    Address=192.168.0.2/24
    Gateway=192.168.0.1
    DNS=192.168.0.1
    EOF
  • DHCP 配置

    # 在所有名字以 "en" 开头的接口 (也就是以太网接口) 上开启 DHCPv4 与 DHCPv6
    cat > /etc/systemd/network/10-dhcp-en.network << EOF
    [Match]
    Name=en*
    [Network]
    DHCP=yes
    EOF
  • 服务启动

    systemctl start systemd-networkd
    systemctl enable systemd-networkd

剩下的这里就不详细阐述了,说一下值得注意的点吧:

  • 如果 .network 文件中指定了 DNS 条目,则 systemd-resolved 服务是必需的, systemd-resolved 是可选的,它是一个为本地应用程序提供网络名称(DNS)解析服务。
  • 配置文件位于 /usr/lib/systemd/network ,非持久化的运行时网络配置目录位于 /run/systemd/network ,本地管理网络配置位于 /etc/systemd/network/etc/systemd/network 中的配置文件具有最高优先级。
  • 如果某个网络接口既没有配置静态 IPv6 地址、也没有启用 DHCPv6 或 IPv6LL 的话, 将会被视为禁用 IPv6 支持。同时,systemd 将会自动向 /proc/sys/net/ipv6/conf/if_name/disable_ipv6 中写入 "1",以彻底禁用此接口上的 IPv6 支持。

ref:

https://wiki.archlinuxcn.org/wiki/Systemd-networkd

https://wiki.debian.org/SystemdNetworkd

https://www.jinbuguo.com/systemd/systemd.network.html

https://lisongmin.github.io/os-systemd-networkd/

# NetworkManager

NetworkManager 是一个为系统提供检测和配置功能以便自动连接到网络的程序。 NetworkManager 的功能对无线和有线网络都很有用。其有两个组件:

  1. 一个以超级用户运行的守护进程(network-manager);
  2. 一个前端管理程序(network-manager-gnome、network-manager-kde 或者 cnetworkmanager)。

默认情况下, NetworkManager 不接管任何 /etc/network/interfaces 里配置的网络接口,而对于已经在 /etc/network/interfaces 中声明过的网络接口,在 Desktop 环境上你会看到 NetworkManager 菜单中相应的网络接口显示 “device not managed”,但如果使用 NetworkManagernmclinmtui 工具去配置 /etc/network/interfaces 中声明过的网络接口,可能会对该网卡造成冲突(包括其它的网络配置服务共存也将导致冲突)。

如果希望 NetworkManager 接管在 /etc/network/interfaces 配置了的网络接口,则进行以下操作:

  1. /etc/NetworkManager/NetworkManager.conf 里把 [ifupdown] 中的 managed 属性修改为此设置 managed=true ;如果有手动改过 /etc/network/interfaces ,那么 NetworkManager 会自行把这行改成: managed=false

  2. 以 root 形式重新启动 NetworkManager 服务: sudo systemctl restart NetworkManager

NetworkManager 除了给 Desktop 环境带来图形操作,还内置提供了一个命令行界面(nmcli)和一个基于 curses 的界面(nmtui)这两个工具:

  • nmcli
# 查看 nmcli 使用说明
nmcli --help
Usage: nmcli [OPTIONS] OBJECT { COMMAND | help }
OPTIONS
  -a, --ask                                ask for missing parameters
  -c, --colors auto|yes|no                 whether to use colors in output
  -e, --escape yes|no                      escape columns separators in values
  -f, --fields <field,...>|all|common      specify fields to output
  -g, --get-values <field,...>|all|common  shortcut for -m tabular -t -f
  -h, --help                               print this help
  -m, --mode tabular|multiline             output mode
  -o, --overview                           overview mode
  -p, --pretty                             pretty output
  -s, --show-secrets                       allow displaying passwords
  -t, --terse                              terse output
  -v, --version                            show program version
  -w, --wait <seconds>                     set timeout waiting for finishing operations
OBJECT
  g[eneral]       NetworkManager's general status and operations
  n[etworking]    overall networking control
  r[adio]         NetworkManager radio switches
  c[onnection]    NetworkManager's connections
  d[evice]        devices managed by NetworkManager
  a[gent]         NetworkManager secret agent or polkit agent
  m[onitor]       monitor NetworkManager changes
  • nmtui
# 查看 NetworkManager 是否启动
nmcli networking
enabled
# 调出伪图形界面,然后根据选项编辑网络配置,最后启用网络连接。
nmtui

img

note:

一些 NetworkManager 网络命令处理:

# 重启服务
systemctl restart NetworkManager
# 查看开机自启是否启用
systemctl list-unit-files --type service | grep NetworkManager

附:

https://wiki.debian.org/zh_CN/NetworkManager

# netplan

netplan 是 Canonical (Ubuntu) 开发的,作为某些 Linux 发行版(主力为 ubuntu Linux 发行版)上默认的网络配置命令行工具。netplan 使用 YAML 描述文件来配置网络,然后,通过这些描述为任何给定的底层呈现工具(主要就是 systemd-networkdnetworkmanager 二种工具)生成必要的配置选项。在 Ubuntu 17.10 引入 netplan 作为 network 的替代品,Ubuntu 20.04 正式使用 netplan 作为网络配置工具。

img

A、指定 NetworkManager 接管网络

cat /etc/systemd/network/xxx.yaml
# Let NetworkManager manage all devices on this system
network:
  version: 2
  renderer: NetworkManager

最后就可以使用可视化界面配置网络了,一般像在桌面上使用无线连接就会很方便,而不用使用 iw 等命令搜索 WiFi 然后指定 SSID 这么麻烦。

B、指定 systemd-networkd 接管网络

  • ipv4 DHCP

    network:
      version: 2
      renderer: networkd
      ethernets:
        ens33:
          dhcp4: yes
          dhcp4-overrides:
            route-metric: 100
  • 单网卡多网段

    network:
      version: 2
      renderer: networkd
      ethernets:
        ens33:
          addresses:
          - 192.168.1.20/24
          - 192.168.50.20/24
         nameservers:
           addresses: [8.8.8.8]
         routes:
          - to: 0.0.0.0/0
            via: 192.168.1.1
            metric: 1000
          - to: 0.0.0.0/0
            via: 192.168.50.1
            metric: 1000
  • 桥接

    network:
      version: 2
      renderer: networkd
      ethernets:
        enp3s0:
          dhcp4: yes
      bridges:
        br0:
          interfaces: [enp3s0]
          dhcp4: no
          addresses:
            - 192.168.1.20/24
          routes:
           - to: 0.0.0.0/0
             via: 192.168.1.1
             metric: 1000
          nameservers:
            addresses: [8.8.8.8]

命令:

  • netplan generate

    yaml 文件中的设置转换为适合正在使用的渲染器的配置,但不应用它们。

  • netplan apply
    应用配置,使配置生效;会自动调用 netplan generate

  • netplan try
    测试配置,然后等待用户的确认;如果取消确认或超时退出则自动恢复配置,注意不是恢复配置文件。

note:

注意在 /etc/netplan 目录下,有多个 yaml 文件存在时,netplan 是根据字母表排序,挨个生效的,后面的 yaml 指定的配置会覆盖前面的 yaml 指定的配置。

netplan 会一次从以下 3 个位置读取配置文件,并且按照优先级,仅有一个位置的配置文件生效:

  • /run/netplan 优先级最高
  • /etc/netplan 次优先级
  • /lib/netplan 最低优先级

ref:

https://cloud-atlas.readthedocs.io/zh-cn/latest/linux/ubuntu_linux/network/netplan.html

https://www.vicsys.com.tw/zh-hans/tech/ub/ub-network.html

# other

其他包含网络配置的重要文件,但我们在这里不会碰到他们:

  • /etc/hosts - 操作系统中使用的计算机文件,用于将主机名映射到 IP 地址。 hosts 文件是一个纯文本文件,通常按照惯例命名为 hosts
  • /etc/hostname - 分配给连接到计算机网络的设备的标签,并用于识别各种形式的电子通信设备。
  • /etc/resolv.conf - 各种操作系统中的计算机文件,用于配置域名系统(DNS)解析器库。该文件是纯文本文件,通常由网络管理员或管理系统配置任务的应用创建。因此 /etc/resolv.conf 是依据网络管理产生,修改 resolv.conf 只在本次有作用,重启服务将会重置。

# 总结

桌面环境建议使用 NetworkManager;在服务器上建议使用默认的配置工具 network,或者切换到 systemd-networkd;但是只能选取其一。除了 network 不支持无线配置,其余三个都支持。

# 关于 NetworkManager 与 systemd-networkd 之间的切换

A、停用 Network Manager 并激活 systemd-networkd

  • 停止并禁用 NetworkManager:

    sudo systemctl stop NetworkManager
    sudo systemctl disable NetworkManager
    sudo systemctl mask NetworkManager
  • 启动和激活 systemd-networkd:

    sudo systemctl unmask systemd-networkd
    sudo systemctl enable systemd-networkd
    sudo systemctl start systemd-networkd

B、激活 NetworkManager 关闭 systemd-networkd

  • 停止并禁用 systemd-networkd:

    sudo systemctl disable systemd-networkd
    sudo systemctl mask systemd-networkd
    sudo systemctl stop systemd-networkd
  • 启动和激活 NetworkManager:

    sudo systemctl unmask NetworkManager
    sudo systemctl enable NetworkManager
    sudo systemctl start NetworkManager

# 关于 netplan 指定 renderer

/etc/netplan 目录下将配置文件 .yaml 中的 renderer 字段更改为需要的后端工具:

  • NetworkManager

    network:
      version: 2
      renderer: NetworkManager
  • systemd-networkd

    network:
      version: 2
      renderer: networkd
      ethernets:
        enxx:
          ...

最后执行: netplan apply ;如果使用 NetworkManager 则不需要编写后面的 ethernets 字段了,完全交由 GUI 界面操作;而如果 renderer 指定 networkd ,则为 ethernets 编写对应的网卡配置信息,以使 netplan 配置到 systemd-networkd 工具上。

# 参考

https://wiki.archlinux.org/title/Network_configuration

https://wiki.debian.org/NetworkConfiguration

https://pan-xiao.gitbook.io/debian/config/network

https://itboon.github.io/linux-20/network/configuration/

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

夏沫の浅雨 微信支付

微信支付

夏沫の浅雨 支付宝

支付宝