我有一套实现 VIP 行为的规则 - 全部在 nat 表中。显然,我希望尽可能少地处理数据包。
我不清楚“-m state --state NEW”在这种情况下是否真的是一种优化。这会为已建立的连接上的数据包提供“快速路径”吗?
我还能做些什么来优化一系列 IP:端口比较和“-j DNAT”规则?
编辑:示例表
-t nat -A OUTPUT -j VIPS
-t nat -A VIPS -d 10.0.154.213/32 -p tcp -m tcp -dport 80 -j SVC-FOO
-t nat -A VIPS -d 10.0.140.123/32 -p tcp -m tcp -dport 80 -j SVC-BAR
-t nat -A VIPS -d 10.0.221.241/32 -p tcp -m tcp -dport 80 -j SVC-QUX
# ... could be hundreds of these
# each SVC-* looks something like this
-t nat -A SVC-FOO -m statistic --mode random --probability 0.5000000000 -j EP-FOO-1
-t nat -A SVC-FOO -j EP-FOO-2
# each EP-*-* looks something like this
-t nat -A EP-FOO-2 -j DNAT --to-destination 10.244.2.7:9376
它有点复杂,因为有几种方法可以让你最终进入 SVC-FOO 链,并且 EP-* 链可能有 LOG 或 MARK 规则。
我的问题是,在 VIP 链中寻找 NEW 状态是否有帮助?或者还有其他优化措施吗?
答案1
如果不知道整个表格到底是什么样的,就很难确定,但匹配NEW
数据包并将其发送到另一个链的规则肯定会加快处理已知已建立连接的数据包的速度。
一般来说,要通过一系列独占匹配达到最小数量的 iptables 规则,需要构建一个地址查找“树”——如果你有一个 /24 的 IPv4 地址需要匹配,你可以构建一个 8 级树,如下所示:
iptables -t nat -N slash24
iptables -t nat -I PREROUTING -d 192.0.2.0/24 -j slash24
iptables -t nat -N slash25_0
iptables -t nat -N slash25_128
iptables -I slash24 -d 192.0.2.0/25 -j slash25_0
iptables -I slash24 -d 192.0.2.128/25 -j slash25_128
iptables -t nat -N slash26_0
iptables -t nat -N slash26_64
iptables -t nat -N slash26_128
iptables -t nat -N slash26_192
iptables -I slash25_0 -d 192.0.2.0/26 -j slash26_0
iptables -I slash25_0 -d 192.0.2.64/26 -j slash26_64
iptables -I slash25_128 -d 192.0.2.128/26 -j slash26_128
iptables -I slash25_128 -d 192.0.2.192/26 -j slash26_192
[etc etc etc]
这不是您想要手动完成的事情,但如果您有大量规则,您(希望)以编程方式进行管理,因此您只需编写脚本即可创建整个邪恶的怪物。
一旦获得了 /32 匹配级别的规则,就可以将该主机的所有规则放入一个链中 — 遗憾的是,您无法在端口上玩相同类型的“子网匹配”游戏。希望您不会尝试根据连接的端口将连接发送到 60,000 多台不同的机器。