我正在尝试在单个系统中使用 iptables 作为防火墙来过滤数据包并将有效数据包传递到防火墙后面的服务器,但如果我使用 DNAT,数据将直接传递到服务器而不会被过滤。
我应该怎么做才能实现这个目标?
答案1
即使经过 DNAT 处理的数据包也会经过过滤器。它按以下顺序进行处理
NAT-PREROUTING (e.g. DNAT) => FORWARD => NAT-POSTROUTING (e.g. SNAT, MASQUERADE)
如果这对您不起作用,最有可能的原因是您的转发规则基于 DNAT 之前有效的标头。一旦 DNAT 完成转发处理,它就会使用已更改的目的地进行处理。
如果您能提供有关规则的更多详细信息以及“未经过滤”的流量信息,有人可以尝试检查您的案例......您提供的信息量太大,无法更具体。
答案2
看一下本页的图表。它说明了 NAT 规则如何先于 FORWARD 规则。即使您通过 DNAT 转到防火墙后面的某个主机,数据包在实际发送到主机之前仍会经过 FORWARD(和 POSTROUTING)规则。
您可以在 FORWARD 规则中进行过滤。插入类似这样的 FORWARD 内容(它将记录到系统日志中)也有助于调试规则:
iptables -I FORWARD 1 -j LOG --log-prefix="FWD: "
它将在系统日志中创建大量条目,但可以让您了解正在传递哪些流量。设置完成后,只需删除规则即可。