为什么我在 iptables OUTPUT 链中创建的规则过了一段时间就被删除了?

为什么我在 iptables OUTPUT 链中创建的规则过了一段时间就被删除了?

我在本地服务器上有一个机器人,其任务是每天在远程服务器上多次创建规则。机器人的目的是计算每个端口消耗的流量。通过 SSH 访问远程服务器,机器人是用 Python 编写的。两台服务器的操作系统均为Ubuntu。机器人创建的规则:

sudo iptables -I OUTPUT -p tcp --sport port_number -j DROP
sudo iptables -I OUTPUT -p tcp --sport port_number -m quota --quota 500000000 -j ACCEPT
iptables -nvL OUTPUT --line-numbers|grep "\<tcp spt:port\>"

那一刻我检查远程服务器

iptables -nvL OUTPUT --line-numbers

好的,规则已创建。但一段时间(2 或 3 小时)后,规则被删除。上面列出了允许机器人制定的所有规则。

没有任何规则不能清除或刷新 OUTPUT 链。清除规则会导致脚本运行不佳,无法控制各个端口的带宽。

现在我意识到机器人每隔几个小时执行一次以下命令

firewall-cmd --reload

此命令删除规则。如何重新加载防火墙并防止规则被删除?

答案1

firewall-cmd --reload运行删除手动添加的规则这一事实表明您的系统正在运行firewalld。它是 IPTables 防火墙(及其未来替代品)的管理系统nftables

由于您的机器人直接操作 IPTables,而不是告诉firewalld它想要做什么,firewalld因此将覆盖直接添加的设置,并根据firewalld配置的说明重置所有 IPtables 设置。

你应该更换任何iptables更改防火墙设置的命令使用等效firewall-cmd命令。查看现有的防火墙设置iptables -nvL可能可以保持原样。

线路

iptables -nvL OUTPUT --line-numbers|grep "\<tcp spt:port\>"

不会创建任何规则,它只是显示 OUTPUT 表的内容,其中包含行号,并过滤掉任何不包含字符串“”的行。

sudo iptables -I OUTPUT -p tcp --sport port_number -j DROP
sudo iptables -I OUTPUT -p tcp --sport port_number -m quota --quota 500000000 -j ACCEPT

由于这两个命令前置将新规则添加到任何现有规则中,这两个命令的结果将是按以下顺序排列的两个规则:

1.) 在输出时,任何源自 的 IPv4 TCP 流量port_number都将应用 500000000 的配额,并且仅在配额允许的情况下才接受

2.) 如果配额没有导致前面提到的流量被接受,那么它将被丢弃。

要使用 精确复制这一点firewall-cmd,似乎您必须使用直接规则:

firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -p tcp --sport port_number -m quota --quota 500000000 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p tcp --sport port_number -j DROP
firewall-cmd --reload

前两条命令会将新规则记录到永久firewalld配置中,第三条命令使新配置生效。

请注意,您必须使用优先级数字来指定直接规则的预期顺序,否则将无法保证正确的顺序。此外,您的机器人不能只是不断地将新的规则对插入到链的开头,从而使链变得越来越长。

我不得不问:firewall-cmd --reload你的机器人执行的周期的目的是什么?它可能会重置配额计数器,因为它会导致重新加载所有规则。 (我想这可能正是您的机器人执行此操作的原因,但如果您需要配额计数器值进行统计等,请确保在执行此命令之前读取旧值并将其存储在某处。)

相关内容