在 Linux 上,如何不通过环回接口发送本地目的地的数据包

在 Linux 上,如何不通过环回接口发送本地目的地的数据包

我有一台 Linux 服务器,它有两个以太网接口,连接到同一个交换机,位于同一个子网中。拓扑如下

+--------------------+
|                    |
|         +----------+        +----------+
|         | enp1s0f0 |<======>|          |
|         +----------+        | ethernet |
|  Server            |        |          |
|         +----------+        |  switch  |
|         | enp1s0f1 |<======>|          |
|         +----------+        +----------+
|                    |
+--------------------+

这两个接口的IP地址分别为172.16.0.100172.16.1.100

$ ip addr
...
4: enp1s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 10:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.100/16 brd 172.16.255.255 scope global noprefixroute enp1s0f0
       valid_lft forever preferred_lft forever
5: enp1s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 10:00:00:00:01:00 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.100/16 brd 172.16.255.255 scope global noprefixroute enp1s0f1
       valid_lft forever preferred_lft forever
...

现在我想通过外部交换机将数据包从发送enp1s0f0到(出于测试目的,从交换机的角度来看,有两台单独的计算机相互通信)。因此,我将套接字的本地地址绑定到 172.16.0.100,并将其连接到 172.16.1.100(例如,使用命令)。但是,我只能看到这些数据包通过接口(通过检查捕获的数据包),而不是这两个以太网接口和交换机。enp1s0f1telnet -b 172.16.0.100 172.16.1.100 22lo

我的第一个问题是我如何强制 Linux 通过外部接口发送这些具有本地目的地的数据包?

我认为我已经正确设置了地址和路由表。路由表包含以下条目

$ ip route
...
172.16.0.0/16 dev enp1s0f0 proto kernel scope link src 172.16.0.100 metric 100
172.16.0.0/16 dev enp1s0f1 proto kernel scope link src 172.16.1.100 metric 101

ARP 表似乎也配置正确

$ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
172.16.1.100             ether   10:00:00:00:01:00   CM                    enp1s0f0
172.16.0.100             ether   10:00:00:00:00:00   CM                    enp1s0f1

然而 Linux 仍然通过lo接口路由这些数据包

$ ip route get from 172.16.0.100  172.16.1.100
local 172.16.1.100 from 172.16.0.100 dev lo uid 1000
    cache <local>
$ ip route get from 172.16.1.100  172.16.0.100
local 172.16.0.100 from 172.16.1.100 dev lo uid 1000
    cache <local>

我也尝试ping从这些接口进行连接,例如ping -I enp1s0f0 172.16.1.100。捕获的数据包显示发送的 ICMP 数据包可以按预期通过交换机到达目的地,但是接口上没有看到回复数据包enp1s0f1。我搜索了这个问题的解决方案,发现答案是,这可能与反向路径过滤。因此,我尝试rp_filter通过将默认值和接口的rp_filter值设置为 0 或 2 来禁用,但这并没有解决问题。我的另一个问题是我的配置是否正确?在这种情况下我应该如何让 Linux 回复 ICMP ping 数据包?

我的操作系统是 Ubuntu 20.04,ICMP 回复在其他接口上运行良好,并且没有配置 iptable 条目。

相关内容