Linux

iptables:目前不同網關IP的不同規則

  • April 4, 2022

假設我有機器 A 作為網關。機器 A 有一個帶有 2 個 IP 的介面。

機器 A 的 netplan 配置如下:

 renderer: networkd
 ethernets:
   eth0:
     dhcp4: no
     addresses:
       - 192.168.1.1/24
       - 192.168.1.2/24

現在我希望 iptables 的 REDIRECT 規則的行為不同,具體取決於機器 B 將其網關設置為 192.168.1.1 還是 192.168.1.2

這是我試圖在機器 A 上執行的 iptables 命令:

iptables --table nat --append PREROUTING --some-parameter 192.168.1.1 --protocol tcp  --jump REDIRECT --to-ports 9991
iptables --table nat --append PREROUTING --some-parameter 192.168.1.2 --protocol tcp  --jump REDIRECT --to-ports 9992

你能告訴--some-parameter 上面的正確名稱是什麼嗎?

網關的同一網路介面上的 192.168.1.1 和 192.168.1.2 無法執行此操作,因此解析為相同的 MAC 地址。這不是iptables中未實現的功能可以實現,它是由於 IP 網路的工作方式而無法實現的功能。

使用 192.168.1.1 或 192.168.1.2 作為網關的客戶端在向 Internet 發送數據包時將永遠不會發送包含 192.168.1.1 或 192.168.1.2 的單個 IPv4 數據包。它會:

  • 查詢給定目的地的路由表
  • 發現這個目的地有網關
  • 使用ARP或記憶體條目來解析到達網關所需的 L2 地址(乙太網 MAC 地址)。

最後一步將只有一個乙太網目標:網關的 NIC 唯一 MAC 地址:對於網關為 192.168.1.1 的客戶端或網關為 192.168.1.2 的其他客戶端相同。

因此,每個客戶端現在將使用其 IPv4 源地址向網關發送數據包,在這兩種情況下,乙太網幀中的預期 IPv4 目標具有相同的目標乙太網 MAC 地址。192.168.1.1/192.168.1.2 不在循環中。

網關現在看到兩個要路由的數據包。在任何情況下,這些數據包都不再提示它們是否正在使用192.168.1.1192.168.1.2作為網關:資訊不會出現線上路上,因此網關無法在任何地方知道。如果系統沒有區分情況的資訊,那麼iptables也不能有這個不存在的資訊。


解決方法建議:

可以使用MACVLAN介面來擁有第二個具有自己獨立 MAC 地址的 NIC,並將 192.168.1.2/24 分配給它,這將使來自使用 192.168.1.2 作為網關的客戶端的數據包改為到達此 NIC。這種情況很容易用iptables區分:不同的-i NIC過濾器。

但這會產生在同一個 LAN 中有多個 NIC 的路由問題,並且需要:

  • 高級策略路由規則以正確解決這種情況

因此不會通過錯誤的 NIC 發送回复,這可能會影響路由行為或防火牆規則。

  • 此外,任何在 192.168.1.2 上查詢的 UDP 服務(如果 192.168.1.1 是預設的),必須知道如何使用正確的源地址 192.168.1.2(而不是預設的 192.168.1.1)來回答:它必須是多宿主的意識到的。TCP 不需要特別注意。
  • 或者一個額外的網路命名空間來分隔添加的介面。但是使用 REDIRECT 規則,這意味著埠 9992 上的服務必須在附加的網路命名空間中執行。而且這個網路命名空間可能仍然需要使用初始網路命名空間與 Internet 通信:還要在各個地方進行更多配置。

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