我管理一台安装了 ispconfig 3 的 Ubuntu 服务器 (14.04)。该服务器用于邮件、网络和数据。在我之前的系统管理员启用了 fail2ban 和 ufw,但我们今天一整天都遇到了 dovecot 身份验证问题。当我尝试访问防火墙时,我不断收到错误消息:
错误:运行 iptables 时出现问题:另一个应用程序当前正在持有 xtables 锁。也许您想使用 -w 选项?
尝试软重启导致服务器冻结,而硬重启又使问题再次出现。
然后,经过进一步调查lsof -p $(pidof iptables)
,我得到以下输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
iptables 1526 root cwd DIR 9,1 4096 2 /
iptables 1526 root rtd DIR 9,1 4096 2 /
iptables 1526 root txt REG 9,1 87768 261694 /sbin/xtables-multi
iptables 1526 root mem REG 9,1 6336 1180648 /lib/xtables/libxt_standard.so
iptables 1526 root mem REG 9,1 14664 1180071 /lib/x86_64-linux-gnu/libdl-2.19.so
iptables 1526 root mem REG 9,1 1840928 1180085 /lib/x86_64-linux-gnu/libc-2.19.so
iptables 1526 root mem REG 9,1 47712 1181161 /lib/libxtables.so.10.0.0
iptables 1526 root mem REG 9,1 31520 1179359 /lib/libip6tc.so.0.1.0
iptables 1526 root mem REG 9,1 27392 1179360 /lib/libip4tc.so.0.1.0
iptables 1526 root mem REG 9,1 149120 1180078 /lib/x86_64-linux-gnu/ld-2.19.so
iptables 1526 root 0r FIFO 0,8 0t0 21609 pipe
iptables 1526 root 1u CHR 1,3 0t0 1029 /dev/null
iptables 1526 root 2u CHR 1,3 0t0 1029 /dev/null
iptables 1526 root 3u unix 0xffff880190eabb80 0t0 686890 @xtables
iptables 1526 root 4u raw 0t0 686891 00000000:00FF->00000000:0000 st=07
iptables 1526 root 5w REG 9,1 242173 917201 /var/log/fail2ban.log
iptables 1526 root 6r 0000 0,9 0 7704 anon_inode
iptables 1526 root 7r 0000 0,9 0 7704 anon_inode
iptables 1526 root 8r 0000 0,9 0 7704 anon_inode
iptables 1526 root 9r FIFO 0,8 0t0 20579 pipe
iptables 1526 root 10w FIFO 0,8 0t0 20579 pipe
欢迎提供关于什么是锁定 xtables 以及如何最好地解决的任何指示。
答案1
这个答案-n
表明 DNS 查找速度慢可能会造成延迟,通过在命令行中包含 可以避免这种情况iptables
。也许您可以使用strace
或ltrace
来调查活动iptables
进程正在做什么(输出中的 pid 1526),或者至少通过 之类的命令检查命令ps -fp $(pidof iptables)
是否iptables
包含-n
。
答案2
我在使用一长串 iptables 命令脚本时也遇到了同样的问题。这个问题的发生相当随机,并且因系统而异。我怀疑存在竞争条件。
对于这种情况,错误消息提供了自己的解决方案:使用 -w 标志将导致 iptables 等待锁可用而不是失败。
如果不直接使用 iptables,而是使用管理软件,则必须对软件进行相应的修补。如果某些原因导致锁失效,则显然存在 iptables 无限期挂起的风险。
答案3
首先,你需要在服务器上输入命令 #lsof -n 2>/dev/null | grep /run/xtables.lock 然后使用以下命令删除文件 /run/xtables.lockrm -f /运行/xtables.lock
答案4
在 Ubuntu 22.04 中发现了这个问题,其中 Webmin 2.013 同时配置了 IPv4 和 IPv6 规则以在启动时激活。
该服务webmin-ip6tables
(用于 IPv6)锁定xtables.lock
文件,同时该服务webmin-iptables
(用于 IPv4)尝试加载其规则集,因此被阻止(我使用systemctl status webmin-iptables
和systemctl status webmin-ip6tables
来检查这一点)。
解决方案webmin-ip6tables.service
:编辑了下面的文件中针对 IPv6 的服务,/etc/systemd/system/multi-user.target.wants/
在行中添加了五秒的延迟ExecStart
,结果是:
[Unit] Description=Load ip6tables save file
[Service] ExecStart=/bin/sh -c 'sleep 5; /sbin/ip6tables-legacy-restore </etc/webmin/firewall6/ip6tables.save' ExecStop=/sbin/ip6tables -t filter -F ; /sbin/ip6tables -t nat -F ; /sbin/ip6tables -t mangle -F ; /sbin/ip6tables -t filter -P INPUT ACCEPT ; /sbin/ip6tables -t filter -P OUTPUT ACCEPT ; /sbin/ip6tables -t filter -P FORWARD ACCEPT ; /sbin/ip6tables -t nat -P PREROUTING ACCEPT ; /sbin/ip6tables -t nat -P POSTROUTING ACCEPT ; /sbin/ip6tables -t nat -P OUTPUT ACCEPT ; /sbin/ip6tables -t mangle -P PREROUTING ACCEPT ; /sbin/ip6tables -t mangle -P OUTPUT ACCEPT Type=oneshot RemainAfterExit=yes
[Install] WantedBy=multi-user.target
不幸的是,我发现 Webmin 防火墙配置中的延迟并不适用于启动操作,所以我无法在那里解决问题。
此更改使 IPv6 规则集加载等待 5 秒,从而为 IPv4 规则集成功加载提供足够的时间。
警告:如果在 Webmin 中禁用启动时激活规则,然后再次启用,则服务文件可能会被覆盖,但没有理由在配置后进行禁用/启用循环,只需修改规则集并应用更改。