iptables-restore < /root/working.iptables.rules

iptables-restore < /root/working.iptables.rules

我遇到了一件非常奇怪的事情,在谷歌搜索了很久之后,我似乎找不到任何相关资料。我似乎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

https://www.linuxquestions.org/questions/linux-security-4/iptables-no-chain-tarjet-match-by-that-name-941406/

我希望这能有所帮助!

答案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 输出就会恢复正常。

相关内容