Настройте Iptables с помощью Ipset

Я был бы очень признателен, если бы кто-то мог помочь с довольно простым правилом ipset, которое я пытаюсь настроить. Я не могу понять, почему это не похоже на работу. Так что вот так:

  1. Я создаю простой файл с IP-адресами, которые я хотел бы заблокировать, и называю его черным списком.

  2. Затем я создаю свой 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-адрес, говоря, что время соединения истекло, оно просто подключается и проходит прямо... Я потерян... Кто-нибудь может посоветовать, пожалуйста, где в моих настройках есть ошибка? Любые указатели / помощь / предложения и т. Д. Приветствуются! Спасибо заранее!

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 есть предел наборов, которые я могу иметь (возможно ли это вообще?), Поэтому мое последнее правило не работает, потому что оно выходит за допустимые пределы... невежественны...

3 ответа

Возможно, мне придется ответить на мой собственный вопрос, так как похоже, что никто из виновников сервера не знает ответа. Ну, это действительно просто. Так как правила iptables работают последовательно, все, что было нужно, это изменить с -A INPUT на -I INPUT в моем коде выше. Задача решена.

Он создал измененные (-A) правила в моей цепочке ввода и поместил их сзади, что, казалось, противоречило другим правилам, которые были до него. Хитрость заключалась в том, чтобы сделать вставку (-I), которая создала новое правило и поместила его впереди, что остановило конфликт с остальными и начало работать на отлично.

Надеюсь, это поможет кому-то.

Проблема с правилом 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
                                  ^^^^^^^^

Как вы, кажется, обнаружили, в том, что вы делали, нет ничего принципиально неправильного - вам кажется, что вас укусил приоритет правила iptables. ака первый матч выигрывает.

В общем, вы бы хотели, чтобы ваш 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, который может помочь автоматизировать заполнение ваших ipsets на основе джейлов, которые вы для него настраиваете (tl;dr: jails ссылка на фильтры, которые запускают регулярное выражение для указанных файлов / событий журнала (например, неудачный вход в SSH) запрашивает URL-адреса панели администратора и т. д.), извлекает IP-адрес и добавляет / удаляет его из соответствующих ipsets).

Другие вопросы по тегам