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开始的整数。