Iptables 沒有按我的預期工作:響應包未按預期在 PREROUTING 中使用 DNAT 進行 DNAT 處理

Iptables 沒有按我的預期工作:響應包未按預期在 PREROUTING 中使用 DNAT 進行 DNAT 處理

我的伺服器(載入了以下iptables規則)有 IP 192.168.3.110。我的區域網路中有另一台電腦有IP 192.168.3.106。我正在嘗試將連接埠 80 上的伺服器請求重定向到192.168.3.106.

iptables我的 CentOS 7 伺服器中載入了以下檔案:


*nat
:PREROUTING DROP
:INPUT DROP
:OUTPUT DROP
:POSTROUTING DROP

-A PREROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT
-A PREROUTING -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A PREROUTING --dst 192.168.3.110 -p tcp --dport 80 -j DNAT --to-destination 192.168.3.106
-A PREROUTING -i lo -j ACCEPT

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT

-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A OUTPUT --dst 192.168.3.110 -p tcp -m state --state NEW --dport 80 -j DNAT --to-destination 192.168.3.106
-A OUTPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

-A POSTROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT
-A POSTROUTING -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A POSTROUTING --src 192.168.3.0/24 --dst 192.168.3.106 -p tcp --dport 80 -j SNAT --to-source 192.168.3.110
-A POSTROUTING -o lo -j ACCEPT

COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

-A OUTPUT -p tcp --sport 22 -j ACCEPT
-A OUTPUT -p tcp -j ACCEPT
-A OUTPUT -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

COMMIT

基本上我正在做以下事情(至少我是這麼理解的):

  • 啟用 ssh

  • 在連接埠 80 上啟用 TCP

  • DNAT 和 SNAT 資料包使我實現了所需的行為。

問題:我不明白為什麼當我從伺服器向自身發出呼叫時,即192.168.3.110我得到回應。

這就是我理解在這種情況下事情應該會起作用的方式:

  1. curl http://192.168.3.110- 不要忘記我是從我的伺服器上使用 IP 執行此操作的192.168.3.110
  2. 資料包將從 nat 表轉到 OUTPUT 鏈,並在其中進行 DNAT 標記
  3. 封包將從 nat 表轉到 POSTROUTING 鏈,並在其中進行 SNAT 處理
  4. 我的 Apache 來自192.168.3.106,正在回答我的請求。
  5. 資料包正在從 nat 表到達 PREROUTING 鏈,並應在此處對其進行 DNATed
  6. 資料包被轉發並扔到某個地方。

除了 5 和 6 之外,一切似乎都按預期工作。誰能解釋一下我的邏輯哪裡被打破了?

答案1

iptables nat 表僅針對(偽)連接的第一個封包進行遍歷。後面的資料包根據第一個資料包建立的映射進行映射(或保留)。

相關內容