IPTABLES中DNAT和REDIRECT的区别

QWa*_*ade 16 routing proxy iptables

好吧,可能是因为我很密集,或者可能只是没有找到合适的来源,但我不明白为什么这些 IPTABLES 设置中的一个会比另一个更好。

这是我的设置:

我有一个用作透明代理和路由器的盒子。它上面有两个接口,ETH0和ETH1,地址方案如下:

ETH0 = DHCP ETH1 = 192.168.5.1/24 为 192.168.5.0/24 网络的 DHCP 服务在 LAN 后面的客户端

我安装了 privoxy 并作为透明代理在端口 8080 上监听。我通过此设置完成的是能够将此框放入现有网络中,配置最少,并将客户端附加到代理。

这是我的原始 IPTABLES 文件

*nat
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-port 8080
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
*filter
COMMIT
Run Code Online (Sandbox Code Playgroud)

此配置工作正常,流量来回流动没有问题。我在 privoxy 日志文件中获得了原始客户端的 IP 地址,并且生活很好。

当我开始查看其他人的配置并看到他们使用 DNAT 而不是 REDIRECT 时,我的困惑就出现了,我试图了解其中一个的真正好处。这是一个示例配置:

*nat
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to 192.168.5.1:8080
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
*filter
COMMIT
Run Code Online (Sandbox Code Playgroud)

同样,此配置也有效,并从日志记录的角度为我提供了所需的一切......

哪个是正确的,或者可能比另一个更正确?

感谢您花时间阅读到这里...

War*_*ner 18

REDIRECT更改目标 IP 地址以发送到机器本身。换句话说,本地生成的数据包被映射到 127.0.0.1 地址。它用于重定向本地数据包。如果您只想重定向本地机器上服务之间的流量,这将是一个不错的选择。

DNAT是实际的网络地址转换。如果您希望以本地系统外部为目的地的数据包更改目的地,则这是两者中更好的选择,因为REDIRECT不起作用。

  • 当数据包通过防火墙时,DNAT 会更改地址,以便它到达所需的主机,反之则似乎来自防火墙。DNAT 几乎从不应用于出站流量,这是由 MASQUERADE 规则处理的。如果 privproxy 位于另一台主机上,那么 DNAT 将是合适的,该主机有一个适当的例外。 (2认同)

小智 13

REDIRECT正如 Warner@ 所回答的那样,确实会更改目标 IP 地址以发送到机器本身。但我想说这个答案并不完全正确,或者有点误导。

REDIRECT不仅仅是用于重定向本地数据包。实际上DNAT,要使用的目标 IP 地址是隐式的,如果是本地数据包则为 127.0.0.1,否则为机器接口的 IP 地址,在 OP 的情况下为 192.168.5.1。

所以在这个问题中,无论最终目的地是什么,数据包都应该首先到达代理,所以REDIRECT非常适合。

由于REDIRECT您不需要指定 IP 地址,它只会选择正确的 IP 地址,因此它具有以下优势DNAT

  • 如果机器的 IP 地址因任何原因发生变化,您不需要修改规则,尤其是DNAT不适用于 DHCP 控制的接口。

  • 您可以为多个系统(例如多个代理实例)编写和维护相同的规则,而不会因为特定的 IP 地址而保留略有不同的版本。

  • @Hod,我听说REDIRECT是DNAT的一个特例,但是我使用REDIRECT并且TOR知道数据包的实际目的地,所以我得出结论iphdr和tcphdr结构的daddr和dport是完整的,并且数据包刚刚返回到REDIRECT目的地核心。DNAT实际上会改变结构。我错了吗? (2认同)