我在本地服务器上有一个机器人,其任务是每天在远程服务器上多次创建规则。机器人的目的是计算每个端口消耗的流量。通过 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
你的机器人执行的周期的目的是什么?它可能会重置配额计数器,因为它会导致重新加载所有规则。 (我想这可能正是您的机器人执行此操作的原因,但如果您需要配额计数器值进行统计等,请确保在执行此命令之前读取旧值并将其存储在某处。)