情况大概是这样的:最近在试 CLE 的新服务器,需要把两个弹性 IP 绑到一个 VM 的两张网卡上;给 VM 添加了两张网卡之后发现入网并不能通,一通骚操作之后连出网都通不了了……
首先说一下那台服务器的基本情况,服务器的操作系统是 Arch Linux,有两张网卡在 Linux 当中显示为 ens3
和 ens12
,分别绑定了两个不同的弹性 IP;网关和地址都不同:
ens3
- 分配的 IP 为
10.229.147.60
- 广播
10.229.255.255
- 网关地址是
10.230.128.128
- 分配的 IP 为
ens12
- 分配的 IP 为
10.230.82.200
- 广播
10.230.127.255
- 网关地址是
10.230.108.202
- 默认出网走此网卡
- 分配的 IP 为
于是在请教了专 业 人 士之后,得知还需要配置路由和规则表然后指定默认的路由,总之他光速给我写出了一堆 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 route
和 ip 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 试试规则对不对,如果不对会自动恢复
如果配置正确的话,现在路由规则就可以开机自动生效了。好诶!