Назад | Перейти на главную страницу

Регистрируйте каждый IP-адрес, подключающийся к системе, с помощью iptables

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

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

Спасибо :)

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

Я сузил его до 5 пакетов, регистрируемых для каждого нового сеанса, что странно, поскольку я использую --hashlimit 1 --haslimit-burst 1, Я подозреваю, что здесь играет роль --m limit, который по умолчанию равен 5. Проблема в том, что если я установил --m limit равным 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): "

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

# 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).

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

Хитрость заключается в том, чтобы исправить ВСТАВИТЬ SQL-запрос таким образом, чтобы база данных могла справиться с избыточностью IP-адресов и вставлять новые записи в журналы только для уникальных IP-адресов.

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

Я беру дикий (непроверенный) крек @ 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

Что даст вам счет. Различные танцы с awk / perl / и т. Д. Позволят вам разделить его по IP.

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