我如何使用 Parallels Virtuozzo 的内置防火墙实用程序(在后台调用,实际上psa-firewall
psa-firewall
似乎是一个单独的 Plesk 界面 - 无论如何,它基本上是一个用于有限 iptables 管理的 UI)为 VPS 设置一条简单规则,拒绝所有连接访问某个端口以外某些指定的 IP 地址?
我的想法是,VZ 防火墙规则(就像我相信它们被转换成的 iptables 规则一样)按从上到下的顺序执行,并且我可以阻止除指定 IP 地址之外的所有 IP 地址访问我的端口(在本例中为端口 22 上的 SSH)通过在列表的末尾针对 IP 地址 xx.xx.xx.xx 和端口 22 设置狭窄的允许规则,然后在末尾针对任何 IP 地址和端口 22 设置拒绝规则。
其理念是,对于来自指定 IP 地址的请求,将触发允许规则,因此永远不会触发拒绝规则。对于其他所有请求,将忽略允许规则,并触发其下方的拒绝规则。
但但事实并非如此一开始,它完全按照预期工作,但大约 20 分钟后,我发现自己无法使用 SSH,唯一能重新进入的方法就是删除拒绝规则和将(冗余的)允许所有端口 22 规则添加到列表顶部。
经过进一步测试,VZ 防火墙实用程序 UI 中的规则顺序似乎不是清楚地指示结果配置中的顺序。例如,我发现在列表顶部有一个允许所有到 22 的规则,在底部有一个拒绝所有到 22 的规则,这似乎会阻止所有连接,与反转顺序完全相同。
我有一个理论,即实用程序将新激活的规则添加到列表中,但似乎拒绝所有规则总是压倒任何接受一条规则,无论列表位置或添加顺序如何。
我无法弄清楚其中的规律,也找不到任何与此实用程序相关的资源来解释它。我也找不到任何其他方法。
我使用 VZ 防火墙实用程序而不是直接使用 iptables 的原因,我希望管理员能够更新规则并添加白名单 IP 地址,而不会面临永久锁定自己的危险。能够使用不依赖于 SSH 访问的工具来管理 SSH 访问非常有用。
ps 很难找到有关 VZ 防火墙实用程序的优质信息。我到处寻找的资源要么是极其不完整的傻瓜式资源,要么是有关直接配置 iptables 的信息。我找不到任何有关如何在后台解释 UI 设置在哪些方面,或者它们如何与现有 iptables 设置相关的信息。任何有关 VZ 防火墙实用程序后台运行情况的详细优质信息的一般性提示都将不胜感激。
答案1
这是我迄今为止测试过的最好的理论。它看起来像:
- 发生更改时,VZ 防火墙实用程序会查找现有规则,将其删除,然后添加新规则,而不是重置规则。这似乎不是 100% 可靠的,并且可能会编辑规则,最终得到一个“幽灵规则”,直到 IPtables 重置后才会消失。
- 该实用程序似乎会定期刷新并重新运行规则(以及 /etc/firewall/include 中的任何编码)。
- 看起来使用实用程序 UI 配置的规则是按顺序包含在内,并且确实按照我预期的方式运行 - 除非幕后存在其中一条“幽灵规则”。
如果这是真的,如果有人发现自己处于我当时的境地,您应该能够使用 VZ 重新启动“系统服务”中的 iptables“服务”,以使 VZ 的防火墙再次合理运行。如果它声称无法重新启动服务,则在链顶部添加一个临时允许规则。
(警惕用来iptables -F
刷新 iptables 规则,因为这似乎会刷新所有内容,包括授予 VZ 实用程序适当访问权限的规则。系统重启工具会刷新 iptables 的所有内容,包括 VZ 的底层配置、主机的配置、实用程序中配置的规则以及 中的自定义规则/etc/firewall/include
。iptables -F
不会。如果默认情况下设置为拒绝或丢弃,您可能会完全锁定自己)
编辑:这显然不是全部……突然,VZ 防火墙实用程序已开始对底层 iptables 规则完全没有影响,并使用iptables -n -L INPUT|grep dpt:22
列出所有指定端口 dport 22 的 iptables 规则,我看到许多旧的垃圾规则已被删除,即使在刷新 iptables 然后重新启动服务后也不会在重新启动时被删除。阅读http://www.webhostingtalk.com/showthread.php?t=1166215表明 VZ 防火墙也有一个规则数据库,该数据库可能与代码和 UI 不同步……但没有提供有关如何访问该数据库的线索。
编辑 2:似乎有什么东西导致 iptables 和 Virtuozzo 防火墙开始只是从文件中读取,/etc/sysconfig/iptables
而不是正确地重新生成。我找到的笨拙修复方法基本上是重命名文件/etc/sysconfig/iptables
并/etc/sysconfig/iptables.save
作为备份,然后使用 VZ 防火墙设置完全重置防火墙,这会生成空iptables
文件,然后重新启动 iptables 服务 - 完成所有这些操作后,VZ 防火墙实用程序中的设置开始产生预期的效果。
奇怪的是,完成上述操作后,iptables 链的名称变成了 VZ_INPUT,而不是 INPUT,因此要列出端口的 iptables 规则,我需要使用iptables -n -L|grep dpt:22
或 而iptables -n -L VZ_INPUT|grep dpt:22
不是iptables -n -L INPUT|grep dpt:22
。奇怪。
希望如果其他人最终陷入了行为失常的 Virtuozzo 防火墙服务,这里的一些内容可以提供帮助。