FastNetMon

Wednesday, 14 April 2010

Мониторинг отброшенных / принятых соединений в iptables без dmesg

Стандартным способом узнать, какие именно соединения / пакеты принял iptables является цель -j LOG, которая выбрасывает их в кольцевой буфер ядра, dmesg. Но это крайне неудобно по двум причинам - замусоривается dmesg, где могут быть крайне важные и полезные сообщения от ядра, а также неудобно читать и следить за логом (да, есть klogd).

Тут нам на выручку приходит ULOG, позволяющий по netlink отправить сообщения о пропущенных / заблокированных пакетах в userspace, где их встретит демон.

Вот выдержка из мана по iptables:
This target provides userspace logging of matching packets. When this target is set for a rule, the Linux kernel willmulticast this packet through a netlink socket. One or more userspace processes may then subscribe to various multicast groups and receive the packets. Like LOG, this is a "non-terminating target", i.e. rule traversal continues at the next rule.


Самое важное во всем этом то, что ULOG является не детерминирующим правилом, то есть после -j ULOG пакет будет пропущен дальше и если Вы хотите таки его отбросить, нужно следующим правилом добавить -j DROP.

Мое правило, работу которого я хочу контролировать логом имеет вид:
-A OUTPUT -p tcp -m tcp --dport 25 -j DROP


Чтобы сначала пакеты зафиксировать в ULOG нужно перед ним добавить еще одно правило:

-A OUTPUT -p tcp -m tcp --dport 25 -j ULOG --ulog-prefix "SMTP25BLOCK" --ulog-cprange 0 --ulog-qthreshold 50
-A OUTPUT -p tcp -m tcp --dport 25 -j DROP


Ставим:
apt-get install -y ulogd


После установки ulogd создает два лога:

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


Запускаем:
/etc/init.d/ulogd start


Пробуем коннект наружу:
telnet mail.ru 25
Trying 217.69.128.45...
^C


Получаем один пакет, зафиксированный ULOG и один отброшенный:

iptables -nvL
Chain OUTPUT (policy ACCEPT 1546 packets, 2211K bytes)
1 60 ULOG tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25 ULOG copy_range 0 nlgroup 1 prefix `SMTP25BLOCK' queue_threshold 50
1 60 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25


Вот и все, запись о нашей попытке запсиана в лог:

tail /var/log/ulog/syslogemu.log
Apr 14 21:48:19 v1 SMTP25BLOCK IN= OUT=eth0 MAC= SRC=xx.xx.xx.xx DST=yy.yy.yy.yy LEN=60 TOS=10 PREC=0x00 TTL=64 ID=29311 DF PROTO=TCP SPT=50089 DPT=25 SEQ=731105051 ACK=0 WINDOW=5840 SYN URGP=0


Ну вот и все :) Разве что у меня остался вопрос, как добавить сюда uid/gid приложения пытавшегося осуществить отправку. Но он, к сожалению, не решается в рамках ULOG, так как только у цели LOG есть ключик --log-uid, который как раз логгирует uid отправителя.

No comments :

Post a Comment

Note: only a member of this blog may post a comment.