![如何更新 iptables 规则,而不是刷新和重写](https://linux22.com/image/205907/%E5%A6%82%E4%BD%95%E6%9B%B4%E6%96%B0%20iptables%20%E8%A7%84%E5%88%99%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%E5%88%B7%E6%96%B0%E5%92%8C%E9%87%8D%E5%86%99.png)
目前我正在iptables
使用 bash 脚本更新我的规则,我在其中调用命令:
iptables -F
然后我应用规则。
问题是我需要更新规则才能访问端口 80,然后我每 10 分钟在 cron 作业中删除所有内容。因此,每隔 10 分钟我iptables -F
就会打电话删除旧规则并打开所有端口(这是我不想要的)。
我不想每 10 分钟刷新一次规则,只需编辑或更新现有规则即可。
答案1
如果有需要定期更新的特定规则,我会将它们放在一个单独的链中,并从INPUT
适当的槽中调用该链
iptables -N mychain # Create new chain "mychain"
iptables -A INPUT mychain # Insert it into INPUT
iptables -A INPUT …other rules… # Append other rules as before
现在您可以刷新并添加经常更改的规则,mychain
而不影响 中的规则INPUT
:
iptables -F mychain
iptables -A mychain …rule…
iptables -A mychain …rule…
…
如果您确实希望将它们作为单个实体添加,就像在事务中一样,您可以创建链,将规则添加到该链,然后将该链插入到 中INPUT
,然后立即删除先前的实例。您可能需要为此动态链名称。例如,
chain="mychain_$(date +%s)" # One second granularity
iptables -N "$chain" # Create the chain
iptables -A "$chain" …rule… # and its rules
iptables -A "$chain" …rule…
iptables -A "$chain" …rule…
…
然后
old=$(iptables -L INPUT | awk '$1 ~ /^mychain_[0-9]+$/ {print $1; exit}')
iptables -I INPUT 1 -j "$chain" # Add new chain in correct position
if [ -n "$old" ]
then
iptables -D INPUT -j "$old" # Remove old chain
iptables -X "$old" # Delete it
fi
另一方面,如果您的要求是阻止或允许大量 IP 地址,您最好考虑IP设置。
答案2
更换规则是可能的。
这是一个例子:
首先,您可以使用以下命令在顶部(第一个)位置创建规则:
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
可以指定规则来替换链中现有的规则。
位置 1 给出的第一条规则是允许从任何地方连接到 http 端口(端口 80)。
以下 iptables 命令替换规则,限制仅从网络地址范围 192.168.0.0/24 到标准 http 端口(端口 80)的连接:
iptables -R INPUT 1 -p tcp -s 192.168.0.0/24 --dport 80 -j ACCEPT
因此,您不必删除所有规则,而只需知道需要替换的规则的位置即可。
这是完整的课程方法来源