这页面似乎表明,如果表PREROUTING
的链中有一条规则nat
将目标转换1.2.3.4:80
为,则和链10.1.1.1:8080
中的规则应该匹配,而不是匹配。INPUT
FORWARD
10.1.1.1:8080
1.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 和常规网络中的数据包流描述了查看数据包的不同钩子之间的关系。以下是其中一小部分:
所以如果你想互动庄严地带数据包前合理的选择是mangle/PREROUTING
:连接跟踪钩子已经跟踪了数据包:它不会得到无效状态,但是纳特还是没有发生。
只要记住 iptables 的纳特只看到第一个数据包,然后其他所有数据包都直接由连接跟踪,仍然发生在同一个地方:mangle/PREROUTING
和路线决策之间。
另一种方法在 Anton Danilov 的回答:通过查询连接跟踪从查找表中检查前一个地址。