多年来,我一直在使用 bash shell 脚本来设置复杂iptables
的规则。但是,Debian Stretch
当我尝试使用脚本时,它变得迟缓并导致 iptables 处于不良状态。
当我试图做一个iptables -L -v
它回来了一个错误......
Another app is currently holding the xtables lock; still -9s 0us time ahead to have a chance to grab the lock...
谷歌让我发现了这个建议使用“-w”开关的错误。手册页并没有真正说明此开关如何影响问题。
为了便于管理,我的脚本使用了一个循环,这会导致它对 iptables 进行大量调用。
# This actually sets the allowed incoming iptables lines
setincoming() {
for port in ${2}; do
for ip in ${1}; do
if [ `echo "$ip" | grep -P "(^|\s)[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(/[0-9]*)*(\s*)$"` ]; then
iptables -I INPUT -p tcp -s $ip --dport $port -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
else
ip6tables -I INPUT -p tcp -s $ip --dport $port -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
fi
done
done
}
#####
# APIs
setincoming "123.123.123.10 123.123.123.11 fe80::xxxx:xxx:xxxx:xxxx" "4200 4300"
谁能帮我理解如何使用“-w”来解决这个问题?
编辑:
为了澄清,当然,我确实查看了手册页 - 并尝试使用开关-w
并结合 as-w -W1
但这对问题没有影响(既没有修复它也没有改变症状)。
所以,我仍然不知道如何解决。
该
-w
选项只会导致 iptables 等待 xtables 锁定,而不是在最初未能获得它时退出。该选项可以解决多个进程竞争获取和释放 xtables 锁的竞争条件。如果另一个进程没有释放锁,或者有太多进程在竞争锁,则此选项可能无济于事。正如 Tomek 建议的那样,我会修改您的脚本以利用 ipset。它肯定会更加优化,因为它依赖于哈希表而不是串行地通过您的 iptables 规则。它也可能会解决您的锁定问题。类似于以下内容:
由于您在示例中同时包含了 IPv4 和 IPv6,我还将提到您可以
family
在创建 ipset 时使用该参数以特别支持 IPv6。