如何修复“iptables: No chain/target/match by that name”?

ald*_*ita 7 linux iptables

我在我的 linux 嵌入式系统上构建并安装了 iptables。如果我列出所有规则,一切正常:

#iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
Run Code Online (Sandbox Code Playgroud)

但是,如果我添加一个新规则来阻止 icmp ping,我会得到以下错误:

iptables -A INPUT -i eth0 -p icmp --icmp-type any -s 0/0 -d 10.20.3.179 -m state --state NEW,ESTABLISHED,RELATED -j DROP
iptables: No chain/target/match by that name.
Run Code Online (Sandbox Code Playgroud)

如何解决?

注意:我以超级用户身份启动命令

Jon*_*ney 10

您需要弄清楚规则的哪一部分导致了该错误消息。这可能是-m state一部分,但不一定。iptables 和 netfilter 的各种扩展必须编译到 iptables 用户空间二进制文件和 Linux 内核中的 netfilter 中。您可以通过向 iptables 询问有关您正在测试的扩展的帮助信息来确定您缺少哪个部分。以下是测试各种扩展的一些方法:

$ iptables -m state -h
$ iptables -p icmp -h
$ iptables -j DROP -h
Run Code Online (Sandbox Code Playgroud)

如果您在输出的最底部获得包含有关扩展的信息的帮助输出,则它会被编译到用户空间二进制文件中。如果没有,那么你需要重新编译iptables。如果可行,请尝试使用最简单的规则来查看扩展是否包含在内核空间中:

$ iptables -A INPUT -m state --state NEW
$ iptables -A INPUT -p icmp
$ iptables -A INPUT -j DROP
Run Code Online (Sandbox Code Playgroud)

(小心这些规则,最后一个你会想要删除,因为它可能会比你想要的更多!)当你再次收到错误消息时:No chain/target/match by that name你会知道特定的扩展没有编译到你的内核中。您需要重新编译内核。

查看、 和 中的 make 文件linux/net/ipv6/netfilter,以了解为内核启用各种扩展的选项。对于用户空间,我认为有问题的 make 文件在,但我认为文件夹结构在最近的版本中发生了一些变化。linux/net/ipv4/netfilterlinux/net/netfilteriptables/extensions