网络配置管理¶
主要作者
本文编写中
ifupdown¶
ifupdown2¶
systemd-networkd¶
Netplan¶
Netplan 是 Canonical(Ubuntu 母公司)开发的一个网络配置抽象渲染器,常见于 Ubuntu 系统中。该程序可以将复杂的网络配置集中于一个或若干个 YAML 格式的文件(通常位于 /etc/netplan/)中,在系统启动时生成不同网络配置后端配置(目前有 NetworkManager 与 Systemd-networkd),起到简化网络配置的用途。其工作原理如下图所示:
图片来自 Netplan 首页
这边只介绍该工具的常用命令与常见网络环境下的单文件配置,详细的文件可以参见 Netplan 文档。
由于后续会涉及到配置样例,这边先做如下约定:
/etc/netplan/中只有单个配置文件(需要以.yaml为后缀)。- 假定计算机中存在 2 个有线接口,其名称为
eth0与eth1,存在一个无线接口,其名称为wlan0。应用到实际的配置中,需要修改为实际存在的接口(可以使用ip link命令查看)。 - 连接的网络为
192.168.0.0/24网关为192.168.0.1。
常用命令¶
Netplan 的常用命令不多,只有 2 个:
大多数情况下(尤其是使用 ssh 远程修改网络配置时)建议使用 netplan try,避免因为错误的网络配置导致 ssh 断开后失去远程访问。
改用 NetworkManager 管理网络¶
如果希望 Netplan 将网络配置交由 NetworkManager 管理(该配置为 Netplan 在主流桌面发行版中的默认配置),只需要修改配置如下,应用配置即可:
有线网络使用 DHCP¶
在 eth0 接口使用 DHCP,使用如下配置:
network:
version: 2 # 配置文件的版本 目前默认为 2
renderer: networkd # 使用的后端,推荐使用 networkd
ethernets:
eth0:
dhcp4: true
有线网络使用固定 IP 并配置 DNS 与默认路由¶
在 eth0 接口使用固定 IP 并配置 DNS 与默认路由,使用如下配置:
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: false # 不使用 DHCP
addresses:
- 192.168.0.100/24 # 主机的 IP 此处要带上子网前缀长度
routes: # 配置默认路由
- to: default # 此处可以改为 0.0.0.0/0
via: 192.168.0.1
# 可以追加更多的路由条目
nameservers:
addresses:
- 192.168.0.1
DNS 服务器的选择
一般来说,DNS 服务器应选择网络提供商分配的即可。出于备份或是隐私的考虑可以使用公共 DNS,可参见网络服务实践的 DNS 章节。
连接到无线网络¶
使用 wlan0 接口连接到开放的无线网络 MyWifi,使用 DHCP 配置地址,配置样例如下:
network:
version: 2
renderer: networkd
wifis:
wlan0:
dhcp4: true
access-points:
"MyWifi": {} # 只需要定义网络名称
如果网络有密码保护,配置样例如下:
network:
version: 2
renderer: networkd
wifis:
wlan0:
dhcp4: true
access-points:
"MyWifi":
password: "mypassword" # 这边替换为网络密码
如果网络为双频网络(即 2.4GHz 和 5GHz 共用一个 SSID),你希望连接到 5GHz 的网络,可以使用如下配置:
network:
version: 2
renderer: networkd
wifis:
wlan0:
dhcp4: true
access-points:
"MyWifi":
band: 5GHz # 指定使用 5GHz
使用静态地址的配置和有线网络接口类似,这边不再举例。
配置 IPv6¶
内核参数检查¶
默认情况下,操作系统都默认启用了 IPv6 支持,可以通过 sysctl -a | grep disable_ipv6 命令查看当前系统内核参数,如果出现例如 net.ipv6.conf.all.disable_ipv6 = 0 或者 net.ipv6.conf.eth0.disable_ipv6 = 0(这里 eth0 是网络接口名称)则已经启用。如果值为 1,则需要在目录 /etc/sysctl.d/ 中的 .conf 文件修改或追加上述参数为 0,随后重启系统应用参数。
使用 SLAAC(无状态地址自动配置)自动配置地址¶
该方式常见于家庭网络、企业网络和部分校园网络中,由路由器提供网络前缀(通常为前 64 位),主机使用不同的方式(例如随机值或是网络设备的 MAC 地址)生成接口标识(后 64 位)组合成 IPv6 地址。
大多数情况下,该模式默认为启用状态无需配置,当然也可以手动启用,下面给出在 eth0 接口使用静态 IPv4 地址和通过 SLAAC 模式获取 IPv6 地址的样例,该配置组合常见于家庭网络中。
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: false # 不使用 DHCP
dhcp6: false # 不使用 DHCP 获取 IPv6
accept-ra: true # 通过 Router Advertisement 报文获取 IPv6 地址
addresses:
- 192.168.0.100/24 # 主机的 IP 此处要带上子网前缀长度
routes: # 配置默认路由
- to: default
via: 192.168.0.1
# 注 IPv6 的默认路由会通过 Router Advertisement 报文发送,无需额外配置
nameservers:
addresses:
- 192.168.0.1
IPv6 下的 DNS 服务器
在使用了 SLAAC 或 DHCPv6 分配地址的网络下,一般也会通过 Router Advertisement 报文或 DHCP 报文下发 IPv6 地址的 DNS 服务器。在双栈网络中,IPv6 地址的 DNS 服务器不是必须的,通过 IPv4 的 DNS 服务器也可以解析出域名的 IPv6 地址。
使用 DHCPv6 获取 IPv6 地址¶
该方式常见于校园网络中,Router Advertisement 报文提供默认路由,地址通过 DHCPv6 分配。配置样例如下:
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: false # 不使用 DHCP
dhcp6: true # 这边改成 true
accept-ra: true # 接受 Router Advertisement 报文
addresses:
- 192.168.0.100/24 # 主机的 IP 此处要带上子网前缀长度
routes: # 配置默认路由
- to: default
via: 192.168.0.1
# 注 IPv6 的默认路由会通过 Router Advertisement 报文发送,无需额外配置
nameservers:
addresses:
- 192.168.0.1 # 大多数路由器都会提供 DNS 服务
如果不清楚自己的网络是使用何种方式分发的 IPv6 地址,建议先按照 SLAAC 模式配置,无法获取再尝试使用 DHCPv6 获取。
使用固定 IPv6 地址¶
IPv6 配置固定地址与 IPv4 类似,样例如下:
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: false # 不使用 DHCP
dhcp6: false # 不使用 DHCP
accept-ra: false # 不接受 Router Advertisement 报文
addresses:
- 192.168.0.100/24 # 主机的 IP 此处要带上子网前缀长度
- fda5:ebe7:7078:ad26::2/64 # 这边使用了私有 IPv6 范围的地址,可以访问 https://simpledns.plus/private-ipv6 获得
routes: # 配置默认路由
- to: default
via: 192.168.0.1
- to: default
via: fe80::1daa:eaff:fe73:b2d2 # IPv6 的默认路由通常使用路由器的链路本地地址 当然也可以像 IPv4 一样使用同网段的 fda5:ebe7:7078:ad26::1
nameservers:
addresses:
- 192.168.0.1
@Pd12: 何时使用静态 IPv6 地址
大多数情况下 IPv6 都使用动态方式分配地址,很少使用静态 IPv6 地址。编者唯一使用过的情况是校园网中使用路由器架设宿舍网络,由于学校的网络需要登陆使用,只能使用一个 IPv6 地址,故不得不采取 NAT 的形式在宿舍网络中使用 IPv6 网络。
创建网桥¶
假设需要创建网桥 br0 用于桥接接口 eth0 与 eth1,样例配置如下:
network:
version: 2
renderer: networkd
ethernets:
eth0: # 作为网桥的端口使用时,不需要获取地址
dhcp4: false
dhcp6: false
accept-ra: false
eth1:
dhcp4: false
dhcp6: false
accept-ra: false
bridges:
br0:
interfaces: # 此处声明网桥的接口
- eth0
- eth1
dhcp4: false
# 不需要 IPv6 的,可以设置 dhcp6 accept-ra 为 false
dhcp6: false
accept-ra: true
addresses:
- 192.168.0.100/24 # 主机的 IP 此处要带上子网前缀长度
routes: # 配置默认路由
- to: default
via: 192.168.0.1
nameservers:
addresses:
- 192.168.0.1
无线网络与网桥
注意,大多数情况下 wlan 接口作为客户端运行时无法作为网桥的子接口(AP 模式可以)。如果的确需要多设备接入无线网络,建议使用 网桥+NAT 实现。
接入 VLAN¶
假设接口 eth0 作为 Trunk 接口使用,需要接入 VLAN 2-3,配置样例如下:
network:
version: 2
renderer: networkd
ethernets:
eth0: # 此处配置未带 VLAN 标签的网络参数
dhcp4: false # 不使用 DHCP
addresses:
- 192.168.0.100/24 # 主机的 IP 此处要带上子网前缀长度
routes: # 配置默认路由
- to: default
via: 192.168.0.1
nameservers:
addresses:
- 192.168.0.1
vlans:
eth0.2: # 此处的名称可以自定义,这边使用惯例 [母接口名称].[VLAN ID] 的命名方式
id: 2 # 声明该接口的 VLAN ID
link: eth0 # 该接口的母接口
# 后续的配置和 eth0 一样,此处简化为使用 dhcp
dhcp4: true
eth0.3: # 再创建一个 VLAN ID 为 3 的接口
id: 3 # 声明该接口的 VLAN ID
link: eth0 # 该接口的母接口
# 后续的配置和 eth0 一样,此处简化为使用 dhcp
dhcp4: true
VLAN 接入网桥¶
假设接口 eth0 作为 Trunk 接口使用,需要接入 VLAN 2-3 并接入各自的网桥,配置样例如下:
network:
version: 2
renderer: networkd
ethernets:
eth0: # 作为网桥的端口使用时,不需要获取地址
dhcp4: false
dhcp6: false
accept-ra: false
vlans: # 先声明 VLAN 后,再将 VLAN 接口接入网桥
eth0.2:
id: 2
link: eth0
dhcp4: false
dhcp6: false
accept-ra: false
eth0.3:
id: 3
link: eth0
dhcp4: false
dhcp6: false
accept-ra: false
bridges:
br0:
interfaces: # 此处声明网桥的接口
- eth0
dhcp4: false
# 不需要 IPv6 的,可以设置 dhcp6 accept-ra 为 false
dhcp6: false
accept-ra: true
addresses:
- 192.168.0.100/24 # 主机的 IP 此处要带上子网前缀长度
routes: # 配置默认路由
- to: default
via: 192.168.0.1
nameservers:
addresses:
- 192.168.0.1 # 大多数路由器都会提供 DNS 服务
br2:
interfaces: # 此处声明网桥的接口
- eth0.2
# 后续的配置简化为使用 dhcp
dhcp4: true
br3:
interfaces:
- eth0.3
dhcp4: true
@Pd12: 与 NetworkManager 和 Systemd-networkd 比较
编者同时使用过 NetworkManager,Systemd-networkd,Netplan 三者,根据个人经验给出一些比较。
简单网络环境下(例如只是配置个固定 IP),使用哪种都差不多,一般系统默认安装哪个就用哪个。
在易用性上,NetworkManager 完胜,该软件带有的
nmtui工具可以使用图形界面配置网络,无需编写配置文件。如果需要使用 Systemd-networkd 提供的更多功能(例如在接口上启用 DHCP 服务器这种),请直接编写 Systemd-networkd 配置,缺点是需要编写大量配置文件(一般一个网络接口需要提供 .network .netdev 两个文件)。而 Netplan 则对配置文件进行了简化处理,一般只需要一个配置文件即可。