我在我的 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
但是,如果我添加一条新规则来阻止 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.
如何修复?
注意:我以超级用户身份启动命令
答案1
您需要找出规则的哪个部分导致了该错误消息。可能是该-m state
部分,但不一定。iptables 和 netfilter 的各种扩展必须编译到 iptables 用户空间二进制文件和 Linux 内核中的 netfilter 中。您可以通过向 iptables 询问您正在测试的扩展的帮助信息来确定您缺少哪个部分。以下是测试各种扩展的一些方法:
$ iptables -m state -h
$ iptables -p icmp -h
$ iptables -j DROP -h
如果您获得的帮助输出在输出的最底部包含有关扩展的信息,则表明它已编译到用户空间二进制文件中。如果没有,则需要重新编译 iptables。如果可行,请尝试最简单的规则来查看扩展是否包含在内核空间中:
$ iptables -A INPUT -m state --state NEW
$ iptables -A INPUT -p icmp
$ iptables -A INPUT -j DROP
(小心这些规则,最后一个规则你应该删除,因为它可能会比你希望的删除更多!)当你再次收到错误消息时:No chain/target/match by that name
你会知道特定的扩展没有编译到你的内核中。你需要重新编译你的内核。
查看linux/net/ipv6/netfilter
、linux/net/ipv4/netfilter
和中的 make 文件linux/net/netfilter
,查找启用内核各种扩展的选项。对于用户空间,我认为有问题的 make 文件在,iptables/extensions
但我认为文件夹结构在较新的版本中有所改变。
答案2
我正在使用 buildroot 并且遇到了同样的问题。
我发现内核中有很多 iptables 选项没有被选中。找到 linux.config 文件并启用所需的选项。例如,要启用 TARGET_MASQUERADE:
改变这个:
# CONFIG_IP_NF_TARGET_MASQUERADE is not set
更改为:
CONFIG_IP_NF_TARGET_MASQUERADE=y