在 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到發送資料包enp1s0f1(出於測試目的,從交換器的角度來看,有兩台單獨的電腦相互通訊)。所以我將套接字的本地位址綁定到172.16.0.100並將其連接到172.16.1.100(例如,使用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從這些介面進行 ing,例如ping -I enp1s0f0 172.16.1.100.捕獲的資料包顯示,發送的 ICMP 資料包可以按預期透過交換器到達目的地,但介面上看不到回覆資料包enp1s0f1。我已經搜索過這個問題的解決方案並發現答案,它說這可能與反向路徑過濾。所以我嘗試rp_filter透過將預設值和介面的rp_filter值設為 0 和 2 來停用,但這並沒有解決問題。我的附加問題是我的配置是否正確?

我的作業系統是 Ubuntu 20.04,ICMP 回覆在其他介面上運作良好,並且沒有配置 iptable 條目。

相關內容