Linux

是否可以綁定到在 iptables 中有 DNAT 條目的埠?

  • March 27, 2020

我在PREROUTING使用時為埠(比如 30001)添加了一個 DNAT 條目(在主機中)iptables

$ sudo iptables -t nat -A PREROUTING -p tcp --dport 30001 -j DNAT --to-destination <my guest vm ip>:80

注意:上面我嘗試了一種埠轉發技術來允許進入來賓虛擬機。

30001應用上述規則後,主機程序是否可以綁定到埠?Linux 會允許它還是通過說它已經在使用來阻止它?

是的,綁定一個埠是網路棧的一部分,它與iptables所屬的netfilter是分開的。netfilter不會關心或意識到這個新的偵聽埠,並且網路堆棧不會被告知稍後將在其背後完成一些特殊的事情。

因此,可以將程序綁定到埠 30001/tcp。使用您的規則將無法從遠端訪問它,但仍可在本地使用:從主機到自身的本地(非路由)訪問遵循鏈OUTPUT進行發射,然後當它環回時,直接到達INPUT沒有點擊PREROUTING,因此在這種情況下不會執行您的nat/PREROUTING規則。

這個示意圖應該有助於理解它是如何在 DNAT / 路由案例中工作的(雖然沒有清楚地顯示非路由本地案例)。遠端訪問將遵循PREROUTING -> 路由決策 -> INPUT -> 本地程序,但在您的 DNAT 規則的情況下,它將採用路徑PREROUTING -> 路由決策 -> FORWARD -> …所以不會到達本地過程。因此,只要您不在nat/OUTPUT中添加等效規則,這種情況仍然有用。在任何情況下,無論是否可用,您仍然可以綁定到此埠。

引用自:https://unix.stackexchange.com/questions/575244