Мониторинг TCP-трафика на определенном порту

Мониторинг TCP-трафика на определенном порту

Я долго искал информацию по этому поводу, но так и не смог найти работающий пример.

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

Я уже испробовал netstat, nmap и tcptrack, но ни один из них не поддерживает временную метку.

Я подумал, что скрипт оболочки Linux мог бы работать, если бы я следил за определенным локальным портом и записывал текст в файл при установлении соединения, а затем просто объединял бы дату в каждой строке.

Я играл с этим:

netstat -ano|grep 443|grep ESTABLISHED

а также это:

tcptrack -i eth0 port 443

но ни один из них не подходит мне, так как мне нужно время, когда происходит соединение.

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

Спасибо. :)

решение1

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


tcpdump port 443 and '(tcp-syn|tcp-ack)!=0'

или только tcp-syn, или только tcp-ack(я предполагаю, что это одно), в зависимости от того, что вам нужно.

решение2

Для этого можно использовать поддержку iptables в ядре Linux.Плюс в том, что не требуется никакого дополнительного ПО, чтобы быть умеренно полезным. Минус в том, что для настройки требуются привилегии root (но учитывая, что вы говорите о порте 443, который является привилегированным портом, вам, вероятно, понадобятся привилегии root для большинства решений).

Добавьте правило iptables примерно следующего содержания:

sudo iptables -I INPUT -p tcp --dport 443 --syn -j LOG --log-prefix "HTTPS SYN: "

(Отрегулируйте -I INPUTдеталь по своему вкусу.)

Когда правило срабатывает, ядро ​​выдает запись в syslog. Например, с правилом ввода запись в журнале может выглядеть примерно так:

5 дек 09:10:56 имя хоста ядро: [1023963.185332] HTTPS SYN: IN=ifX OUT= MAC=80:80:80:80:80:80:80:80:80:80:80:08:00 SRC=ABCD DST=WXYZ LEN=52 TOS=0x00 PREC=0x20 TTL=119 ID=11901 DF PROTO=TCP SPT=37287 DPT=443 WINDOW=8192 RES=0x00 SYN URGP=0

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

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

Чтобы избежать затопления вашего журнала, рассмотрите возможность использования limitмодуля в сочетании с этим. Подробности см. на странице руководства iptables(8).

решение3

Разрешение микросекунды

По умолчанию,tcpdumpУтилита сообщит время с точностью до микросекунды. Например:

$ sudo tcpdump -i any port 443

отобразит вывод, аналогичный следующему:

12:08:14.028945 IP localhost.33255 > localhost.https: Флаги [S], последовательность 1828376761, win 43690, параметры [mss 65495,sackOK,TS val 108010971 ecr 0,nop,wscale 7], длина 0
12:08:14.028959 IP localhost.https > localhost.33255: Флаги [R.], последовательность 0, ack 1828376762, win 0, длина 0

Полный список параметров tcpdump см. в tcpdump(8), а полный синтаксис фильтров, которые вы можете использовать, — в pcap-filter(7).

решение4

Это также может потребоваться для мониторинга входящих и исходящих пакетов с других машин.

tcpflow -i eth0 -c port 7891

(возможность -iуказания сети, возможность -cвывода пакетов в консоль)

Связанный контент