iptables - утилита командной строки, межсетевого экрана (брандмауэра)

Процесс установки zabbix а так же дополнительных различных вспомогательных программ
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 817
Стаж: 5 лет 4 месяца
Откуда: Вологодская область
Поблагодарили: 35 раз
Контактная информация:

iptables - утилита командной строки, межсетевого экрана (брандмауэра)

Сообщение Артём Мамзиков »

Настроим блокировки и разрешения для Zabbix Server с помощью iptables

Сперва теория:

СИНТАКСИС:
iptables [-t ТАБЛИЦА] -A ЦЕПОЧКА ПАРАМЕТРЫ [опция]ДЕЙСТВИЕ

Таблица:
-t
raw - с сырыми пакетами, пока они еще не прошли обработку;
mangle - для модификации пакетов;
nat - работа nat, в качестве маршрутизатора;
nat - таблица, предназначенная целиком по функции трансляции сетевых адресов
filter - основная таблица для фильтрации пакетов, используется по умолчанию.
security - используется для назначения пакетам или соединениям неких меток, которые в дальнейшем может интерпретировать SElinux

ЦЕПОЧКА ПАРАМЕТРЫ:
-A - добавить правило в цепочку (в самое начало);
- проверить все правила;
-D - удалить правило;
-I - <номер> вставить правило с нужным номером;
-L - вывести все правила в текущей цепочке;
-S - вывести все правила;
-F - удалить все правила из цепочки, если цепочка не указана, удаляются все правила;
-N - создать цепочку;
-X - удалить цепочку;
-P - установить действие по умолчанию, действие будет выполняться на все пакеты, которые не подошли по каким-либо параметрам в другие правила.
-R <цепочка> <номер> - заменяет определенные критерии цепочки с номером
-Z <цепочка> - обнуляет все счётчики пакетов и байтов в цепочке

БАЗОВЫЕ ЦЕПОЧКИ:
INPUT - входящие пакеты и подключения
OUTPUT - исходящих пакетов и соединений
FORWARD - проходящих соединения
PREROUTING - правила в этой цепочке применяются ко всем пакетам, которые поступают на сетевой интерфейс извне
POSTROUTING - применяются к пакетам, которые должны покинуть сетевой интерфейс

ПАРАМЕТРЫ:
-p - указать протокол, один из all,tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh;
-m - включает дополнительные модули, явно задающимися данным ключём (например -m limit --limit 3/min - установит лимит на количество пакетов в минуту, -m tcp)
-s - указать ip/dns адрес устройства-отправителя пакета;
-d - указать ip/dns адрес получателя;
-i <имя интерфейса> - входной сетевой интерфейс;
-o <имя интерфейса> - исходящий сетевой интерфейс;
–-sport - порт источника
-–dport - порт назначения

ОПЦИИ ДЛЯ ДЕЙСТВИЙ:
-j (--jump) - применяет одно из действий accept, drop, reject и другие, если правило подошло.
-g (--goto) - переходит к другой цепочке правил

Действия:
ACCEPT - разрешить прохождение пакета
DROP - отбросить пакет не сообщая причины(более приоритетный вариант, нежели REJECT, т.к для блокируемого ip адреса(или диапазонов) будет аналогичный эффект тому, когда сервер находится в дауне)
REJECT - выбрасывает пакет и возвращает причину в виде ошибки, например: icmp unreachable
QUEUE - отправляет пакет за пределы логики iptables, в стороннее приложение. Это может понадобиться, когда нужно обработать пакет в рамках другого процесса в другой программе
RETURN - остановить обработку правила и вернуться на одно правило назад. Это действие подобно break'у в языке программирования
LOG - просто делает запись в логе, если пакет соответствует критериям правила;
DNAT - правило используется в NAT-ировании и меняет Destination IP пакета. Используется только в таблице nat и цепочках OUTPUT и PREROUTING
SNAT - правило используется в NAT-ировании и меняет Source IP пакета. Используется только в таблице nat и цепочке POSTROUTING
MASQUERADE - делает то же самое что SNAT, только применяется на выходном интерфейсе, когда IP адрес может меняться, например, когда назначается по DHCP

Как вы уже наверняка заметили, в пространстве ядра, в зависимости от типа протокола, пакеты могут иметь несколько различных состояний. Однако, вне ядра пакеты могут иметь только 4 состояния. В основном состояние пакета используется критерием --state. Допустимыми являются состояния NEW, ESTABLISHED, RELATED и INVALID. В таблице, приводимой ниже, рассматриваются каждое из возможных состояний.
--state
Состояние Описание
NEW - Признак NEW сообщает о том, что пакет является первым для данного соединения. Это означает, что это первый пакет в данном соединении, который увидел модуль трассировщика. Например если получен SYN пакет являющийся первым пакетом для данного соединения, то он получит статус NEW. Однако, пакет может и не быть SYN пакетом и тем не менее получить статус NEW. Это может породить определенные проблемы в отдельных случаях, но может оказаться и весьма полезным, например когда желательно "подхватить" соединения, "потерянные" другими брандмауэрами или в случаях, когда таймаут соединения уже истек, но само соединение не было закрыто.
ESTABLISHED - Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении. Схема установки состояния ESTABLISHED достаточна проста для понимания. Единственное требование, предъявляемое к соединению, заключается в том, что для перехода в состояние ESTABLISHED необходимо чтобы узел сети передал пакет и получил на него ответ от другого узла (хоста). После получения ответа состояние соединения NEW или RELATEDбудет изменено на ESTABLISHED.
RELATED - Состояние RELATED одно из самых "хитрых". Соединение получает статус RELATED если оно связано с другим соединением, имеющим признак ESTABLISHED. Это означает, что соединение получает признак RELATED тогда, когда оно инициировано из уже установленного соединения, имеющего признак ESTABLISHED. Хорошим примером соединения, которое может рассматриваться как RELATED, является соединение FTP-data, которое является связанным с портом FTP control, а так же DCC соединение, запущенное из IRC. Обратите внимание на то, что большинство протоколов TCP и некоторые из протоколов UDP весьма сложны и передают информацию о соединении через область данных TCP или UDP пакетов и поэтому требуют наличия специальных вспомогательных модулей для корректной работы.
INVALID - Признак INVALID говорит о том, что пакет не может быть идентифицирован и поэтому не может иметь определенного статуса. Это может происходить по разным причинам, например при нехватке памяти или при получении ICMP-сообщения об ошибке, которое не соответствует какому либо известному соединению. Наверное наилучшим вариантом было бы применение действия DROP к таким пакетам.
Эти четыре состояния могут использоваться в критерии --state. Механизм определения состояния позволяет строить чрезвычайно мощную и эффективную защиту. Раньше приходилось открывать все порты выше 1024, чтобы пропустить обратный трафик в локальную сеть, теперь же, при наличии механизма определения состояния, необходимость в этом отпала, поскольку появилась возможность "открывать" доступ только для обратного (ответного) трафика, пресекая попытки установления соединений извне.

Варианты просмотра
iptables -L - просмотр текущих правил
iptables -L INPUT - просмотр правил входящие пакеты и подключения
iptables -L INPUT --line-numbers - вывод с номерами правил
iptables -L -t nat - покажет правила таблицы nat
iptables -L –line-numbers - узнать номер правила
iptables -D INPUT 5 - удалить правило номер 5 из цепочки INPUT
iptables -L -n
iptables -L -n -v --line-numbers - параметр -v показывает детальную статистику по правилам, -n не резолвит ip
iptables -F - полностью очищаем список со всеми правилами
iptables -F -t nat - удаляем правила таблицы nat

iptables -h - вызвать справку

Более подробно можно почитать Руководство по iptables (Iptables Tutorial)
Руководство в архиве
iptables-rus-1.1.19.zip
iptables-rus-1.1.19.zip
(496.24 КБ) 26 скачиваний
# Удаление всех правил
iptables -F
# Очистка правил для входящих
iptables -F Input
# На Дефолт
iptables-restore
# Разрешить всё
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

prerouting - в эту цепочку пакет попадает перед обработкой iptables, система еще не знает куда он будет отправлен, в input, output или forward;
postrouting - сюда попадают все проходящие пакеты, которые уже прошли цепочку forward.

Примеры:

# ПОРТ 22 SSH (SFTP)
# Разрешить для
iptables -I INPUT -s 192.168.175.8 -p tcp --dport 22 -j ACCEPT
# Блокируем для всех остальных 22 порт
iptables -A INPUT -p tcp --dport 22 -j DROP

# ПОРТ 80 Вебка
# Разрешить для
iptables -I INPUT -s 192.168.175.8 -p tcp --dport 80 -j ACCEPT
# Блокируем для всех остальных 80 порт
iptables -A INPUT -p tcp --dport 80 -j DROP

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

Заблокировать все порты, кроме разрешенных
# ЗАКРЫТЬ ВСЕ ОСТАЛЬНЫЕ ВХОДЯЩИЕ ПОРТЫ (если для пакета не подходит ни одно правило)
iptables -P INPUT DROP

Тут мы получаем интересную ситуацию, с данного узла где производим настройки, у нас идут OUTPUT исходящие подключения на 80 и 22 (проверка доступности сайтов и 22 порта). OUTPUT - у нас разрешен запрос уходит, но обратно пакет не принимается правилом INPUT.
Ситуация аналогична всем остальным портам.
Получается что нужно прописать правило еще и для исходящих подключение ? Это как то не правильно.
В данном случае нужно задать правило все исходящие пакеты, разрешить на прием. Если узел на котором мы производим настройку делает запрос на 80 порт то и ответ он должен принять, если он запрос не делал то пакеты не пройдут.


#Разрешаем исходящие соединения, в целях, например, использования ping и других внутренних приложений
#если не собираетесь использовать, то можно не указывать, но тогда есть вероятность того, что не будут работать, скажем, обновления из интернета
#установленные соединения пропускаются, иначе каждый (а не только инициирующий) пакет в tcp-соединении будет проходить через эти цепочки правил
# Приём пакетов для установленных соединений:
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Более новая версия
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Это правило позволит пропускать пакеты, относящиеся к уже установленным соединениям (ESTABLISHED) или связанным с ними (RELATED). Таким образом, вы сможете видеть активные соединения в вашей сети.
Описание
Показать
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT:

В данной команде используется модуль state, который является устаревшим и был заменен модулем conntrack.
Параметр --state ESTABLISHED,RELATED указывает на установленные соединения (ESTABLISHED) и связанные с ними (RELATED), что позволяет пропускать пакеты, относящиеся к этим соединениям.
Эта команда может быть использована в старых версиях iptables, но рекомендуется использовать модуль conntrack для более современных версий.
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT:

В данной команде используется модуль conntrack, который предоставляет более широкие возможности отслеживания состояний подключений.
Параметр --ctstate ESTABLISHED,RELATED также указывает на установленные соединения (ESTABLISHED) и связанные с ними (RELATED).
Модуль conntrack обеспечивает более гибкое и эффективное отслеживание состояний подключений и рекомендуется для использования в более современных версиях iptables.
Таким образом, основное отличие заключается в использовании устаревшего модуля state в первой команде и более современного и рекомендуемого модуля conntrack во второй команде для отслеживания установленных и связанных соединений в iptables.
По умолчанию все порты которые не запрещены они разрешены.
iptables -P INPUT ACCEPT

#разрешает трафик на локальный интерфейс. localhost часто используется для размещения, например, базы данных, к которой подключаются веб-сайт и почтовый сервер, т.е таким образом, сервер имеет доступ к базе данных, но взломать её через интернет сложно
# Разрешить loopback интерфейс
iptables -I INPUT -i lo -j ACCEPT

# разрешаем исходящие соединения c сервера
iptables -P OUTPUT ACCEPT

НЕКОТОРЫЕ ПОРТЫ ZABBIX:
21 FTP
22 SSH (SFTP)
80 Вебка http
443 Вебка https (ssl)
3000 Grafana web
3306 MySql
53 dns
123 ntp время
25 SMTP Почта
465 SMTP Почта
143 imap
993 imap

НА ПОДСЕТИ
10050 Заббикс Агент Пассивный
10051 Заббикс Агент Активный
10052 JMX
12345 JMX
161 SNMP
162 Trap SNMP
166 SNMP ИБП
623 IPMI

Для ограничения доступа подключения к заббикс серверу нужно выбрать только те порты, на которые будет выполнятся подключение со стороны узлов, если заббикс сервер будет сам опрашивать узел такой порт не нужно включать в правило!
например порт 10050 - опрашивается с заббикс сервера его можно не включать в правило, а порт
10051 - он сам передает информацию на заббикс сервер такой порт нужно включать в правило.
порты Trap так же не обходимо включать в правило так как они передают данные сами на сервер
.

Можно сделать скрипт с 2 циклами 2 списка ip/dns и порты, первый перебирает IP а второй под цикл подставляет порты.
порты можно указать в одной строке через двоеточие 10051:162

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

Код: Выделить всё

#!/bin/bash

# Инфо https://www.opennet.ru/docs/RUS/iptables/

# Удаление всех правил
iptables -F
# На Дефолт
#iptables-restore
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

# ДЛЯ АДМИНИСТРАТОРОВ И СЛУЖЕБНЫЕ ПОРТЫ
# ПОРТ 21 FTP
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 21  -j ACCEPT
iptables -I INPUT -s 192.168.175.8 -p tcp --dport 21 -j ACCEPT
iptables -I INPUT -s 192.168.175.23 -p tcp --dport 21 -j ACCEPT
# Блокируем для всех остальных 21 порт
iptables -A INPUT -p tcp --dport 21 -j DROP

# ПОРТ 22 SSH (SFTP)
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 22  -j ACCEPT
iptables -I INPUT -s 192.168.175.8 -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -s 192.168.175.23 -p tcp --dport 22 -j ACCEPT
#  Блокируем для всех остальных 22 порт
iptables -A INPUT -p tcp --dport 22 -j DROP
#Пресечь попытки взлома
#iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --udpate --seconds 3600 --hitcount 8 -j REJECT
#iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --set
#iptables -A INPUT -p tcp --dport 22 -m recent --name ssh ! --rcheck --seconds 15 --hitcount 2 -j REJECT

# ПОРТ 80 Вебка
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 80  -j ACCEPT
iptables -I INPUT -s 192.168.175.8 -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -s 192.168.175.23 -p tcp --dport 80 -j ACCEPT
# Блокируем для всех остальных 80 порт
iptables -A INPUT -p tcp --dport 80 -j DROP

# ПОРТ 443 Вебка
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 443  -j ACCEPT
iptables -I INPUT -s 192.168.175.8 -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -s 192.168.175.23 -p tcp --dport 443 -j ACCEPT
# Блокируем для всех остальных 443 порт
iptables -A INPUT -p tcp --dport 443 -j DROP

# ПОРТ 3000 Grafana web
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 3000  -j ACCEPT
iptables -I INPUT -s 192.168.175.8 -p tcp --dport 3000 -j ACCEPT
iptables -I INPUT -s 192.168.175.23 -p tcp --dport 3000 -j ACCEPT
# Блокируем для всех остальных 3000 порт
iptables -A INPUT -p tcp --dport 3000 -j DROP

# ПОРТ 3306  MySql
iptables -I INPUT -s 192.168.175.111 -p tcp --dport 3306 -j ACCEPT
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 3306 -j ACCEPT
# Блокируем для всех остальных 3306 порт
iptables -A INPUT -p tcp --dport 3306 -j DROP

# ПОРТ 53 dns
# Блокируем для всех остальных 53 порт
iptables -A INPUT -p tcp --dport 53 -j DROP

# ПОРТ 123 ntp время
iptables -I INPUT -s 192.168.175.111 -p tcp --dport 123 -j ACCEPT
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 123 -j ACCEPT
# Блокируем для всех остальных 123 порт
iptables -A INPUT -p tcp --dport 123 -j DROP

# ПОРТ 25 SMTP Почта
# Разрешить для
iptables -I INPUT -s 192.168.175.110 -p tcp --dport 25 -j ACCEPT
#  Блокируем для всех остальных 25 порт
iptables -A INPUT -p tcp --dport 25 -j DROP

#разрешает smtp-трафик (если сервер не выступает как почтовый, то можно не разрешать):
#iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
#iptables -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT

#разрешает pop-трафик
#iptables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
#iptables -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT

#разрешает imap-трафик
#iptables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
#iptables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT



# НАШИ ПОДСЕТИ
# ПОРТ 10050 Заббикс Агент Пассивный 
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 10050  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p tcp --dport 10050  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p tcp --dport 10050  -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p tcp --dport 10050  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p tcp --dport 10050  -j ACCEPT
iptables -I INPUT -s 192.168.101.0/24 -p tcp --dport 10050  -j ACCEPT
# Блокируем для всех остальных 10050 порт
iptables -A INPUT -p tcp --dport 10050 -j DROP

# ПОРТ 10051 Заббикс Агент Активный
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 10051  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p tcp --dport 10051  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p tcp --dport 10051 -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p tcp --dport 10051  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p tcp --dport 10051  -j ACCEPT
iptables -I INPUT -s 192.168.101.0/24 -p tcp --dport 10051  -j ACCEPT
# Блокируем для всех остальных 10051 порт
iptables -A INPUT -p tcp --dport 10051 -j DROP

# ПОРТ 10052 JMX
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 10052  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p tcp --dport 10052  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p tcp --dport 10052 -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p tcp --dport 10052  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p tcp --dport 10052  -j ACCEPT
iptables -I INPUT -s 192.168.101.0/24 -p tcp --dport 10052  -j ACCEPT
# Блокируем для всех остальных 10052 порт
iptables -A INPUT -p tcp --dport 10052 -j DROP

# ПОРТ 12345 JMX
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 12345  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p tcp --dport 12345  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p tcp --dport 12345 -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p tcp --dport 12345  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p tcp --dport 12345  -j ACCEPT
iptables -I INPUT -s 192.168.101.0/24 -p tcp --dport 12345  -j ACCEPT
# Блокируем для всех остальных 12345 порт
iptables -A INPUT -p tcp --dport 12345 -j DROP

# ПОРТ 161 SNMP
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 161  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p tcp --dport 161  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p tcp --dport 161 -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p tcp --dport 161  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p tcp --dport 161  -j ACCEPT
iptables -I INPUT -s 192.168.101.0/24 -p tcp --dport 161  -j ACCEPT
# Блокируем для всех остальных 161 порт
iptables -A INPUT -p tcp --dport 161 -j DROP

# ПОРТ 162 Trap SNMP
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 162  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p tcp --dport 162  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p tcp --dport 162 -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p tcp --dport 162  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p tcp --dport 162  -j ACCEPT
iptables -I INPUT -s 192.168.101.0/24 -p tcp --dport 162  -j ACCEPT
# Блокируем для всех остальных 162 порт
iptables -A INPUT -p tcp --dport 162 -j DROP

# ПОРТ 166 SNMP ИБП
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 166  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p tcp --dport 166  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p tcp --dport 166 -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p tcp --dport 166  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p tcp --dport 166  -j ACCEPT
iptables -I INPUT -s 192.168.101.0/24 -p tcp --dport 166  -j ACCEPT
# Блокируем для всех остальных 166 порт
iptables -A INPUT -p tcp --dport 166 -j DROP

# ПОРТ 623 IPMI
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 623  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p tcp --dport 623  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p tcp --dport 623 -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p tcp --dport 623  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p tcp --dport 623 -j ACCEPT
iptables -I INPUT -s 192.168.101.0/24 -p tcp --dport 623  -j ACCEPT
# Блокируем для всех остальных 623 порт
iptables -A INPUT -p tcp --dport 623 -j DROP

#*****udp*****
# ДЛЯ АДМИНИСТРАТОРОВ И СЛУЖЕБНЫЕ ПОРТЫ
# ПОРТ 21 FTP
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p udp --dport 21  -j ACCEPT
iptables -I INPUT -s 192.168.175.8 -p udp --dport 21 -j ACCEPT
iptables -I INPUT -s 192.168.175.23 -p udp --dport 21 -j ACCEPT
# Блокируем для всех остальных 21 порт
iptables -A INPUT -p udp --dport 21 -j DROP

# ПОРТ 22 SSH (SFTP)
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p udp --dport 22  -j ACCEPT
iptables -I INPUT -s 192.168.175.8 -p udp --dport 22 -j ACCEPT
iptables -I INPUT -s 192.168.175.23 -p udp --dport 22 -j ACCEPT
#  Блокируем для всех остальных 22 порт
iptables -A INPUT -p udp --dport 22 -j DROP
#Пресечь попытки взлома
#iptables -A INPUT -p udp --dport 22 -m recent --name ssh --udpate --seconds 3600 --hitcount 8 -j REJECT
#iptables -A INPUT -p udp --dport 22 -m recent --name ssh --set
#iptables -A INPUT -p udp --dport 22 -m recent --name ssh ! --rcheck --seconds 15 --hitcount 2 -j REJECT

# ПОРТ 80 Вебка
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p udp --dport 80  -j ACCEPT
iptables -I INPUT -s 192.168.175.8 -p udp --dport 80 -j ACCEPT
iptables -I INPUT -s 192.168.175.23 -p udp --dport 80 -j ACCEPT
# Блокируем для всех остальных 80 порт
iptables -A INPUT -p udp --dport 80 -j DROP

# ПОРТ 443 Вебка
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p udp --dport 443  -j ACCEPT
iptables -I INPUT -s 192.168.175.8 -p udp --dport 443 -j ACCEPT
iptables -I INPUT -s 192.168.175.23 -p udp --dport 443 -j ACCEPT
# Блокируем для всех остальных 443 порт
iptables -A INPUT -p udp --dport 443 -j DROP

# ПОРТ 3000 Grafana web
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p udp --dport 3000  -j ACCEPT
iptables -I INPUT -s 192.168.175.8 -p udp --dport 3000 -j ACCEPT
iptables -I INPUT -s 192.168.175.23 -p udp --dport 3000 -j ACCEPT
# Блокируем для всех остальных 3000 порт
iptables -A INPUT -p udp --dport 3000 -j DROP

# ПОРТ 3306  MySql
iptables -I INPUT -s 192.168.175.111 -p udp --dport 3306 -j ACCEPT
iptables -I INPUT -s 127.0.0.1 -p udp --dport 3306 -j ACCEPT
# Блокируем для всех остальных 3306 порт
iptables -A INPUT -p udp --dport 3306 -j DROP

# ПОРТ 53 dns
# Блокируем для всех остальных 53 порт
iptables -A INPUT -p udp --dport 53 -j DROP

# ПОРТ 123 ntp время
iptables -I INPUT -s 192.168.175.111 -p udp --dport 123 -j ACCEPT
iptables -I INPUT -s 127.0.0.1 -p udp --dport 123 -j ACCEPT
# Блокируем для всех остальных 123 порт
iptables -A INPUT -p udp --dport 123 -j DROP

# ПОРТ 25 SMTP Почта
# Разрешить для
iptables -I INPUT -s 192.168.175.110 -p udp --dport 25 -j ACCEPT
#  Блокируем для всех остальных 25 порт
iptables -A INPUT -p udp --dport 25 -j DROP

#разрешает smtp-трафик (если сервер не выступает как почтовый, то можно не разрешать):
#iptables -A INPUT -p udp -m udp --dport 25 -j ACCEPT
#iptables -A INPUT -p udp -m udp --dport 465 -j ACCEPT

#разрешает pop-трафик
#iptables -A INPUT -p udp -m udp --dport 110 -j ACCEPT
#iptables -A INPUT -p udp -m udp --dport 995 -j ACCEPT

#разрешает imap-трафик
#iptables -A INPUT -p udp -m udp --dport 143 -j ACCEPT
#iptables -A INPUT -p udp -m udp --dport 993 -j ACCEPT



# НАШИ ПОДСЕТИ
# ПОРТ 10050 Заббикс Агент Пассивный 
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p udp --dport 10050  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p udp --dport 10050  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p udp --dport 10050  -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p udp --dport 10050  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p udp --dport 10050  -j ACCEPT
iptables -I INPUT -s 192.168.101.0/24 -p udp --dport 10050  -j ACCEPT
# Блокируем для всех остальных 10050 порт
iptables -A INPUT -p udp --dport 10050 -j DROP

# ПОРТ 10051 Заббикс Агент Активный
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p udp --dport 10051  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p udp --dport 10051  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p udp --dport 10051 -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p udp --dport 10051  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p udp --dport 10051  -j ACCEPT
iptables -I INPUT -s 192.168.101.0/24 -p udp --dport 10051  -j ACCEPT
# Блокируем для всех остальных 10051 порт
iptables -A INPUT -p udp --dport 10051 -j DROP

# ПОРТ 10052 JMX
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p udp --dport 10052  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p udp --dport 10052  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p udp --dport 10052 -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p udp --dport 10052  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p udp --dport 10052  -j ACCEPT
iptables -I INPUT -s 192.168.101.0/24 -p udp --dport 10052  -j ACCEPT
# Блокируем для всех остальных 10052 порт
iptables -A INPUT -p udp --dport 10052 -j DROP

# ПОРТ 12345 JMX
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p udp --dport 12345  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p udp --dport 12345  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p udp --dport 12345 -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p udp --dport 12345  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p udp --dport 12345  -j ACCEPT
iptables -I INPUT -s 192.168.101.0/24 -p udp --dport 12345  -j ACCEPT
# Блокируем для всех остальных 12345 порт
iptables -A INPUT -p udp --dport 12345 -j DROP

# ПОРТ 161 SNMP
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p udp --dport 161  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p udp --dport 161  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p udp --dport 161 -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p udp --dport 161  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p udp --dport 161  -j ACCEPT
iptables -I INPUT -s 192.168.101.0/24 -p udp --dport 161  -j ACCEPT
# Блокируем для всех остальных 161 порт
iptables -A INPUT -p udp --dport 161 -j DROP

# ПОРТ 162 Trap SNMP
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p udp --dport 162  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p udp --dport 162  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p udp --dport 162 -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p udp --dport 162  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p udp --dport 162  -j ACCEPT
iptables -I INPUT -s 192.168.101.0/24 -p udp --dport 162  -j ACCEPT
# Блокируем для всех остальных 162 порт
iptables -A INPUT -p udp --dport 162 -j DROP

# ПОРТ 166 SNMP ИБП
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p udp --dport 166  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p udp --dport 166  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p udp --dport 166 -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p udp --dport 166  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p udp --dport 166  -j ACCEPT
iptables -I INPUT -s 192.168.101.0/24 -p udp --dport 166  -j ACCEPT
# Блокируем для всех остальных 166 порт
iptables -A INPUT -p udp --dport 166 -j DROP

# ПОРТ 623 IPMI
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p udp --dport 623  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p udp --dport 623  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p udp --dport 623 -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p udp --dport 623  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p udp --dport 623 -j ACCEPT
iptables -I INPUT -s 192.168.101.0/24 -p udp --dport 623  -j ACCEPT
# Блокируем для всех остальных 623 порт
iptables -A INPUT -p udp --dport 623 -j DROP

# ПОРТ icmp Проверка пинга
# Разрешить для
iptables -I INPUT -s 127.0.0.1 -p  icmp  -j ACCEPT
iptables -I INPUT -s 192.168.175.0/24 -p  icmp  -j ACCEPT
iptables -I INPUT -s 172.16.37.0/24 -p icmp  -j ACCEPT
iptables -I INPUT -s 172.16.35.0/24 -p  icmp  -j ACCEPT
iptables -I INPUT -s 172.16.78.0/24 -p  icmp  -j ACCEPT
# ВНЕШНИЕ ПРОВЕРКИ
iptables -I INPUT -s 110.10.182.34/24 -p  icmp  -j ACCEPT
# Блокируем для всех остальных icmp порт
iptables -A INPUT -p  icmp -j DROP

#Разрешаем исходящие соединения, в целях, например, использования ping и других внутренних приложений
#если не собираетесь использовать, то можно не указывать, но тогда есть вероятность того, что не будут работать, скажем, обновления из интернета
#установленные соединения пропускаются, иначе каждый (а не только инициирующий) пакет в tcp-соединении будет проходить через эти цепочки правил
# Приём пакетов для установленных соединений:
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT


#разрешает трафик на локальный интерфейс. localhost часто используется для размещения, например, базы данных, к которой подключаются веб-сайт и почтовый сервер, т.е таким образом, сервер имеет доступ к базе данных, но взломать её через интернет сложно
# Разрешить loopback интерфейс
iptables -I INPUT -i lo -j ACCEPT

# разрешаем исходящие соединения c сервера
iptables -P OUTPUT ACCEPT

# ЗАКРЫТЬ ВСЕ ОСТАЛЬНЫЕ ВХОДЯЩИЕ ПОРТЫ (если для пакета не подходит ни одно правило)
iptables -P INPUT DROP

# Разрешить
#iptables -P INPUT ACCEPT


#блокирует нулевые пакеты
#iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

#сброс пакетов XMAS
#iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

#защита от syn-flood
#iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP



# Сохранить правила
iptables-save
service iptables save

# Показать правила
#prav=`iptables -S`
# вывести все правила в текущей цепочке
prav=`iptables -L INPUT --line-numbers`
echo -e "${prav}"
echo "Готово"


Другие различные примеры

Блокировка пакетов
iptables -A INPUT -s 10.10.10.10 -j DROP
iptables -A OUTPUT -s 10.10.10.10 -j DROP

Блокировка диапазона
iptables -A INPUT -s 10.10.10.0/24 -j DROP
или
iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP

заблокировать все входящие соединения ssh
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP

Удаление правил вместо A пишем D
iptables -A OUTPUT -s 10.10.10.10 -j DROP

iptables -F - Очистка всех правил
iptables -F Input - Очистка правил для входящих
таблицы по умолчанию - filter

Сохранить правила
iptables-save
или
service iptables save
если пропадают у меня писало что все сохранено выдавало список что сохранено, но после перезагрузки все правила слетали
добавить в /etc/network/interfaces post-up iptables-restore < /etc/iptables/iptables.rules
Или можно добавить в Крон при включении запускать скрипт с правилами.

Еще пример: для 1 ip сразу несколько портов, для определенного сегмента ip адресов

Код: Выделить всё

#!/bin/bash
# Удаление всех правил
iptables -F
#iptables-restore
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
# ПОРТ 25  (SMTP) Разрешить для всех
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
# Разрешает трафик на локальный интерфейс. localhost часто используется для размещения, например, базы данных, к которой подключаются веб-сайт и почтовый сервер, т.е таким образом, сервер имеет доступ к базе данных, но взломать её через интернет сложно. Разрешить loopback интерфейс
iptables -I INPUT -i lo -j ACCEPT
iptables -I INPUT -s 127.0.0.0 -j ACCEPT
iptables -I INPUT -s 127.0.0.1 -j ACCEPT
iptables -I INPUT -s 127.0.0.2 -j ACCEPT
#Разрешаем исходящие соединения, в целях, например, использования ping и других внутренних приложений. Если не собираетесь использовать, то можно не указывать, но тогда есть вероятность того, что не будут работать, скажем, обновления из интернета. Установленные соединения пропускаются, иначе каждый (а не только инициирующий) пакет в tcp-соединении будет проходить через эти цепочки правил Приём пакетов для установленных соединений:
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# ДЛЯ АДМИНИСТРАТОРОВ И СЛУЖЕБНЫЕ ПОРТЫ Разрешить для

# multiport максимум 15 портов, так же можно указать диапазонами c 1 по 5 порт 1:5(диапазон занимает два слота) и (+ 1) отдельный порт 7 будет 1:5,7
# Eсли нужно использовать большой диапазон портов можно использовать --sport (--source-port) 513:65535, s-Источник(ip отправителя) d-Пункт назначения(ip получателя) --dport (--destination-port) без указания -s или -d,
# --port тогда будут и входящие и исходящие. Важный момент! в какой секции иптейблс(INPUT/OUTPUT) стоит правило, и важно понимать кто будет Источник и кто Пункт назначения. То же самое и с портами. https://losst.ru/nastrojka-iptables-dlya-chajnikov
# Важен порядок правил! Если первым правилом запретить, а после разрешить пакет уже будет отбит первым правилом и не дойдет до второго, поэтому запрещающие правила ставятся после разрешающихся!
# TCP
iptables -I INPUT -s 127.0.0.1 -p tcp -m multiport --port 21,22,80,443,1311,3000,3306,123,10050:10052,12345,161,162,166,623 -j ACCEPT

iptables -I INPUT -s 192.168.175.36 -p tcp -m multiport --port 21,3306,123 -j ACCEPT
iptables -I INPUT -s 192.168.175.8 -p tcp -m multiport --port 21,3306,123,22,80,443 -j ACCEPT
iptables -I INPUT -s 192.168.175.111 -p tcp -m multiport --port 21,3306,123,10050,10051 -j ACCEPT
# ПОРТ 443 Веб Разрешить для
iptables -I INPUT -s 10.0.0.211 -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -s 192.168.125.3/28 -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -s 172.16.39.0/24 -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -m iprange --src-range 172.16.101.0-172.16.128.255 -p tcp -m multiport --port 80,443 -j ACCEPT
# разрешаем исходящие соединения c сервера
iptables -P OUTPUT ACCEPT
# ЗАКРЫТЬ ВСЕ ОСТАЛЬНЫЕ ВХОДЯЩИЕ ПОРТЫ (если для пакета не подходит ни одно правило)
iptables -P INPUT DROP
# Сохранить правила
iptables-save
service iptables save
# Показать правила
#prav=`iptables -S`
# вывести все правила в текущей цепочке
prav=`iptables -L INPUT --line-numbers`
echo -e "${prav}"
echo "Готово"

Multiport
Расширение multiport позволяет указывать в тексте правила несколько портов и диапазонов портов.

Вы не сможете использовать стандартную проверку портов и расширение -m multiport (например –sport 1024:63353 -m multiport –dport 21,23,80) одновременно. Подобные правила будут просто отвергаться iptables. Выделяет не один порт, как –dport или –sport, а несколько по списку (до 15 штук). Можно задавать диапазоны как первый_порт:последний_порт. Может быть использовано только вместе с -p udp или -p tcp.

Отправитель -–source-ports порт1,порт2,порт3:порт4

Код: Выделить всё

iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
Служит для указания списка исходящих портов. С помощью данного критерия можно указать до 15 различных портов. Названия портов в списке должны отделяться друг от друга запятыми, пробелы в списке не допустимы. Данное расширение может использоваться только совместно с критериями -p tcp или -p udp. Главным образом используется как расширенная версия обычного критерия –source-port.

Полкучатель -–destination-ports порт1,порт2,порт3:порт4

Код: Выделить всё

iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
Служит для указания списка входных портов. Формат задания аргументов полностью аналогичен -m multiport –source-port.

-–ports порт1,порт2,порт3:порт4

Код: Выделить всё

iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
Данный критерий проверяет как исходящий так и входящий порт пакета. Формат аргументов аналогичен критерию –source-port и –destination-port. Обратите внимание на то что данный критерий проверяет порты обеих направлений, т.е. если вы пишете -m multiport –port 80, то под данный критерий подпадают пакеты, идущие с порта 80 на порт 80.


iprange
iprange — позволяет указать диапазон IP-адресов, не являющийся подсетью. Поддерживает следующие параметры:

-–src-range адрес[-адрес] — позволяет указать диапазон исходных адресов. Например,

Код: Выделить всё

iptables -I INPUT -m iprange --src-range 192.168.0.8-192.168.0.25 -j DROP
заблокирует все пакеты, исходный адрес которых лежит в диапазоне с 192.168.0.8 по 192.168.0.25 включительно.

-–dst-range адрес[-адрес] — позволяет указать диапазон адресов назначения.

Еще вариант записи

Код: Выделить всё

# Generated by iptables-save v1.4.21 on Mon Nov 14 16:13:02 2022
*filter
:INPUT DROP [8938:1462782]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [397735:75577431]
-A INPUT -s 192.168.175.23/32 -p tcp -m tcp --dport 445 -j ACCEPT
-A INPUT -s 192.168.175.111/32 -p tcp -m tcp --dport 10051 -j ACCEPT
-A INPUT -s 192.168.175.111/32 -p tcp -m tcp --dport 10050 -j ACCEPT
-A INPUT -s 192.168.175.111/32 -p icmp -j ACCEPT
-A INPUT -s 192.168.98.0/24 -p tcp -m tcp --dport 201:500 -j ACCEPT
https://wiki.dieg.info/iptables

Порядок работы:
ЛОГИРОВАТЬ
ПРИНЯТЬ
ОТБРАСЫВАТЬ
количество слов: 3914
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 817
Стаж: 5 лет 4 месяца
Откуда: Вологодская область
Поблагодарили: 35 раз
Контактная информация:

iptables - утилита командной строки, межсетевого экрана (брандмауэра)

Сообщение Артём Мамзиков »

Есть различные дополнения и расширения модули для Iptables для работы в связке с ним.
iptables-расширения

Iptables поддерживает различные расширения (extensions), которые предоставляют дополнительные возможности для настройки правил фильтрации пакетов. Некоторые из наиболее распространенных расширений в iptables включают:

1. **iptables-extensions**: Это общее название для всех расширений iptables. Они включают в себя различные возможности, такие как различные типы соединений, совпадения с IP-адресами, портами, флагами TCP и другими параметрами.

2. **iptables-conntrack**: Расширение, которое позволяет использовать функциональность отслеживания состояния соединений для управления состоянием соединений и применения правил на основе этого состояния.

3. **iptables-nat**: Расширение, которое предоставляет возможности для настройки Network Address Translation (NAT) с помощью iptables, включая маскарадинг, портовое перенаправление и другие функции.

4. **iptables-geoip**: Расширение, которое позволяет использовать географическую информацию для фильтрации пакетов на основе страны и региона IP-адреса.

5. **iptables-ipv6**: Расширение для работы с IPv6 адресами и правилами в iptables.

6. **iptables-filter**: Расширение, которое предоставляет дополнительные возможности для фильтрации пакетов на основе различных критериев.

7. **iptables-LOG**: Расширение, позволяющее журналировать пакеты, которые соответствуют определенным правилам.

8. **iptables-REJECT**: Расширение, которое позволяет отклонять пакеты с определенным сообщением об ошибке.

Это лишь небольшой список расширений, доступных в iptables. Каждое расширение предоставляет уникальные возможности для настройки правил фильтрации пакетов в соответствии с вашими потребностями. При работе с iptables рекомендуется изучить документацию по соответствующим расширениям для более подробной информации о их использовании.

Блокируем злоумышленников с помощьюfail2ban
Коллекция аддонов Xtables-addons Xtables-addons - для установки модулей не требуется пересборка ядра и/или iptables. В итоге добавление новых функций происходит очень просто, нет проблем и при обновлении ядра.
Анализируем трафик с OpenDPI


Рассмотрим работу Ulogd Ulogd2
Iptables + Ulogd Применения действия -j NFLOG или -j ULOG
ulogd — управляющая программа журналирования пространства пользователя для netfilter подсистемы межсетевого экранирования.
Ulogd позволяет журналировать пакеты в различных форматах для различных целей: (текстовые файлы, базы данных и т.д.).
Она обладает простым в использовании интерфейсом подключаемых модулей для добавления новых протоколов и новых целей вывода.

Установка

Код: Выделить всё

apt-get install ulogd
или

Код: Выделить всё

apt-get install ulogd2
Пакеты с дополнительными плагинами в разных ОС могут отличаться названия!

Код: Выделить всё

apt-get install ulogd-dbi ulogd-dbi-debuginfo ulogd-debuginfo ulogd-mysql ulogd-mysql-debuginfo ulogd-pgsql ulogd-pgsql-debuginfo ulogd-sqlite3 ulogd-sqlite3-debuginfo 
Команды управления сервисом
start|stop|reload|restart|condstop|condrestart|condreload|status

Управление сервисом ulogd
СТАРТ

Код: Выделить всё

service ulogd start
СТОП

Код: Выделить всё

service ulogd stop
РЕСТАРТ

Код: Выделить всё

service ulogd restar
СТАТУС

Код: Выделить всё

service ulogd status
или
СТАРТ

Код: Выделить всё

systemctl start ulogd
СТОП

Код: Выделить всё

systemctl stop ulogd
РЕСТАРТ

Код: Выделить всё

systemctl restart ulogd
СТАТУС

Код: Выделить всё

systemctl status ulogd

Код: Выделить всё

systemctl status ulogd.service
Прописываем в автозагрузку
в зависимости от ОС:

Код: Выделить всё

update-rc.d ulogd defaults
или

Код: Выделить всё

systemctl enable ulogd.service
или

Код: Выделить всё

chkconfig --add ulogd

Код: Выделить всё

chkconfig ulogd on
Возможно Имя ulogd2

Код: Выделить всё

update-rc.d ulogd2 defaults
или

Код: Выделить всё

systemctl enable ulogd2.service
или

Код: Выделить всё

chkconfig --add ulogd2

Код: Выделить всё

chkconfig ulogd2 on
Служба пути
/etc/rc.d/init.d/ulogd
/lib/systemd/system/ulogd.service
/etc/logrotate.d/ulogd
/usr/lib64/
/usr/lib64/ulogd/
/usr/sbin/ulogd

Конфигурация

Код: Выделить всё

nano /etc/ulogd.conf
Логи
Директория с логами

Код: Выделить всё

cd /var/log/ulogd/
Путь на базы
/var/lib/ulogd/ulogd.sqlite3db

Вывод в mysql postgresql прописывается подключение в файле конфигурации.

Как работает порядок в файле конфигурации:
1.В начале настройки можно задать уровень отладки 1 что бы смотреть что как запускается и работает, после завершения настройки задать 5.
2. Далее указываем какие плагины нам не обходимо загружать, если все закомментированы загружаться будут все плагины (загрузку и работу плагинов проверяем в логе, возможно какой то плагин не загрузился, но при этом служба запустилась)
Есть плагины ВХОД Начало получения/обработки, ФИЛЬТР, ВЫХОД вывод информации
3. stack= За этим параметром следует список экземпляров плагина, который начинается с плагина ввода, содержит плагин дополнительной фильтрации и заканчивается плагином вывода.
Можно задать несколько параметров одновременно по разным плагинам и разный вывод данных
Пример:
# это стек для протоколирования пакетов, отправляемых системой через LOGEMU
stack=log1:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,emu1:LOGEMU

4. Фильтрация например номер группы, префикс и тд.
Пример:
[log1]
# Протоколирование системного пакета через NFLOG группы 0
# группа многоадресной рассылки netlink (совпадает с параметром iptables --nflog-group)
# Группа O используется ядром для регистрации недопустимого сообщения об отслеживании соединения
group=0

5. Вывод информации из плагинов в лог файл или базу данных
[emu1]
file="/var/log/ulogd/ulogd_syslogemu.log"
sync=1

Просмотр текущий правил

Код: Выделить всё

iptables -L INPUT --line-numbers
Удалить ошибочное правило или правило тестирования
Пример - удалить правило номер 5 из цепочки INPUT

Код: Выделить всё

iptables -D INPUT 5
Пример правил для группы 0
Передавать все о подключениях в ULOG

Код: Выделить всё

iptables -I INPUT -j NFLOG --nflog-group 0
Передавать все о TCP подключениях в ULOG

Код: Выделить всё

iptables -I INPUT -p tcp -j NFLOG --nflog-group 0
Передавать все о подключении TCP 22 порта в ULOG
iptables -A INPUT -p tcp --dport 22 -j NFLOG --nflog-group <Номер-группы>

Код: Выделить всё

iptables -I INPUT -p tcp --dport 22 -j NFLOG --nflog-group 0
С префиксом

Код: Выделить всё

iptables -A INPUT -p tcp --dport 22 -j ULOG --ulog-prefix "Port 22 Connection: "

Код: Выделить всё

iptables -A INPUT -p tcp --dport 22 -j NFLOG --nflog-prefix "Port 22 Connection: "

Код: Выделить всё

iptables -A INPUT -p tcp --dport 22 -j NFLOG --nflog-group 0 --nflog-prefix "Port 22 Connection: "
Несколько портов и выборка состояния подключения Информация ниже

Код: Выделить всё

iptables -I INPUT -p tcp -m multiport --port 21,22 -m conntrack --ctstate NEW,RELATED,INVALID,UNTRACKED,DNAT,SNAT -j NFLOG --nflog-group 0

Конфигурация

Код: Выделить всё

nano /etc/ulogd.conf

Код: Выделить всё

# Пример конфигурации для ulogd
# Адаптировано для Debian Ахиллеасом Котсисом <achille@debian.gr>

[global]
######################################################################
# ГЛОБАЛЬНЫЕ ПАРАМЕТРЫ
######################################################################


# файл журнала для сообщений о состоянии
logfile="/var/log/ulogd/ulogd.log"

# уровень журнала: отладка(1), информация(3), уведомление(5), ошибка(7) или фатальный исход(8) (по умолчанию 5)
loglevel=1

######################################################################
# ПАРАМЕТРЫ ПЛАГИНА
######################################################################

# Нам нужно настроить и загрузить все плагины, которые мы хотим использовать

# общие правила:
#
# 0. не указывайте какой-либо плагин для ulogd, чтобы загрузить их все
# 1. сначала загрузите плагины из глобального раздела
# 2. параметры для каждого плагина в отдельном разделе ниже


# ВХОД Начало получения/обработки

# Старый добрый плагин ввода ipt_ULOG. Это в основном эмулирует ulogd-1.x, у которого не было плагинов ввода.
#plugin="/usr/lib64/ulogd/ulogd_inppkt_ULOG.so"

# Он взаимодействует с новым интерфейсом nfnetlink_log. Для компиляции вам необходимо, чтобы в вашей системе был установлен libnetfilter_log.
#plugin="/usr/lib64/ulogd/ulogd_inppkt_NFLOG.so"

#plugin="/usr/lib64/ulogd/ulogd_inpflow_NFCT.so"

#plugin="/usr/lib64/ulogd/ulogd_inpflow_NFACCT.so"

#plugin="/usr/lib64/ulogd/ulogd_inppkt_UNIXSOCK.so"


# ФИЛЬТР

# Базовый плагин интерпретатора для nfmark, timestamp, mac-адреса, ip-заголовка, tcp-заголовка, udp-заголовка, icmp-заголовка, ah/esp-заголовка... Большинство людей захотят загрузить этот очень важный плагин.
#plugin="/usr/lib64/ulogd/ulogd_raw2packet_BASE.so"

# Этот плагин преобразует аппаратный заголовок в строку. В случае ethernet-пакета он в основном преобразует mac-адрес в представление строки.
#plugin="/usr/lib64/ulogd/ulogd_filter_HWHDR.so"

# Плагин фильтра, который обеспечивает перевод из числового ifindex (например, '1') в имя сетевого интерфейса (например, 'eth4').
#plugin="/usr/lib64/ulogd/ulogd_filter_IFINDEX.so"

# Этот плагин преобразует IP-адреса в двоичную форму, используемую базами данных, такими как MySQL.
#plugin="/usr/lib64/ulogd/ulogd_filter_IP2BIN.so"

# Этот плагин преобразует IP-адреса в двоичную форму в порядке расположения узлов, используемую базами данных, такими как MySQL.
#plugin="/usr/lib64/ulogd/ulogd_filter_IP2HBIN.so"

# Этот плагин преобразует IP-адреса в строку.
#plugin="/usr/lib64/ulogd/ulogd_filter_IP2STR.so"

# Когда этот плагин помещается в стек, будут регистрироваться только те сообщения, метка которых (метка пакета или метка соединения) соответствует заданной метке/маске.
#plugin="/usr/lib64/ulogd/ulogd_filter_MARK.so"

# Преобразуйте ключи относительно потока в строку, читаемую человеком.
#plugin="/usr/lib64/ulogd/ulogd_filter_PRINTFLOW.so"

# Преобразуйте ключи относительно пакета в строку, читаемую человеком. Этот плагин должен использоваться для печати пакета в формате, аналогичном целевому формату ЖУРНАЛА.
#plugin="/usr/lib64/ulogd/ulogd_filter_PRINTPKT.so"

# Пример плагина-интерпретатора для регистрации текстовых паролей, используемых с FTP и POP3. Не вините меня за написание этого плагина! Протоколы по своей сути небезопасны, и существует множество других инструментов для перехвата паролей...
#plugin="/usr/lib64/ulogd/ulogd_filter_PWSNIFF.so"


# ВЫХОД вывод информации

#plugin="/usr/lib64/ulogd/ulogd_output_GPRINT.so"

#plugin="/usr/lib64/ulogd/ulogd_output_GRAPHITE.so"

#plugin="/usr/lib64/ulogd/ulogd_output_JSON.so"

# Модуль вывода, который пытается эмулировать старый целевой журнал на основе системного журнала, насколько это возможно. Однако ведение журнала выполняется в отдельный текстовый файл, а не в системный журнал.
# Модуль определяет следующие директивы конфигурации:
# Файл
# Имя файла, в который он должен войти. Значение по умолчанию - /var/log/ulogd.syslogemu
# Синхронизация
# Установите значение 1, если вы хотите, чтобы ваш файл журнала записывался синхронно. Это может снизить производительность, но строки журнала будут отображаться немедленно. Значение по умолчанию равно 0
#plugin="/usr/lib64/ulogd/ulogd_output_LOGEMU.so"

#plugin="/usr/lib64/ulogd/ulogd_output_NACCT.so"

#plugin="/usr/lib64/ulogd/ulogd_output_OPRINT.so"

#plugin="/usr/lib64/ulogd/ulogd_output_SYSLOG.so"

#plugin="/usr/lib64/ulogd/ulogd_output_XML.so"

#plugin="/usr/lib64/ulogd/ulogd_output_DBI.so"

#plugin="/usr/lib64/ulogd/ulogd_output_IPFIX.so"

#plugin="/usr/lib64/ulogd/ulogd_output_MYSQL.so"

#plugin="/usr/lib64/ulogd/ulogd_output_PCAP.so"

#plugin="/usr/lib64/ulogd/ulogd_output_PGSQL.so"

#plugin="/usr/lib64/ulogd/ulogd_output_SQLITE3.so"


# stack= За этим параметром следует список экземпляров плагина, который начинается с плагина ввода, содержит плагин дополнительной фильтрации и заканчивается плагином вывода. Этот параметр может отображаться несколько раз.

# это стек для ведения журнала на основе пакетов ULOG через LOGEMU
#stack=ulog1:ULOG,base1:BASE,ip2str1:IP2STR,print1:PRINTPKT,emu1:LOGEMU

# это стек для протоколирования пакетов, отправляемых системой через LOGEMU
stack=log1:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,emu1:LOGEMU
#stack=log1:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,pwsniff1:PWSNIFF,print1:PRINTPKT,emu1:LOGEMU

# Тесты
#stack=log1:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,mac2str1:HWHDR,print1:PRINTPKT,emu1:LOGEMU
#stack=log1:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,mac2str1:HWHDR,pws1:PWSNIFF,print1:PRINTPKT,emu1:LOGEMU
#stack=log1:NFCT,ip2str1:IP2STR,print1:PRINTFLOW,emu1:LOGEMU
#stack=log1:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,hwhdr1:HWHDR,print1:PRINTPKT,script1:ZABBIXSCRIPT

#stack=log1:NFLOG,base1:BASE,mac1:HWHDR,print1:PRINTPKT,emu1:LOGEMU
#plugin="/var/log/ulogd/ulogd_zabbix2.so"

# это стек для ведения журнала на основе пакетов с помощью GPRINT
#stack=log1:NFLOG,gp1:GPRINT

# это стек для входа в систему в формате XML
#stack=log1:NFLOG,xml1:XML

# это стек для регистрации пакета в SQLITE3
#stack=log1:NFLOG,sqlite3_pkt:SQLITE3

# это стек для ведения журнала на основе пакетов через LOGEMU
#stack=log2:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,emu1:LOGEMU

# это стек для ведения журнала на основе пакетов через LOGEMU с фильтрацией по методу
#stack=log2:NFLOG,base1:BASE,mark1:MARK,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,emu1:LOGEMU

# это стек для ведения журнала на основе пакетов NFLOG в PCAP
#stack=log2:NFLOG,base1:BASE,pcap1:PCAP

# это стек для регистрации пакетов в MySQL
#stack=log2:NFLOG,base1:BASE,ifi1:IFINDEX,ip2bin1:IP2BIN,mac2str1:HWHDR,mysql1:MYSQL

# это стек для регистрации пакета в PGsql после сбора через NFLOG
#stack=log2:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,mac2str1:HWHDR,pgsql1:PGSQL

# это стек для записи пакета в файл в формате JSON после сбора через NFLOG
#stack=log2:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,mac2str1:HWHDR,json1:JSON

# это стек для записи пакетов в системный журнал после сбора через NFLOG
#stack=log3:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,sys1:SYSLOG

# это стек для ведения журнала на основе потока через LOGEMU
#stack=ct1:NFCT,ip2str1:IP2STR,print1:PRINTFLOW,emu1:LOGEMU

# это стек для ведения журнала на основе потока с помощью GPRINT
#stack=ct1:NFCT,gp1:GPRINT

# это стек для ведения журнала на основе потока через XML
#stack=ct1:NFCT,xml1:XML

# это стек для ведения журнала на основе потока в MySQL
#stack=ct1:NFCT,ip2bin1:IP2BIN,mysql2:MYSQL

# это стек для ведения журнала на основе потока в PGSQL
#stack=ct1:NFCT,ip2str1:IP2STR,pgsql2:PGSQL

# это стек для потокового ведения журнала в PGSQL без локального хэша
#stack=ct1:NFCT,ip2str1:IP2STR,pgsql3:PGSQL

# это стек для ведения журнала на основе потока в SQLITE3
#stack=ct1:NFCT,sqlite3_ct:SQLITE3

# это стек для ведения журнала на основе потока в формате, совместимом с NACCT
#stack=ct1:NFCT,ip2str1:IP2STR,nacct1:NACCT

# это стек для ведения журнала на основе бухгалтерского учета с помощью XML
#stack=acct1:NFACCT,xml1:XML

# это стек для ведения журнала на основе бухгалтерского учета на сервере Graphite
#stack=acct1:NFACCT,graphite1:GRAPHITE

# это стек для ведения журнала на основе бухгалтерского учета с помощью GPRINT
#stack=acct1:NFACCT,gp1:GPRINT

# это стек для записи пакетов в системный журнал после сбора через NuFW
#stack=nuauth1:UNIXSOCK,base1:BASE,ip2str1:IP2STR,print1:PRINTPKT,sys1:SYSLOG



# ВВОД данных фильтрация***************************************************************************
[ulog1]
# группа многоадресной рассылки netlink (такая же, как у iptables --ulog-nlgroup param)
nlgroup=1
#numeric_label=0 # optional argument

[log1]
# Протоколирование системного пакета через NFLOG группы 0
# группа многоадресной рассылки netlink (совпадает с параметром iptables --nflog-group)
# Группа O используется ядром для регистрации недопустимого сообщения об отслеживании соединения
group=0

#netlink_socket_buffer_size=217088
#netlink_socket_buffer_maxsize=1085440
# установите количество пакетов для постановки в очередь внутри ядра
#netlink_qthreshold=1
# установите задержку перед сбросом пакета в очередь внутри ядра (в 10 мс)
#netlink_qtimeout=100

[log2]
# регистрация пакетов через NFLOG для группы 1
# группа многоадресной рассылки netlink (такая же, как iptables --nflog-group param)
group=1 # Группа должна отличаться от той, которая используется в log1
#netlink_socket_buffer_size=217088
#netlink_socket_buffer_maxsize=1085440
# Если ваше ядро старше 2.6.29 и если плагин ввода NFLOG с
# group 0 не используется ни в одном стеке, вам необходимо иметь по крайней мере один плагин ввода NFLOG
# с привязкой, установленной на 1. Если вы этого не сделаете, вы можете не получить никакого сообщения от ядра.
#
#bind=1

#group=1
#group_name=emu1_logs
#nflog_prefix=emu1_
#exec="/etc/zabbix/scripts/portmonitor.sh"
#file="/var/log/ulogd/ulogd_test.log"
#file_mode=0644
#file_group=ulog
#base="MARK, TIMESTAMP, NFPROTO_IPV4, NFPROTO_IPV6"

[log3]
# регистрация пакетов через NFLOG для группы 2, numeric_label равна
# set to 1
# группа многоадресной рассылки netlink (такая же, как у iptables --nflog-group param)
group=2 # Группа должна отличаться от той, которая используется в log1/log2
numeric_label=1 # вы можете пометить информацию журнала на основе вердикта по пакету
#netlink_socket_buffer_size=217088
#netlink_socket_buffer_maxsize=1085440
#bind=1

[ct1]
#netlink_socket_buffer_size=217088
#netlink_socket_buffer_maxsize=1085440
#netlink_resync_timeout=60 # секунды ожидания для выполнения повторной синхронизации
#pollinterval=10 # используйте ведение журнала на основе опроса вместо управляемого событиями
# Если значение pollinterval не задано, плагин NFCT будет работать в режиме события
# В этом случае вы можете использовать следующие фильтры для событий:
#accept_src_filter=192.168.1.0/24,1:2::/64 # ip-адрес источника подключения должен принадлежать этим сетям
#accept_dst_filter=192.168.1.0/24 # конечный ip-адрес подключения должен принадлежать этим сетям
#accept_proto_filter=tcp,sctp # уровень 4 - прототип соединений

[ct2]
#netlink_socket_buffer_size=217088
#netlink_socket_buffer_maxsize=1085440
#reliable=1 # включить надежное ведение журнала на основе потока (возможно отбрасывание пакетов)
hash_enable=0

[acct1]
pollinterval = 2
# Если установлено значение 0, мы не сбрасываем счетчики для каждого опроса (по умолчанию - 1).
#zerocounter = 0
# Установите временную метку (по умолчанию 0, что означает, что не установлено). Эта временная метка может быть
# интерпретирована плагином вывода.
#timestamp = 1

[nuauth1]
socket_path="/tmp/nuauth_ulogd2.sock"


# ВЫВОД**********************************************************************************
[emu1]
file="/var/log/ulogd/ulogd_syslogemu.log"
sync=1

[gp1]
file="/var/log/ulogd/ulogd_gprint.log"
sync=1
timestamp=1

[xml1]
directory="/var/log/ulogd/"
sync=1

[sqlite3_pkt]
table="ulog_pkt"
db="/var/lib/ulogd/ulogd.sqlite3db"
buffer=200

[sqlite3_ct]
table="ulog_ct"
db="/var/lib/ulogd/ulogd.sqlite3db"
buffer=200

[pcap1]
#файл по умолчанию - это /var/log/ulogd/ulogd.pcap
file="/var/log/ulogd/ulogd.pcap"
sync=1

[mysql1]
db="ulogd2"
host="localhost"
user="ulogd2"
table="ulog"
pass="ulogd2"
procedure="INSERT_PACKET_FULL"
# конфигурация журнала невыполненных работ:
# установите backlog_memcap на размер памяти, который будет
# выделен для хранения событий в памяти, если данные временно недоступны
# и вставьте их, когда база данных вернется.
#backlog_memcap=1000000
# количество событий, которые нужно вставить одновременно, если журнал невыполненных работ не пуст
#backlog_oneshot_requests=10

[mysql2]
db="ulogd2"
host="localhost"
user="ulogd2"
table="conntrack"
pass="ulogd2"
procedure="INSERT_CT"

[pgsql1]
db="nulog"
host="localhost"
user="nupik"
table="ulog"
#schema="public"
pass="changeme"
procedure="INSERT_PACKET_FULL"
# connstring может использоваться для определения строки подключения PostgreSQL, которая
# содержит все параметры соединения. Если задано, это значение имеет
# приоритет над другими переменными, используемыми для построения строки подключения.
# Смотрите http://www.postgresql.org/docs/9.2/static/libpq-connect.html#LIBPQ-CONNSTRING
# для получения полного описания опций.
#connstring="host=localhost port=4321 dbname=nulog user=nupik password=changeme"
#backlog_memcap=1000000
#backlog_oneshot_requests=10
# Если значение больше 1, создается поток, предназначенный для выполнения SQL-запроса.
# Значение сохраняет номер SQL-запроса, который необходимо сохранить
# в кольцевом буфере
#ring_buffer_size=1000

[pgsql2]
db="nulog"
host="localhost"
user="nupik"
table="ulog2_ct"
#schema="public"
pass="changeme"
procedure="INSERT_CT"

[pgsql3]
db="nulog"
host="localhost"
user="nupik"
table="ulog2_ct"
#schema="public"
pass="changeme"
procedure="INSERT_OR_REPLACE_CT"

[pgsql4]
db="nulog"
host="localhost"
user="nupik"
table="nfacct"
#schema="public"
pass="changeme"
procedure="INSERT_NFACCT"

[json1]
sync=1
file="/var/log/ulogd/ulogd.json"
#timestamp=0
# имя устройства, которое будет использоваться в сообщении JSON
device="Мой потрясающий брандмауэр Netfilter"
# Если значение boolean_label равно 1, то числовая метка, добавленная к пакету
# плагином ввода, кодирует действие с пакетом: если 0, то
# пакет был заблокирован, а если не null, то он был принят.
boolean_label=1
# Рас комментируйте следующую строку, чтобы использовать формат событий JSON версии 1, который
# может обеспечить лучшую совместимость с некоторыми программами чтения файлов JSON.
#eventv1=1

[json1]
sync=1
file="/var/log/ulogd/ulogd1.json"
timestamp=0
device="Мой потрясающий брандмауэр Netfilter"
boolean_label=1
eventv1=1

[sys1]
facility=LOG_LOCAL1

[sys2]
facility=LOG_LOCAL2

[nacct1]
sync = 1
file = /var/log/ulogd/ulogd_nacct.log

[graphite1]
host="127.0.0.1"
port="2003"
# Префикс имени данных, отправляемых на сервер graphite
prefix="netfilter.nfacct"

[op1]
file="/var/log/ulogd/ulogd_oprint.log"
sync=1

[dbi1]
db="ulog2"
dbtype="pgsql"
host="localhost"
user="ulog2"
table="ulog"
pass="ulog2"
procedure="INSERT_PACKET_FULL"

[mark1]
mark = 1


Пример включения минимальных плагинов для одного вида лога

Код: Выделить всё

[global]
# файл журнала для сообщений о состоянии
logfile="/var/log/ulogd/ulogd.log"

# уровень журнала: отладка(1), информация(3), уведомление(5), ошибка(7) или фатальный исход(8) (по умолчанию 5)
loglevel=1

plugin="/usr/lib/ulogd/ulogd_inppkt_NFLOG.so"
plugin="/usr/lib/ulogd/ulogd_raw2packet_BASE.so"
plugin="/usr/lib/ulogd/ulogd_pkt2packet_SIMPLE.so"
plugin="/usr/lib/ulogd/ulogd_output_LOGEMU.so"

stack=log1:NFLOG,base1:BASE,pkt1:SIMPLE,emu1:LOGEMU

[log1]
group=0

[emu1]
file="/var/log/ulogd/ulogd_syslogemu.log"
sync=1
После изменения каких либо настроек в ulog рестартуем службу

Код: Выделить всё

service ulogd restart
и Проверяем состояние все ли запустилось, если нет смотрим лог.

Код: Выделить всё

service ulogd status
Документация
ULOGD 2.x - the Netfilter Userspace Logging Daemon
Перевод Документации ULOGD 2.x
Показать
Харальд Вельте <laforge@netfilter.org>, Эрик Леблонд <eric@inl.fr>
Редакция 2009/04/18
Это документация для ulogd-2.x, демона ведения журнала в пользовательском пространстве Netfilter второго поколения. ulogd использует подсистемы Linux >= 2.6.14 nfnetlink_log и nfnetlink_conntrack, но также обеспечивает обратную совместимость для Linux >= 2.4.0 ipt_ULOG.

1. ДИЗАЙН

КОНЦЕПЦИЯ 1.1
ulogd-2.x хочет предоставить гибкий, почти универсальный демон ведения журнала для ведения журнала netfilter. Это включает в себя как ведение журнала на основе пакетов (регистрация нарушений политики), так и ведение журнала на основе потоков, например, для целей бухгалтерского учета.

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

Плагины ввода
Плагины ввода действуют как источник данных. Они получают данные откуда-то за пределами ulogd и преобразуют их в список ключей ulogd.

Плагины для фильтрации
Плагины фильтрации интерпретируют и / или фильтруют данные, полученные от плагина ввода. Хорошим примером является синтаксический анализ необработанного пакета в IPv4 / TCP / ... информация заголовка.

Плагины для вывода
Плагины вывода описывают, как и куда помещать информацию, полученную плагином ввода и обработанную одним или несколькими плагинами фильтрации. Самый простой способ - построить строку для каждого пакета и распечатать ее в файл. Некоторые люди могут захотеть войти в базу данных SQL или получить выходные данные, соответствующие языку IETF IPFIX.

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

1.2 ПОДРОБНОСТИ
Основная подсказка заключается в предоставлении максимально гибкой платформы. Никто не знает, какие странные сетевые протоколы существуют :) Но в то же время ведение журнала пакетного фильтра часто очень важно для производительности. Как и все версии ulogd начиная с 0.3.x, ядро ulogd-2.x не выполняет никаких динамических распределений во время выполнения. Да, очевидно, что во время запуска файл конфигурации анализируется и производятся распределения. Но после этого все распределяется заранее. В качестве дополнительного улучшения по сравнению с ulogd-1.x также отсутствует поиск по хэш-таблице для разрешения ключа. Все ключи ввода / вывода плагинов в каждом стеке разрешаются во время синтаксического анализа файла конфигурации и напрямую связаны указателями.

2. УСТАНОВКА
2.1 Ядро Linux
Для использования плагина ввода NFCT или NFLOG вам понадобится ядро 2.6.14 или более поздней версии. Для ведения журнала ULOG в старом стиле вам понадобится ядро >= 2.4.18.

2.2 Библиотеки пользовательского пространства
Если вы планируете использовать NFCT и плагин ввода NFLOG, вам нужно будет скомпилировать библиотеки libnfnetlink, libnetfilter_conntrack и libnetfilter_log, которые можно загрузить с http://ftp.netfilter.org/pub/. Простого './configure; make; make install' будет достаточно, чтобы библиотека была установлена в вашей системе.

2.3 ulogd
Перекомпиляция исходного кода
Загрузите пакет ulogd с http://ftp.netfilter.org/pub/ulogd / и распакуйте его.

Если вы хотите создать ulogd с поддержкой MySQL, введите './configure --with-mysql' . Возможно, вам также придется указать путь к библиотекам mysql, используя '--with-mysql =path' . Чтобы создать ulogd без поддержки MySQL, просто используйте '. /configure'.

Чтобы скомпилировать и установить программу, вызовите "make install".

3. Конфигурация
3.1 iptables NFLOG target
Быстрая настройка
Просто добавьте правила, используя целевой файл NFLOG, в свою цепочку брандмауэра. Очень простой пример.:

Код: Выделить всё

iptables -A FORWARD -j NFLOG --nflog-group 32 --nflog-prefix foo
Чтобы повысить производительность ведения журнала, попробуйте использовать

--nflog-qthreshold N
опция (где 1 < N <= 50). Указанное вами число представляет собой количество пакетов, объединенных в одно составное сообщение netlink. Если вы установите значение 20, ядро назначит ulogd только один раз через каждые 20 пакетов. Затем все 20 пакетов обрабатываются ulogd. Это уменьшает количество переключений контекста между ядром и пользовательским пространством.
Конечно, вы можете комбинировать целевой файл NFLOG с различными модулями сопоставления netfilter. Для получения более подробного описания ознакомьтесь с инструкциями netfilter, доступными на домашней странице netfilter.

Целевая ссылка на NFLOG
--nflog-группа N
Номер группы многоадресной рассылки netlink, в которую отправляются пакеты NFLOG'ed. Вам придется использовать один и тот же номер группы в цели NFLOG и ulogd, чтобы протоколирование работало.

--nflog-диапазон N
Copyrange . Это работает аналогично параметру 'snaplen' в tcpdump . Вы можете указать количество байт, до которого копируется пакет. Если вы скажете "40", вы получите первые сорок байт каждого пакета. Оставьте значение 0 для сброса всего пакета.

--nflog-пороговое значение N
Пороговое значение очереди. Если пакету соответствует правило iptables, и в очереди уже находится N пакетов, очередь сбрасывается в пространство пользователя. Вы можете использовать это для реализации политики, подобной: используйте большую очередь, чтобы добиться высокой производительности, но при этом определенные пакеты все равно будут немедленно регистрироваться в пользовательском пространстве.

--nflog-СТРОКА префикса
Строка, связанная с каждым пакетом, зарегистрированным по этому правилу. Вы можете использовать эту опцию, чтобы позже указать, по какому правилу был зарегистрирован пакет.

3.2 цель ведения журнала iptables
Быстрая настройка
Просто добавьте правила, используя цель ULOG, в свою цепочку брандмауэра. Очень простой пример.:

Код: Выделить всё

iptables -A FORWARD -j ULOG --ulog-nlgroup 32 --ulog-prefix foo
Чтобы повысить производительность ведения журнала, попробуйте использовать

--ulog-qthreshold N
опция (где 1 < N <= 50). Указанное вами число представляет собой количество пакетов, объединенных в одно составное сообщение netlink. Если вы установите значение 20, ядро назначит ulogd только один раз через каждые 20 пакетов. Затем все 20 пакетов обрабатываются ulogd. Это уменьшает количество переключений контекста между ядром и пользовательским пространством.
Конечно, вы можете комбинировать целевой модуль ULOG с различными модулями сопоставления netfilter. Для получения более подробного описания ознакомьтесь с инструкциями netfilter, доступными на домашней странице netfilter.

Ссылка на цель ULOG
--ulog-nlgroup N
Номер группы многоадресной рассылки netlink, в которую отправляются загруженные пакеты. Вам нужно будет использовать один и тот же номер группы в цели ULOG и ulogd, чтобы протоколирование работало.

--ulog-cprange N
Copyrange . Это работает аналогично параметру 'snaplen' в tcpdump . Вы можете указать количество байт, до которого копируется пакет. Если вы скажете "40", вы получите первые сорок байт каждого пакета. Оставьте это для 0

--ulog-qthreshold N
Пороговое значение очереди. Если пакету соответствует правило iptables, и в очереди уже находится N пакетов, очередь сбрасывается в пространство пользователя. Вы можете использовать это для реализации политики, подобной: используйте большую очередь, чтобы добиться высокой производительности, но при этом определенные пакеты все равно будут немедленно регистрироваться в пользовательском пространстве.

--СТРОКА префикса ulog
Строка, связанная с каждым пакетом, зарегистрированным по этому правилу. Вы можете использовать эту опцию, чтобы позже указать, по какому правилу был зарегистрирован пакет.

Параметры модуля ipt_ULOG
Модуль ядра ipt_ULOG имеет пару параметров времени загрузки модуля, которые могут (и должны) быть настроены для удовлетворения потребностей приложения:

nlbufsiz N
Размер буфера Netlink. Буфер указанного размера N выделяется для каждой используемой группы netlink. Пожалуйста, обратите внимание, что из-за ограничений распределителя памяти ядра у нас не может быть размера буфера > 128 Кб. Больший размер буфера увеличивает производительность, поскольку для того же количества пакетов требуется меньше переключений контекста ядра / пользовательского пространства. Обратной стороной такого увеличения производительности является потенциально большая задержка. Значение по умолчанию равно 4096 байтам, что довольно мало.

flushtimeout N
flushtimeout определяет, через сколько тактов (на alpha: 1 мс, на x86 и большинстве других платформ: 10 мс единиц времени) буфер / очередь должны быть очищены, даже если они не заполнены. Это может использоваться для получения преимущества в виде большого буфера, но при этом все равно вводится конечная максимальная задержка. Значение по умолчанию установлено равным 10 секундам.

Пример:
modprobe ipt_ULOG nlbufsiz=65535 flushtimeout=100
Для этого потребуется размер буфера 64 КБ и время сброса 100 тактов (1 секунда на x86).

3.3 ulogd
ulogd - вот что это такое, поэтому давайте опишем его конфигурацию...

ссылка на синтаксис конфигурационного файла ulogd
Все настраиваемые параметры ulogd находятся в файле конфигурации, обычно расположенном по адресу '/etc/ulogd.conf'.

Доступны следующие параметры конфигурации:

файл журнала
Основной файл журнала, в котором ulogd сообщает о любых ошибках, предупреждениях и других непредвиденных условиях. Помимо обычного имени файла, могут использоваться следующие специальные значения; `syslog" для входа через механизм системного журнала unix (3). `stdout" для входа в stdout.

уровень журнала
Это указывает, насколько подробным является ведение журнала в logfile. В настоящее время определены следующие уровни журнала: 1 = отладочная информация, 3 = информационные сообщения, 5 = заметные исключительные условия, 7 = условия ошибки, 8 = неустранимые ошибки, прерывание программы.

плагин
За этим параметром следует имя файла плагина ulogd, который ulogd должен загрузить при инициализации. Этот параметр может отображаться несколько раз.

стек
За этим параметром следует список экземпляров плагина, который начинается с плагина ввода, содержит плагин дополнительной фильтрации и заканчивается плагином вывода. Этот параметр может отображаться несколько раз.

ссылка на параметр командной строки ulogd
Помимо файла конфигурации, в ulogd есть несколько параметров командной строки:

-h --help Справка
Выведите справочное сообщение о параметрах командной строки.

-V --version Версия
Версия для печати информации об ulogd.

-d --daemon
Для перехода в режим демона. Если вы не занимаетесь отладкой, вам захочется использовать это большую часть времени.

-c --configfile
Используя этот параметр командной строки, можно использовать альтернативный файл конфигурации. Это важно, если на одном компьютере должно быть запущено несколько экземпляров ulogd.

-i --info
Отображает информацию о плагине, имя файла которого указано в качестве аргумента.

4. Сигналы / Logrotate
ulogd понимает два типа сигналов:

SIGHUP
Закройте и повторно откройте все файлы журналов. В основном это предназначено для сценариев logrotate. Также закрывает и повторно открывает подключения к базе данных.

SIGUSR1
Перезагрузите файл конфигурации. Это пока реализовано не полностью.

5. Доступные плагины
Важно понимать, что ulogd без плагинов ничего не делает. Он будет получать пакеты и ничего с ними не делать.

Существует два вида плагинов, плагины интерпретатора и плагины вывода. Плагины интерпретатора анализируют пакет, плагины вывода записывают интерпретированную информацию в некоторый файл журнала / базу данных /...

Вы можете получить информацию о плагинах, запустив
ulogd -i путь /к/плагину/файлу.so

5.1 Плагины ввода
ulogd поставляется со следующими плагинами ввода:

ulogd_inppkt_NFLOG.so
Он использует новый интерфейс nfnetlink_log. Для компиляции в вашей системе должен быть установлен libnetfilter_log.

Группа group
Номер группы многоадресной рассылки netlink, в которую отправляются NFLOG'ed пакеты. Вам нужно будет использовать один и тот же номер группы в цели NFLOG (--nflog-group) и в плагине ввода.

семейство адресов addressfamily
Вам нужно будет указать значение протокола, если вы не регистрируете пакет IPv4. семейство адресов равно 7 для пакета bridged и 10 для пакета IPv6.

numeric_label
Вы можете использовать эту метку для хранения информации, относящейся к ведению журнала. Администратор может определить соглашение, которое позже можно использовать для дифференциации пакетов. Например, он может хранить серьезность зарегистрированного события.

netlink_socket_buffer_size
Укажите базовый размер буфера сокета. При необходимости это начальное значение будет увеличено до netlink_socket_buffer_maxsize .

netlink_socket_buffer_maxsize
Укажите максимальный размер буфера базового сокета.

ulogd_inpflow_NFCT.so
Он взаимодействует с подсистемой ядра nfnetlink_conntrack и обеспечивает ведение журнала на основе потока. Для компиляции в вашей системе должна быть установлена libnetfilter_conntrack.

pollinterval
Измените интервал дампа отслеживания соединений.

hash_enable
Если установлено значение 1 (по умолчанию), внутренний хэш будет сохранен, и только событие уничтожения достигнет выходного плагина. При значении 0 все события восстанавливаются выходным плагином.

hash_buckets
Размер внутренней корзины хэша.

hash_max_entries
Максимальное количество записей во внутреннем хэше подключения.

event_mask
Выберите событие, полученное от ядра, на основе маски. Типы событий определяются следующим образом:

Событие создания: 0x00000001
Событие обновления: 0x00000002
Событие уничтожения: 0x00000004

netlink_socket_buffer_size
Укажите базовый размер буфера сокета. При необходимости это начальное значение будет увеличено до netlink_socket_buffer_maxsize .

netlink_socket_buffer_maxsize
Укажите максимальный размер буфера базового сокета.

ulogd_inppkt_ULOG.so
Старый добрый плагин ввода ipt_ULOG. По сути, он эмулирует ulogd-1.x, в котором не было плагинов ввода.

nlgroup
Номер группы многоадресной рассылки netlink, в которую отправляются загруженные пакеты. Вам нужно будет использовать тот же номер группы в целевом адресе ULOG и nin в плагине ввода.

numeric_label
Вы можете использовать эту метку для хранения информации, относящейся к ведению журнала. Администратор может определить соглашение, которое позже можно использовать для дифференциации пакетов. Например, он может хранить серьезность зарегистрированного события.

5.2 Плагины интерпретатора
ulogd поставляется со следующими плагинами интерпретатора:

ulogd_raw2packet_BASE.so
Базовый плагин интерпретатора для nfmark, метки времени, mac-адреса, IP-заголовка, tcp-заголовка, udp-заголовка, icmp-заголовка, ah / esp-заголовка... Большинство людей захотят загрузить этот очень важный плагин.

ulogd_filter_PWSNIFF.so
Пример плагина-интерпретатора для регистрации паролей открытым текстом, используемого с FTP и POP3. Не вините меня за написание этого плагина! Протоколы по своей сути небезопасны, и существует множество других инструментов для отслеживания паролей... это просто пример.

ulogd_filter_IFINDEX.so
Плагин фильтрации, который обеспечивает преобразование числового ifindex (например, '1') в имя сетевого интерфейса (например, 'eth4').

ulogd_LOCAL.so
Это "виртуальный интерпретатор". На самом деле он не возвращает никакой информации о самом пакете, скорее локальное системное время и имя хоста. Пожалуйста, обратите внимание, что время - это время на момент ведения журнала, а не время получения пакетов.

ulogd_filter_HWHDR.so
Этот плагин преобразует аппаратный заголовок в строку. В случае пакета Ethernet он в основном преобразует mac-адрес в строковое представление.

ulogd_filter_IP2BIN.so
Этот плагин преобразует IP-адреса в двоичную форму, доступную для таких баз данных, как MySQL.

ulogd_filter_IP2HBIN.so
Этот плагин преобразует IP-адреса в двоичную форму в порядке расположения узлов, который может быть использован такими базами данных, как MySQL.

ulogd_filter_IP2STR.so
Этот плагин преобразует IP-адреса в строку.

ulogd_filter_PRINTFLOW.so
Преобразуйте ключи относительно потока в строку, читаемую человеком.

ulogd_filter_PRINTPKT.so
Преобразуйте ключи относительно пакета в строку, читаемую человеком. Этот плагин должен использоваться для печати пакета в формате, аналогичном целевому формату журнала.

ulogd_filter_MARK.so
Когда этот плагин помещается в стек, будут регистрироваться только сообщения, отметка которых (метка пакета или метка подключения) соответствует заданной метке / маске.

отметить
Определите метку, которая будет использоваться для проверки пакета или потока.

маска
Определите маску, которая будет использоваться для проверки пакета или потока.

5.3 Плагины вывода

ulogd поставляется со следующими плагинами вывода:

ulogd_output_OPRINT.so
Очень простой модуль вывода, сбрасывающий все пакеты в формате

===>PACKET BOUNDARY
key=value
key=value
...
===>PACKET BOUNDARY
...
в файл. Единственное полезное приложение - отладка.
Модуль определяет следующие директивы конфигурации:

файл дампа dumpfile
Имя файла, в которое он должен входить. По умолчанию /var/log/ulogd.pktlog

ulogd_output_LOGEMU.so
Модуль вывода, который пытается максимально эмулировать старый журнал на основе системного журнала. Однако ведение журнала выполняется в отдельный текстовый файл, а не в системный журнал.

Модуль определяет следующие директивы конфигурации:

файл file
Имя файла, в которое он должен входить. По умолчанию /var/log/ulogd.syslogemu

синхронизация sync
Установите это значение равным 1, если вы хотите, чтобы ваш файл журнала записывался синхронно. Это может снизить производительность, но заставит строки журнала отображаться немедленно. По умолчанию 0

ulogd_output_MYSQL.so
Выходной плагин для входа в базу данных mysql. Он компилируется, только если у вас установлены библиотеки mysql, и скрипт configure смог их обнаружить. (то есть для ./configure было указано: --with-mysql)

Плагин автоматически запускает процедуру с аргументами, взятыми из настраиваемой таблицы; Он подключается к mysql на этапе запуска ulogd и получает список столбцов в таблице. Затем он пытается сопоставить имена столбцов с ключами плагинов интерпретатора. Таким образом, вы можете легко выбрать, какую информацию вы хотите зарегистрировать - просто по расположению таблицы.

Если, например, ваша таблица содержит поле с именем 'ip_saddr', ulogd разрешит это с помощью ключа 'ip.saddr' и поместит ip-адрес в виде 32-битного целого числа без знака в соответствующий аргумент table.

Файл "doc/mysql-ulogd2.sql" содержит схему для ведения журнала как пакетов, так и потоков.

Модуль определяет следующие директивы конфигурации:

таблица table
Имя таблицы, которую ulogd будет использовать для построения списка аргументов.

процедура procedure
Хранимая процедура, которая будет выполняться с аргументом, указанным в табличной переменной. Поведение параметра процедуры можно изменить, используя конкретное имя. Если имя процедуры равно:

"INSERT": классический SQL-запрос INSERT выполняется в таблице, на которую указывает переменная "table".
начните с "INSERT": в конфигурации должно быть указано начало запроса INSERT, который будет использоваться. Например, типичным значением является "ВСТАВИТЬ В ulog2".
начните с "ВЫЗОВА": именованная хранимая процедура выполняется командой MySQL "CALL".
В противном случае именованная хранимая функция выполняется командой MySQL "SELECT".

db
Имя базы данных mysql.

хост host
Имя узла базы данных mysql.

порт port
Номер TCP-порта сервера базы данных mysql.

пользователь user
Имя пользователя mysql.

пароль pass
Пароль для mysql.

пере подключение reconnect
Количество попыток повторного подключения до объявления выходного плагина неработоспособным.

connect_timeout
Время ожидания подключения к базе данных.

ulogd_output_PGSQL.so
Выходной плагин для входа в базу данных postgresql. Он компилируется, только если у вас установлены библиотеки pgsql, и скрипт configure смог их обнаружить. (то есть для ./configure было указано: --with-pgsql)

Плагин автоматически запускает процедуру с аргументами, взятыми из настраиваемой таблицы; Он подключается к pgsql на этапе запуска ulogd и получает список столбцов в таблице. Затем он пытается сопоставить имена столбцов с ключами плагинов интерпретатора. Таким образом, вы можете легко создать свою собственную процедуру и выбрать ее аргументы, просто изменив макет таблицы.

Если, например, ваша таблица содержит поле с именем 'ip_saddr', ulogd разрешит это поле с помощью ключа 'ip.saddr' и поместит ip-адрес в виде 32-битного целого числа без знака в таблицу.

Файл "doc/pgsql-ulogd2.sql" содержит схему для ведения журнала как пакетов, так и потоков.

Модуль определяет следующие директивы конфигурации:

таблица table
Имя таблицы, которую ulogd будет использовать для построения списка аргументов.

процедура procedure
Хранимая процедура, которая будет выполняться с аргументом, указанным в табличной переменной.

схема schema
Используемая схема PGSQL.

db
Имя базы данных.

хост host
Имя узла базы данных mysql.

порт port
Номер TCP-порта сервера базы данных.

пользователь user
Имя пользователя sql.

пароль pass
Пароль для пользователя sql.

переподключение reconnect
Количество попыток повторного подключения до объявления выходного плагина неработоспособным.

connect_timeout
Время ожидания подключения к базе данных.

ulogd_output_PCAP.so
Плагин вывода, который можно использовать для генерации файлов журнала пакетов в стиле libpcap. Это может быть полезно для последующего анализа журнала пакетов с помощью таких инструментов, как tcpdump или ethereal.

Модуль определяет следующие директивы конфигурации:

файл file
Имя файла, в которое он должен входить. По умолчанию: /var/log/ulogd.pcap

синхронизация sync
Установите для этого значение 1, если вы хотите, чтобы файл журнала pcap записывался синхронно. Это может снизить производительность, но ваши пакеты будут сразу отображаться в файле на диске. Значение по умолчанию равно 0

ulogd_output_SQLITE3.so
Плагин вывода для входа в базу данных SQLITE v3. Он компилируется, только если у вас установлены библиотеки sqlite, и скрипт configure смог их обнаружить. (то есть для ./configure было указано: --with-sqlite3)

Плагин автоматически вставляет данные в настроенную таблицу; Он открывает базу данных sqlite на этапе запуска ulogd и получает список столбцов в таблице. Затем он пытается сопоставить имена столбцов с ключами плагинов интерпретатора. Таким образом, вы можете легко выбрать, какую информацию вы хотите зарегистрировать - просто по расположению таблицы.

Если, например, ваша таблица содержит поле с именем 'ip_saddr', ulogd разрешит это поле с помощью ключа 'ip.saddr' и поместит ip-адрес в виде 32-битного целого числа без знака в таблицу.

Возможно, вы захотите взглянуть на файл 'doc/sqlite3.table' в качестве примера таблицы, включающей поля для регистрации всех ключей ulogd_BASE.so. Просто удалите поля, которые вас не интересуют, и создайте таблицу. Этот файл содержит две таблицы, одну для ведения журнала на основе пакетов, а другую для ведения журнала на основе потоков.

Чтобы создать файл базы данных с таблицами, вы должны вызвать следующую команду: sqlite3 ulogd.sqlite3db < sqlite3.table

Чтобы проверить, что мы правильно вводим в него данные: sqlite3 ulogd.sqlite3db "SELECT * from ulog_ct"

Модуль определяет следующие директивы конфигурации:

таблица table
Имя таблицы, в которую ulogd должен входить.

db
Имя базы данных.

буфер buffer
Размер буфера sqlite.

ulogd_output_SYSLOG.so
Плагин вывода, который действительно ведет журнал через syslogd. Строки будут выглядеть точно так же, как напечатанные с помощью традиционного целевого журнала.

Модуль определяет следующие директивы конфигурации:

средство facility
Средство ведения системного журнала (LOG_DAEMON, LOG_KERN, LOG_LOCAL0 .. LOG_LOCAL7, LOG_USER)

Уровень level
Уровень системного журнала (LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO, LOG_DEBUG)

6. ВОПРОСЫ / КОММЕНТАРИИ
Все комментарии / вопросы / ... приветствуются.

Просто напишите записку по адресу netfilter-devel@vger.kernel.org

Предпочтительным методом сообщения об ошибках является система netfilter bugzilla, доступная по адресу http://bugzilla.netfilter.org/
количество слов: 2290
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 817
Стаж: 5 лет 4 месяца
Откуда: Вологодская область
Поблагодарили: 35 раз
Контактная информация:

iptables - утилита командной строки, межсетевого экрана (брандмауэра)

Сообщение Артём Мамзиков »

Сборка из исходного кода Ulogd Ulogd2

netfilter ulogd
Git netfilter 2.0.8
netfilter.org ulogd2
Для ALTLinux rpm
Исходники ALTLinux

Пример для ALTLinux 8.2 x64

Предварительно установить

Код: Выделить всё

apt-get install rpm-build-licenses libpcap-devel zlib-devel libMySQL-devel postgresql-devel libsqlite3-devel libdbi-devel libnfnetlink-devel libmnl-devel libnetfilter_log-devel libnetfilter_conntrack-devel libnetfilter_acct-devel libjansson-devel linuxdoc-tools OpenSP
Если нет configure или даже есть желательно обновить под текущую систему.
в файле configure.ac или configure.in

Устанавливаем, если не установлено autoconf

Код: Выделить всё

apt-get install autoconf
Выполним команды

Код: Выделить всё

autoreconf -i
И

Код: Выделить всё

autoreconf
обновит файлы настройки, включая configure.ac, на основе макросов Autoconf, и создаст скрипт configure После этого вы сможете выполнить
./configure

./configure --enable-ulog --enable-nflog --enable-nfct --enable-nfacct --enable-pgsql --enable-mysql --enable-sqlite3 --enable-dbi --enable-pcap --enable-json

autoreconf
configure --disable-static --with-dbi-lib=%_libdir --with-jansson
make DESTDIR=%buildroot
make -C doc

Пропишем пути установки для altlinux и не обходимые модули для установки

Код: Выделить всё

./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var/lib/ulogd --libdir=/usr/lib64 --libexecdir=/usr/lib64/ulogd --sbindir=/usr/sbin --datadir=/usr/share/ulogd --docdir=/usr/share/doc/ulogd --mandir=/usr/share/man/man8 --with-logrotate=/etc/logrotate.d --with-initdir=/etc/rc.d/init.d --with-systemdsystemunitdir=/lib/systemd/system --disable-static --with-dbi-lib=/usr/lib64 --with-jansson --enable-ulog --enable-nflog --enable-nfct --enable-nfacct --enable-pgsql --enable-mysql --enable-sqlite3 --enable-dbi --enable-pcap --enable-json
Если ошибок нет пакеты разработчика все установлены продолжаем дальше Устанавливаем

Код: Выделить всё

make install

Код: Выделить всё

./configure --help
Описание параметров в configure --help
Показать
`configure' настраивает ulogd 2.0.8 для адаптации ко многим типам систем.

Использование: ./configure [ОПЦИЯ]... [VAR=ЗНАЧЕНИЕ]..

Чтобы назначить переменные окружения (например, CC, CFLAGS...), укажите их как
VAR=ЗНАЧЕНИЕ. Смотрите ниже описания некоторых полезных переменных.

Значения по умолчанию для параметров указаны в квадратных скобках.

Конфигурация:
-h, --help отобразите эту справку и выйдите
--help=short параметры отображения, характерные для данного пакета
--help=recursive отобразите краткую справку по всем включенным пакетам
-V, --version отобразите информацию о версии и выйдите
-q, --quiet, --silent не печатайте сообщения `проверка..."
--cache-file=FILE кэшировать результаты теста в ФАЙЛЕ [отключено]
-C, --config-cache alias/псевдоним для `--cache-file=config.cache'
-n, --no-create не создавайте выходные файлы
--srcdir=DIR найдите исходники в каталоге [настроить каталог или `..']

Установочные каталоги:
--prefix=PREFIX установите архитектурно-независимые файлы в PREFIX
[/usr/local]
--exec-prefix=EPREFIX установите файлы, зависящие от архитектуры, в PREFIX
[PREFIX]

По умолчанию, `make install' установит все файлы в
`/usr/local/bin', `/usr/local/lib' etc. Вы можете указать
способ установки префикс, отличный от `/usr/local' с помощью `--prefix',
например `--prefix=$HOME'.

Для лучшего контроля используйте приведенные ниже опции.

Точная настройка установочных каталогов:
--bindir=DIR пользовательские исполняемые файлы [EPREFIX/bin]
--sbindir=DIR исполняемые файлы системного администратора [EPREFIX/sbin]
--libexecdir=DIR исполняемые файлы программы [EPREFIX/libexec]
--sysconfdir=DIR данные для одной машины, доступные только для чтения [PREFIX/etc]
--sharedstatedir=DIR изменяемые данные, не зависящие от архитектуры [PREFIX/com]
--localstatedir=DIR изменяемые данные для одной машины [PREFIX/var]
--libdir=DIR библиотеки объектного кода [EPREFIX/lib]
--includedir=DIR Заголовочные файлы C [PREFIX/include]
--oldincludedir=DIR Заголовочные файлы C для не-gcc [/usr/include]
--datarootdir=DIR только для чтения arch.-independent/независимые данные root [PREFIX/share]
--datadir=DIR данные, не зависящие от архитектуры, доступны только для чтения [DATAROOTDIR]
--infodir=DIR информационная документация [DATAROOTDIR/info]
--localedir=DIR данные, зависящие от языка [DATAROOTDIR/locale]
--mandir=DIR документация [DATAROOTDIR/man]
--docdir=DIR документация администраторов/root [DATAROOTDIR/doc/ulogd]
--htmldir=DIR html документация [DOCDIR]
--dvidir=DIR dvi документация [DOCDIR]
--pdfdir=DIR pdf документация [DOCDIR]
--psdir=DIR ps документация [DOCDIR]

Названия программ:
--program-prefix=PREFIX добавляйте ПРЕФИКС к именам установленных программ
--program-suffix=SUFFIX добавляйте СУФФИКС к названиям установленных программ
--program-transform-name=PROGRAM запустите программу sed по именам установленных программ

Типы систем:
--build=BUILD настроить для сборки при сборке [guessed]
--host=HOST перекрестная компиляция для создания программ для запуска на хосте [BUILD]

Дополнительные функции:
--disable-option-checking игнорировать непризнанное --enable/--with options
--disable-FEATURE не включать ФУНКЦИЮ (такую же, как --enable-FEATURE=no)
--enable-FEATURE[=ARG] включить ФУНКЦИЮ [ARG=yes]
--enable-silent-rules менее подробный вывод сборки (отмена: "make V=1")
--disable-silent-rules подробный вывод сборки (отменить: "make V=0")
--enable-dependency-tracking не отвергайте медленные средства извлечения зависимостей
--disable-dependency-tracking ускоряет одноразовую сборку
--enable-static[=PKGS] создавайте статические библиотеки [default=no]
--enable-shared[=PKGS] создавайте общие библиотеки [default=yes]
--enable-fast-install[=PKGS] оптимизация для быстрой установки [default=yes]
--disable-libtool-lock избегайте блокировки (может нарушить параллельную сборку)
--disable-largefile исключить поддержку больших файлов
--enable-ulog Включить модуль ulog [по умолчанию=да]
--enable-nflog Включить модуль nflog [по умолчанию=да]
--enable-nfct Включить модуль nfct [по умолчанию=да]
--enable-nfacct Включить модуль nfacct [по умолчанию=да]
--enable-pgsql Включить плагин вывода PostgreSQL [по умолчанию=тест]
--enable-mysql Включить плагин вывода MySQL [по умолчанию=тест]
--enable-sqlite3 Включить плагин вывода SQLITE3 [по умолчанию=тест]
--enable-dbi Включить плагин вывода DBI [по умолчанию=тест]
--enable-pcap Включить плагин вывода PCAP [по умолчанию=тест]
--enable-json Включить плагин вывода JSON [по умолчанию=тест]

Дополнительные пакеты:
--with-PACKAGE[=ARG] использовать ПАКЕТ [ARG=yes]
--without-PACKAGE не используйте ПАКЕТ (такой же, как --with-PACKAGE=no)
--with-pic[=PKGS] старайтесь использовать только объекты PIC/non-PIC [по умолчанию=use both]
--with-aix-soname=aix|svr4|both вариант управления версиями разделяемой библиотеки (он же "SONAME"), предоставляемый в AIX, [по умолчанию=aix].
--with-gnu-ld предположим, что компилятор C использует GNU ld [по умолчанию=нет]
--with-sysroot[=DIR] Выполните поиск зависимых библиотек в каталоге (или в системном корне компилятора, если он не указан).
--with-pg-config=PATH Путь к скрипту pg_config
--with-mysql-config=PATH Путь к скрипту mysql_config
--with-pcap-config=PATH Путь к скрипту pcap-config
--with-ulogd2libdir=PATH Каталог по умолчанию для загрузки плагина ulogd2 из [[LIBDIR/ulogd]]

Некоторые влиятельные переменные среды:
CC Команда компилятора C
CFLAGS Флаги компилятора C
LDFLAGS флаги компоновщика, например -L<lib dir>, если у вас есть библиотеки в нестандартном каталоге <lib dir>
LIBS библиотеки для передачи компоновщику, например -l<библиотека>
CPPFLAGS (Objective) Флаги препроцессора C/C++, например -I<включить каталог>, если у вас есть заголовки в нестандартном каталоге <включить каталог>
LT_SYS_LIBRARY_PATH Определенный пользователем путь поиска библиотеки во время выполнения.
CPP C препроцессор
PKG_CONFIG путь к утилите pkg-config
PKG_CONFIG_PATH каталоги для добавления в путь поиска pkg-config
PKG_CONFIG_LIBDIR путь, переопределяющий встроенный путь поиска pkg-config
LIBNFNETLINK_CFLAGS Флаги компилятора C для LIBNFNETLINK, переопределяющие pkg-config
LIBNFNETLINK_LIBS флаги компоновщика для LIBNFNETLINK, переопределяющие pkg-config
LIBNETFILTER_LOG_CFLAGS Флаги компилятора C для LIBNETFILTER_LOG, переопределяющие pkg-config
LIBNETFILTER_LOG_LIBS флаги компоновщика для LIBNETFILTER_LOG, переопределяющие pkg-config
LIBNETFILTER_CONNTRACK_CFLAGS Флаги компилятора C для LIBNETFILTER_CONNTRACK, переопределяющие pkg-config
LIBNETFILTER_CONNTRACK_LIBS флаги компоновщика для LIBNETFILTER_CONNTRACK, переопределяющие pkg-config
LIBMNL_CFLAGS Флаги компилятора C для LIBMNL, переопределяющие pkg-config
LIBMNL_LIBS флаги компоновщика для LIBMNL, переопределяющие pkg-config
LIBNETFILTER_ACCT_CFLAGS Флаги компилятора C для LIBNETFILTER_ACCT, переопределяющие pkg-config
LIBNETFILTER_ACCT_LIBS флаги компоновщика для LIBNETFILTER_ACCT, переопределяющие pkg-config
libpq_CFLAGS Флаги компилятора C для libpq, переопределяющие pkg-config
libpq_LIBS флаги компоновщика для libpq, переопределяющие pkg-config
libmysqlclient_CFLAGS Флаги компилятора C для libmysqlclient, переопределяющие pkg-config
libmysqlclient_LIBS флаги компоновщика для libmysqlclient, переопределяющие pkg-config
libsqlite3_CFLAGS Флаги компилятора C для libsqlite3, переопределяющие pkg-config
libsqlite3_LIBS флаги компоновщика для libsqlite3, переопределяющие pkg-config
libdbi_CFLAGS Флаги компилятора C для libdbi, переопределяющие pkg-config
libdbi_LIBS флаги компоновщика для libdbi, переопределяющие pkg-config
libpcap_CFLAGS Флаги компилятора C для libpcap, переопределяющие pkg-config
libpcap_LIBS флаги компоновщика для libpcap, переопределяющие pkg-config
libjansson_CFLAGS Флаги компилятора C для libjansson, переопределяющие pkg-config
libjansson_LIBS флаги компоновщика для libjansson, переопределяющие pkg-config

Используйте эти переменные, чтобы переопределить выбор, сделанный "configure", или помочь ему найти библиотеки и программы с нестандартными именами/расположениями.

Сообщайте об ошибках поставщику пакетов.

Пример файла ulogd.spec
переменные пути ulogd.spec
Показать
#! /bin/sh

apt-get install rpm-build-licenses libpcap-devel zlib-devel libMySQL-devel postgresql-devel libsqlite3-devel libdbi-devel libnfnetlink-devel libmnl-devel libnetfilter_log-devel libnetfilter_conntrack-devel libnetfilter_acct-devel libjansson-devel linuxdoc-tools OpenSP


%def_disable nfacct

%define _unpackaged_files_terminate_build 1

Summary: ulogd - The userspace logging daemon for netfilter
Url: http://www.netfilter.org/projects/ulogd/
License: %gpl2plus
Group: System/Servers


%prep
%setup
ulogd-2.0.7-alt1.patch -p1


build
#export CFLAGS="$RPM_OPT_FLAGS -fPIC"
autoreconf
configure --disable-static --with-dbi-lib=/usr/lib64 --with-jansson


make DESTDIR=
make -C doc
#rm -f ulogd
#export LDFALGS="-pie"
#make ulogd

install
mkdir -p /var/log/ulogd
mkdir -p /etc
mkdir -p /usr/lib64/ulogd
mkdir -p /usr/sbin
makeinstall_std
mkdir -p /etc/rc.d/init.d
install ulogd.init /etc/rc.d/init.d/ulogd
install -pDm644 ulogd.service /lib/systemd/system/ulogd.service
install -pDm644 ulogd.logrotate /etc/logrotate.d/ulogd
mkdir -p /usr/share/ulogd
install -pm644 doc/*.sql /usr/share/ulogd/
install -pm644 doc/sqlite3.table /usr/share/ulogd/
mkdir -p /var/lib/ulogd/
mkdir -p /usr/share/man/man8
install -pm644 ulogd.8 /usr/share/man/man8/ulogd.8
install -Dm0640 ulogd.conf /etc/ulogd.conf

if_disabled nfacct
sed -i -r 's;^(plugin="/usr/lib64/ulogd/ulogd_inpflow_NFACCT\.so");#\1;' /etc/ulogd.conf
endif

%pre
/usr/sbin//groupadd -r -f ulogd >/dev/null 2>&1
/usr/sbin//useradd -r -n -g ulogd -d /dev/null -s /dev/null ulogd >/dev/null 2>&1 ||:

%preun
%preun_service ulogd

%files
%attr(0755,root,root) /usr/sbin//ulogd
%attr(0640,root,ulogd) %config(noreplace) /etc/ulogd.conf
/etc/rc.d/init.d/ulogd
lib/systemd/system/ulogd.service
%config(noreplace) /etc/logrotate.d/ulogd
%dir /usr/lib64/ulogd
%attr(1770,root,ulogd) var/log/ulogd/ulogd
/usr/lib64/ulogd/*.so
/usr/share/doc/ COPYING AUTHORS README
/usr/share/doc/ulogd.txt /usr/share/doc/ulogd.html
/usr/share/man/man8/*
%attr(1770,root,ulogd) var/lib/ulogd/
%dir /usr/share/ulogd/

%exclude /usr/lib64/ulogd/*.la
%exclude /usr/lib64/ulogd/ulogd_output_MYSQL.so
%exclude /usr/lib64/ulogd/ulogd_output_PGSQL.so
%exclude /usr/lib64/ulogd/ulogd_output_SQLITE3.so
%exclude /usr/lib64/ulogd/ulogd_output_DBI.so

%files mysql
/usr/lib64/ulogd/ulogd_output_MYSQL.so
/usr/share/ulogd/mysql-*.sql

%files pgsql
/usr/lib64/ulogd/ulogd_output_PGSQL.so
/usr/share/ulogd/pgsql-*.sql

%files sqlite3
/usr/lib64/ulogd/ulogd_output_SQLITE3.so
/usr/share/ulogd/sqlite3.table

%files dbi
/usr/lib64/ulogd/ulogd_output_DBI.so

%changelog
количество слов: 1109
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 817
Стаж: 5 лет 4 месяца
Откуда: Вологодская область
Поблагодарили: 35 раз
Контактная информация:

iptables - утилита командной строки, межсетевого экрана (брандмауэра)

Сообщение Артём Мамзиков »

Задача использовать iptables , перед командами блокировки или разрешения определенного порта на определения кто на его подключается.
Без логов, без запуска проверки кроном или другим способом, при подключении на определенный порт iptables сразу же сам передавал данные на заббикс сервер.

Попытки не удачные передать данные в скрипт
Первоначальные попытки
Показать
iptables -A INPUT -p tcp -m multiport --dports 3306,3389,445,21,22,23,25,80,443,109,110,143,1433,1434 -j LOG --log-prefix "PINGDETECTED "
работает но пишет в лог файл не подходит

На основе действия EXEC
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j EXEC --exec "/путь/к/вашему/скрипту.sh"
Вместо "/путь/к/вашему/скрипту.sh" вам нужно указать путь к вашему скрипту, который будет выполнен при подключении.
В вашем скрипте вы можете добавить необходимые действия, которые должны выполняться при подключении.
Например, вы можете использовать команду echo для вывода информации о подключающемся IP-адресе.

Команда
используется для выполнения команды или скрипта при появлении нового входящего TCP-пакета на порту 22.
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j EXEC --exec "/etc/zabbix/scripts/portmonitor.sh"
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j EXEC --cmd "/etc/zabbix/scripts/portmonitor.sh"
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j EXEC --command "/etc/zabbix/scripts/portmonitor.sh"
Параметр --jump или --goto
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW --goto "/etc/zabbix/scripts/portmonitor.sh"
Отключившиеся
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate ESTABLISHED,RELATED -j EXEC --exec "/etc/zabbix/scripts/portmonitor.sh"

описание:
- `iptables`: Команда для управления правилами фильтрации пакетов в Linux.
- `-A INPUT`: Добавляет правило в цепочку INPUT, которая отвечает за обработку входящего трафика.
- `-p tcp`: Указывает протокол TCP для применения правила только к TCP-пакетам.
- `--dport 1161`: Указывает порт назначения, в данном случае 1161, к которому применяется правило.
- `-m conntrack --ctstate NEW`: Использует модуль conntrack Трассировка соединений и параметр состояние соединения `--ctstate NEW`, чтобы применить правило только к новым соединениям.
- `-j EXEC`: Определяет действие, которое должно быть выполнено, если пакет соответствует правилу. В данном случае, используется действие EXEC.
- `--exec "/путь/к/вашему/скрипту.sh"`: Указывает путь к исполняемому файлу или скрипту, который должен быть выполнен, когда пакет соответствует правилу. Замените `"/путь/к/вашему/скрипту.sh"` на фактический путь к вашему скрипту.

Таким образом, при каждом появлении нового входящего TCP-пакета на порту 22, команда `"/путь/к/вашему/скрипту.sh"` будет выполнена.
Вы можете использовать этот скрипт для выполнения необходимых действий при подключении к порту 22.

/etc/zabbix/scripts/portmonitor.sh

Код: Выделить всё

#!/bin/bash

# Получение информации о подключении из переменных окружения
source_ip="$SRC"
destination_ip="$DST"
protocol="$PROTO"

# Действия, которые нужно выполнить при подключении
# Например, запись информации в журнал или выполнение других команд

# Пример: Запись информации в файл
echo "Подключение от $source_ip к $destination_ip с использованием протокола $protocol" >> /root/test.log
Похоже, что вы пытаетесь выполнить скрипт, используя параметр --exec, но этот параметр недоступен в более ранних версиях iptables.
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j EXEC_SCRIPT
Добавьте правило в цепочку EXEC_SCRIPT для выполнения скрипта:
iptables -A EXEC_SCRIPT -exec --exec "/etc/zabbix/scripts/portmonitor.sh"

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j LOG --log-prefix "SSH connection: " --log-level 4
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j EXEC /path/to/your/script.sh

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j LOG --log-prefix "SSH Connection:" --log-level 7 ; exec /etc/zabbix/scripts/portmonitor.sh

Параметр "exec" в iptables не является стандартным и не поддерживается ядром Linux.
Добавление поддержки параметра "exec" в iptables требует изменения исходного кода iptables и перекомпиляции. Однако, следует помнить, что это нестандартное действие и может привести к непредсказуемому поведению вашей системы.
Если вы все равно хотите продолжить с этим подходом, вам придется вносить изменения в исходный код iptables. Вот общий шаговый план:
Скачайте исходный код iptables: Сначала вам нужно получить исходный код iptables. Вы можете найти его на официальном сайте проекта iptables или на GitHub.
Измените исходный код: Внесите изменения в исходный код iptables, чтобы добавить поддержку параметра "exec". Это может потребовать изменений в различных файлах, связанных с обработкой правил iptables.
Перекомпилируйте iptables: После внесения изменений вам нужно перекомпилировать iptables. Убедитесь, что у вас установлены все необходимые зависимости для компиляции.
Установите измененную версию iptables: После успешной компиляции установите измененную версию iptables на своей системе.
Тестирование: После установки измененной версии iptables протестируйте ее, чтобы убедиться, что параметр "exec" работает так, как вы ожидаете.
Помните, что внесение изменений в исходный код iptables может быть сложным и подвержено риску неправильной работы системы. Поэтому перед тем как приступить к этому, убедитесь, что вы понимаете последствия и принимаете все возможные меры предосторожности.


Если вы хотите включить поддержку параметра "exec" в ядре Linux, то это может быть связано с добавлением определенного модуля ядра или функциональности. Однако, стоит отметить, что параметр "exec" не является стандартным параметром iptables или ядра Linux.
Если вы все равно хотите продолжить с этим, вам может потребоваться внести изменения в исходный код ядра Linux и перекомпилировать ядро. Вот общий шаговый план:
Получите исходный код ядра Linux: Сначала вам нужно получить исходный код ядра Linux. Вы можете найти его на официальном сайте kernel.org или на GitHub.
Измените исходный код ядра: Внесите необходимые изменения в исходный код ядра Linux, чтобы добавить поддержку параметра "exec". Это может потребовать изменений в различных частях кода, связанных с обработкой пакетов и iptables.
Настройте конфигурацию ядра: Убедитесь, что включили новую функциональность или модуль в конфигурации ядра. Это может потребовать изменений в файле конфигурации ядра (например, через make menuconfig).
Перекомпилируйте ядро: После внесения изменений вам нужно перекомпилировать ядро Linux. Убедитесь, что у вас установлены все необходимые зависимости для компиляции ядра.
Установите новое ядро: После успешной компиляции установите новое ядро на вашей системе и перезагрузите ее.
Тестирование: После перезагрузки системы убедитесь, что параметр "exec" работает так, как вы ожидаете.
Помните, что внесение изменений в ядро Linux может быть сложным и потенциально опасным для стабильности и безопасности системы. Поэтому убедитесь, что вы понимаете последствия и принимаете все необходимые меры предосторожности.


iptables -A INPUT -p tcp --match multiport --dports 22,1161,80,443,523 -m conntrack --ctstate NEW -j LOG --log-prefix "Connection:" --log-level 7
Опция LOG в команде iptables используется для логирования пакетов, которые соответствуют заданному правилу.
Параметр --log-prefix "Connection:" устанавливает префикс для сообщения в логах, который будет отображаться перед каждой записью.
В данном случае префикс установлен как "Connection:". Параметр --log-level 7 устанавливает уровень логирования. Уровень 7 означает DEBUG,
что соответствует наивысшему уровню детализации логирования.

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j NFQUEUE --queue-num 1
После перенаправления трафика в очередь NFQUEUE с помощью этого правила, вы можете написать отдельный скрипт с помощью инструмента, такого как nfqueue-bindings,
для обработки пакетов из очереди и выполнения желаемого скрипта, когда он обнаруживает пакеты, соответствующие критериям.
Попытки через nflog так же не удачно
1. iptables -A INPUT -p tcp --dport 22 -j NFLOG --nflog-prefix "Port 22 Connection: " --nflog-exec /etc/zabbix/scripts/portmonitor.sh

2. В файле конфигурации при выводе в лог запускать еще скрипт
[emu1]
file="/var/log/ulogd/ulogd_syslogemu.log"
sync=1
exec="/etc/zabbix/scripts/portmonitor.sh"


Переделываем ulogd под эту задачу.

Переделать под скрипт sh (передача всех данных и запуск скрипта) вместо файла лога.
Примерный план действий:

1. Вид настройки конфигурации

Код: Выделить всё

nano /etc/ulogd.conf

Код: Выделить всё


#plugin="/usr/lib64/ulogd/ulogd_output_ZABBIXSCRIPT.so"

stack=log1:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,hwhdr1:HWHDR,print1:PRINTPKT,script1:ZABBIXSCRIPT

# ВЫВОД**********************************************************************************
[script1]
# Путь на скрипт
pathscript="/etc/zabbix/scripts/iptablesulogmonitor.sh"
# Синхронизация значение 1 синхронно
sync=1
# Штамп времени 0 выключен, 1 включен
timestamp=1
# Данные для zabbix_sender
# IP/DNS zabbix сервера
ipzabbix=192.168.175.111
# Порт zabbix
portzabbix=10051
# Имя узла сети, текущее имя хоста
namehost=имя-узла
# Ключ куда передаем данные
zabbixkey=iptablesulog
2. Скрипт передающий данные траппером заббиксу

Код: Выделить всё

nano /etc/zabbix/scripts/iptablesulogmonitor.sh

Код: Выделить всё

#!/bin/bash
# Для теста
echo "Передача всех аргументов: $@" >> /var/log/ulogd/test.txt
# Передача в zabbix
ipzabbix=$1
portzabbix=${2:-10051}
namehost=$3
zabbixkey=$4
# Данные ulog передаваемые zabbix
data=$5
zabbix_sender -z $ipzabbix -p $portzabbix -s "$namehost" -k zabbixkey -o "${data}"
3. Создание плагина ZABBIXSCRIPT.so
переделать LOGEMU под работу скрипта ZABBIXSCRIPT
/ulogd-2.0.7/output/ulogd_output_LOGEMU.c
переделываем под
/ulogd-2.0.7/output/ulogd_output_ZABBIXSCRIPT.c

gcc -shared -fPIC -o ulogd_ZABBIXSCRIPT.so ulogd_output_ZABBIXSCRIPT.c

Готовый плагин закидываем .so
/usr/lib64/ulogd/

Проверяем

Код: Выделить всё

service ulogd restart

Код: Выделить всё

service ulogd status
Не вышло... так сразу пробуем частями вносить изменения.


Тесты сборки плагина на ALTLinux 8.2
ulogd-c9f2-00e7725.zip
ulogd-c9f2-00e7725.zip
(3.28 МБ) 4 скачивания
Плагины лежат в /ulogd-c9f2-00e7725/ulogd/output/orig

В помощь в создании GPT

1.Вначале пробуем просто изменить вывод в журнал/Лог в плагине ulogd_output_LOGEMU

Конфигурация стандартная
stack=log1:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,emu1:LOGEMU


/ulogd-c9f2-00e7725/ulogd/output/orig/штамп времени

Код: Выделить всё

/* ulogd_LOGEMU.c
 *
 * ulogd output target for syslog logging emulation
 *
 * This target produces a file which looks the same like the syslog-entries
 * of the LOG target.
 *
 * (C) 2000-2005 by Harald Welte <laforge@gnumonks.org>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 
 *  as published by the Free Software Foundation
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <ulogd/ulogd.h>
#include <ulogd/conffile.h>

#ifndef HOST_NAME_MAX
#warning this libc does not define HOST_NAME_MAX
#define HOST_NAME_MAX	(255+1)
#endif

#ifndef ULOGD_LOGEMU_DEFAULT
#define ULOGD_LOGEMU_DEFAULT	"/var/log/ulogd/ulogd_syslogemu.log"
#endif

#ifndef ULOGD_LOGEMU_SYNC_DEFAULT
#define ULOGD_LOGEMU_SYNC_DEFAULT	0
#endif

static char hostname[HOST_NAME_MAX + 1];

static struct ulogd_key logemu_inp[] = {
    {
        .type = ULOGD_RET_STRING,
        .name = "print",
    },
    {
        .type = ULOGD_RET_UINT32,
        .flags = ULOGD_KEYF_OPTIONAL,
        .name = "oob.time.sec",
    },
};

static struct config_keyset logemu_kset = {
    .num_ces = 2,
    .ces = {
        {
            .key = "file",
            .type = CONFIG_TYPE_STRING,
            .options = CONFIG_OPT_NONE,
            .u = {.string = ULOGD_LOGEMU_DEFAULT},
        },
        {
            .key = "sync",
            .type = CONFIG_TYPE_INT,
            .options = CONFIG_OPT_NONE,
            .u = {.value = ULOGD_LOGEMU_SYNC_DEFAULT},
        },
    },
};

struct logemu_instance {
    FILE *of;
};

static int _output_logemu(struct ulogd_pluginstance *upi)
{
    struct logemu_instance *li = (struct logemu_instance *)&upi->private;
    struct ulogd_key *res = upi->input.keys;

    if (res[0].u.source->flags & ULOGD_RETF_VALID) {
        char *tmp;
        time_t now;
        struct tm *tm_info;

        if (res[1].u.source && (res[1].u.source->flags & ULOGD_RETF_VALID))
            now = (time_t)res[1].u.source->u.value.ui32;
        else
            now = time(NULL);

        tm_info = localtime(&now);

        char timestamp[17];
        strftime(timestamp, sizeof(timestamp), "%Y%m%d:%H%M%S", tm_info);

        // Добавляем текущую секунду
        sprintf(timestamp + strlen(timestamp), "%02d", tm_info->tm_sec);

        fprintf(li->of, "%s %s %s", timestamp, hostname, (char *)res[0].u.source->u.value.ptr);

        if (upi->config_kset->ces[1].u.value)
            fflush(li->of);
    }

    return ULOGD_IRET_OK;
}

static void signal_handler_logemu(struct ulogd_pluginstance *pi, int signal)
{
    struct logemu_instance *li = (struct logemu_instance *)&pi->private;
    FILE *old = li->of;

    switch (signal) {
    case SIGHUP:
        ulogd_log(ULOGD_NOTICE, "syslogemu: reopening logfile\n");
        li->of = fopen(pi->config_kset->ces[0].u.string, "a");
        if (!li->of) {
            ulogd_log(ULOGD_ERROR, "can't reopen syslogemu: %s\n", strerror(errno));
            li->of = old;
        }
        else {
            fclose(old);
        }
        break;
    default:
        break;
    }
}

static int start_logemu(struct ulogd_pluginstance *pi)
{
    struct logemu_instance *li = (struct logemu_instance *)&pi->private;
    char *tmp;

    ulogd_log(ULOGD_DEBUG, "starting logemu\n");

#ifdef DEBUG_LOGEMU
    li->of = stdout;
#else
    ulogd_log(ULOGD_DEBUG, "opening file: %s\n", pi->config_kset->ces[0].u.string);
    li->of = fopen(pi->config_kset->ces[0].u.string, "a");
    if (!li->of) {
        ulogd_log(ULOGD_FATAL, "can't open syslogemu: %s\n", strerror(errno));
        return -errno;
    }
#endif

    if (gethostname(hostname, sizeof(hostname)) < 0) {
        ulogd_log(ULOGD_FATAL, "can't gethostname(): %s\n", strerror(errno));
        return -EINVAL;
    }

    /* truncate hostname */
    if ((tmp = strchr(hostname, '.')))
        *tmp = '\0';

    return 0;
}

static int fini_logemu(struct ulogd_pluginstance *pi)
{
    struct logemu_instance *li = (struct logemu_instance *)&pi->private;

    if (li->of != stdout)
        fclose(li->of);

    return 0;
}

static int configure_logemu(struct ulogd_pluginstance *pi, struct ulogd_pluginstance_stack *stack)
{
    ulogd_log(ULOGD_DEBUG, "parsing config file section %s\n", pi->id);
    return config_parse_file(pi->id, pi->config_kset);
}

static struct ulogd_plugin logemu_plugin = {
    .name = "LOGEMU",
    .input = {
        .keys = logemu_inp,
        .num_keys = ARRAY_SIZE(logemu_inp),
        .type = ULOGD_DTYPE_PACKET | ULOGD_DTYPE_FLOW,
    },
    .output = {
        .type = ULOGD_DTYPE_SINK,
    },
    .config_kset = &logemu_kset,
    .priv_size = sizeof(struct logemu_instance),

    .configure = &configure_logemu,
    .start = &start_logemu,
    .stop = &fini_logemu,

    .interp = &_output_logemu,
    .signal = &signal_handler_logemu,
    .version = VERSION,
};

void __attribute__((constructor)) init(void);

void init(void)
{
    ulogd_register_plugin(&logemu_plugin);
}
После изменения пере собираем и устанавливаем

Код: Выделить всё

./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var/lib/ulogd --libdir=/usr/lib64 --libexecdir=/usr/lib64/ulogd --sbindir=/usr/sbin --datadir=/usr/share/ulogd --docdir=/usr/share/doc/ulogd --mandir=/usr/share/man/man8 --with-logrotate=/etc/logrotate.d --with-initdir=/etc/rc.d/init.d --with-systemdsystemunitdir=/lib/systemd/system --disable-static --with-dbi-lib=/usr/lib64 --with-jansson --enable-ulog --enable-nflog --enable-nfct --enable-nfacct --enable-pgsql --enable-mysql --enable-sqlite3 --enable-dbi --enable-pcap --enable-json

Код: Выделить всё

make install
Рестартуем службы и проверяем вывод то что в начале строк появился штамп времени

Код: Выделить всё

service ulogd restart
Проверяем

Код: Выделить всё

service ulogd status
Штамп времени в начале строки добавился точнее изменился формат yyyyMMdd:hhmmss

А такой Лог уже можно мониторить через Zabbix Активный Агент
Мониторинг файлов журналов
Используйте один из представленных ключей элементов данных:
log[] или logrt[]
Плюс в том что не надо запускать команду на проверку изменились записи в логе , появились новые или нет строки кроном через скрипт или самим заббикс агентом.


2. Экспериментируем дальше пробуем добавить вывод данных в скрипт
/ulogd-c9f2-00e7725/ulogd/output/orig/Скрипт + Лог

Код: Выделить всё

/* ulogd_LOGEMU.c
 *
 * ulogd output target for syslog logging emulation
 *
 * This target produces a file which looks the same like the syslog-entries
 * of the LOG target.
 *
 * (C) 2000-2005 by Harald Welte <laforge@gnumonks.org>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 
 *  as published by the Free Software Foundation
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <ulogd/ulogd.h>
#include <ulogd/conffile.h>

#ifndef HOST_NAME_MAX
#warning this libc does not define HOST_NAME_MAX
#define HOST_NAME_MAX	(255+1)
#endif

#ifndef ULOGD_LOGEMU_DEFAULT
#define ULOGD_LOGEMU_DEFAULT	"/var/log/ulogd/ulogd_syslogemu.log"
#endif

#ifndef ULOGD_LOGEMU_SYNC_DEFAULT
#define ULOGD_LOGEMU_SYNC_DEFAULT	0
#endif

static char hostname[HOST_NAME_MAX + 1];

static struct ulogd_key logemu_inp[] = {
    {
        .type = ULOGD_RET_STRING,
        .name = "print",
    },
    {
        .type = ULOGD_RET_UINT32,
        .flags = ULOGD_KEYF_OPTIONAL,
        .name = "oob.time.sec",
    },
};

static struct config_keyset logemu_kset = {
    .num_ces = 2,
    .ces = {
        {
            .key = "file",
            .type = CONFIG_TYPE_STRING,
            .options = CONFIG_OPT_NONE,
            .u = {.string = ULOGD_LOGEMU_DEFAULT},
        },
        {
            .key = "sync",
            .type = CONFIG_TYPE_INT,
            .options = CONFIG_OPT_NONE,
            .u = {.value = ULOGD_LOGEMU_SYNC_DEFAULT},
        },
    },
};

struct logemu_instance {
    FILE *of;
};

static int _output_logemu(struct ulogd_pluginstance *upi)
{
    struct logemu_instance *li = (struct logemu_instance *)&upi->private;
    struct ulogd_key *res = upi->input.keys;

    if (res[0].u.source->flags & ULOGD_RETF_VALID) {
        char *tmp;
        time_t now;
        struct tm *tm_info;

        if (res[1].u.source && (res[1].u.source->flags & ULOGD_RETF_VALID))
            now = (time_t)res[1].u.source->u.value.ui32;
        else
            now = time(NULL);

        tm_info = localtime(&now);

        char timestamp[15];
        strftime(timestamp, sizeof(timestamp), "%Y%m%d:%H%M%S", tm_info);

        fprintf(li->of, "%s %s %s\n", timestamp, hostname, (char *)res[0].u.source->u.value.ptr);

        if (upi->config_kset->ces[1].u.value)
            fflush(li->of);

        char command[PATH_MAX];
        snprintf(command, sizeof(command), "/var/log/ulogd/myscript.sh \"%s\" \"%s\" \"%s\"", timestamp, hostname, (char *)res[0].u.source->u.value.ptr);
        int status = system(command);
        if (status == -1) {
            ulogd_log(ULOGD_ERROR, "Failed to execute script: %s\n", strerror(errno));
        }
    }

    return ULOGD_IRET_OK;
}

static void signal_handler_logemu(struct ulogd_pluginstance *pi, int signal)
{
    struct logemu_instance *li = (struct logemu_instance *)&pi->private;
    FILE *old = li->of;

    switch (signal) {
    case SIGHUP:
        ulogd_log(ULOGD_NOTICE, "syslogemu: reopening logfile\n");
        li->of = fopen(pi->config_kset->ces[0].u.string, "a");
        if (!li->of) {
            ulogd_log(ULOGD_ERROR, "can't reopen syslogemu: %s\n", strerror(errno));
            li->of = old;
        }
        else {
            fclose(old);
        }
        break;
    default:
        break;
    }
}

static int start_logemu(struct ulogd_pluginstance *pi)
{
    struct logemu_instance *li = (struct logemu_instance *)&pi->private;
    char *tmp;

    ulogd_log(ULOGD_DEBUG, "starting logemu\n");

#ifdef DEBUG_LOGEMU
    li->of = stdout;
#else
    ulogd_log(ULOGD_DEBUG, "opening file: %s\n", pi->config_kset->ces[0].u.string);
    li->of = fopen(pi->config_kset->ces[0].u.string, "a");
    if (!li->of) {
        ulogd_log(ULOGD_FATAL, "can't open syslogemu: %s\n", strerror(errno));
        return -errno;
    }
#endif

    if (gethostname(hostname, sizeof(hostname)) < 0) {
        ulogd_log(ULOGD_FATAL, "can't gethostname(): %s\n", strerror(errno));
        return -EINVAL;
    }

    /* truncate hostname */
    if ((tmp = strchr(hostname, '.')))
        *tmp = '\0';

    return 0;
}

static int fini_logemu(struct ulogd_pluginstance *pi)
{
    struct logemu_instance *li = (struct logemu_instance *)&pi->private;

    if (li->of != stdout)
        fclose(li->of);

    return 0;
}

static int configure_logemu(struct ulogd_pluginstance *pi, struct ulogd_pluginstance_stack *stack)
{
    ulogd_log(ULOGD_DEBUG, "parsing config file section %s\n", pi->id);
    return config_parse_file(pi->id, pi->config_kset);
}

static struct ulogd_plugin logemu_plugin = {
    .name = "LOGEMU",
    .input = {
        .keys = logemu_inp,
        .num_keys = ARRAY_SIZE(logemu_inp),
        .type = ULOGD_DTYPE_PACKET | ULOGD_DTYPE_FLOW,
    },
    .output = {
        .type = ULOGD_DTYPE_SINK,
    },
    .config_kset = &logemu_kset,
    .priv_size = sizeof(struct logemu_instance),

    .configure = &configure_logemu,
    .start = &start_logemu,
    .stop = &fini_logemu,

    .interp = &_output_logemu,
    .signal = &signal_handler_logemu,
    .version = VERSION,
};

void __attribute__((constructor)) init(void);

void init(void)
{
    ulogd_register_plugin(&logemu_plugin);
}
Дать права

Код: Выделить всё

chmod 775 /var/log/ulogd/myscript.sh
Скрипт для теста

Код: Выделить всё

nano /var/log/ulogd/myscript.sh

Код: Выделить всё

#!/bin/bash
# Для теста

#echo "Передача всех аргументов: $@" >> /var/log/ulogd/test.txt

# Для теста
#arg1=$(echo "\$1" | awk '{\$1=\$1};1')
#arg2=$(echo "\$2" | awk '{\$1=\$1};1')
#arg3=$(echo "\$3" | awk '{\$1=\$1};1')
# Исключаем аргумент [0].u.source->u.value.ptr
#if [[ "$arg3" == *"[0].u.source->u.value.ptr"* ]]; then
#  arg3=""
#fi
#echo "Передача всех аргументов: $arg1 $arg2 $arg3" >> /var/log/ulogd/test.txt


# Передача в zabbix
#ipzabbix=$1
#portzabbix=${2:-10051}
#zabbixkey=$3

# Данные ulog передаваемые zabbix
# Получение аргументов командной строки
timestamp=$1
hostname=$2
value=$3

ipzabbix=192.168.175.111
portzabbix=10051
zabbixkey=iptablesulog
#zabbix_sender -z $ipzabbix -p $portzabbix -s "$hostname" -k $zabbixkey -o "${timestam} ${hostnam} ${valu}"

# Вывод аргументов в файл
# chmod 664 /var/log/ulogd/test.txt
echo "Проверка расположения скрипта" $ipzabbix $portzabbix $hostname $zabbixkey "Timestamp:" $timestamp "Value:" $value >> /var/log/ulogd/test.txt

# Завершение скрипта
exit 0
Создать тестовый лог для вывода из скрипта

Код: Выделить всё

echo 0 > /var/log/ulogd/test.txt
Дать права на запись тестового лога из скрипта

Код: Выделить всё

chmod 664 /var/log/ulogd/test.txt
После изменения пере собираем и устанавливаем

Код: Выделить всё

./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var/lib/ulogd --libdir=/usr/lib64 --libexecdir=/usr/lib64/ulogd --sbindir=/usr/sbin --datadir=/usr/share/ulogd --docdir=/usr/share/doc/ulogd --mandir=/usr/share/man/man8 --with-logrotate=/etc/logrotate.d --with-initdir=/etc/rc.d/init.d --with-systemdsystemunitdir=/lib/systemd/system --disable-static --with-dbi-lib=/usr/lib64 --with-jansson --enable-ulog --enable-nflog --enable-nfct --enable-nfacct --enable-pgsql --enable-mysql --enable-sqlite3 --enable-dbi --enable-pcap --enable-json

Код: Выделить всё

make install
Рестартуем службы и проверяем вывод то что в начале строк появился штамп времени

Код: Выделить всё

service ulogd restart
Проверяем

Код: Выделить всё

service ulogd status
Проверяем содержимое

Код: Выделить всё

nano /var/log/ulogd/test.txt
Данные поступают через скрипт)


3.Оставим только передачу в скрипт

Код: Выделить всё

/* ulogd_LOGEMU.c
 *
 * ulogd output target for syslog logging emulation
 *
 * This target produces a file which looks the same like the syslog-entries
 * of the LOG target.
 *
 * (C) 2000-2005 by Harald Welte <laforge@gnumonks.org>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 
 *  as published by the Free Software Foundation
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <ulogd/ulogd.h>
#include <ulogd/conffile.h>

#ifndef HOST_NAME_MAX
#warning this libc does not define HOST_NAME_MAX
#define HOST_NAME_MAX	(255+1)
#endif

#ifndef ULOGD_LOGEMU_DEFAULT
#define ULOGD_LOGEMU_DEFAULT	"/var/log/ulogd/ulogd_syslogemu.log"
#endif

#ifndef ULOGD_LOGEMU_SYNC_DEFAULT
#define ULOGD_LOGEMU_SYNC_DEFAULT	0
#endif

static char hostname[HOST_NAME_MAX + 1];

static struct ulogd_key logemu_inp[] = {
    {
        .type = ULOGD_RET_STRING,
        .name = "print",
    },
    {
        .type = ULOGD_RET_UINT32,
        .flags = ULOGD_KEYF_OPTIONAL,
        .name = "oob.time.sec",
    },
};

static struct config_keyset logemu_kset = {
    .num_ces = 2,
    .ces = {
        {
            .key = "file",
            .type = CONFIG_TYPE_STRING,
            .options = CONFIG_OPT_NONE,
            .u = {.string = ULOGD_LOGEMU_DEFAULT},
        },
        {
            .key = "sync",
            .type = CONFIG_TYPE_INT,
            .options = CONFIG_OPT_NONE,
            .u = {.value = ULOGD_LOGEMU_SYNC_DEFAULT},
        },
    },
};

struct logemu_instance {
    FILE *of;
};

static int _output_logemu(struct ulogd_pluginstance *upi)
{
    struct logemu_instance *li = (struct logemu_instance *)&upi->private;
    struct ulogd_key *res = upi->input.keys;

    if (res[0].u.source->flags & ULOGD_RETF_VALID) {
        char *tmp;
        time_t now;
        struct tm *tm_info;

        if (res[1].u.source && (res[1].u.source->flags & ULOGD_RETF_VALID))
            now = (time_t)res[1].u.source->u.value.ui32;
        else
            now = time(NULL);

        tm_info = localtime(&now);

        char timestamp[15];
        strftime(timestamp, sizeof(timestamp), "%Y%m%d:%H%M%S", tm_info);

        char command[PATH_MAX];
        snprintf(command, sizeof(command), "/var/log/ulogd/myscript.sh \"%s\" \"%s\" \"%s\"", timestamp, hostname, (char *)res[0].u.source->u.value.ptr);
        int status = system(command);
        if (status == -1) {
            ulogd_log(ULOGD_ERROR, "Failed to execute script: %s\n", strerror(errno));
        }
    }

    return ULOGD_IRET_OK;
}

static void signal_handler_logemu(struct ulogd_pluginstance *pi, int signal)
{
    // Обработчик сигналов
}

static int start_logemu(struct ulogd_pluginstance *pi)
{
    struct logemu_instance *li = (struct logemu_instance *)&pi->private;
    char *tmp;

    if (gethostname(hostname, sizeof(hostname)) < 0) {
        ulogd_log(ULOGD_FATAL, "can't gethostname(): %s\n", strerror(errno));
        return -EINVAL;
    }

    /* truncate hostname */
    if ((tmp = strchr(hostname, '.')))
        *tmp = '\0';

    return 0;
}

static int fini_logemu(struct ulogd_pluginstance *pi)
{
    // Завершение работы
    return 0;
}

static int configure_logemu(struct ulogd_pluginstance *pi, struct ulogd_pluginstance_stack *stack)
{
    ulogd_log(ULOGD_DEBUG, "parsing config file section %s\n", pi->id);
    return config_parse_file(pi->id, pi->config_kset);
}

static struct ulogd_plugin logemu_plugin = {
    .name = "LOGEMU",
    .input = {
        .keys = logemu_inp,
        .num_keys = ARRAY_SIZE(logemu_inp),
        .type = ULOGD_DTYPE_PACKET | ULOGD_DTYPE_FLOW,
    },
    .output = {
        .type = ULOGD_DTYPE_SINK,
    },
    .config_kset = &logemu_kset,
    .priv_size = sizeof(struct logemu_instance),

    .configure = &configure_logemu,
    .start = &start_logemu,
    .stop = &fini_logemu,

    .interp = &_output_logemu,
    .signal = &signal_handler_logemu,
    .version = VERSION,
};

void __attribute__((constructor)) init(void);

void init(void)
{
    ulogd_register_plugin(&logemu_plugin);
}
Выполняем аналогичные команды и проверяем

У меня все работает выложены уже рабочие варианты кода.


4. Создаем отдельный плагин ulogd_output_ZABBIXSCRIPT.c

Конфигурация будет иметь следующий вид

Код: Выделить всё

nano /etc/ulogd.conf
Добавляем:

Код: Выделить всё

stack=log1:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,script1:ZABBIXSCRIPT

# ВЫВОД**********************************************************************************
[emu1]
# Путь на лог файл
file="/var/log/ulogd/ulogd_syslogemu.log"
# Синхронизация значение 1 синхронно
sync=1

[script1]
# Путь на скрипт
pathscript="/etc/zabbix/scripts/portmonitor.sh"
# Синхронизация значение 1 синхронно
sync=1
# Штамп времени 0 выключен, 1 включен
timestamp=1
# Данные для zabbix_sender
# IP/DNS zabbix сервера
#ipzabbix=192.168.175.111
# Порт zabbix
#portzabbix=10051
# Ключ куда передаем данные
#zabbixkey=iptablesulog
Исходник для плагина
ulogd_output_ZABBIXSCRIPT.c

Код: Выделить всё

/* ulogd_ZABBIXSCRIPT.c
 *
 * ulogd output target for syslog logging emulation
 *
 * This target produces a file which looks the same like the syslog-entries
 * of the LOG target.
 *
 * (C) 2000-2005 by Harald Welte <laforge@gnumonks.org>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 
 *  as published by the Free Software Foundation
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <ulogd/ulogd.h>
#include <ulogd/conffile.h>

#ifndef HOST_NAME_MAX
#warning this libc does not define HOST_NAME_MAX
#define HOST_NAME_MAX    (255+1)
#endif

#ifndef ULOGD_ZABBIXSCRIPT_DEFAULT
#define ULOGD_ZABBIXSCRIPT_DEFAULT    "/var/log/ulogd/ulogd_syszabbixscript.log"
#endif

#ifndef ULOGD_ZABBIXSCRIPT_SYNC_DEFAULT
#define ULOGD_ZABBIXSCRIPT_SYNC_DEFAULT    0
#endif

#ifndef ULOGD_ZABBIXSCRIPT_PATHSCRIPT_DEFAULT
#define ULOGD_ZABBIXSCRIPT_PATHSCRIPT_DEFAULT    "/etc/zabbix/scripts/portmonitor.sh"
#endif

static char hostname[HOST_NAME_MAX + 1];
static char pathscript[PATH_MAX];

static struct ulogd_key zabbixscript_inp[] = {
    {
        .type = ULOGD_RET_STRING,
        .name = "print",
    },
    {
        .type = ULOGD_RET_UINT32,
        .flags = ULOGD_KEYF_OPTIONAL,
        .name = "oob.time.sec",
    },
};

static struct config_keyset zabbixscript_kset = {
    .num_ces = 3,
    .ces = {
        {
            .key = "file",
            .type = CONFIG_TYPE_STRING,
            .options = CONFIG_OPT_NONE,
            .u = {.string = ULOGD_ZABBIXSCRIPT_DEFAULT},
        },
        {
            .key = "sync",
            .type = CONFIG_TYPE_INT,
            .options = CONFIG_OPT_NONE,
            .u = {.value = ULOGD_ZABBIXSCRIPT_SYNC_DEFAULT},
        },
        {
            .key = "pathscript",
            .type = CONFIG_TYPE_STRING,
            .options = CONFIG_OPT_NONE,
            .u = {.string = ULOGD_ZABBIXSCRIPT_PATHSCRIPT_DEFAULT},
        },
    },
};

struct zabbixscript_instance {
    FILE *of;
};

static int _output_zabbixscript(struct ulogd_pluginstance *upi)
{
    struct ulogd_key *res = upi->input.keys;

    if (res[0].u.source->flags & ULOGD_RETF_VALID) {
        time_t now;
        struct tm *tm_info;

        if (res[1].u.source && (res[1].u.source->flags & ULOGD_RETF_VALID))
            now = (time_t)res[1].u.source->u.value.ui32;
        else
            now = time(NULL);

        tm_info = localtime(&now);

        char timestamp[15];
        strftime(timestamp, sizeof(timestamp), "%Y%m%d:%H%M%S", tm_info);

        char command[4096];
        snprintf(command, sizeof(command), "%s \"%s\" \"%s\" \"%s\"", pathscript, timestamp, hostname, (char *)res[0].u.source->u.value.ptr);
        int status = system(command);
        if (status == -1) {
            ulogd_log(ULOGD_ERROR, "Failed to execute script: %s\n", strerror(errno));
        }
    }

    return ULOGD_IRET_OK;
}

static void signal_handler_zabbixscript(struct ulogd_pluginstance *pi, int signal)
{
    // Обработчик сигналов
}

static int start_zabbixscript(struct ulogd_pluginstance *pi)
{
    char *tmp;

    if (gethostname(hostname, sizeof(hostname)) < 0) {
        ulogd_log(ULOGD_FATAL, "can't gethostname(): %s\n", strerror(errno));
        return -EINVAL;
    }

    /* truncate hostname */
    if ((tmp = strchr(hostname, '.')))
        *tmp = '\0';

    return 0;
}

static int fini_zabbixscript(struct ulogd_pluginstance *pi)
{
    // Завершение работы
    return 0;
}

static struct ulogd_key *config_find_key(const char *section, const char *name, struct config_keyset *kset)
{
    int i;

    for (i = 0; i < kset->num_ces; i++) {
        if (!strcmp(section, kset->ces[i].key) && !strcmp(name, kset->ces[i].key))
            return &kset->ces[i];
    }

    return NULL;
}

static int configure_zabbixscript(struct ulogd_pluginstance *pi, struct ulogd_pluginstance_stack *stack)
{
    struct ulogd_key *pathscript_key = config_find_key(pi->id, "pathscript", pi->config_kset);
    if (pathscript_key && pathscript_key->u.source && (pathscript_key->u.source->flags & ULOGD_RETF_VALID))
        strncpy(pathscript, (char *)pathscript_key->u.source->u.value.ptr, sizeof(pathscript));
    else
        strncpy(pathscript, ULOGD_ZABBIXSCRIPT_PATHSCRIPT_DEFAULT, sizeof(pathscript));

    ulogd_log(ULOGD_DEBUG, "parsing config file section %s\n", pi->id);
    return config_parse_file(pi->id, pi->config_kset);
}

static struct ulogd_plugin zabbixscript_plugin = {
    .name = "ZABBIXSCRIPT",
    .input = {
        .keys = zabbixscript_inp,
        .num_keys = ARRAY_SIZE(zabbixscript_inp),
        .type = ULOGD_DTYPE_PACKET | ULOGD_DTYPE_FLOW,
    },
    .output = {
        .type = ULOGD_DTYPE_SINK,
    },
    .config_kset = &zabbixscript_kset,
    .priv_size = sizeof(struct zabbixscript_instance),

    .configure = &configure_zabbixscript,
    .start = &start_zabbixscript,
    .stop = &fini_zabbixscript,

    .interp = &_output_zabbixscript,
    .signal = &signal_handler_zabbixscript,
    .version = VERSION,
};

void __attribute__((constructor)) init(void);

void init(void)
{
    ulogd_register_plugin(&zabbixscript_plugin);
}
просто командой gcc -shared -o ulogd_ZABBIXSCRIPT.so ulogd_ZABBIXSCRIPT.c -fPIC у нас плагин получается не рабочий будем собирать полностью
в исходниках \ulogd\output\
правим еще файлы Makefile , Makefile.am , Makefile.in добавляем в них блоки ZABBIXSCRIPT аналогично блокам LOGEMU (готовые есть в архиве)

Скрипт будет лежать в

Код: Выделить всё

nano /etc/zabbix/scripts/portmonitor.sh

Код: Выделить всё

#!/bin/bash
# Для теста

#echo "Передача всех аргументов: $@" >> /var/log/ulogd/test.txt

# Для теста
#arg1=$(echo "\$1" | awk '{\$1=\$1};1')
#arg2=$(echo "\$2" | awk '{\$1=\$1};1')
#arg3=$(echo "\$3" | awk '{\$1=\$1};1')
# Исключаем аргумент [0].u.source->u.value.ptr
#if [[ "$arg3" == *"[0].u.source->u.value.ptr"* ]]; then
#  arg3=""
#fi
#echo "Передача всех аргументов: $arg1 $arg2 $arg3" >> /var/log/ulogd/test.txt


# Передача в zabbix
#ipzabbix=$1
#portzabbix=${2:-10051}
#zabbixkey=$3

# Данные ulog передаваемые zabbix
# Получение аргументов командной строки
timestamp=$1
hostname=$2
value=$3

ipzabbix=192.168.175.111
portzabbix=10051
zabbixkey=iptablesulog
#zabbix_sender -z $ipzabbix -p $portzabbix -s "$hostname" -k $zabbixkey -o "${timestam} ${hostnam} ${valu}"

# Вывод аргументов в файл
# chmod 664 /var/log/ulogd/test.txt
echo "Проверка расположения скрипта" $ipzabbix $portzabbix $hostname $zabbixkey "Timestamp:" $timestamp "Value:" $value >> /var/log/ulogd/test.txt

# Завершение скрипта
exit 0
После изменения пере собираем и устанавливаем

Код: Выделить всё

./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var/lib/ulogd --libdir=/usr/lib64 --libexecdir=/usr/lib64/ulogd --sbindir=/usr/sbin --datadir=/usr/share/ulogd --docdir=/usr/share/doc/ulogd --mandir=/usr/share/man/man8 --with-logrotate=/etc/logrotate.d --with-initdir=/etc/rc.d/init.d --with-systemdsystemunitdir=/lib/systemd/system --disable-static --with-dbi-lib=/usr/lib64 --with-jansson --enable-ulog --enable-nflog --enable-nfct --enable-nfacct --enable-pgsql --enable-mysql --enable-sqlite3 --enable-dbi --enable-pcap --enable-json

Код: Выделить всё

make install
Рестартуем службы и проверяем вывод то что в начале строк появился штамп времени

Код: Выделить всё

service ulogd restart
Проверяем

Код: Выделить всё

service ulogd status
Проверяем в моем случае все заработало!


Не получилось только взять переменные из файла конфигурации
nano /ect/ulogd.conf
[script1]
# Путь на скрипт
pathscript="/etc/zabbix/scripts/portmonitor.sh"
# Данные для zabbix_sender
# IP/DNS zabbix сервера
#ipzabbix=192.168.175.111
# Порт zabbix
#portzabbix=10051
# Ключ куда передаем данные
#zabbixkey=iptablesulog

Эти данные прописываем прямо в скрипте, также обработку данных делаем в скрипте nano /etc/zabbix/scripts/portmonitor.sh


Документация
ulogd2.pdf.zip
ulogd2.pdf.zip
(583.52 КБ) 3 скачивания


Тест сборки Исходный код Debian 8 Исходный код Debian 8 jessie
сборка будет на i386 для архитектуры Intel x86
Исходный код ulogd2 debian-jessie

Установка пакетов

Код: Выделить всё

apt-get install libnfnetlink-dev libmnl-dev libnetfilter-log-dev libnetfilter-conntrack-dev libnetfilter-acct-dev libpcap-dev libdbi-dev libjansson-dev linuxdoc-tools libsqlite3-dev zlib1g-dev libmysql++-dev openspy libpq-dev pkgconf postgresql-server-dev-all
groff default-libmysqlclient-dev debhelper-compat

Добавляем наш плагин ZABBIXSCRIPT
Debian 8 jessie x86 Ulog.zip
Debian 8 jessie x86 Ulog.zip
(1.79 МБ) 3 скачивания
Собираем

Код: Выделить всё

autoreconf -i

Код: Выделить всё

autoreconf
./configure --prefix=/usr --sysconfdir=/etc

./configure --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --libexecdir=/usr/lib/ulogd --sbindir=/usr/sbin --datadir=/usr/share/ulogd --docdir=/usr/share/doc/ulogd --mandir=/usr/share/man/man8 --with-logrotate=/etc/logrotate.d --with-initdir=/etc/init.d --with-systemdsystemunitdir=/usr/lib/systemd/system --disable-static --with-dbi-lib=/usr/lib --with-jansson --enable-ulog --enable-nflog --enable-nfct --enable-nfacct --enable-pgsql --enable-mysql --enable-sqlite3 --enable-dbi --enable-pcap --enable-json

./configure --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --libexecdir=/usr/lib/ulogd --sbindir=/usr/sbin --datadir=/usr/share/ulogd --docdir=/usr/share/doc/ulogd --mandir=/usr/share/man/man8 --with-logrotate=/etc/logrotate.d --with-initdir=/etc/init.d --with-systemdsystemunitdir=/usr/lib/systemd/system --disable-static --with-dbi-lib=/usr/lib/i386-linux-gnu --with-jansson --enable-ulog --enable-nflog --enable-nfct --enable-nfacct --enable-pgsql --enable-mysql --enable-sqlite3 --enable-dbi --enable-pcap --enable-json

Пути из готовых deb пакетов
пути
Показать
/usr/share/man/man8/
/usr/share/lintian/overrides/
/usr/share/doc/
/usr/share/doc-base/
/usr/share/doc/ulogd2/
/usr/share/doc/ulogd2/examples/
/usr/sbin/
/usr/lib/tmpfiles.d/
/usr/lib/systemd/system/
/usr/lib/i386-linux-gnu/ulogd/
/etc/
/etc/logrotate.d/
/etc/init.d/


./etc/logrotate.d/ulogd2
./etc/ulogd.conf
./etc/init.d/ulogd2
./etc/rc0.d/K02ulogd2
./etc/rc1.d/K02ulogd2
./etc/rc2.d/S03ulogd2
./etc/rc3.d/S03ulogd2
./etc/rc4.d/S03ulogd2
./etc/rc5.d/S03ulogd2
./etc/rc6.d/K02ulogd2
./etc/init/ulogd2.conf
./etc/systemd/system/ulogd.service
./etc/systemd/system/multi-user.target.wants/ulogd2.service
./run/ulog
./run/ulog/ulogd.pid
./usr/share/lintian/overrides/ulogd
./usr/share/lintian/overrides/ulogd2
./usr/share/man/man8/sulogin.8.gz
./usr/share/man/man8/ulogd.8.gz
./usr/share/doc-base/ulogd2-manual
./usr/share/doc/ulogd
./usr/share/doc/ulogd2
./usr/share/doc/ulogd2/mysql-ulogd2-flat.sql.gz
./usr/share/doc/ulogd2/ulogd.txt.gz
./usr/share/doc/ulogd2/pgsql-ulogd2-flat.sql.gz
./usr/share/doc/ulogd2/pgsql-ulogd2.sql.gz
./usr/share/doc/ulogd2/mysql-ulogd2.sql.gz
./usr/share/doc/ulogd2/ulogd.html
./usr/share/doc/ulogd2/examples/ulogd.conf.gz
./usr/share/doc/ulogd2/examples/pcap2ulog.gz
./usr/lib/i386-linux-gnu/ulogd

Код: Выделить всё

./configure --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib/i386-linux-gnu --libexecdir=/usr/lib/ulogd --sbindir=/usr/sbin --datadir=/usr/share/ulogd --docdir=/usr/share/doc/ulogd --mandir=/usr/share/man/man8 --with-logrotate=/etc/logrotate.d --with-initdir=/etc/init.d --with-systemdsystemunitdir=/usr/lib/systemd/system --disable-static --with-dbi-lib=/usr/lib/i386-linux-gnu --with-jansson --enable-ulog --enable-nflog --enable-nfct --enable-nfacct --enable-pgsql --enable-mysql --enable-sqlite3 --enable-dbi --enable-pcap --enable-json

Код: Выделить всё

make install 

Тесты правил передачи данных в заббикс

тест

Код: Выделить всё

iptables -I INPUT -p tcp --dport 22 -j NFLOG --nflog-group 0
текущие настройки правила
iptables -L INPUT --line-numbers
удалить правило номер 5 из цепочки INPUT
iptables -D INPUT 5

В старых версиях iptables использовался модуль state
В новых версиях iptables используется модуль conntrack

модуль conntrack:
--ctstate NEW: соединение в новом состоянии, т.е. только что установленное соединение.
--ctstate ESTABLISHED: установленное соединение, которое прошло процесс установки. (много данных кадую секунду )
--ctstate RELATED: соединение, связанное с уже установленным соединением (например, ответ на запрос).
--ctstate INVALID: некорректное или недействительное соединение.
--ctstate UNTRACKED: соединение, не отслеживаемое модулем conntrack.
--ctstate DNAT: соединение, подвергшееся изменению адреса назначения (Destination NAT).
--ctstate SNAT: соединение, подвергшееся изменению адреса отправителя (Source NAT).
--ctstate DNAT,SNAT: соединение, подвергшееся изменению и адреса назначения, и адреса отправителя.

Только новые подключения
Проверка состояния соединения, правило будет применяться только к новым (еще не установленным) соединениям на порту
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j NFLOG --nflog-group 0
или
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j NFLOG --nflog-group 0

Отключившиеся (закрытые)
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT (старая версия)
или
iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT (новая)
или
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT (для 22 порта)
И
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate ESTABLISHED,RELATED -j NFLOG --nflog-group 0

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate ESTABLISHED -j NFLOG --nflog-group 0
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate RELATED -j NFLOG --nflog-group 0
или
iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED,RELATED -j NFLOG --nflog-group 0
iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -j NFLOG --nflog-group 0
iptables -A INPUT -p tcp --dport 22 -m state --state RELATED -j NFLOG --nflog-group 0

Будут отображаться только отклоненные (недопустимые, отброшенные) подключения
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate INVALID -j NFLOG --nflog-group 0
или
iptables -A INPUT -p tcp --dport 22 -m state --state INVALID -j NFLOG --nflog-group 0

Соединение, не отслеживаемое модулем conntrack
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate UNTRACKED -j NFLOG --nflog-group 0
или
iptables -A INPUT -p tcp --dport 22 -m state --state UNTRACKED -j NFLOG --nflog-group 0

Соединение, подвергшееся изменению адреса назначения (Destination NAT)
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate DNAT -j NFLOG --nflog-group 0
или
iptables -A INPUT -p tcp --dport 22 -m state --state DNAT -j NFLOG --nflog-group 0

Соединение, подвергшееся изменению адреса отправителя (Source NAT)
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate SNAT -j NFLOG --nflog-group 0
или
iptables -A INPUT -p tcp --dport 22 -m state --state SNAT -j NFLOG --nflog-group 0

Соединение, подвергшееся изменению и адреса назначения, и адреса отправителя
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate DNAT,SNAT -j NFLOG --nflog-group 0
или
iptables -A INPUT -p tcp --dport 22 -m state --state DNAT,SNAT -j NFLOG --nflog-group 0

Сразу несколько
iptables -I INPUT -p tcp -m multiport --port 21,22 -m conntrack --ctstate NEW,RELATED,INVALID,UNTRACKED,DNAT,SNAT -j NFLOG --nflog-group 0

Код: Выделить всё

service ulogd restart

Код: Выделить всё

service ulogd status
Создаем шаблон , цепляем к узлу проверяем

Данные приходящие в заббикс
20240305:1351 monitor IN=eth0 OUT= MAC=a4:ba:db:44:d9:7a:a4:ba:db:44:d8:55:08:00 SRC=192.168.175.8 DST=192.168.175.35 LEN=104 TOS=00 PREC=0x00 TTL=128 ID=11299 DF PROTO=TCP SPT=62574 DPT=22 SEQ=1632962945 ACK=2832040458 WINDOW=251 ACK PSH URGP=0 UID=0 GID=0 MARK=0

еще примеры данных:
***DPT=22 SEQ=2537864224 ACK=0 WINDOW=8192 SYN URGP=0 MARK=0
***DPT=22 SEQ=2537865637 ACK=3811024585 WINDOW=251 ACK FIN URGP=0 UID=0 GID=0 MARK=0
***DPT=22 SEQ=2537865509 ACK=3811024313 WINDOW=252 ACK PSH URGP=0 UID=0 GID=0 MARK=0

РАСШИФРОВКА
IN=eth0: Пакет пришел через интерфейс eth0.
OUT=: Пакет не отправляется из системы, поэтому поле пустое.
MAC=a4:ba:db:44:d9:7a:a4:ba:db:44:d8:55:08:00: MAC-адрес отправителя и получателя пакета.
SRC=192.168.175.8: IP-адрес отправителя пакета.
DST=192.168.175.35: IP-адрес получателя пакета.
LEN=104: Длина пакета в байтах.
TOS=00: Поле Type of Service (TOS) не установлено.
PREC=0x00: Поле Precedence не установлено.
TTL=128: Время жизни (Time To Live) пакета равно 128.
ID=11299: Идентификатор пакета.
DF: Флаг Don't Fragment указывает, что пакет не может быть фрагментирован.
PROTO=TCP: Протокол пакета - TCP.
SPT=62574: Порт отправителя пакета.
DPT=22: Порт получателя пакета.
SEQ=1632962945: Последовательный номер пакета.
ACK=2832040458: Подтверждение номера пакета.
WINDOW=251: Размер окна TCP.
ACK: Установлен флаг ACK (подтверждение).
PSH: Установлен флаг PSH (push).
URGP=0: Поле Urgent Pointer не установлено.
UID=0: Идентификатор пользователя, связанного с пакетом, равен 0 (root).
GID=0: Идентификатор группы, связанной с пакетом, равен 0 (root).
MARK=0: Метка пакета равна 0 (не установлена).

флаг
SYN (синхронизация) в TCP-пакете указывает на то, что это новое подключение, которое инициировано клиентом.
SYN-ACK ответ сервера на запрос клиента, а затем клиент отправляет сегмент ACK, завершая установление соединения
Для определения закрытия TCP-подключения в записи мониторинга сети обычно используется наличие флага
FIN (завершение) или RST (сброс) в TCP-пакете указывать на закрытие TCP-подключении
FIN (завершение) Когда одна из сторон хочет закрыть соединение, отправляет сегмент с установленным флагом FIN.
После того как обе стороны обменялись сегментами FIN и получили подтверждение (ACK), соединение считается закрытым.
RST (сброс) используется для немедленного разрыва соединения без завершения обычным образом, соединения аварийно завершается или возникают другие проблемы.


Неудачной попытки подключения несколько признаков:
Отсутствие ответа на запрос SYN: Если в записи присутствует только пакет с установленным флагом SYN (синхронизация) от клиента,
но нет ответа SYN-ACK (или другого подтверждения), это может указывать на неудачную попытку подключения.

Флаги RST или ICMP сообщения: Если в ответ на попытку установления соединения приходит пакет с флагом RST (сброс) или ICMP сообщение об ошибке,
это также может свидетельствовать о неудачной попытке подключения.
Таймауты: Если попытка установления соединения не завершается в течение определенного времени и заканчивается таймаутом,
это тоже может указывать на неудачную попытку подключения.

Как пометить пакет пример:
Через Ulog
--ulog-nlgroup 1 указывает номер группы Netlink, в которую будут отправляться пакеты для логирования.
--ulog-prefix "MyPrefix: или --nflog-prefix " задает префикс, который будет добавлен к каждому сообщению журнала.
iptables -I INPUT -p tcp --dport 22 -m conntrack --ctstate RELATED -j NFLOG --nflog-group 0 --nflog-prefix "CONECT=RELATED"

Пометить входящие пакеты отдельное правило
--ctdir ORIGINAL указывает на оригинальное направление соединения.
iptables -I INPUT -m conntrack --ctstate NEW -m conntrack --ctdir ORIGINAL -j MARK --set-mark 1
iptables -I INPUT -m conntrack --ctstate ESTABLISHED -m conntrack --ctdir ORIGINAL -j MARK --set-mark 2
iptables -I INPUT -m conntrack --ctstate RELATED -m conntrack --ctdir ORIGINAL -j MARK --set-mark 3
iptables -I INPUT -m conntrack --ctstate INVALID -m conntrack --ctdir ORIGINAL -j MARK --set-mark 4
iptables -I INPUT -m conntrack --ctstate UNTRACKED -m conntrack --ctdir ORIGINAL -j MARK --set-mark 5
iptables -I INPUT -m conntrack --ctstate DNAT -m conntrack --ctdir ORIGINAL -j MARK --set-mark 6
iptables -I INPUT -m conntrack --ctstate SNAT -m conntrack --ctdir ORIGINAL -j MARK --set-mark 7

Или так обозначим
# Мониторинг 80,443 порта в zabbix через ULOG (кроме ESTABLISHED)
#iptables -I INPUT -p tcp -m multiport --port 80,443 -m conntrack --ctstate NEW,RELATED,INVALID,UNTRACKED,DNAT,SNAT -j NFLOG --nflog-group 0
# Сделаем отметку о правиле поэтому разделим
iptables -I INPUT -p tcp -m multiport --port 80,443 -m conntrack --ctstate NEW -j NFLOG --nflog-group 0 --nflog-prefix "CONECT=NEW"
#iptables -I INPUT -p tcp -m multiport --port 80,443 -m conntrack --ctstate ESTABLISHED -j NFLOG --nflog-group 0 --nflog-prefix "CONECT=ESTABLISHED"
iptables -I INPUT -p tcp -m multiport --port 80,443 -m conntrack --ctstate RELATED -j NFLOG --nflog-group 0 --nflog-prefix "CONECT=RELATED"
iptables -I INPUT -p tcp -m multiport --port 80,443 -m conntrack --ctstate INVALID -j NFLOG --nflog-group 0 --nflog-prefix "CONECT=INVALID"
iptables -I INPUT -p tcp -m multiport --port 80,443 -m conntrack --ctstate UNTRACKED -j NFLOG --nflog-group 0 --nflog-prefix "CONECT=UNTRACKED"
iptables -I INPUT -p tcp -m multiport --port 80,443 -m conntrack --ctstate DNAT -j NFLOG --nflog-group 0 --nflog-prefix "CONECT=DNAT"
iptables -I INPUT -p tcp -m multiport --port 80,443 -m conntrack --ctstate SNAT -j NFLOG --nflog-group 0 --nflog-prefix "CONECT=SNAT"

Шаблон zabbix
Iptables-Ulog информация о выбранных порта.zip
Iptables-Ulog информация о выбранных порта.zip
(7.41 КБ) 2 скачивания
Со вместо с шаблоном Авто-закрытие триггеров
Пример макросы авто-закрытие-триггеров
Пример макросы авто-закрытие-триггеров
так же если нужно исключить некоторые ip из проверки что бы в заббикс не приходили в скрипте добавляем проверку

Код: Выделить всё

zabbixkey=iptablesulog
# Пропуск IP адресов не отправляем их
propusk='23.544.42.150\|235.189.256.5'
valuef=$(echo $value|grep -iwv "$propusk" )
if [ -n "${valuef}" ]; then
zabbix_sender -z $ipzabbix -p $portzabbix -s "$hostname" -k $zabbixkey -o "$timestamp $hostname $value"
fi
или условие в триггер, но данные будут приходить на сервер
{iptables-ulog:iptablesulogipport.iregexp(23.544.42.150|235.189.256.5)}=0 and
количество слов: 5667
Ответить Вложения 6 Пред. темаСлед. тема

Вернуться в «Установка Заббикс и Дополнений»