我有一個帶有兩個乙太網路介面的 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
到發送資料包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 條目。