Jak znaleźć proces, który wysyła dane do określonego portu?

21

Mam usługę, która utrzymuje pewien port otwarty.

Dostaję dane, których nie oczekuję ani nie chcę uzyskać, i staram się wskazać źródło tych danych. Jak więc znaleźć proces, który wysyła dane do określonego portu, w przeciwieństwie do tego, który proces nasłuchuje.

użytkownik50849
źródło

Odpowiedzi:

23

W przypadku protokołu TCP (chociaż to samo podejście działałoby w przypadku SCTP 1 lub dowolnego protokołu transportowego zorientowanego na połączenie), tak samo jak w przypadku wyszukiwania nasłuchujących:

lsof -nPi tcp:the-port

Zgłosi procesy, w których gniazdo TCP jest otwarte na tym porcie. Jeśli znasz port źródłowy (aplikacja serwera może o nim wiedzieć i zalogować się), możesz go użyć do wskazania nieuczciwego klienta.

W przypadku gniazd UDP lub RAW byłoby to trudniejsze, ale przypuszczam, że może się przydać coś takiego jak systemtap lub dtrace. Prawdopodobnie również poddane audytowi.


1 Chociaż obsługa SCTP (tylko w systemie Linux) została dodana lsofw wersji 4.86, nie można używać -ido jawnego pytania o gniazda SCTP. Tutaj można użyć lsof -nP | grep -w 'SCTP.*:the-port'jako heurystyki.

Stéphane Chazelas
źródło
Dla mnie to nie działa dla SCTP.
sudo,
1
@sudo, patrz edycja
Stéphane Chazelas
3

Spróbuj wykonać następujące czynności:

$sudo ss -tp

Lub:

$sudo netstat -A inet -p

Aby uniknąć wyniku localhost:

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

Aby wyświetlić listę tylko USTALONYCH połączeń:

$sudo netstat -A inet -p | grep -v localhost | grep ESTABLISHED
Amol
źródło
2

W zależności od rodzaju połączenia, które ustanawia, aby wysłać dane, jedno z tych podejść doprowadzi cię gdzieś.

  • Służy tcpdump port 1234do pozyskiwania danych wysyłanych do tego portu. Możesz użyć programu takiego jak Wireshark, aby przeanalizować go na innym komputerze (przechwyconym do pliku za pomocą -wopcji). Możesz też użyć Wireshark bezpośrednio.

  • W przypadku, gdy ustanawia i utrzymuje otwarte połączenie tcp / udp, można użyć netstatdo znalezienia zdalnego adresu IP połączenia.

  • Wymień otwarte gniazda procesu jak w odpowiedzi dostarczonej przez @StephaneChazelas.

gertvdijk
źródło
1

Możesz użyć sockstatpolecenia, aby znaleźć proces, który zainicjował połączenie z twoją usługą na lokalnym hoście.

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

Po prostu dopasuj wszystkie połączenia źródłowe do miejsca docelowego. Działa to dobrze w przypadku gniazd TCP / UDP / UNIX.

Andrey Voitenkov
źródło
0

W systemie Solaris uruchamianie plików pf na wszystkich procesach powinno pokazywać, które procesy mają otwarte połączenia. Będzie to wymagało ostrożnego filtrowania, prawdopodobnie przy użyciu opcji -A, -B ggrep ...

W systemie Linux netstat -anp --inetdziała, nawet bez zainstalowanego lsof. (upuść, --inetaby uzyskać także gniazda domeny Unix)

Gert van den Berg
źródło