![IPTABLES 中的 DNAT 和 REDIRECT 之间的区别](https://linux22.com/image/524134/IPTABLES%20%E4%B8%AD%E7%9A%84%20DNAT%20%E5%92%8C%20REDIRECT%20%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%88%AB.png)
好吧,这可能是因为我很笨,或者只是没有找到正确的来源,但我不明白为什么这些 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