# 常见网络配置工具包
配置「Linux 操作系统」的网络有以下几款主流的配置工具可供选择:
配置工具 | 说明 |
---|---|
ifupdown | 用来启动 / 关闭网络的标准工具(Debian 及部分衍生版本特有),配置文件在 /etc/network/interfaces 。 |
systemd-networkd | systemd 是许多发行版默认的 kernel 程序,其中 systemd-networkd 组件可用于网络配置管理,配置文件在 /etc/systemd/network/ 。 |
NetworkManager | 一个为桌面版提供的图形化前端工具,也可以使用内嵌的 nmcli 和 nmtui 进行配置。 |
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
的功能对无线和有线网络都很有用。其有两个组件:
- 一个以超级用户运行的守护进程(network-manager);
- 一个前端管理程序(network-manager-gnome、network-manager-kde 或者 cnetworkmanager)。
默认情况下, NetworkManager
不接管任何 /etc/network/interfaces
里配置的网络接口,而对于已经在 /etc/network/interfaces
中声明过的网络接口,在 Desktop 环境上你会看到 NetworkManager
菜单中相应的网络接口显示 “device not managed”,但如果使用 NetworkManager
的 nmcli
或 nmtui
工具去配置 /etc/network/interfaces
中声明过的网络接口,可能会对该网卡造成冲突(包括其它的网络配置服务共存也将导致冲突)。
如果希望 NetworkManager
接管在 /etc/network/interfaces
配置了的网络接口,则进行以下操作:
在
/etc/NetworkManager/NetworkManager.conf
里把[ifupdown]
中的managed
属性修改为此设置managed=true
;如果有手动改过/etc/network/interfaces
,那么NetworkManager
会自行把这行改成:managed=false
;以 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 |
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-networkd
和 networkmanager
二种工具)生成必要的配置选项。在 Ubuntu 17.10 引入 netplan 作为 network 的替代品,Ubuntu 20.04 正式使用 netplan 作为网络配置工具。
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/