FORWARD 或 INPUT 链中的 iptables 过滤如何与 NAT 交互?

FORWARD 或 INPUT 链中的 iptables 过滤如何与 NAT 交互?

页面似乎表明,如果表PREROUTING的链中有一条规则nat将目标转换1.2.3.4:80为,则和链10.1.1.1:8080中的规则应该匹配,而不是匹配。INPUTFORWARD10.1.1.1:80801.2.3.4:80

如果想要实现更像概述的操作顺序,该怎么办这里? 即在NAT之前如何对数据包的特征进行过滤?

一种可能性似乎是使用表PREROUTING的链raw。问题是 conntrack 不可用raw/PREROUTING(参见注释 1),例如非初始 UDP 片段将与初始片段不相关,并将产生意外匹配。

请让我知道我是否清楚地描述了这个困境,以及是否有任何解决方法。

注 1:如果我错了,请纠正我,但当我尝试在 中使用 conntrack 时raw/PREROUTING,所有初始 SYN 数据包都标记为“ INVALID”而不是“ NEW”。在 Netfilter 流程​​图中,“conntrack”似乎位于 之后raw/PREROUTING

答案1

您不需要任何raw/PREROUTING规则。您可以使用conntrack匹配按原始(转换前)目标/源地址/端口号过滤数据包。是conntrack旧匹配的后继。它可以检查与(和 NAT)state相关的各种附加元数据。conntrack entry

举几个例子:

# allow any port-forwarded packets
iptables -t filter -A FORWARD -m conntrack --ctstate DNAT -j ACCEPT

# check the original destination address of DNATed packets
iptables -t filter -A FORWARD -p tcp --dport 8080 -m conntrack --ctstate DNAT --ctorigdstport 80 --ctorigdst X.X.X.X --ctdir ORIGINAL -j ACCEPT

iptables -m conntrack --help有关详细信息,请检查和的输出man iptables-extensions

答案2

Netfilter 和常规网络中的数据包流描述了查看数据包的不同钩子之间的关系。以下是其中一小部分:

Netfilter 和常规网络中的数据包流

所以如果你想互动庄严地带数据包合理的选择是mangle/PREROUTING连接跟踪钩子已经跟踪了数据包:它不会得到无效状态,但是纳特还是没有发生。

只要记住 iptables 的纳特只看到第一个数据包,然后其他所有数据包都直接由连接跟踪,仍然发生在同一个地方:mangle/PREROUTING和路线决策之间。

另一种方法在 Anton Danilov 的回答:通过查询连接跟踪从查找表中检查前一个地址。

相关内容