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

49

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

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

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

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

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

netstat -ano|grep 443|grep ESTABLISHED

а также это:

tcptrack -i eth0 port 443

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

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

Спасибо. :)


источник
Ха-ха, мигрировавший из stackoverflow, но должен перейти на Unix / Linux
Kolob Canyon

Ответы:

71

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


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

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

Wrikken
источник
Вместо того, чтобы показывать имя хоста для каждого соединения, есть ли способ переопределить его с помощью IP?
Да, добавьте -nпосле tcpdump (man tcpdump: -n Не преобразовывать адреса (т.
Е.
5
Я бы сказал, что спам в журнале ядра не очень хорош. ;)
Даниэль Б
1
Ах, но я бы, при условии, что каждый правильно настраивает, куда должны идти журналы: P Но, эй, этот ответ все еще здесь, если это
нарушает условия
2
@ Проблема с использованием журнала ядра заключается в том, что при использовании вашего решения, когда вы нажимаете ctrl + c из tcpdump, все остается прежним. Решение iptables означает «сюрприз», если вы не удалите правило вручную. Этот сюрприз может перевести на наличие полного корневого диска в кратчайшие сроки. Извините, но я проголосую за это (:
Джон Блэкберри,
31

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

Добавьте правило iptables что-то вроде:

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

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

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

5 декабря 09:10:56 имя хоста ядро: [1023963.185332] HTTPS SYN: IN = ifX OUT = MAC = 80: 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

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

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

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

CVn
источник
Возможно ли выполнить скрипт Python, запускающий это?
Карл Циллнер
Не забудьте удалить эти правила IP-таблиц, как только вы закончите, иначе они будут спамить логи в зависимости от правила. digitalocean.com/community/tutorials/...
Mo Beigi
26

Микро-второе разрешение

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

$ sudo tcpdump -i any port 443

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

12: 08: 14.028945 IP localhost.33255> localhost.https: Flags [S], seq 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.], seq 0, подтверждение 1828376762, победа 0, длина 0

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

CodeGnome
источник
5

443 - это зашифрованный трафик, так что сложно так или иначе сделать трафик на этом порту:

ты можешь сделать

yum install ngrep или apt-get install ngrep

тогда беги

ngrep -W byline -d any port 443 -q
Оправданный Халцион
источник
2

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

tcpflow -i eth0 -c port 7891

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

Reegan Vijay
источник
Это действительно комментарий, а не ответ на оригинальный вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его постом - вы всегда можете комментировать свои собственные посты, и, когда у вас будет достаточно репутации, вы сможете комментировать любые посты . Пожалуйста, прочитайте Почему мне нужно 50 репутации, чтобы комментировать? Что я могу сделать вместо этого?
DavidPostill
1

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

sigjuice
источник
0

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

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

Коста Цаусис
источник
Я бы сказал, что это немного перебивает просто для регистрации соединений, где будет работать iPTables + --log.
djsmiley2k - CoW
Вы правы, это излишне, если вам нужно регистрировать соединения. Я использую это решение не для того, чтобы отслеживать, какие клиенты подключены, а какую пропускную способность использует служба.
Коста Цаусис