我的伺服器(載入了以下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
我得到回應。
這就是我理解在這種情況下事情應該會起作用的方式:
curl http://192.168.3.110
- 不要忘記我是從我的伺服器上使用 IP 執行此操作的192.168.3.110
- 資料包將從 nat 表轉到 OUTPUT 鏈,並在其中進行 DNAT 標記
- 封包將從 nat 表轉到 POSTROUTING 鏈,並在其中進行 SNAT 處理
- 我的 Apache 來自
192.168.3.106
,正在回答我的請求。 - 資料包正在從 nat 表到達 PREROUTING 鏈,並應在此處對其進行 DNATed
- 資料包被轉發並扔到某個地方。
除了 5 和 6 之外,一切似乎都按預期工作。誰能解釋一下我的邏輯哪裡被打破了?
答案1
iptables nat 表僅針對(偽)連接的第一個封包進行遍歷。後面的資料包根據第一個資料包建立的映射進行映射(或保留)。