这个页面似乎暗示,如果PREROUTING
表链中有一条规则nat
将目标转换1.2.3.4:80
为10.1.1.1:8080
,那么INPUT
andFORWARD
链中的规则应该匹配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
.
你不需要任何
raw/PREROUTING
规则。您可以使用conntrack
匹配按原始(转换前)目标/源地址/端口号过滤数据包。conntrack
是旧state
比赛的继任者。conntrack entry
它可以检查与(和 NAT)相关的各种附加元数据。几个例子:
有关更多详细信息,请检查 和 的
iptables -m conntrack --help
输出man iptables-extensions
。Netfilter 和 General Networking中的数据包流描述了看到数据包的不同钩子之间的关系。这是其中的一小部分:
因此,如果您想在 nat之前与数据包进行有状态交互,合乎逻辑的选择是:conntrack挂钩已经跟踪了数据包:它不会获得 INVALID 状态,但nat仍然没有发生。
mangle/PREROUTING
请记住,iptables 的nat只看到第一个数据包,然后其他所有内容都由conntrack直接处理,仍然发生在同一个地方:中间
mangle/PREROUTING
和路由决策。Anton Danilov 的回答中描述了另一种方法:通过查询conntrack从其查找表中检查前一个地址。