Журнал каждого 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-адрес в конце дня. Если ваш системный журнал способен фильтровать сообщения с помощью регулярных выражений, вы можете захватить сообщения и направить их в отдельный файл журнала. В конце дня все значения вычисляются, и сообщение повторно вставляется в вашу основную запись системного журнала.