iptables: пишем в лог все заблокированные соединения/пакеты

  • 7 867
  • 6
  • 90,00%
  • 8

Во время настройки правил iptables очень часто возникает необходимость посмотреть, какие из соединений отбрасываются (дропаются, фильтруются). В этой статье мы рассмотрим настройки для iptables, чтобы отфильтрованные фаерволом пакеты, сохранялись в отдельный лог файл для дальнейшего анализа.

Информация в данной статье написана для случая, когда политика по-умолчанию для цепочек INPUT и OUTPUT установлена на DROP. Т.е. любые соединения, для которых не указаны разрешающие правила - будут блокироваться фаерволом. Команды, которые приведены ниже, просто позволяют прежде чем заблокировать такое соединение/пакет, сначала записать информацию о нем в лог-файл, а уже потом заблокировать. Если же у вас политика по-умолчанию установлена на ACCEPT, то описанные ниже команды вам не подойдут, т.к. введя их, вы просто заблокируете доступ себе и другим.

Описание

Чтобы это работало, мы должны создать конфигурационный файл для rsyslog (считаем, что он у вас уже установлен в системе).

touch /etc/rsyslog.d/10-iptables.conf

Открываем его любым текстовым редактором, например, nano и вносим туда следующие строчки:

:msg, contains, "IPTables-Dropped: " -/var/log/iptables.log
& ~

Сохраняем изменения в файле. Первая строчка говорит rsyslog, что нужно искать в логе фразу "IPTables-Dropped: ", и когда он её находит, то переносит в файл /var/log/iptables.log
Вторая строчка просто дает понять rsyslog, чтобы найденные строки, подходящие под условия, не дублировались в основной лог /var/log/messages.
Перезапускаем rsyslog:

service rsyslog restart

Все, подготовительный этап, позволяющий писать лог iptables в отдельный файл мы сделали. Можно его не делать и тогда все записи будут появляться в /var/log/messages, но ИМХО это не очень удобно.

Переходим ко второму этапу, непосредственной настройке iptables.

Если у вас уже есть написанные правила для iptables, то все настройки, приведенные ниже, необходимо дописывать в самый низ конфигурации.

Возможны три варианта настройки:

Вариант 1 - Записываем в лог (логируем) только входящие отброшенные соединения/пакеты:

iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A LOGGING -j DROP

Разберем что же означает каждая из команд в примере выше:
iptables -N LOGGING: Создаем новую цепочку LOGGING
iptables -A INPUT -j LOGGING: Все входящие пакеты (для которых не сработало ни одно из ваших собственных правил и которые из-за политики DROP все-равно должны заблокироваться) попадают в цепочку LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4: Логируем все входящие пакеты в syslog (/var/log/messages).
iptables -A LOGGING -j DROP: Отбрасываем все пакеты, которые пришли в цепочку LOGGING.

Вариант 2 - Записываем в лог только исходящие отброшенные соединения/пакеты:
Все тоже самое, что и в примере выше, за исключением цепочки, теперь используем OUTPUT вместо INPUT.

iptables -N LOGGING
iptables -A OUTPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A LOGGING -j DROP

Вариант 3 - Записываем в лог все исходящие и входящие отброшенные соединения/пакеты:

iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A OUTPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A LOGGING -j DROP


Комментарии:

    • Евгений

    Спасибо! Очень помогло, хорошая статья!

    • Александр

    В последнем примере после iptables -A LOGGING -j DROP намертво завешивается хост

      • AJIekceu4

      У вас к хосту физический доступ или через ssh? Если физический, то это явно какие то проблемы. Если доступ через ssh, то, видимо, у вас нет правил, явно разрешающих доступ по ssh, поэтому после ввода указанной команды - вас и блокирует. Чтобы команды из этой статьи нормально работали, необходимо, чтобы политика по умолчанию у iptables была установлена на DROP, т.е. блокировались любые соединения, для которых не указаны явные правила (поэтому, не забываем заранее написать правила для ssh, чтобы можно было потом попасть на хост). В статье речь идет о том, чтобы все соединения/пакеты для которых нету правил и которые будут все-равно заблокированы, сначала писались в лог-файл, а уже потом блокировались. Раз уже не первый комментарий по этой теме, то допишу сейчас статью, чтобы читатели меньше путались.

    • Сергей

    ага, мат_удален какая-то, логируем все входящие, а потом дропаем все входящие и получаем логирование дропуных входящих, шутка юмора

      • AJIekceu4

      Если, прежде чем писать комментарий, прочитать хотя бы первый абзац в статье, а если сил на это не хватает, то хотя бы заголовок, то можно сильно удивиться и узнать, что бывают ситуации, когда надо писать в лог именно дропнутые входящие/исходящие соединения, а данной статье - описан один из способов, как это можно сделать.

    • Ваня

    Не вздумайте выполнять эти команды. Заблокируете себе и всем остальным доступ к сайту

Добавить комментарий

Ваш e-mail не будет опубликован.

Напоминаем Вам, что Ваше сообщение будет опубликовано только после проверки администратором сайта. Обычно это занимает 1-2 рабочих дня.