iptables:目前不同網關IP的不同規則
假設我有機器 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.1
或192.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 通信:還要在各個地方進行更多配置。