如何防止使用 MAC 和 ebtables 進行 IP 欺騙?

如何防止使用 MAC 和 ebtables 進行 IP 欺騙?

我正在嘗試創建IP-MAC位址中的配對規則ebtables。可用的教程和相關問題 [1] 很少,但我有一些特定的設定。

環境: 我有許多實體主機。每台主機都有少量乙太網路卡,以綁定方式連接並用作橋接器的從屬設備。每台主機上都有許多虛擬機器(kvm、qemu、libvirt)。每個虛擬機器都透過名為 vnet[0-9]+ 的新連接埠連接到其實體主機的網橋。沒有 NAT。網路運作正常,所有實體主機都可以 ping 通,所有虛擬機器也是如此。每個虛擬機器都有自己的IP位址和MAC位址。

問題:在虛擬機器內部,IP 位址可以變更為另一個位址。

找到解決方案:ebtables 網站 [2] 上有一個已知的解決方案,但此解決方案僅適用於僅使用一台主機的情況。它允許所有流量,如果有來自 IP 的封包具有允許的其他 MAC,則封包將被丟棄。如果有多個主機,則需要在所有主機上註冊所有現有的 IP-MAC 對。需要反向政策解決。

精心設計的解決方案:我嘗試以相反的方式使用 ebtables。這是我嘗試過的一個例子。

實施例1

Bridge table: filter
Bridge chain: INPUT, entries: 2, policy: DROP
-i bond0 -j ACCEPT 
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT 
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

實施例2

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: DROP
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT 
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

我想要的核心是預設策略 DROP,並且只允許來自在給定主機上部署了正確的 IP-MAC 對的虛擬機器的流量。然而,這些解決方案不起作用。

問題:如何僅允許網橋上正在運行的虛擬機器的指定 IP-MAC 對的流量並丟棄來自連接埠 vnet[0-9]+ 的所有未知 IP-MAC 對?

非常感謝您的任何答覆。

答案1

我終於設法制定了一個可行的解決方案。

  1. 解決方案使用 ebtables 和 IP-MAC 對。
  2. 唯一需要的表是預設的“過濾器”表。
  3. 無需在 INPUT 鏈中添加任何規則或策略,因為 INPUT 鏈與運行的虛擬機器無關。過濾器表中 INPUT、OUTPUT 和 FORWARD 鏈含義的解釋位於 ebtables 線上說明頁中。
  4. 由於 ebtables 在乙太網路層級運作,且 IP-MAC 配對僅適用於 IP 封包,因此需要在規則中強調這一點,以免阻止 ARP 訊框和其他重要流量。

因此,一開始沒有任何規則,所有政策都設定為「接受」。沒有使用者定義的鏈。過濾表如下所示:

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

新增了一條新鏈。此鏈包含所有允許的 IP-MAC 對。它被稱為VMS。

# ebtables -N VMS

現在,重要的部分。對於從連接埠 vnet[0-9]+ 通過橋接器的每個包含 IP 封包(或其部分)的幀,應用鏈策略和鏈 VMS 規則。換句話說,對於來自任何虛擬機器的每個 IP 封包,請套用 VMS 鏈。

# ebtables -A FORWARD -p ip -i vnet+ -j VMS

鏈VMS的預設策略必須是DROP。這樣,來自任何虛擬機器的每個 IP 封包都會預設被丟棄。隨後,添加了允許的 IP-MAC 對例外。預設策略 DROP 會導致來自具有未知 IP-MAC 對的任何虛擬機器的所有流量立即被丟棄,從而使 IP 欺騙變得不可能。

# ebtables -P VMS DROP

表過濾器現在看起來是這樣的。此外,當沒有虛擬機器運行(允許)時,它看起來是這樣的。

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: ACCEPT
-p IPv4 -i vnet+ -j VMS
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
Bridge chain: VMS, entries: 0, policy: DROP

假設有兩台正在運作的機器。如果我們嘗試對它們執行 ping 操作,流量就會下降並且無法到達目的地。這是期望的結果,因為該流量尚未被允許。只需一條指令就足以允許每一台虛擬機器流量。

# ebtables -A VMS -p ip --ip-src 192.168.11.125 -s 54:52:00:cc:35:fa -j ACCEPT
# ebtables -A VMS -p ip --ip-src 192.168.11.122 -s 54:52:00:98:d7:b6 -j ACCEPT

現在,來自允許的虛擬機器的流量可以正常流動,並且可以防止 IP 欺騙。

這個解決方案可能並不完美,如果您有任何意見或改進,我很樂意聽到。

相關內容