我的 iptables 脚本包含许多规则。每次运行时,它都会刷新旧规则并重新加载它们,这样它们就不会堆积。但由于运行时间较长,我想创建一个单独的脚本来仅运行此规则。
myacl=$(cat list.txt)
for string in `echo -e "$myacl"`; do
iptables -A FORWARD -m string --string "$string" --algo bm -j DROP
done
因此,我需要重新加载此规则,以便它接受我在“list.txt”中所做的更改,但不影响其余的 iptables 规则,这些规则在另一个脚本中已经加载并正在运行。
PD:某人这里使用“iptables -D”来表示。例如:
myacl=$(cat list.txt)
for string in `echo -e "$myacl"`; do
iptables -D FORWARD -m string --string "$string" --algo bm -j DROP
iptables -A FORWARD -m string --string "$string" --algo bm -j DROP
done
但我认为这个解决方案行不通,而且对我来说很奇怪
谢谢
答案1
Linux 内核规则由 iptables 命令修改。如果你刷新所有规则并重新创建它们,那么有一段时间根本没有规则(并且所有数据包都可能被丢弃)。这就是“重新加载”或“重新启动”的原理。
使用 -D(删除)只会删除一条规则。-A 将在末尾附加新规则。其他规则不受影响。
我不明白你的脚本:你删除了一条规则,然后在最后重新添加它。如果你自上次运行脚本以来更改了文件,你将无法删除所有现有规则(如果它们不再存在于文件中),因为 iptables 找不到它们。
例子 :
- 第一步:你的文件有“string1 string2 string3”
- 运行后,内核会有3条规则:"string1"、"string2"、"string3",若规则不存在则删除,否则会出错。
- 第二步:将文件更新为“string1 string3 string4”
- 运行脚本。内核永远不会删除“string2”,因为它不存在于文件中(规则将保持活动状态),当您尝试删除“string4”时会出错,因为它尚不存在。