数据包丢失问题,可能与两个网络接口(DHCP)上的不同网关有关

数据包丢失问题,可能与两个网络接口(DHCP)上的不同网关有关

我正在为一台服务器而苦恼,它有两个网络接口,分别连接到两个不同的网络,每个网络都有不同的网关。我无法访问交换机配置和 ACL,但“另一边”声称“一切都设置好了”。

配置非常简单,netplan在 Ubuntu 20.04 服务器上使用:

$ cat /etc/netplan/99_config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eno1:
      dhcp4: true
    eno2:
      dhcp4: true

这是网络(这是实际配置,没有任何混淆)

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether f4:ee:08:10:07:40 brd ff:ff:ff:ff:ff:ff
    inet 10.131.161.10/24 brd 10.131.161.255 scope global dynamic eno1
       valid_lft 20579sec preferred_lft 20579sec
    inet6 fe80::f6ee:8ff:fe10:740/64 scope link
       valid_lft forever preferred_lft forever
3: ens1f0np0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether e4:3d:1a:e8:6c:90 brd ff:ff:ff:ff:ff:ff
4: eno2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether f4:ee:08:10:07:41 brd ff:ff:ff:ff:ff:ff
    inet 10.189.161.110/24 brd 10.189.161.255 scope global dynamic eno2
       valid_lft 20579sec preferred_lft 20579sec
    inet6 fe80::f6ee:8ff:fe10:741/64 scope link
       valid_lft forever preferred_lft forever
5: ens1f1np1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether e4:3d:1a:e8:6c:91 brd ff:ff:ff:ff:ff:ff

如您所见,两个不同的网络10.131.161.10/2410.189.161.110/24两个接口。

到目前为止一切顺利,一切运行正常,但是......

有时(上次是在之后,apt-get upgrade这次是刚好发生在一夜之间,没有任何交互),服务器的网络会处于数据包丢失率约为 90% 的状态。

--- ecap-s010 ping statistics ---
485 packets transmitted, 40 received, 91.7526% packet loss, time 490417ms
rtt min/avg/max/mdev = 0.222/0.298/0.348/0.025 ms

从那时起,我几乎无法通过 SSH 连接:我必须尝试数百次,如果幸运的话,我会抓住一个数据包路由正确的短时间窗口,这足以建立连接。如果我做到了这一点,我就会有一个稳定的 SSH 连接(大多数时候)。

流量转储显示,回显回复不知何故来自另一个接口(这是不同的网络)!如果我10.131.161.10在这个错误状态下执行 ping 操作,答案(大多数情况下)会从分配给 的另一个接口发回10.189.161.110

摆脱这种状态的唯一方法是从ens1f0np0接口(10.189.161.110)拔出网线并重新插入。此后几天,一切都像以前一样。我无法找出与此相关的任何事件,没有dmesg任何消息。唯一真正与交互相关的一次是我执行时apt-get upgrade,这可能触发了一些重新配置,但我不知道是什么。其他时候它是随机发生的。

我没有任何花哨的 IP 表配置。基本上就是这样:

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3000 -m comment --comment "Grafana" -j ACCEPT
-A INPUT -s 10.131.161.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 10.131.161.0/24 -p tcp -m state --state NEW -m tcp --dport 8086 -m comment --comment "Grafana Agents"-j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

您是否知道如何调试这个问题,或者发生了什么事情?

答案1

在多宿主主机上,您需要配置路由,以便它知道哪些网络可通过哪个接口访问。

在您当前的配置中,每个接口都从其所连接的网段的 DHCP 服务器收到默认路由。因此,您的服务器将认为它可以通过两个接口中的任何一个访问每个 IP 地址,并且可以自由选择它们。(除了两个直接连接的网络 10.131.161.10/24 和 10.189.161.110/24 中的一个中的地址,它将优先使用直接链接。)您可以通过使用命令显示和检查路由表来验证这一点ip route

但是,正如您遇到的数据包丢失所证明的那样,两个接口中只有一个可以真正连接到公共互联网。因此,您需要修复路由配置,以告诉服务器两个默认路由中的哪一个是正确的。一种方法是向文件route-metric中添加条目/etc/netplan/99_config.yaml,如 Netplan 配置示例中所示https://netplan.io/examples/#connecting-multiple-interfaces-with-dhcp

根据您的网络拓扑,您可能还需要额外的静态路由。您应该与您的网络团队讨论此事。

相关内容