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