我发生了一些非常奇怪的事情,经过大量谷歌搜索后我似乎找不到任何参考。我好像没有iptables。并不是说链被刷新或者它们都是 ACCEPT 规则之类的,表本身似乎不存在。这就是我的意思:
故事是,我的码头工人在过去几个月的某个时候停止工作,我终于抽出时间来修复它。该错误是由以下命令引起的:
$ 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.
不起作用。
有没有人见过这个?有什么办法可以把桌子拿回来吗?
我的系统是带有内核 5.1.8 的 Ubuntu 18.10
更新
我已经将所有 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
希望这对某人有意义,对我来说毫无意义。
在互联网上搜索我发现可以使用以下命令在 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/
我希望能有所帮助!
您是否尝试过手动重新安装 iptables?
取自这里。
这原来是一个内核配置问题。通常当我应用我的补丁构建一个新内核时,我从以前的版本复制我使用的配置(事后看来可能是个坏主意)。一旦我将我的配置与最新的 Ubuntu 内核配置合并并重建内核,我的 iptables 输出看起来又正常了。