Я собрал и установил iptables в своей встроенной системе Linux. Если перечислить все правила, все работает нормально:
#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, я получу следующую ошибку:
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.
Как это исправить?
Примечание: я запускаю команду как суперпользователь
Вам нужно выяснить, какая часть правила вызывает это сообщение об ошибке. Это наверное -m state
часть, но не обязательно. Различные расширения iptables и netfilter должны быть скомпилированы в двоичный файл пользовательского пространства iptables и netfilter в ядре Linux. Вы можете определить, какая часть вам не хватает, запросив у 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
вы будете знать, что это конкретное расширение не скомпилировано в ваше ядро. Вам нужно будет перекомпилировать ядро.
Просмотрите файлы make в linux/net/ipv6/netfilter
, linux/net/ipv4/netfilter
, и linux/net/netfilter
для вариантов включения различных расширений для ядра. Что касается пользовательского пространства, я думаю, что файлы make, о которых идет речь, находятся в iptables/extensions
но я думаю, что в более поздних версиях структура папок немного изменилась.