Як я можу знайти, який процес надсилає дані до певного порту?


21

У мене є сервіс, тримаючи певний порт відкритим.

Я отримую дані, які я ні сподіваюсь, ні хочу отримати, і намагаюся точно вказати джерело цих даних. Тож як я можу знайти процес, який надсилає дані до певного порту, на відміну від того, який процес слухає.

Відповіді:


23

Для TCP (хоча той самий підхід буде працювати для SCTP 1 або будь-якого транспортного протоколу, орієнтованого на з'єднання), як і для пошуку слухачів:

lsof -nPi tcp:the-port

Повідомлять про процеси, на яких відкритий сокет TCP на цьому порту. Якщо ви знаєте вихідний порт (ваша серверна програма може знати про нього і записати його), ви можете скористатися цим замість цього, щоб точно вказати клієнта-шахрая.

Для сокетів UDP або RAW це було б складніше, хоча я припускаю, що тут може стати в нагоді щось на зразок systemtap або dtrace. Можливо, також перевірено.


1 Хоча lsofу версії 4.86 додано підтримку SCTP (лише для Linux) , ви не можете використовувати -iявно запитувати SCTP-сокети. Тут можна використовувати lsof -nP | grep -w 'SCTP.*:the-port'як евристику.


Це не працює для SCTP для мене.
судо

1
@sudo, дивіться редагування
Stéphane Chazelas

3

Спробуйте наступне:

$sudo ss -tp

Або:

$sudo netstat -A inet -p

Щоб уникнути локального результату:

$sudo netstat -A inet -p | grep -v localhost

Щоб перерахувати лише встановлені з'єднання:

$sudo netstat -A inet -p | grep -v localhost | grep ESTABLISHED

2

Залежно від типу з'єднання, встановленого для надсилання даних, один із цих підходів дістане вас кудись.

  • Використовуйте tcpdump port 1234для отримання даних, що надсилаються до цього порту. Ви можете використовувати таку програму, як Wireshark, щоб проаналізувати її на іншій машині (захоплено у файл за допомогою -wпараметра). Крім того, використовуйте Wireshark безпосередньо.

  • У випадку, якщо він встановлює та залишає відкритим з'єднання tcp / udp, яке ви можете використовувати netstatдля пошуку віддаленого IP-з'єднання.

  • Перерахуйте відкриті розетки процесу, як у відповіді, наданій @StephaneChazelas.


1

Ви можете скористатися sockstatкомандою для пошуку процесу, який ініціював з'єднання з вашою службою на локальному хості.

DESCRIPTION
     The sockstat command lists open Internet or UNIX domain sockets.

Просто встановіть відповідність усіх підключень джерела до пункту призначення. Це добре працює для розеток TCP / UDP / UNIX.


0

У Solaris запуск pfiles для всіх процесів повинен показувати, які процеси мають, які з'єднання відкриті. Знадобиться ретельна передача файлів, можливо, використовуючи параметри ggrep -A, -B ...

На Linux netstat -anp --inetпрацюватиме навіть без встановленого lsof. (скиньте і --inetщоб отримати розетки домену Unix)

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