Sniff gniazdo domeny UNIX

9

Wiem, że jakiś proces zapisuje do określonego gniazda domeny unix ( /var/run/asterisk/asterisk.ctl), ale nie znam pid nadawcy. Jak mogę dowiedzieć się, kto pisze do gniazda? Próbowałem z:

sudo lsof /var/run/asterisk/asterisk.ctl

ale wyświetla tylko właściciela gniazda. Chciałbym wiedzieć, kto pisze / czyta to gniazdo, a także chciałbym powąchać dane. czy to możliwe?

Dangonfast
źródło

Odpowiedzi:

4

Krótkie odpowiedzi są przeczące i niełatwe.

W Linuksie lsof polega na /proc/net/unixpobieraniu informacji dotyczących gniazd domeny UNIX. Ten interfejs wyświetla listę wszystkich powiązanych gniazd, ale nie śledzi punktów końcowych. Więc można zobaczyć, jakie istnieją gniazda, ale nie można zobaczyć, co się do nich podłączone. Gdzieś ta informacja jest śledzona, musi być śledzona, inaczej połączenia gniazd nie będą działać. Nie znalazłem jeszcze żadnego mechanizmu do odzyskania informacji o połączeniu.

Pytanie wąchania jest nieco bardziej interesujące, ale nie mniej rozczarowujące. Mam na myśli to, że „niełatwo” to to, że nie ma żadnego haka, który mógłby się zakraść i odczytać te dane. Najbliższym analogiem jest użycie tcpdump lub Wireshark, z których oba używają libpcap do ciężkiego podnoszenia. Chociaż zarówno sieć (AF_INET), jak i domena UNIX (AF_UNIX) są tworzone przy użyciu socket()wywołania funkcji, oba służą connect()do łączenia się, używania read()i write()przetwarzania danych, są obsługiwane przez różne podsystemy jądra. Ma to niefortunny efekt uboczny, ponieważ libpcap nie jest przeznaczony do pracy z gniazdami domenowymi UNIX.

Problem ma nieco słabszą stronę. Spójrz na stronę podręcznika użytkownika dla recv(2). Jest to wywołanie systemowe niższego poziomu, które read()wykorzystuje. Istnieje flaga dla recv()tzw MSG_PEEK. Umożliwiłoby to wąchanie ruchu przechodzącego przez gniazdo domeny UNIX. Więc to jest jasna strona, ciemna strona jest taka, że ​​według mojej najlepszej wiedzy nie istnieje żadna bieżąca aplikacja zaprojektowana do tego celu. Więc patrzysz na wysiłek rozwojowy.

Naprawdę chciałbym, aby była ładna prosta odpowiedź F'YEAH na obie części twojego pytania.

Scott Pack
źródło
11

Tak, możesz to zrobić. Wszystko czego potrzebujesz to systemtap.

Rozważ jeden z przykładowych skryptów systemtap, które wypiszą PID i nazwę procesu dowolnego programu, który czyta lub zapisuje określony i-węzeł (a takie jest właśnie gniazdo domeny w Uniksie).

Możesz w prosty sposób zmodyfikować ten skrypt, aby wydrukować rzeczywiste dane, które są odczytywane / zapisywane; Zostawię to jako ćwiczenie dla czytelnika.

Michael Hampton
źródło
4

Wiem, że to nie odpowiada na główne pytanie, ale znalazłem się tutaj, szukając po prostu wąchania komunikacji na gnieździe. Postanowiłem publikować posty dla takich jak ja. Oto jak to zrobiłem:

$> sudo socat -t100 -x -v UNIX-LISTEN: /var/run/php5-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT: /var/run/php5-fpm.sock

Możesz usunąć -x i po prostu zostawić -v dla komunikacji ascii. Mam nadzieję, że komuś pomoże.

Anton Valqk
źródło
działa doskonale
JSmyth,
-1

socat -t100 UNIX-LISTEN: /tmp/file.sock,mode=777,reuseaddr,fork STDOUT

Nie ma powielania danych wyjściowych, nie ma danych cyklicznych. Błąd poprzedniego komentarza „.sock.socat”

srvf
źródło
2
Chociaż może to być przydatne polecenie, dodaj wyjaśnienie / wyjaśnienie (a czym to się różni od tej odpowiedzi ?)
HBruijn
Przepraszam. Nie ma powielania danych wyjściowych, nie ma danych cyklicznych. Błąd poprzedniego komentarza „.sock.socat”
srvf