IPtables:DNAT 不工作

Get*_*ree 2 linux firewall iptables port-forwarding

在我拥有的 CentOS 服务器中,我想将端口 8080 转发到第三方网络服务器。
所以我添加了这个规则:

iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination thirdparty_server_ip:80
Run Code Online (Sandbox Code Playgroud)

但它似乎不起作用。
为了调试这个过程,我添加了这两条 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_] "
Run Code Online (Sandbox Code Playgroud)

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

根据此页面mangle/PREROUTING链是第一个处理传入数据包的nat/POSTROUTING链,而链是最后一个处理传出数据包的链。

并且由于nat/PREROUTING链位于其他两个的中间,因此三个规则应该这样做:

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

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

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

PS:没有比这三个更多的规则了。所有表中的所有其他链都是空的,并且策略为 ACCEPT。

小智 6

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

回声 1 > /proc/sys/net/ipv4/ip_forward

  • 天哪。这一定是我很久以来遇到的最愚蠢的问题。就是这样!我的 DNAT 规则现在按预期工作。谢谢。 (3认同)