IPtables:DNAT 不起作用

IPtables:DNAT 不起作用

在我拥有的 CentOS 服务器中,我想将端口 8080 转发到第三方 Web 服务器。
因此我添加了此规则:

iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination thirdparty_server_ip:80

但这似乎不起作用。
为了调试该过程,我添加了以下两个 LOG 规则:

iptables -t mangle -A PREROUTING -p tcp --src my_laptop_ip --dport ! 22 -j LOG --log-level warning --log-prefix "[_REQUEST_COMING_FROM_CLIENT_] "
iptables -t nat -A POSTROUTING -p tcp --dst thirdparty_server_ip  -j LOG --log-level warning --log-prefix "[_REQUEST_BEING_FORWARDED_] "

(该--dport ! 22部分只是为了过滤掉 SSH 流量,这样我的日志文件就不会被淹没)

根据这一页mangle/PREROUTING链是第一个处理传入数据包的链,并且该nat/POSTROUTING链是最后一个处理传出数据包的链。

由于nat/PREROUTING链条位于另外两条链条的中间,因此这三条规则应该这样做:

  1. 规则mangle/PREROUTING记录传入的数据包
  2. 规则nat/PREROUTING修改了数据包(它改变了目标 IP 和端口)
  3. 规则nat/POSTROUTING记录了即将转发的修改后的数据包

虽然第一条规则确实记录了来自我的笔记本电脑的传入数据包,但第三条规则并未记录第二条规则应该修改的数据包。但是,它确实记录了服务器中生成的数据包,因此我知道这两条 LOG 规则工作正常。

为什么数据包没有被转发,或者至少为什么它们没有被第三条规则记录?

PS:除了这三条规则外,没有其他规则了。所有表中的所有其他链均为空,且策略为 ACCEPT。

答案1

您可能需要在服务器上打开 IP 转发。尝试

echo 1 > /proc/sys/net/ipv4/ip_forward

答案2

这完全取决于您为其执行 DNAT 的客户端是否使用您的 NAT 盒作为网关(+ 实际上回复也会使用您的 NAT 盒)。

我猜他们没有,所以以下描述了错误:{

当做基因转移酶你是使用中继 IP 屏蔽有效 IP属于 NAT-box(从客户端的 PoV 来看)。因此,客户端希望与中继 IP 而不是有效 IP 进行通信。相反,客户端突然收到他从未听说过的有效 IP 的回复。

因此,当在客户端和有效服务之间进行这样的屏蔽而不需要中间网关时,您也需要使用 SNAT(使用 NAT-box-external-IP 隐藏客户端),这样来自有效 IP 服务盒的所有回复都会返回到您的 NAT 网关,然后才会被解除 NAT 并发送回发起此操作的客户端。

}

相关内容