我遇到了一件非常奇怪的事情,在谷歌搜索了很久之后,我似乎找不到任何相关资料。我似乎不iptables。并不是说链被刷新了,也不是说它们都是 ACCEPT 规则之类的,表本身似乎不存在。我的意思是:
事情是这样的,我的 docker 在过去几个月的某个时候停止工作了,我终于有时间修复它了。错误是由以下命令引起的:
$ iptables -A DOCKER-ISOLATION-STAGE-1 -j RETURN
iptables: No chain/target/match by that name.
哪个 docker 作为其启动的一部分运行,我尝试手动运行哪个来调试。
于是我开始尝试在不同的地方添加不同的链和规则,但都出现了同样的错误。最后我尝试列出所有内容
$sudo iptables -S
iptables: No chain/target/match by that name.
$ sudo iptables -L
iptables: No chain/target/match by that name.
$ sudo iptables --list
iptables: No chain/target/match by that name.
什么也没有。所以我试着查看了每张表
# iptables -vL -t filter
iptables: No chain/target/match by that name.
# iptables -vL -t nat
iptables: No chain/target/match by that name.
# iptables -vL -t mangle
iptables: No chain/target/match by that name.
# iptables -vL -t raw
iptables: No chain/target/match by that name.
# iptables -vL -t security
iptables: No chain/target/match by that name.
更糟糕的是,就像实际的桌子本身消失了一样。即使是像
# iptables -P INPUT ACCEPT
iptables: Bad built-in chain name.
不起作用。
有人见过这种情况吗?有没有什么办法可以找回这些桌子?
我的系统是 Ubuntu 18.10,内核为 5.1.8
更新
此后,我已将所有 iptables 模块添加到我的系统中/etc/modules
并重建了 initramfs。模块现在在启动时加载,但这并没有解决问题。
我发现该iptables-save
命令没有错误,但它也只打印以下内容:
# Generated by iptables-save v1.6.1 on Tue Jun 11 17:35:52 2019
*nat
COMMIT
# Completed on Tue Jun 11 17:35:52 2019
# Generated by iptables-save v1.6.1 on Tue Jun 11 17:35:52 2019
*mangle
COMMIT
# Completed on Tue Jun 11 17:35:52 2019
# Generated by iptables-save v1.6.1 on Tue Jun 11 17:35:52 2019
*raw
COMMIT
# Completed on Tue Jun 11 17:35:52 2019
# Generated by iptables-save v1.6.1 on Tue Jun 11 17:35:52 2019
*security
COMMIT
# Completed on Tue Jun 11 17:35:52 2019
# Generated by iptables-save v1.6.1 on Tue Jun 11 17:35:52 2019
*filter
COMMIT
# Completed on Tue Jun 11 17:35:52 2019
我还发现 ip6tables 似乎运行正常,只有 iptables 出现故障。
接下来我尝试以详细模式运行一些 iptables 命令。
# iptables -S -vv
libiptc vlibxtables.so.12. 0 bytes.
Table `filter'
Hooks: pre/in/fwd/out/post = 7f68/9f6085dd/5616/9f60a8e0/5616
Underflows: pre/in/fwd/out/post = 36e4540/7fff/36e48e8/7fff/0
iptables: No chain/target/match by that name.
# iptables -N DOCKER-ISOLATION-STAGE-1 -vv
在详细模式下,此命令无法完成,输出非常大。我尝试将其转储到一个文件中,但当该文件的大小达到 8.5GB 时,我将其终止。输出是以下模式的所有重复:
libiptc vlibxtables.so.12. 1032595540 bytes.
Table `filter'
Hooks: pre/in/fwd/out/post = 7ffe/92c0b5dd/55a7/92c0d8e0/55a7
Underflows: pre/in/fwd/out/post = 3d8c10f0/7ffe/3d8c1498/7ffe/3d8c2854
Entry 0 (0):
SRC IP: 0.0.0.0/0.0.0.0
DST IP: 0.0.0.0/0.0.0.0
Interface: `'/................to `'/................
Protocol: 0
Flags: 00
Invflags: 00
Counters: 0 packets, 0 bytes
Cache: 00000000
Target name: `' [0]
verdict=0
Entry 0 (0):
SRC IP: 0.0.0.0/0.0.0.0
DST IP: 0.0.0.0/0.0.0.0
Interface: `'/................to `'/................
Protocol: 0
Flags: 00
Invflags: 00
Counters: 0 packets, 0 bytes
Cache: 00000000
Target name: `' [0]
verdict=0
希望这对某些人来说是有意义的,但对我来说毫无意义。
答案1
在互联网上搜索后,我发现可以使用以下命令在 Linux 上恢复 iptables
iptables-restore < /root/working.iptables.rules
然而,一些技术指南表明,如果使用 kubernetes 代理 iptables 规则在重新启动 iptables+node 后会丢失。
以下文件提供了有关它的有用信息:
https://www.cyberciti.biz/faq/how-to-save-restore-iptables-firewall-config-ubuntu/
https://github.com/openshift/origin/issues/1922
我希望这能有所帮助!
答案2
您是否尝试过手动重新安装 iptables?
./configure --prefix=/usr \
--sbindir=/sbin \
--disable-nftables \
--enable-libipq \
--with-xtlibdir=/lib/xtables &&
make
make install &&
ln -sfv ../../sbin/xtables-legacy-multi /usr/bin/iptables-xml &&
for file in ip4tc ip6tc ipq iptc xtables
do
mv -v /usr/lib/lib${file}.so.* /lib &&
ln -sfv ../../lib/$(readlink /usr/lib/lib${file}.so) /usr/lib/lib${file}.so
done
make install-iptables
摘自这里。
答案3
原来这是内核配置问题。通常,当我应用补丁构建新内核时,我会从以前的版本复制我使用的配置(事后看来,这可能是一个坏主意)。一旦我将我的配置与最新的 Ubuntu 内核配置合并并重建内核,我的 iptables 输出就会恢复正常。