我有一个配置有两个网络接口的 lxd 容器(使用 systemd-networkd)。
第一个有静态 IP 地址:
testuser@lxd-7e5cbece-180b-427f-a8b1-b2c12f6e9d79:~$ cat /etc/systemd/network/20-net0.network
[Match]
Name=net0
[Network]
Address=162.132.242.249/26
Gateway=162.132.192.252
DNS=162.132.192.252
DNS=162.132.170.6
lxd 的默认接口(使用 DHCP):
testuser@lxd-7e5cbece-180b-427f-a8b1-b2c12f6e9d79:~$ cat /etc/systemd/network/eth0.network
[Match]
Name=eth0
[Network]
DHCP=ipv4
[DHCP]
SendHostname=True
现在的问题是,路由表是使用162.132.192.252
(来自 net0)作为默认网关生成的,但我希望来自 eth0 的网关成为默认网关。
testuser@lxd-7e5cbece-180b-427f-a8b1-b2c12f6e9d79:~$ sudo route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 162.132.242.252 0.0.0.0 UG 0 0 0 net0
0.0.0.0 10.245.111.1 0.0.0.0 UG 1024 0 0 eth0
10.245.111.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.245.111.1 0.0.0.0 255.255.255.255 UH 1024 0 0 eth0
162.132.242.192 0.0.0.0 255.255.255.192 U 0 0 0 net0
1)为什么路由表是按这个顺序生成的? (首先是net0,然后是eth0)
2) 是否可以更改默认网关的顺序?
答案1
对于遇到同样问题的任何人,您实际上可以使用指标来做到这一点。您可以将具有较低度量的默认路由添加到静态接口,而不是在 [Network] 部分中定义默认网关:
[Match]
Name=net0
[Network]
Address=162.132.242.249/26
DNS=162.132.192.252
DNS=162.132.170.6
[Route]
Gateway=162.132.192.252
Destination=0.0.0.0/0
Metric=1024
此后,您可以对 DHCP 接口执行相同的操作(请注意,您不必定义网关,因为这将由 DHCP 服务器提供):
[Match]
Name=eth0
[Network]
DHCP=ipv4
[DHCP]
SendHostname=True
UseDomains=True
[Route]
Destination=0.0.0.0/0
Metric=1000
现在您获得了所需的路由表,其中 eth0 接口作为默认网关:
> ip route list
default dev eth0 proto static metric 1000
default dev net0 proto static metric 1024
default via 10.245.111.1 dev eth0 proto dhcp src 10.245.111.96 metric 1024
10.245.111.0/24 dev eth0 proto kernel scope link src 10.245.111.96
10.245.111.1 dev eth0 proto dhcp scope link src 10.245.111.96 metric 1024
162.132.242.192/26 dev net0 proto kernel scope link src 162.132.242.249
答案2
这实际上不是一个编程问题。您最好在 StackExchange Unix & Linux 上询问此类问题。
我遇到过类似的情况:使用 DHCP 的多个接口导致多个默认路由。
我所做的,也许对你也有用,就是告诉接口我们不需要 DHCP 路由,我们不需要它们。在.network
接口的文件中,添加 DHCPUseRoutes=false
选项,如下例所示:
[Match]
Name=eno3
[Network]
DHCP=ipv4
[DHCP]
UseRoutes=false