2013-06-07 15:55:48 +0000 2013-06-07 15:55:48 +0000
51
51

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

Я достаточно много искал для этого, но не могу придумать рабочий пример.

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

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

Я подумал, что скрипт оболочки linux может работать, если я проконтролирую определенный локальный порт и запишу текст в файл, а затем просто сконцентрирую дату на каждой строке.

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

netstat -ano|grep 443|grep ESTABLISHED

, а также с этим:

tcptrack -i eth0 port 443

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

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

Спасибо. :)

Ответы (7)

73
73
73
2013-06-07 16:03:28 +0000

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

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

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

33
33
33
2014-12-05 15:08:24 +0000

Вы можете использовать поддержку 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:08:00 SRC=A.B.C.D DST=W.X.Y. Z 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 вместе с этим. Смотрите man-страницу iptables(8) для подробностей.

26
26
26
2013-06-07 16:13:36 +0000

Микросекундное разрешение

По умолчанию утилита tcpdump выдаст отчет о времени с микросекундным разрешением. Например:

$ sudo tcpdump -i any port 443

покажет вывод, аналогичный следующему:

12:08:14.028945 IP localhost.33255. > localhost.https: флаги [S], seq 1828376761, win 43690, options [mss 65495,sackOK,TS val 108010971 ecr 0,nop,wscale 7], length 0 12:08:14.028959 IP localhost.https > localhost.33255: Флаги [R.], seq 0, ack 1828376762, win 0, length 0

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

5
5
5
2013-06-07 16:09:31 +0000

443 является зашифрованным трафиком - так что в любом случае трудно сделать голову или хвост трафика на этом порту:

можно сделать

юм установку ngrep или apt-получить установку ngrep

, а затем запустить

ngrep -W byline -d any port 443 -q
2
2
2
2016-06-02 09:48:03 +0000

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

tcpflow -i eth0 -c port 7891

(опция -i для упоминания сети, опция -c для печати пакетов в консоли)

1
1
1
2013-06-07 15:59:57 +0000

Вы можете использовать tcpdump или Wireshark.

0
0
0
2017-05-26 11:08:35 +0000

Если вам нужно постоянное решение, которое всегда будет контролировать трафик на интересующих вас портах, я предлагаю использовать QoS (команда tc в linux). tc немного загадочна и недокументирована, поэтому я использую FireQoS для настройки QoS и netdata для его мониторинга в реальном времени.

Проверьте это для получения дополнительной информации: https://github.com/firehol/netdata/wiki/You-should-install-QoS-on-all-your-servers

Похожие вопросы

6
10
11
5
6