Linux

iptables 規則混亂,nat PREROUTING

  • November 12, 2021

我很難準確理解這些 iptables 規則集的作用。

埠 22 是否獲取數據包並且埠 2222 是否也獲取它的副本?或者數據包是否會跳過埠 22 重定向到埠 2222?有人可以向我詳細解釋這些規則的作用嗎?提前致謝!

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -P FORWARD ACCEPT
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-ports 2222

不會。只有偵聽埠的本地程序2222才會收到數據包。如果它回复,將進行反向轉換,並且傳出reply數據包將從 port發出22

第四條規則將使任何遇到的發往埠22的數據包重新路由到您的本地埠2222,即使它們不打算用於這台機器。由於您沒有任何其他匹配標準,因此對任何人都適用,除了從這台機器傳出的連接。

實際上,這會攔截任何直通的 SSH 流量。如果有人將此系統設置為他們的網關並嘗試連接到 LAN 外的任何 SSH 服務,他們最終會連接到您在埠上執行的服務2222。如果他們已經建立了信任(在known_hosts文件中有真實伺服器的密鑰,或者它已通過 DNSSEC 正確發布),他們的嘗試將被他們的客戶端拒絕,並發出有關正在進行的中間人攻擊的適當警告(這個規則本質上看起來像)。

請查閱Netfilter 數據包流程圖

順便說一句,在這種情況下,您不需要啟用 ip 轉發,因為不需要轉發數據包(即使在沒有REDIRECT規則的情況下必須轉發)。而且你不需要對FORWARD鏈做任何事情,因為它沒有被遍歷。所以第一個和第二個命令是多餘的。表後nat,數據包被重新定位到本地機器;當路由決策發生時,數據包被發送到INPUT鏈。這是您可以控制此數據包的地方,並且那裡的數據包將已經轉換為 port 2222,因此您的第三個命令中的規則是正確的。

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