IPTABLES 中的 DNAT 和 REDIRECT 之间的区别

IPTABLES 中的 DNAT 和 REDIRECT 之间的区别

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

这是我的设置:

我有一个用作透明代理和路由器之类的设备的盒子。它有两个接口,ETH0 和 ETH1,以及以下地址方案:

ETH0 = DHCP ETH1 = 192.168.5.1/24 为 LAN 中其后面的客户端提供 192.168.5.0/24 网络的 DHCP

我已安装 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

此配置运行良好,流量来回流动没有问题。我在 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

再次,此配置也有效,并且从日志的角度为我提供了我需要的一切......

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

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

答案1

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

DNAT是实际的网络地址解读。如果您希望发送到本地系统之外的数据包的目的地发生改变,则这是两者中更好的选择,因为REDIRECT不会起作用。

答案2

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

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

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

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

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

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

答案3

如果您想将流量发送到本地机器,DNAT 和 REDIRECT 完全相同。

文档中这样描述:“[重定向] 是目标 NAT 的一个特例,称为重定向:这是一种简单的便利,完全相当于对传入接口的地址执行 DNAT。”

https://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html#ss6.2

相关内容