Журнал каждого IP-соединения, подключенного к системе с iptables

Название говорит обо всем.

Как я могу, с iptables под Linux, регистрировать все IP, соединяющиеся с сервером? В качестве небольшой детали, я хотел бы иметь только ОДНУ запись в журнале PER DAY PER IP.

Спасибо:)

РЕДАКТИРОВАТЬ:

Я сузил его до 5 пакетов, регистрируемых для каждого нового сеанса, что странно, так как я использую --hashlimit 1 --haslimit-burst 1, я подозреваю, что предел - m, который по умолчанию равен 5, играет роль в этом. Проблема в том, что если я установлю предел --m на 1, для ВСЕХ IP будет записана только 1 запись, а не одна на КАЖДЫЙ IP.

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

РЕДАКТИРОВАТЬ 2: Вот моя текущая попытка, в формате iptables-restore: (в несколько строк для удобства чтения)

-A FORWARD -d 10.x.x.x -p tcp --dport 443 -m state --state NEW 
-m hashlimit --hashlimit-upto 1/min --hashlimit-burst 1 
--hashlimit-mode srcip --hashlimit-name denied-client 
-j LOG --log-prefix "iptables (denied client): "

4 ответа

Я бы попробовал это:

# IP address entry older than one day
iptables -A ... -m recent --name mydaily ! --rcheck ! --seconds 86400 -j logandset
# IP address never seen before
iptables -A ... -m recent --name mydaily ! --rcheck -j logandset

# Custom chain for logging and refreshing
iptables -N logandset
iptables -A logandset -j LOG
iptables -A logandset -m recent --name mydaily --set

Итак, ваш список mydaily будет отслеживать последние просмотренные IP-адреса, и если он никогда не был виден раньше, или если последний просмотренный был старше одного дня, пакет будет зарегистрирован, и запись в списке для этого IP-адреса будет обновлена.

Вы должны, вероятно, установить ip_list_tot на более высокое значение для mydaily, как объяснено на странице руководства iptables (в вашем случае для /proc/net/xt_recent/mydaily).

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

Я беру дикий (непроверенный) кряк @ this, но что-то вроде:

iptables -I INPUT -m conntrack --ctstate NEW -j LOG --log-prefix 'IPT/New Connection' 

iptables будет отправлять сообщение в журнал ядра для каждого нового соединения. Затем вам нужно будет сделать что-то вроде

grep 'IPT/New Connection' /var/log/kern.log | | wc -l

Который даст вам счет. Различные танцы w/ awk/perl/etc позволят вам разделить его по IP.

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

Я бы использовал исправленную версию ulogd с SQL- сервером.

Хитрость заключается в исправлении SQL-запроса INSERT таким образом, чтобы база данных имела дело с избыточностью IP-адресов и вставляла новые записи в журналы только для уникальных IP-адресов.

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