Netplan是一个在linux系统上轻松配置网络的实用工具。您只需创建所需网络接口的YAML描述以及每个接口应配置的功能。根据此描述,Netplan将为您选择的渲染器工具生成所有必要的配置。
一、如何工作
Netplan从/etc/Netplan/*.yaml
读取网络配置,这些文件由管理员、安装人员、云映像实例化或其他操作系统部署编写。在系统引导初期,Netplan将在/run
中生成特定于后端的配置文件,然后再将设备的控制权移交给特定的网络守护进程。
Netplan目前支持以下两种网络管理工具(渲染器) :
NetworkManager
Systemd-networkd
二、如何使用
1.配置
显然,没有配置,netplan什么也做不了。
最有用的配置片段(通过dhcp显示内容)如下所示:
network:
version: 2
renderer: NetworkManager
此配置将以NetworkManager作为渲染器来管理所有设备(默认情况下,一旦检测到carrier,以太网设备就将通过DHCP来启动)。
而使用networkd作为渲染器则不会通过DHCP来自动启动设备;而是将每个接口设备都在/etc/netplan
中的文件中进行指定和配置以便在networkd中使用。
2.命令
Netplan通过如下的几个子命令来驱动网络行为:
- netplan generate: 使用
/etc/netplan
来为渲染器生成所需的配置 - netplan apply: 应用渲染器的配置,根据需要重新启动它们。
- netplan try: 应用配置,等待用户确认;如果网络中断或未给出确认,将回滚。
三、常见的Netplan 配置示例
要配置 netplan,请将配置文件保存在/etc/netplan/
下的*.yaml
中(如/etc/netplan/config.yaml
) ,然后运行sudo netplan apply
,此命令可将解析配置并应用于系统。写入/etc/netplan/
下的配置将在重新引导之间保持。
1.使用 DHCP 和静态寻址
为了让名为‘ enp3s0’的以太网设备通过 DHCP 获得一个地址,创建一个具有以下内容的 YAML 文件:
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
dhcp4: true
为了设置一个静态 IP 地址,可使用地址键,它由一个地址列表(IPv4或 IPv6)组成,地址一般连同子网前缀(例如10.10.10.2/24)。此外还可以提供网关和 DNS 信息:
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
addresses:
- 10.10.10.2/24
gateway4: 10.10.10.1
nameservers:
search: [mydomain, otherdomain]
addresses: [10.10.10.1, 1.1.1.1]
2.用 DHCP 连接多个接口
许多系统都包括不止一个的网络接口。服务器通常需要连接到多个网络,并且可能要求连接到 Internet 的流量只通过一个某个特定的接口,尽管它们都提供了一个有效的网关。
通过为在 DHCP 上检索的路由指定一个度量,可以实现在 DHCP 上所需的精确路由,这将确保某些路由优于其他路由。在这个例子中,en3s0 比 en4s0 更受欢迎,因为它有一个更低的路由度量:
network:
version: 2
ethernets:
en3s0:
dhcp4: yes
dhcp4-overrides:
route-metric: 100
en4s0:
dhcp4: yes
dhcp4-overrides:
route-metric: 200
3.连接到开放的无线网络
Netplan 很容易支持连接到一个开放的无线网络(一个没有密码保护的网络) ,只需要定义接入点:
network:
version: 2
wifis:
wl0:
access-points:
opennetwork: {}
dhcp4: yes
4.连接到 WPA 个人无线网络
无线设备使用“ wifis”键,并与有线以太网设备共享相同的配置选项。无线接驳点名称及密码亦应指定:
network:
version: 2
renderer: networkd
wifis:
wlp2s0b1:
dhcp4: no
dhcp6: no
addresses: [192.168.0.21/24]
gateway4: 192.168.0.1
nameservers:
addresses: [192.168.0.1, 8.8.8.8]
access-points:
"network_ssid_name":
password: "**********"
5.连接到 WPA 企业无线网络
使用 WPA 或 WPA2 Enterprise 进行安全保护的无线网络也很常见,这需要额外的身份验证参数。
例如,如果使用 WPA-EAP 和 TTLS 保护网络:
network:
version: 2
wifis:
wl0:
access-points:
workplace:
auth:
key-management: eap
method: ttls
anonymous-identity: "@internal.example.com"
identity: "joe@internal.example.com"
password: "v3ryS3kr1t"
dhcp4: yes
或者,如果使用 WPA-EAP 和 TLS 保护网络:
network:
version: 2
wifis:
wl0:
access-points:
university:
auth:
key-management: eap
method: tls
anonymous-identity: "@cust.example.com"
identity: "cert-joe@cust.example.com"
ca-certificate: /etc/ssl/cust-cacrt.pem
client-certificate: /etc/ssl/cust-crt.pem
client-key: /etc/ssl/cust-key.pem
client-key-password: "d3cryptPr1v4t3K3y"
dhcp4: yes
6.在单个接口上使用多个地址
地址键可以获取一个地址列表来分配给一个接口:
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
addresses:
- 10.100.1.38/24
- 10.100.1.39/24
gateway4: 10.100.1.1
7.使用多个网关的多个地址
与上面的示例类似,可以用多个网关配置具有多个地址的接口。
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
addresses:
- 9.0.0.9/24
- 10.0.0.10/24
- 11.0.0.11/24
#gateway4: # unset, since we configure routes below
routes:
- to: 0.0.0.0/0
via: 9.0.0.1
metric: 100
- to: 0.0.0.0/0
via: 10.0.0.1
metric: 100
- to: 0.0.0.0/0
via: 11.0.0.1
metric: 100
假设有多个地址,每个地址都有自己的网关,我们在这里不指定网关,而是配置单独路由到0.0.0/0(无处不在),并使用使用子网的网关地址。且应该调整 metric 值,以便路由按预期的方式进行。
DHCP 可用于接收接口的一个 IP 地址。在这种情况下,该地址的默认路由将自动配置metric的值为100。作为路由下的一个条目的简写,网关可以设置为其中一个子网的网关地址。在这种情况下,可以从路由中省略该子网的路由。它的metric值将设置为100。
8.复杂的配置例子
network:
version: 2
# if specified, can only realistically have that value, as networkd cannot
# render wifi/3G.
renderer: NetworkManager
ethernets:
# opaque ID for physical interfaces, only referred to by other stanzas
id0:
match:
macaddress: 00:11:22:33:44:55
wakeonlan: true
dhcp4: true
addresses:
- 192.168.14.2/24
- 192.168.14.3/24
- "2001:1::1/64"
gateway4: 192.168.14.1
gateway6: "2001:1::2"
nameservers:
search: [foo.local, bar.local]
addresses: [8.8.8.8]
routes:
- to: 0.0.0.0/0
via: 11.0.0.1
table: 70
on-link: true
metric: 3
routing-policy:
- to: 10.0.0.0/8
from: 192.168.14.2/24
table: 70
priority: 100
- to: 20.0.0.0/8
from: 192.168.14.3/24
table: 70
priority: 50
# only networkd can render on-link routes and routing policies
renderer: networkd
lom:
match:
driver: ixgbe
# you are responsible for setting tight enough match rules
# that only match one device if you use set-name
set-name: lom1
dhcp6: true
switchports:
# all cards on second PCI bus unconfigured by
# themselves, will be added to br0 below
match:
name: enp2*
mtu: 1280
wifis:
all-wlans:
# useful on a system where you know there is
# only ever going to be one device
match: {}
access-points:
"Joe's home":
# mode defaults to "infrastructure" (client)
password: "s3kr1t"
# this creates an AP on wlp1s0 using hostapd
# no match rules, thus the ID is the interface name
wlp1s0:
access-points:
"guest":
mode: ap
# no WPA config implies default of open
bridges:
# the key name is the name for virtual (created) interfaces
# no match: and set-name: allowed
br0:
# IDs of the components; switchports expands into multiple interfaces
interfaces: [wlp1s0, switchports]
dhcp4: true
四、配置参考
netplan配置文件*节点为network:mapping,其中包含vertion:2(curtin、MaaS等目前使用1)。然后可根据它们的类型对设备定义进行分组,比如物理设备ethernets: 、 modem: 、 wifis: 等,或虚拟设备 bridges:、bonds等。我们的渲染器可以理解这些类型,并且后端支持这些类型。
设备的公共属性:
-
renderer:networkd或NetworkManager,指定渲染器。renderer属性可以在设备类型中指定也可以在全局中指定。
-
dhcp4:布尔值,是否开启IPv4的dhcp。默认启用dhcp4。
-
dhcp6:布尔值,是否开启IPv6的dhcp。默认关闭dhcp6
-
ipv6-mtu:设置ipv6-mtu,注意,这是一个不寻常的要求,需要ipv6-mtu特性。
-
ipv6-privacy:布尔值,为指定的接口启用ipv6隐私扩展(RFC 4941),并选择临时地址。默认为false。
-
link-local:ipv4或ipv6序列,将链接本地地址配置为弹出。它们分别允许 IPv4和 IPv6链路本地寻址。如果未定义此字段,则默认设置为只启用 IPv6链路本地地址。如果该字段被定义为一个空集,则 IPv6链路本地地址和 IPv4链路本地地址将被禁用。
只启用ipv4的linklocal:link-local: [ ipv4 ]
只启用ipv4的linklocal:link-local: [ ipv4, ipv6 ]
禁用linklocal:link-local: [ ]
-
critical:布尔值,为连接指定为“对系统至关重要”,这意味着在重新启动守护进程时将特别注意不释放分配的 IP。(网络管理器不能识别)
-
dhcp-identifier:(仅限网络和后端)设置DHCPv4客户端标识符的源。如果指定了 MAC,则使用链路的 MAC 地址。如果省略此选项,或者指定 DUID,networkd 将通过组合链接的 IAID 和 DUID 为接口生成一个符合 rfc4361的客户机标识符。
-
dhcp4-overrides:映射,(仅限于网络/后端)重写默认的 DHCP 行为。
-
dhcp6-overrides:映射,(仅限于网络/后端)重写默认的 DHCP 行为。
-
accept-ra:布尔值,接受有内核自己配置 IPv6的路由器广告。启用时,接受路由器广告。禁用时,不要响应路由器广告。如果取消设置,使用主机内核默认设置。
-
addresses:标量和映射序列。
除了通过 DHCP 或 RA 接收的地址之外,还要向接口添加静态地址。每个序列条目都采用 CIDR 表示法,即addr/prefixlen
形式。Addr 是一个 IPv4或 IPv6地址,由inet _ pton (3)
识别,并以子网位数作为前缀。
对于虚拟设备(桥接器bridges、连接器、 vlan) ,如果没有配置地址并禁用 DHCP,那么接口仍然可以联机,但不能从网络寻址。
除了地址本身,可以指定配置参数作为映射。当前支持的选项有:
lifetime:数值(0-100);label:ip地址标签
例子:
ethernets:
eth0:
addresses:
- 10.0.0.15/24:
lifetime: 0
label: "maas"
- "2001:1::1/64"
-
ipv6-address-generation:数值(0-100),暂不解释
-
ipv6-address-token:数值(0-100),暂不解释
-
gateway4/gateway6:ip地址
为 IPv4/6设置默认网关。网关 ip 必须是inet _ pton (3)
能够识别的形式。在你的全局配置中应该只有一个网关设置,以使它清晰明了。如果您需要多个默认路由,请通过路由策略定义它们。 -
nameservers:DNS服务器或搜索域,设置 DNS 服务器和搜索域,用于手动地址配置。
有两个支持字段:
addresses: 是一个类似于网关的 IPv4或 IPv6地址列表,而 search: 是一个搜索域名列表。
例子:
ethernets:
id0:
[...]
nameservers:
search: [lab, home]
addresses: [8.8.8.8, "FEDC::1"]
- macaddress:MAC地址,设置设备的 MAC 地址。 MAC 地址必须是“ XX: XX: XX: XX: XX: XX: XX: XX: XX”的格式。
注意: 由于与 udev 中的设备重命名的交互作用,对于仅通过名称匹配并由 networkd 呈现的设备,这将不可靠地工作。在设置 MAC 地址时通过 MAC 匹配设备。
例子:
ethernets:
id0:
match:
macaddress: 52:54:00:6b:3c:58
[...]
macaddress: 52:54:00:6b:3c:59
-
mtu:数值,为接口设置最大传输单元/值,默认值为1500,有效值取决于你的网络接口。
注意: 由于与 udev 中的设备重命名的交互作用,对于仅通过名称匹配并由 networkd 呈现的设备,这将不可靠地工作。设置 MTU 时通过 MAC 匹配设备。 -
optional:布尔值
引导不需要可选设备。正常情况下,networkd 将等待一段时间来配置设备,然后再继续启动。但是,如果设备被标记为可选,网络将不会等待它。这只有 networkd 支持,默认值为 false。
例子:
ethernets:
eth7:
# this is plugged into a test network that is often
# down - don't wait for it to come up during boot.
dhcp4: true
optional: true
- optional-addresses:标量序列,指定不需要设备联机考虑的地址类型。这会在引导时更改后端的行为,以避免等待标记为可选的地址,从而更快地将接口视为“可用”的。这不会禁用这些地址,这些地址无论如何都会被提取出来。
例子:
ethernets:
eth7:
dhcp4: true
dhcp6: true
optional-addresses: [ ipv4-ll, dhcp6 ]
-
routes:映射序列,为设备配置静态路由,详见路由选择
-
routing-policy:映射序列,为设备配置策略路由,详见路由选择
五、路由选择
使用 netplan 可以进行复杂的路由选择。标准的静态路由以及使用路由表的策略路由通过 networkd 后端得到支持。
这些选项适用于所有类型的接口。
routes:映射序列
路由块为接口定义标准的静态路由。必须指定至少到和通过(除了有作用域: link 的路线,其中只需要到)。
对于 from、 to 和 via,IPv4和 IPv6地址都是可识别的,并且必须以 addr/prefixlen 或 addr 的形式。
-
from:IP地址,为通过该路由的流量设置一个源 IP 地址
-
to:IP地址,路由的目的地址
-
via:IP地址,地址到此路由使用的网关
-
on-link:布尔值,当设置为“ true”时,指定路由是直接连接到接口设备的
-
metric:正整数值,路由的相对优先级。
-
type:路由类型,路由的有效类型为“unicast” (default) ,“unreachable”, “blackhole” or “prohibit”,分别表示 “单播”(默认)、”不可到达”、”黑洞”或”禁止”的意思。
-
scope:路由范围,可选参数有 “global”, “link”, 或 “host”. NetworkManager不支持此选项。
-
table:路由表
用于路由的表编号。 在某些情况下,它可能是在单独的路由表中设置路由有用。 它也可以使用要引用路由策略规则,也接受表范围。 允许值是从1开始的正整数。
某些值已用于引用特定路由表。 -
mtu:数值,路由使用的 MTU (以字节为单位),1-101。
-
congestion-window:数值,用于路由的拥塞窗口,1-102
-
advertised-receive-window:数值,路由发布广告的接收窗口,1-102
routing-policy:映射序列
路由策略块为网络定义了额外的路由策略,其中流量可以根据源 IP、防火墙标记等进行特殊处理。
对于 from、to,IPv4和 IPv6地址都是可识别的,并且必须以 addr/prefixlen 或 addr 的形式。
-
from:IP地址,设置源 IP 地址以匹配此策略规则的流量
-
to:IP地址,匹配前往指定目的地址的流量
-
table:路由表
匹配路线的表编号。 在某些情况下,它可能是在单独的路由表中设置路由有用。 它也可以使用要引用也接受表参数的路由。允许值是从1开始的正整数。
某些值已用于引用特定路由表。 -
priority:数值,指定路由策略规则的优先级
-
mark:数值,将此路由策略规则规则匹配已标记的流量由iptables防火墙具有此值。 允许的值是正面的从1开始的整数。