如何使用 netplan、Ubuntu 18.04 服务器、2 个 NIC 设置默认路由

Pet*_*tar 8 server dhcp netplan 18.04

我有两个网卡,都是通过 DHCP 控制的。一个有公共IP,第二个私有。

两个接口都在 DHCP 中保留了静态 IP,并且两个接口都获得了正确的 IP,但是有时在重新启动服务器时我无法从公共访问,因为默认路由来自私有 NIC。

如何使用 netplan 永久设置?

公共网卡ens18(IP:213.133.xxx.xxx) 私有网卡ens19(IP:10.10.10.xxx)

我的网络计划配置是:

network:
  version: 2
  renderer: networkd
  ethernets:
    ens18:
      dhcp4: yes
      dhcp6: no
      nameservers:
        addresses: [8.8.8.8,8.8.4.4]
  ethernets:
    ens19:
      dhcp4: yes
      dhcp6: no
Run Code Online (Sandbox Code Playgroud)

Mat*_*rre 9

问题是 networkd 将启动两个网络,并且都设置了默认网关,并且两者的度量标准相同。

Netplan 目前不允许您跳过在一个接口上设置路由,但是您可以通过基于 netplan 已生成的配置来单独配置 networkd 以告诉它执行此操作。

我已经复制了下面的命令。在这里,我假设 ens19 是您不希望为其设置默认网关的“辅助”接口——请注意,要成功执行此操作,还需要在使用新接口重新启动之前发生(或者您可以复制部分config,省略 MACAddress= 行等,以便它足够通用以匹配新接口)。

sudo cp /run/systemd/network/10-netplan-ens19.network /etc/systemd/network
sudo vi /etc/systemd/network/10-netplan-ens19.network
Run Code Online (Sandbox Code Playgroud)

然后在[DHCP]下添加:

UseRoutes=false            # if you don't want to apply any routes from DHCP

RouteMetric=200        # any number above 100 if you want the routes applied, but that they are less preferred.
Run Code Online (Sandbox Code Playgroud)

如果您还没有该文件(即您还没有附加接口),那么您可以复制另一个为 DHCP 设置的接口的内容,并删除 MACAddress=。

通常,该文件应如下所示:

[Match]
Name=interfacename

[Network]
DHCP=ipv4

[DHCP]
UseMTU=true
RouteMetric=200    # or UseRoutes=false, as you prefer.
Run Code Online (Sandbox Code Playgroud)

  • 18.04 附带的 systemd v237 有一个恼人的错误,其中 `UseRoutes=false` 导致 `networkctl status` 卡在 `configuring` 中,导致 `systemd-networkd-wait-online` 失败并在 2 分钟后超时,导致开机延迟。可以通过在`systemd-networkd-wait-online.service`中添加`--timeout=1`来解决。`cp /lib/systemd/system/systemd-networkd-wait-online.service /etc/systemd/system` 并从那里编辑。 (2认同)

小智 7

对于静态接口,只是跳过gateway4(或gateway6)配置选项会导致 netplan 不为该接口创建默认路由。然后,如果您需要使用routes元素(字典数组)的额外路由

对于 DHCP 接口,您可以执行以下操作:

dhcp4-overrides:
    route-metric: 100
Run Code Online (Sandbox Code Playgroud)

只需增加后续接口的指标,您应该会很好。

(参见:https : //netplan.io/examples


ca2*_*202 5

要停止DHCP接口netplan从设置缺省路由,刚刚成立use-routesdhcp4-overridesfalse

eth2:
    dhcp4: true
    dhcp4-overrides:
        use-routes: false
Run Code Online (Sandbox Code Playgroud)

此外,最好不要/etc/netplan/50-cloud-init.yaml直接编辑,而是:

  • 将源更改为/etc/cloud/cloud.cfg.d/50-curtin-networking.cfg.
  • 运行cloud-init clean -r以重新启动。(这会将云配置中的更改传播到netplan配置)


小智 5

使用两个网卡是有技巧的。我更喜欢静态配置并定义路由表,这里有一些提示:

  • 有必要定义每个网卡的网关,除非两者共享相同的网关
  • 即使有多个网关,对于某些系统(即 Ubuntu),也只允许一个默认网关(花了一些时间来了解这一点),但有一些 Linux 发行版允许多个默认网关
  • 始终测试每个 NIC 的入站、出站 ping (ping -I google.com)
  • 如果只有某些范围正确连接,则可以在这些范围之间建立连接,但不能与其他网络建立连接(通过已知地址获取和发送 ping,但无法 ping 8.8.8.8
  • ip r get 8.8.8.8 将有助于了解系统如何到达和外部地址
  • 为每个网络设置 MAC 地址,因为适配器名称可能会在重新启动时更改

在下面的示例中,请注意每个 NIC 都有自己的网关,并且 eno2 具有系统的默认网关,如果您想要故障安全行为,请查看接口绑定或通过 iproute2 手动查看(阅读更多

# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses: [ 88.88.24.26/29, "8888.ffff:1:20::c02/64"  ]
      routes:
          - to: 0.0.0.0/0
            via: 88.88.24.25
            metric: 40
            table: 400
      routing-policy:
          - from: 88.88.24.26/29
            table: 400
      match:
          macaddress: 0c:c4:7b:0b:7b:eb
      set-name: mainInf
      gateway6: "8888.ffff:1:20:0:0:0:1"
      nameservers:
          search: [ mydomain.com ]
          addresses:
              - 8.8.8.8
              - 1.1.1.1
              - "2606:4700:4700::1111"
    eno2:
      addresses: [ 88.88.51.44/29, "8888.ffff:1:20::fa02/64" ]
      gateway4: 88.88.51.41
      routes:
          - to: 0.0.0.0/0
            via: 88.88.51.41
            metric: 40
            table: 200
      routing-policy:
          - from: 88.88.51.41/29
            table: 200
      match:
          macaddress: 0c:c4:7b:0b:7b:bb
      set-name: support
      gateway6: "8888.ffff:1:20:0:0:0:1"
      nameservers:
          search: [ mydomain.com ]
          addresses:
              - 8.8.8.8
              - 1.1.1.1
              - "2606:4700:4700::1111"
Run Code Online (Sandbox Code Playgroud)