Linux
iptables 規則混亂,nat PREROUTING
我很難準確理解這些 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
鏈。這是您可以控制此數據包的地方,並且那裡的數據包將已經轉換為 port2222
,因此您的第三個命令中的規則是正確的。