Контроль трафіку TCP на певному порту


49

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

Моя мета - відстежувати трафік TCP на певному порту, щоб побачити вхідні з'єднання та записати їх у текстовий файл. Можливо, мені також потрібна мітка часу на кожному рядку, щоб точно вказати, коли клієнт підключився до другого.

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

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

Я грав із цим:

netstat -ano|grep 443|grep ESTABLISHED

а також це:

tcptrack -i eth0 port 443

але це не відповідає моїм потребам, оскільки мені потрібен час, коли відбувається з'єднання.

Якщо у вас є якісь пропозиції або могли б направити мене в правильному напрямку, це буде дуже вдячно.

Дякую. :)

linux  bash 

Haha мігрував з stackoverflow, але потребує переходу на unix / linux
Kolob Canyon

Відповіді:


70

редагувати : Я все ще отримую гроші за це через роки. Будь ласка, не звертайтесь за цією відповіддю, відповідь, яка використовуєтьсяiptables тут, на мою думку набагато перевершує.


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

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


Замість того, щоб показувати ім'я хоста для кожного з'єднання, чи є спосіб його замінити IP-адресою?

Так, додайте -nпісля tcpdump (man tcpdump: -n Не перетворюйте адреси (тобто адреси хостів, номери портів тощо) в імена. )
Wrikken

5
Я б стверджував, що спам-журнал ядра насправді не найкращий. ;)
Даніель Б

1
Ага, але я б за умови правильного налаштування того, які журнали повинні йти, звичайно: P Але ей, ця відповідь все-таки є, якщо це угода про порушення :)
Wrikken

1
@Wrikken Проблема використання журналу ядра для цього полягає в тому, що, використовуючи ваше рішення, коли ви ctrl + c з tcpdump, все залишається, як і раніше. Рішення iptables означає залишити "сюрприз" позаду, якщо ви не видалите правило вручну. Ця несподіванка може перетворитись на те, що ми маємо повний кореневий диск за короткий час. Вибачте, але я підтримую це (:
Джон Блекберрі

31

Для цього можна використовувати підтримку iptables в ядрі Linux. Перевага полягає в тому, що воно не потребує додаткового програмного забезпечення, щоб бути помірно корисним. Мінусом є те, що для налаштування потрібні кореневі привілеї (але, враховуючи, що ви говорите про порт 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: 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).


чи можливо виконати скрипт python, що запускає це?
Карл Зілнер

Не забудьте видалити ці правила IP-таблиць, коли ви закінчите, інакше вони будуть спамувати журнали досить сильно залежно від правила. digitalocean.com/community/tutorials/…
Мо Беджі

26

Роздільна здатність мікросекунди

За замовчуванням утиліта tcpdump звітує про час з роздільною здатністю мікросекунди. Наприклад:

$ sudo tcpdump -i any port 443

покаже вихід, подібний до наступного:

12: 08: 14.028945 IP localhost.33255> localhost.https: Прапори [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, ack 1828376762, win 0, довжина 0

Повний список параметрів tcpdump див. У tcpdump (8) та pcap-filter (7) для повного синтаксису фільтрів, які ви можете використовувати.


5

443 - це зашифрований трафік - настільки важко все-таки зробити головами чи хвостами трафіку на цьому порту:

Ви можете зробити

yum встановити ngrep або apt-get install ngrep

потім біжи

ngrep -W byline -d any port 443 -q

2

Це може знадобитися і для контролю над вхідними та вихідними пакетами з інших машин.

tcpflow -i eth0 -c port 7891

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


Це справді коментар, а не відповідь на початкове запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх публікацією - ви завжди можете коментувати свої власні публікації, і як тільки у вас буде достатня репутація, ви зможете коментувати будь-яку публікацію . Будь ласка, прочитайте Чому мені потрібно коментувати 50 репутацій? Що я можу зробити замість цього?
DavidPostill


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

Ви маєте рацію, це надмірно, якщо вам потрібно буде увійти в з'єднання. Я використовую це рішення не для моніторингу того, які клієнти підключені, а скільки пропускної здатності використовує служба.
Коста Цаусіс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.