Я был бы очень признателен, если бы кто-нибудь мог помочь с довольно простым правилом ipset, которое я пытаюсь настроить. Я действительно не могу понять, почему это не работает. Итак, вот оно:
Я создаю простой файл с IP-адресами, которые хочу заблокировать, и называю его черным списком.
Затем я создаю свой ipset и ссылаюсь на него следующим образом:
ipset create blocklist nethash
for i in $(cat /path/to/blocklist); do ipset add blocklist $i; done
-A INPUT -p tcp --match multiport --dport 25,587 -m set --match-set blocklist src -j DROP
Когда я проверяю это с помощью
ipset test blocklist (IP address here) and press enter
он говорит, что IP-адрес находится в списке.
Когда я проверяю это с помощью
iptables -L -n -v
он говорит, что мое правило iptables существует и действует.
Однако, когда я подключаюсь с IP-адреса, который находится в черном списке, он не блокирует этот IP-адрес, говоря, что время ожидания соединения истекло, он просто подключается и проходит через ... Я потерялся ... Кто-нибудь может посоветовать, пожалуйста, где есть ли ошибка в моих настройках? Любые указатели / помощь / предложения и т. Д. Приветствуются! Спасибо заранее!
P.S. Он работает нормально, когда я устанавливаю его без каких-либо многопортовых параметров и блокирует только один порт следующим образом:
-A INPUT -p tcp --dport 80 -m set --match-set blocklist src -j DROP
но когда я делаю то же самое, но на 25-м порту, это не сработает:
-A INPUT -p tcp --dport 25 -m set --match-set blocklist src -j DROP
Я действительно не могу этого понять. У меня Postfix работает нормально и слушает мой 25-й порт.
P.S.S. Единственное, что мне приходит в голову, это то, что есть предел наборов ipset, который я могу иметь (возможно ли это вообще?), Поэтому мое последнее правило не работает, потому что оно выходит за допустимый предел ... невежественный ...
Проблема в правиле iptables:
-A INPUT -p tcp --match multiport --dport 25,587 -m set --match-set blocklist src -j DROP
^^^^^^^
Параметр для совпадения нескольких портов - --dports, а не --dport:
-A INPUT -p tcp --match multiport --dports 25,587 -m set --match-set blocklist src -j DROP
^^^^^^^^
Возможно, мне придется ответить на свой вопрос, поскольку похоже, что никто в serverfault не знает ответа. Что ж, это действительно просто. Поскольку правила iptable работают последовательно, все, что нужно было, это изменить с -A INPUT на -I INPUT в моем приведенном выше коде. Задача решена.
Он создал измененные (-A) правила в моей цепочке ввода и поместил их сзади, что, казалось, противоречило другим правилам, которые были до него. Хитрость заключалась в том, чтобы вставить (-I), который создал новое правило и поместил его впереди, что остановило конфликт с другими и начало работать отлично.
Надеюсь, это тоже поможет кому-то.
Как вы, кажется, обнаружили, в том, что вы делали, нет ничего принципиально неправильного - вам просто кажется, что вас укусил приоритет правил iptables. a.k.a. выигрывает первый матч.
В общем, вы, вероятно, захотите INPUT
цепочка должна выглядеть примерно так:
-A INPUT -m state --state ESTABLISHED -j ACCEPT
-A INPUT -m set --match-set blocklist src -j DROP
<... other rules ....>
-A INPUT -j LOG
-A INPUT -j DROP
Возможно, вы захотите изучить fail2ban, который может помочь автоматизировать заполнение ваших ipset на основе настроенных для него jails (tl; dr: jails ссылка на фильтры, которые запускают регулярное выражение для указанных файлов / событий журнала (например, неудачный вход по SSH , запросы URL-адресов панели администратора и т. д.), извлеките IP-адрес и добавьте / удалите его из соответствующих наборов IP).