Как я могу найти, какой процесс отправляет данные на определенный порт?

21

У меня есть служба, поддерживающая определенный порт открытым.

Я получаю данные, которые я не ожидаю и не хочу получать, и я пытаюсь точно определить источник этих данных. Итак, как я могу найти, какой процесс отправляет данные на определенный порт, а не какой процесс прослушивает.

user50849
источник

Ответы:

23

Для TCP (хотя тот же подход будет работать для SCTP 1 или любого транспортного протокола, ориентированного на соединение), так же, как и для поиска прослушивающих:

lsof -nPi tcp:the-port

Сообщит о процессах, у которых открыт TCP-сокет на этом порту. Если вы знаете исходный порт (ваше серверное приложение может знать об этом и регистрировать его), вы можете использовать его вместо того, чтобы точно определить мошеннического клиента.

Для сокетов UDP или RAW было бы сложнее, хотя я полагаю, что здесь может пригодиться что-то вроде systemtap или dtrace. Возможно, Audit также.


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

Стефан Шазелас
источник
Это не работает для SCTP для меня.
Судо
1
@sudo, см. правку
Стефан
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
Amol
источник
2

В зависимости от типа соединения, которое он устанавливает для отправки данных, один из этих подходов приведет вас куда-то.

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

  • В случае, если он устанавливает и сохраняет открытым соединение TCP / UDP, вы можете использовать, netstatчтобы найти удаленный IP-адрес соединения.

  • Перечислите открытые сокеты процесса как в ответе, предоставленном @StephaneChazelas.

gertvdijk
источник
1

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

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

Просто сопоставьте все исходные соединения с вашим пунктом назначения. Это прекрасно работает для TCP / UDP / UNIXsockets.

Андрей Войтенков
источник
0

В Solaris при запуске pfiles на всех процессах должно быть показано, какие процессы имеют какие соединения открыты. Это потребует некоторой осторожности, возможно, с использованием опций -g, -B ggrep ...

На Linux netstat -anp --inetбудет работать даже без установленного lsof. (сбросьте, --inetчтобы получить доменные сокеты Unix, а также)

Герт ван ден Берг
источник