如何在 iptables 中使用正则表达式

如何在 iptables 中使用正则表达式

我正在尝试对一组通过正则表达式匹配的子域执行路由规则。

iptables -t nat -A PREROUTING -m string --string "/must-[a-z0-9-\.]+gonow[a-z\.]+/g" --algo regex -p tcp -m tcp --dport 12 -j DNAT --to-destination 1.1.1.1:12

收到错误 - iptables:没有该名称的链/目标/匹配。

答案1

问题是你试图在应用程序中使用相对较慢的模式匹配算法,必须使用快速模式匹配算法。还要注意,使用“字符串”过滤器的整个过程可能需要大量计算,因此几年前该模块默认不可用。您必须学习 Boyer-Moore (bm) 或 Knuth-Pratt-Morris (kmp) 快速字符串匹配算法并使用其中一种。

另请参阅iptables-extensions 手册页.摘录:

   --algo {bm|kmp}
          Select the pattern matching strategy. (bm = Boyer-Moore, kmp = Knuth-Pratt-Morris)

答案2

如果没有解决方案,请考虑以下方法:

  • --algo 选项的可用参数是 bm 或 kmp。如上所述,不包括“regex”。

  • 无论如何,我都不确定 iptables 命令是否可以合并正则表达式。也许是设计使然,或者也许是,因为 iptables 可能可以访问所有 shell/Bash 语法。

  • 如果要使用正则表达式,必须密切注意引用。例如,正则表达式通常是硬引号/单引号。

  • 我认为问题取决于 iptables 命令和 iptables 规则之间的区别。命令本身不是规则,而是指示 iptables 呈现规则,然后该规则驻留在内存中。命令可能接受正则表达式(例如,在指定范围时,导致 iptables 为范围的每个成员或增量呈现离散规则),仅仅是因为它是在允许它的 shell 中执行的。然而,另一个问题是 iptables 是否允许将正则表达式传递给规则,或在规则中评估正则表达式。@Doug 的回复表明不是,或者至少存在更好的替代方案。我至少希望让正则表达式在规则中发挥作用需要一些花哨和细心的引用。

  • 如果你只是想自动生​​成规则,也许可以考虑使用 for 循环并将你的正则表达式合并到其中或变量定义中,例如,

dnsclients(){
local CLIENT
for CLIENT in $LAN; do
        iptables -A dns-clients -s $CLIENT -j dns-ports
done
}

相关内容