我有一台 Linux 服务器,它有两个以太网接口,连接到同一个交换机,位于同一个子网中。拓扑如下
+--------------------+
| |
| +----------+ +----------+
| | enp1s0f0 |<======>| |
| +----------+ | ethernet |
| Server | | |
| +----------+ | switch |
| | enp1s0f1 |<======>| |
| +----------+ +----------+
| |
+--------------------+
这两个接口的IP地址分别为172.16.0.100
和172.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(例如,使用命令)。但是,我只能看到这些数据包通过接口(通过检查捕获的数据包),而不是这两个以太网接口和交换机。enp1s0f1
telnet -b 172.16.0.100 172.16.1.100 22
lo
我的第一个问题是我如何强制 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 条目。