Сервер в кармане, или просто о сложном!

главная - Статьи - Linux, FreeBSD

Лог iptables в отдельный файл в CentOS 7

Теги: Linux Iptables

В CentOS и других современных Linux по-умолчанию логи iptables пишутся в /var/log/messages. Это не всегда удобно. Если логирование включено на постоянной основе, то лог iptables способен за минуты полностью задавить все остальные сведения. В такой ситуации может быть необходимым вынести лог iptables в отдельный файл, например, /var/log/iptables.log.

Лог-файл IPTABLES

В CentOS 7 логи управляются с помощью rsyslog (конфиги /etc/rsyslog.conf, /etc/rsyslog.d/*.conf).

Предположим, мы хотим логировать в файл /var/log/iptables.log попытки соединения с портом 1234/tcp и 53/udp.

Для этого среди прочих наших правил iptables должны быть правила с действием LOG, например, такие:

--A INPUT -i eth0 -p tcp -m tcp --dport 1234 -j LOG --log-prefix --1234--LOG--
--A INPUT -i eth0 -p udp -m udp --dport 53 -j LOG --log-prefix --UDP--LOG--

Правила LOG должны быть ДО принятия решения (ACCEPT, DROP, REJECT, FORWARD). Иначе нужный нам пакет просто не дойдет до правила с LOG.

В директории /etc/rsyslog.d/ создадим отдельный файл конфига с фильтрами, которые будут понимать, какие именно пакеты от ядра надо сохранить в лог-файл iptables.log:

# touch /etc/rsyslog.d/iptables.conf
# nano /etc/rsyslog.d/iptables.conf

:msg, contains, "--1234--LOG--" -/var/log/iptables.log
& stop
:msg, contains, "--UDP--LOG--" -/var/log/iptables.log
& stop

# systemctl restart rsyslog.service

Проверяем, должно работать.

Logrotate

Чтобы лог-файл /var/log/iptables.log не рос бесконечно в размере, необходимо настроить его ротацию, по аналогии с другими лог-файлами.

Logrotate выполняется ежедневно по расписанию cron (/etc/cron.daily/logrotate) используя конфиг /etc/logrotate.conf и конфиги из директории /etc/logrotate.d, если они есть.

Создадим файл /etc/logrotate.d/iptables:

/var/log/iptables.log
{
  missingok
  notifempty
  rotate 5
  size 300k
  create 0600 root root
  postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
  endscript
}

Проверить работу можно принудительно, не дожидаясь увеличения размера лога:

# logrotate -v /etc/logrotate.d/iptables
reading config file /etc/logrotate.d/iptables
Allocating hash table for state file, size 15360 B

Handling 1 logs

rotating pattern: /var/log/iptables.log
 307200 bytes (5 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/iptables.log
  log does not need rotating (log size is below the 'size' threshold)

Если перевести, то "судя по настройкам из /etc/logrotate.d/iptables, ротацию надо делать логу /var/log/iptables.log при достижении размера 307200 байт, держать 5 ротаций лога, пустой файл не ротировать, а старые удалять. Конкретно сейчас лог /var/log/iptables.log не нуждается в ротации, поскольку его размер меньше порога size".

В man logrotate предлагается пример:

/var/log/messages {
  rotate 5
  weekly
  postrotate
    /usr/bin/killall -HUP syslogd
  endscript
}

Выбирайте на здоровье! Все.

Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?