Iptables

iptables 未按預期工作:響應包未按預期進行 DNATed,在 PREROUTING 中使用 DNAT

  • October 30, 2018

我的伺服器(iptables載入了以下規則)具有 IP 192.168.3.110。我的 LAN 中有另一台電腦使用 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- 不要忘記我是從我的伺服器上執行的,使用 IP192.168.3.110
  2. 數據包將從 nat 表進入 OUTPUT 鏈,在那裡它被 DNATed
  3. 數據包將從 nat 表進入 POSTROUTING 鏈,在那裡它被 SNATed
  4. 我的 Apache192.168.3.106正在響應我的請求。
  5. 數據包從 nat 表到達 PREROUTING 鏈,它應該被 DNATed
  6. 數據包被轉發並扔到某處。

除了 5 和 6 之外,一切似乎都按預期工作。換句話說,我收到了來自伺服器的響應。任何人都可以解釋我的邏輯在哪裡被破壞了嗎?

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

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