Linux

在一個介面上禁用 rp_filter

  • October 17, 2017

我有一個 Ubuntu 16.04 伺服器,它充當具有多個 (VLAN) 介面的路由器。預設情況下,rp_filter所有介面都啟用(反向路徑過濾)。我想保持這種狀態,但只為一個介面例外。(應允許來自該介面的數據包具有與該介面的任何路由目標地址不對應的源 IP 地址。)

假設這個介面的名稱ens20.4是 ,它的 vlan-raw-device 是ens20,並且目標介面(用於測試數據包流)被命名ens20.2(儘管它應該適用於任何目標介面)。

我試圖只設置rp_filter屬性ens20.4,但沒有成功:

echo 0 > /proc/sys/net/ipv4/conf/ens20.4/rp_filter

因此,出於測試目的,我還禁用rp_filter了 vlan-raw-device 和測試目標介面:

echo 0 > /proc/sys/net/ipv4/conf/ens20/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens20.2/rp_filter

仍然沒有成功,帶有“欺騙”源 IP 地址的數據包仍然被丟棄。只有當我禁用所有介面時,數據包才能通過rp_filter

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter

但是,我仍然想為所有其他介面保留反向路徑過濾 - 我錯過了什麼?

那裡的資訊:https ://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/tree/Documentation/networking/ip-sysctl.txt?h=v4.9#n1090

請注意可以解釋您的嘗試的最後一句話:

conf/{all,interface}/rp_filter 中的最大值用於在 {interface} 上進行源驗證。

所以這應該工作:

for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
   echo 1 > "$i"
done
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens20.4/rp_filter

現在 max(conf/{all,ens20.4}/rp_filter == 0 :沒有源驗證。只需仔細檢查其他介面是否仍然受到保護。

您還可以檢查值為 2 的“鬆散”rpf。如果數據包通常應該由其他介面路由,那總比沒有驗證要好。

引用自:https://serverfault.com/questions/816393