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 表仅针对(伪)连接的第一个数据包进行遍历。后面的数据包根据第一个数据包建立的映射进行映射(或保留)。

相关内容