Відповіді:
Для 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'
як евристику.
Залежно від типу з'єднання, встановленого для надсилання даних, один із цих підходів дістане вас кудись.
Використовуйте tcpdump port 1234
для отримання даних, що надсилаються до цього порту. Ви можете використовувати таку програму, як Wireshark, щоб проаналізувати її на іншій машині (захоплено у файл за допомогою -w
параметра). Крім того, використовуйте Wireshark безпосередньо.
У випадку, якщо він встановлює та залишає відкритим з'єднання tcp / udp, яке ви можете використовувати netstat
для пошуку віддаленого IP-з'єднання.
Перерахуйте відкриті розетки процесу, як у відповіді, наданій @StephaneChazelas.
Ви можете скористатися sockstat
командою для пошуку процесу, який ініціював з'єднання з вашою службою на локальному хості.
DESCRIPTION
The sockstat command lists open Internet or UNIX domain sockets.
Просто встановіть відповідність усіх підключень джерела до пункту призначення. Це добре працює для розеток TCP / UDP / UNIX.
У Solaris запуск pfiles для всіх процесів повинен показувати, які процеси мають, які з'єднання відкриті. Знадобиться ретельна передача файлів, можливо, використовуючи параметри ggrep -A, -B ...
На Linux netstat -anp --inet
працюватиме навіть без встановленого lsof. (скиньте і --inet
щоб отримати розетки домену Unix)