В один прекрасный вечер, за просмотром средненького фильма стал приводить в порядок свой скрипт для iptables. Надо сказать, что обращался я с ним достаточно жестоко, просто прописывая новое правило по необходимости. В результате - несколько NAT даже на внутренние подсетки и т.п. помойки. Выкинул один NAT, пакеты завалились на второй, в результате чего вчера были проблемы с авторизацией. Но это отступление. Суть в следующем, у меня стоят ловушки, банящие адреса при подключении на стандартные порты различных приложений. За неделю набегает так конкретно адресов, в результате чего линейное их сравнение на каждом пакете тоже начинает подтормаживать, приходилось генерировать кучу правил вида:
Код:
iptables -I PREROUTING -t mangle -s $REMOTE_HOST/32 -j DROP
под руку попалось упоминание ipset. Грубо говоря, это списки адресов, сравнение с которым идет, во-первых, в одно правило, во-вторых - значительно быстрее. Взводится моментально, emerge ipset. В ядре так же включается поддержка ipset. И тут я сел в лужу.
Цитата: iptables -A INPUT -i $INET -m set --match-set badip src -j DROP
iptables: No chain/target/match by that name.
как я только не танцевал, как только не переиначивал правило... Убился. В дебаговом режиме было, что target все же кривой. Это было на ipset-4.5 6.8. Размаскировал, обновился - фиг. В общем, неизвестно, какой бубен надоумил, но поставил ipset-6.9.1-r2 c флагом modules (в ядре поддержку пришлось отключить), заработало... В использовании этот фильтр очень прост.
Создаем список адресов:
Код:
ipset create badip iphash
после чего в общий конфиг можно добавить строку
Код:
iptables -t mangle -A PREROUTING -i $INET -m state --state NEW -p tcp -m set --match-set badip src -j DROP
которая обозначает, что все новые соединения с инет-интерфейса от списка badip будут сбрасываться. Все! Осталось только поправить ловушки, чтобы они выполняли команду
Код:
ipset -A badip $REMOTE_HOST
список жертв теперь просто посмотреть командой
, раньше я взрывал мозг, листая правила и фильтруя кучу ненужного текста. Теперь работает правильно, быстро, красиво... Сбрасывать можно отдельно от общего списка правил...
P.S. при установке ipset в ebuild ругается, что нужен netlink.patch, на эту надпись можно забить. Я потратил много времени на выяснения, но патч нужен только на старые ядра.