回應資料包與 LAN 中傳入的介面相同

回應資料包與 LAN 中傳入的介面相同

目前,我正在努力應對以下情況:

  • 我的伺服器有 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 規則,您在規則中指定傳入介面(deviif此處)。這就是問題所在:這並沒有達到人們預期的效果。參見iif中的描述ip rule

投資基金姓名

選擇要匹配的傳入設備。如果介面是環回的,則規則僅符合源自該主機的封包。這意味著您可以為轉送封包和本機封包建立單獨的路由表,從而將它們完全隔離。

雖然寫得不清楚,但事實恰恰相反:資料包起源來自該主機的將僅匹配環回介面:它們不會匹配iif ens160nor iif ens224,但僅匹配iif lo(yesiif意味著傳入介面並iif lo匹配本地生成的外向的資料包,請將此視為「從本地系統傳入[到路由規則將告訴的任何地方]」)。這確實很重要。

然後會發生什麼:

  1. 筆記型電腦嘗試到達 $IP2(它不知道也不應該知道 $IP2 可能透過同一 LAN 上伺服器的 $IF1 和 $IP1 到達),透過閘道,

  2. 閘道將封包路由到屬於 $P2_NET 的伺服器 $IP2,到其 $IF2 接口,

  3. 伺服器在 $IF2 介面上接收屬於 $P1_NET(來自 172.31.190.129)的資料包,

  4. 伺服器的嚴格反向路徑rp_filter=1檢查反向路線,

  5. 如上所示,反向路線不匹配任何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 
    
  6. 反向路徑未使用資料包到達的介面:資料包被丟棄。

出於同樣的原因,目前的設定將不允許從以下位置正確存取網路:伺服器當使用 $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_過濾器),所以如果可以避免的話最好不要使用它們。

相關內容