Czy mogę monitorować lokalne gniazdo domeny unix, takie jak tcpdump?

59

Chciałbym monitorować odpowiedzi na gnieździe unixowym bez zakłócania oryginalnych połączeń i przesyłać je do skryptu w celu przetworzenia.

Wiem, jak to zrobić za pomocą tcpdump dla połączeń tcp, ale nie mogę znaleźć rozwiązania dla lokalnych gniazd unixowych.

Czy to w ogóle możliwe?

ck_
źródło

Odpowiedzi:

15

Jest facet, który twierdzi, że to robi, tworząc aplikację, która działa jako brama między dwoma gniazdami i rejestruje wszystkie przepływające dane. Więc nie możesz dotknąć gniazda, ale jeśli możesz ponownie uruchomić usługę i dostroić ją, aby korzystać z tej aplikacji dla faceta, będziesz w stanie zobaczyć cały ruch.

Oto link do postu: Unix Socket Sniffer

Jest inny sposób, w którym musisz znaleźć identyfikator procesu dołączony do gniazda, a następnie znaleźć za pomocą lsof deskryptora pliku gniazda, a następnie dotknąć deskryptora pliku za pomocą strace.

Jeśli możesz zatrzymać cokolwiek klient / serwer używa gniazda i zmienić jego konfigurację, zalecałbym zawsze pierwszą metodę, druga metoda jest trudna i wymaga dotknięcia bieżącego procesu, który w niektórych aplikacjach może spowodować awarię.

Mam nadzieję, że ktoś nas oświeci w inny sposób :)

Powodzenia

Dzielność
źródło
Tak, możesz zastosować metodę pośrednika również z socat, ale mam nadzieję na bardziej bezpośredni sposób bez modyfikowania istniejących ustawień w innym miejscu.
ck_
1
W takim razie jestem jedyną świadomą tego drogą. Uważaj na produkcję, kiedy odłączysz strace od procesu, sprawdź, czy po tym wszystko działa.
Valor
3
Po dalszych poszukiwaniach znalazłem podobne pytanie z pewnymi szczegółami, dlaczego nie jest to bezpośrednio możliwe na stackoverflow stackoverflow.com/questions/8394613/…
ck_
80

możesz użyć socat.

sudo mv /path/to/sock /path/to/sock.original
sudo socat -t100 -x -v UNIX-LISTEN:/path/to/sock,mode=777,reuseaddr,fork UNIX-CONNECT:/path/to/sock.original

Co się dzieje powyżej: Najpierw przenieś oryginalne gniazdo do sock.original. Socat tworzy nowe gniazdo („UNIX-LISTEN”) w lokalizacji oryginałów i przekazuje je wszystkie do oryginału („UNIX-connect”). Opcja -v mówi socatowi, aby wydrukował również dane wyjściowe do STDERR.

storoj
źródło
3
Chcesz dodać trochę więcej wyjaśnień?
Kazark,
4
To proste, gdy oryginalne gniazdo unix ma ścieżkę w systemie plików. ale co, jeśli jest to abstrakcyjne gniazdo uniksowe przestrzeni nazw, którego w rzeczywistości nie można przenieść?
Valerio Schiavoni
6

Możesz także spróbować użyć strace na jednym z procesów po obu stronach gniazda, ponieważ pozwoli ci to zobaczyć, co jest napisane / przeczytane. Znalazłem w moim środowisku produkcyjnym, nie mam towarzystwa, ale mam stratę.

W dowolnym przydatnym celu należy ustawić -s na coś dużego.

omnigrok
źródło
To działało dla mnie dobrze i łatwe do zrobienia. Służy strace -p <pid>do oglądania uruchomionego procesu.
Matt Munson,
szybkie polecenie: strace -s9999 -f $(for i in $( pidof php5-fpm ) ; do echo -n " -p $i "; done ) 2>&1 | tee /tmp/php.loga następnie uruchom testy. Masz plik /tmp/php.log, aby powoli sprawdzać, czy dziennik jest zbyt duży. Jeśli otrzymujesz zbyt duży ruch, zrób zapytanie z ciągiem zapytania ze swoim imieniem lub czymś, aby wyszukać go w dziennikach
higuita
1
@higuita Wiem, że minęło dużo czasu, ale zamiast tej pętli możesz pozwolić printfsobie na powtórzenie. printf " -p %s" $(pidof php5-fpm)poprzedzi każdy argument pid znakiem -pi jest o wiele bardziej praktyczny do napisania.
JoL
2
// backup the socket
sudo mv /var/run/docker.sock /var/run/docker.sock.original

// use tcp port 8089 proxy the original socket
sudo socat TCP-LISTEN:8089,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock.original

// use the new socket to proxy the 8089 port
sudo socat UNIX-LISTEN:/var/run/docker.sock,fork TCP-CONNECT:127.0.0.1:8089

następnie:

sudo tcpdump -i lo -netvv port 8089
任喜军
źródło
el magnifeco! Dzięki
typelogic