43

Я довольно широко искал это, но, похоже, не смог найти работающего примера.

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

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

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

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

netstat -ano|grep 443|grep ESTABLISHED

так же как и это:

tcptrack -i eth0 port 443

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

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

Благодарю. :)

7 ответов7

58

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


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

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

24

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

По умолчанию утилита 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) для полного синтаксиса фильтров, которые вы можете использовать.

23

Для этого вы можете использовать поддержку 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) за подробностями.

3

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 для печати пакетов в консоли)

0

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

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .