在我拥有的 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
链条位于另外两条链条的中间,因此这三条规则应该这样做:
- 规则
mangle/PREROUTING
记录传入的数据包 - 规则
nat/PREROUTING
修改了数据包(它改变了目标 IP 和端口) - 规则
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 并发送回发起此操作的客户端。
}