Linux 下使用 netplan 配置多网卡

情况大概是这样的:最近在试 CLE 的新服务器,需要把两个弹性 IP 绑到一个 VM 的两张网卡上;给 VM 添加了两张网卡之后发现入网并不能通,一通骚操作之后连出网都通不了了……

首先说一下那台服务器的基本情况,服务器的操作系统是 Arch Linux,有两张网卡在 Linux 当中显示为 ens3ens12,分别绑定了两个不同的弹性 IP;网关和地址都不同:

  • ens3
    • 分配的 IP 为 10.229.147.60
    • 广播 10.229.255.255
    • 网关地址是 10.230.128.128
  • ens12
    • 分配的 IP 为 10.230.82.200
    • 广播 10.230.127.255
    • 网关地址是 10.230.108.202
    • 默认出网走此网卡

于是在请教了专 业 人 士之后,得知还需要配置路由和规则表然后指定默认的路由,总之他光速给我写出了一堆 ip 路由规则:

ip rule add from 10.230.82.200 table 200 prefer 5000
ip ro add default via 10.230.108.202 table 200
ip rule add from 10.230.133.168 table 168 prefer 5000
ip ro add default via 10.230.128.128 table 168
ip ro change default via 10.230.108.202

虽然不太明白是什么,反正直呼内行就是了,把这一串路由规则贴进去 VNC 里执行之后,出网入网都通了,泪目……

直到我手欠地执行了一次 reboot 重启服务器为止。

就当我连不上 SSH,十分疑惑为什么重启了这么长时间之后,连上 VNC 一看,这机器不是好好地开着吗?登进去一看入网出网又全炸了。

噔噔咚。

一开始以为是服务器网络有问题,后来检查了半天发现路由规则不见了,重新跑了上面那些命令设置路由规则之后,出入网又正常了。

那么问题的关键就在于,使用 ip routeip rule 命令设置的路由和规则,并不会自动保存,重启之后就失效了。于是我就在群里问有没有什么解决的办法,AJ 告诉我可以用 netplan.

我:“啥东西啊?”

虽然不知道这是什么,总之照做就好了。那么首先安装一下 netplan

pacman -S netplan
netplan
You need to specify a command
usage: /usr/bin/netplan  [-h] [--debug]  ...

Network configuration in YAML

optional arguments:
  -h, --help  show this help message and exit
  --debug     Enable debug messages

Available commands:
  
    help      Show this help message
    apply     Apply current netplan config to running system
    generate  Generate backend specific configuration files from
              /etc/netplan/*.yaml
    info      Show current netplan version and available features
    ip        Retrieve IP information from the system
    try       Try to apply a new netplan config to running system, with
              automatic rollback

看 CLI 的指示,是要我们在 /etc/netplan 底下创建一个 yaml 文件,写入网卡的配置,然后用 netplan 命令生成并应用。我们先创建一下 /etc/netplan

mkdir -p /etc/netplan

那么接下来,这个 yaml 要怎么写呢?还是去看看官方文档好了:https://netplan.io/examples/ ,官方文档给了我们两个很简单的例子:

network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      dhcp4: true

看起来还是比较容易理解的,这个 YAML 告诉系统当前设备有一张名为 enp3s0 的网卡,然后开启了 IPv4 的 DHCP.

那我们要实现静态分配 IP 呢?可以用 addresses 设置 IP,用 gateway4 设置 IPv4 的网关:

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]

然后,自定义路由规则呢?可以这么写:

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

然后回到我们的需求,看了这些示例,照抄一下即可:

network:
    ethernets:
        ens12:
            dhcp4: false
            addresses: [10.230.82.200/18]
            routes:
                - to: 0.0.0.0/0
                  via: 10.230.108.202
                  metric: 203
            optional: true
        ens3:
            dhcp4: false
            addresses: [10.229.147.60/15]
            routes:
                - to: 0.0.0.0/0
                  via: 10.230.128.128
                  metric: 202
            optional: true
    version: 2 

首先上面的配置文件说明机器有两张网卡,一张名为 ens3,一张名为 ens12;然后给 ens3 分配了地址 10.230.82.200/18、给 ens12 分配了地址 10.229.147.60/15;因为是静态 IP 所有都关闭了 DHCP4;然后因为路由手动设置,所以可以不填写 gateway4

接着为两张网卡分别设置了路由规则,ens3 通过 10.230.108.202 网关出网,优先级是 203(优先级越大越优先,最大的为默认网卡);ens12 则通过 10.230.128.128 网关出网,优先级是 202.

将上面的配置保存到 /etc/netplan/default.yaml 下,然后执行以下命令应用配置:

netplan generate
netplan apply       # 也可以用 netplan try 试试规则对不对,如果不对会自动恢复

如果配置正确的话,现在路由规则就可以开机自动生效了。好诶!