Я был бы очень признателен, если бы кто-нибудь мог помочь с довольно простым правилом ipset, которое я пытаюсь установить. Я действительно не могу понять, почему это не работает. Итак, вот оно:
Я создаю простой файл с IP-адресами, которые хочу заблокировать, и называю его blocklist.
Затем я создаю свой ipset и ссылаюсь на него следующим образом:
ipset create blocklist nethash
для i в $ (cat / path / to / blocklist); сделать ipset добавить черный список $ i; сделанный
-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-адрес, говоря, что время ожидания соединения истекло, он просто подключается и проходит через ... Я потерялся ... Кто-нибудь может посоветовать, пожалуйста, где есть ошибка в моей настройке? Любые указатели / помощь / предложения и т. Д. Приветствуются! Заранее большое спасибо!
PS Он работает нормально, когда я устанавливаю его без каких-либо опций многопортов, и блокирует только один порт следующим образом:
-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-й порт.
PSS Единственное, что мне приходит в голову, это то, что есть предел наборов ipset, который я могу иметь (возможно ли это вообще?), Поэтому мое последнее правило не работает, потому что оно выходит за допустимый предел ... невежественный ...
Возможно, мне придется ответить на свой вопрос, поскольку похоже, что никто в 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 на основе тюрем, которые вы настроить для него (tl; dr: jails ссылка на фильтры, которые запускают регулярное выражение для указанных файлов / событий журнала (например, неудачный вход по SSH, запросы URL-адресов панели администратора и т. д.), извлекают IP-адрес и добавляют / удаляют его из соответствующих IP-адресов ).
Проблема связана с правилом 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
^^^^^^^^