目前,我正在努力應對以下情況:
- 我的伺服器有 2 個接口,位於 2 個獨立的 LAN 子網路中。 IF1、IF2
- 我有一台筆記型電腦,其 IP 位址來自第一個子網
- 當我嘗試從這台特定筆記型電腦連接到伺服器的第二個 IP 位址時,我根本沒有得到回應。
例如,當我嘗試從 IP 172.31.190.129 的筆記型電腦 ping 172.31.196.185 時,我可以在 ens224 介面上的 tcpdump 中看到傳入請求,但此後在任何其他介面上都沒有回應請求。
這是我的網路圖:
+-------------------------+
| |
| Laptop 172.31.190.129 +---------+
| | |
+-------------------------+ |
| +-------------------------+
| | |
+-----------+---------+ | Linux Server |
+----+ | | |
| | LAN 172.31.190.0/23 +-------+ IF1 - default gw |
+------+--+ | | | 172.31.190.63 |
+----------+ | | +---------------------+ | |
| Internet +---+ Gateway | | |
+----------+ | | +---------------------+ | |
+------+--+ | | | |
| | LAN 172.31.196.0/23 +-------+ IF2 |
+----+ | | 172.31.196.185 |
+---------------------+ | |
| |
| |
+-------------------------+
另外,我有這個腳本:
IF1=ens160
IF2=ens224
P1_NET=172.31.190.0/23
P2_NET=172.31.196.0/23
IP1=172.31.190.63
IP2=172.31.196.185
P1=172.31.190.1
P2=172.31.196.1
ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1
ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add default via $P2 table T2
ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2
ip rule add from $P1_NET dev $IF1 table T1
ip rule add from $P2_NET dev $IF2 table T2
是按照這個連結寫的:https://lartc.org/howto/lartc.rpdb.multiple-links.html
在我的案例中,我嘗試了許多不同的方法來製定基於策略的路由,但沒有人成功...
答案1
長話短說
沒有必要iptables、記號,也不放鬆反向路徑轉送/過濾。使用與ip rule
傳出資料包不符的命令,而不是使用中描述的命令LARTC 的文檔您提供的連結:
ip rule add from $IP1 table T1 ip rule add from $IP2 table T2
那麼一切都會正常進行。
長版
即使總是可以透過放鬆讓事情順利進行反向路徑轉送/過濾例如使用sysctl -w net.ipv4.conf.all.rp_filter=2
等等,從而允許非對稱路由,應始終避免非對稱路由。特別是考慮到閘道(如果充當嚴格的狀態防火牆)或筆記型電腦也可能出於類似的原因不允許這樣做。使用iptables糾正錯誤行為的標記肯定無助於理解已經複雜的路由設定的行為。
雖然連結的文檔使用伺服器的 IP 作為來源(對於 $IF2/恩斯224: 172.31.196.185)無介面對於 ip 規則,您在規則中指定傳入介面(dev
指iif
此處)。這就是問題所在:這並沒有達到人們預期的效果。參見iif
中的描述ip rule
:
投資基金姓名
選擇要匹配的傳入設備。如果介面是環回的,則規則僅符合源自該主機的封包。這意味著您可以為轉送封包和本機封包建立單獨的路由表,從而將它們完全隔離。
雖然寫得不清楚,但事實恰恰相反:資料包起源來自該主機的將僅匹配環回介面:它們不會匹配iif ens160
nor iif ens224
,但僅匹配iif lo
(yesiif
意味著傳入介面並iif lo
匹配本地生成的外向的資料包,請將此視為「從本地系統傳入[到路由規則將告訴的任何地方]」)。這確實很重要。
然後會發生什麼:
筆記型電腦嘗試到達 $IP2(它不知道也不應該知道 $IP2 可能透過同一 LAN 上伺服器的 $IF1 和 $IP1 到達),透過閘道,
閘道將封包路由到屬於 $P2_NET 的伺服器 $IP2,到其 $IF2 接口,
伺服器在 $IF2 介面上接收屬於 $P1_NET(來自 172.31.190.129)的資料包,
伺服器的嚴格反向路徑
rp_filter=1
檢查反向路線,如上所示,反向路線不匹配任何
iif
不同於iif lo
:兩個新規則不匹配,因此唯一剩餘的匹配規則是主路由表的規則:透過 $IF1,驗證如下:# ip route get 172.31.190.129 from 172.31.196.185 172.31.190.129 from 172.31.196.185 dev ens160 uid 0 cache
反向路徑未使用資料包到達的介面:資料包被丟棄。
出於同樣的原因,目前的設定將不允許從以下位置正確存取網路:伺服器當使用 $IP2: 時,它再次與新規則不匹配,並嘗試使用 $IF1 :
# ip route get 8.8.8.8 from 172.31.196.185
8.8.8.8 from 172.31.196.185 via 172.31.190.1 dev ens160 uid 0
cache
因此,一旦刪除並更改這兩個規則(如 LARTC 中所述),即可:
ip rule add from $IP1 table T1 ip rule add from $IP2 table T2
那是:
# ip rule add from 172.31.190.63 table T1
# ip rule add from 172.31.196.185 table T2
事情會正常工作,正如路由查找所告訴的(現在使用table T2
):
# ip route get 172.31.190.129 from 172.31.196.185
172.31.190.129 from 172.31.196.185 via 172.31.196.1 dev ens224 table T2 uid 0
cache
# ip route get 8.8.8.8 from 172.31.196.185
8.8.8.8 from 172.31.196.185 via 172.31.196.1 dev ens224 table T2 uid 0
cache
這 3 種變體也可能有效(為了簡潔起見,只需將規則與表 T2 放在一起):
ip rule add from 172.31.196.0/23 table T2
ip rule add from 172.31.196.185 iif lo table T2
ip rule add from 172.31.196.0/23 iif lo table T2
請注意,如手冊頁所述,iif lo
如果出現以下情況,將改變行為:伺服器還在路由其後面的其他系統(同樣,規則與這些系統不符):除非需要,否則最好不要使用它。
沒有必要iptables並為此做標記。使用標記來更改介面可能會為路由、ARP 請求和反向路徑過濾帶來額外的麻煩(使用標記通常需要放鬆)rp_過濾器),所以如果可以避免的話最好不要使用它們。