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.

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.


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

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.


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.


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)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.