我的服务器通过 OpenVPN 连接到一些奇怪的资源,并且每次 OpenVPN 客户端启动时,ovpn
都会出现一个界面。
我想只向该接口公开选定的端口(例如,MySQL),因此在我的 iptables 中有这条规则:
iptables -A INPUT -i ovpn -p tcp --dport 3306 -j ACCEPT
但是,由于 OpenVPN 客户端可以在无人干预的情况下断开连接并重新连接,因此链接 ID(如图所示ip link show ovpn
)可能会发生变化。
当链接消失并再次出现(具有不同的 ID)时,上述 iptables 规则还会继续起作用吗?
答案1
是的,它将继续发挥作用,因为iptables不使用接口的索引,而是在评估-i
/--in-interface
参数时与当前接口的名称进行字符串比较。实际上它似乎是总是被评估,即使没有提供参数,但内联函数相当优化。
相比之下,nftables(现任候选人继任者iptables) 提供了两种不同的表达方式:iifname
:直接等同于-i
,比较当前名称,并iif
比较接口索引,这会在您的用例中导致问题。当iptables被翻译成nftables(使用iptables-翻译或者iptables-nft对于较新的 iptables-over-kernel-nftables API),-i
将转换iifname
为符合预期的兼容性。
答案2
是的,会。删除引用的接口时,规则不会被删除。
此外,还有通配符规则,例如,您可以使用匹配-i ppp+
或指定“任何 pppX 接口” -o ppp+
。根本没有具有该名称的接口,因此它无法引用任何内容。但如果有涉及 ppp2 接口的流量,则此规则将立即应用。
一般来说,规则是在界面出现之前还是之后创建的并不重要。