Jak śledzić aktywność sieciową polecenia?

14

Chcę śledzić aktywność sieciową polecenia, próbowałem tcpdump i strace bez powodzenia.

Na przykład: jeśli instaluję pakiet lub używam dowolnego polecenia, które próbuje dotrzeć do jakiejś witryny, chcę wyświetlić tę aktywność sieciową (witrynę, do której próbuje dotrzeć).

Myślę, że możemy to zrobić za pomocą tcpdump. Próbowałem, ale śledzi całą aktywność sieciową mojego systemu. Powiedzmy, że jeśli uruchamiam wiele poleceń związanych z siecią i chcę śledzić tylko określoną aktywność w sieci poleceń, trudno jest znaleźć dokładne rozwiązanie.

Czy jest na to sposób?

AKTUALIZACJA:

Nie chcę śledzić wszystkiego, co dzieje się w moim interfejsie sieciowym. Chcę tylko śledzić aktywność sieciową polecenia (na przykład #yum install -y vim). Takich jak strona, do której próbuje dotrzeć.

Buvanesh Kumar
źródło
1
Umieść aplikację w sieciowej przestrzeni nazw, a następnie użyj tcpdump / wireshark. Zobacz np . Tutaj .
bezpośrednio

Odpowiedzi:

17

netstat dla uproszczenia

Używanie netstati grepping na PID lub nazwie procesu:

# netstat -np --inet | grep "thunderbird"
tcp        0      0 192.168.134.142:45348   192.168.138.30:143      ESTABLISHED 16875/thunderbird
tcp        0      0 192.168.134.142:58470   192.168.138.30:443      ESTABLISHED 16875/thunderbird

I możesz użyć watchdo aktualizacji dynamicznych:

watch 'netstat -np --inet | grep "thunderbird"'

Z:

  • -n: Pokaż adresy numeryczne zamiast próbować określić symboliczny host, port lub nazwę użytkownika
  • -p: Pokaż PID i nazwę programu, do którego należy każde gniazdo.
  • --inet: Pokaż tylko gniazda protokołu raw, udp i tcp.

miejsce na gadatliwość

Powiedziałeś, że wypróbowałeś stracenarzędzie, ale czy wypróbowałeś tę opcję trace=network? Zauważ, że wyjście może być dość szczegółowe, więc możesz potrzebować trochę grepowania. Możesz zacząć od grepowania na „sin_addr”.

 strace -f -e trace=network <your command> 2>&1 | grep sin_addr

Lub, dla już uruchomionego procesu, użyj PID:

 strace -f -e trace=network -p <PID> 2>&1 | grep sin_addr
Gohu
źródło
+1, dla netstatktórego IMHO jest najprostszym i najczystszym rozwiązaniem.
dr01
@Gohu Zrobiłem to samo dla dnf. ale bez powodzenia. Próbowałem zainstalować niektóre pakiety za pomocą dnf, a następnie widzę, że proces dnf jest uruchomiony (nazwa procesu: dnf zgodnie z poleceniem top i ps aux). Niestety nie otrzymałem żadnych danych wyjściowych z netstat -np --inet | grep „dnf”.
Buvanesh Kumar
+1 za strace. To rozwiązało mój problem. Mogę uzyskać adresy IP. Dziękuję bardzo za odpowiedź :) @Gohu. Wydaje mi się, że podaje wszystkie adresy IP, które osiąga przez sieć (np. Adres IP routera i inne adresy IP). Jeśli wiesz, czy można śledzić tylko docelowy adres IP?
Buvanesh Kumar
Możesz spróbować przefiltrować dane stracewyjściowe, utrzymując tylko connectwywołania systemowe i usuwając dnsżądania (port 53) za pomocą:| grep connect | grep -v 'sin_port=htons(53)'
Gohu
+1 za opcję śledzenia sieci na strace
wyreżyserowano
5

Utworzyłbym nową przestrzeń nazw sieci , przerzuciłbym ją do prawdziwej sieci, a następnie monitorowałem pomost za pomocą tcpdump.

Simon Richter
źródło
1
Dziękuję za odpowiedź. Byłoby wspaniale, jeśli powiesz mi, jak to zrobić :).
Buvanesh Kumar,
5

sysdig pozwala monitorować całą aktywność jądra lub kilku poleceń uruchomionych w twoim systemie w czasie pracy, w tym między innymi aktywność sieciową.

Ponieważ wynik może być duży, musisz zbudować filtry, dlatego domyślna strona dla najbardziej podstawowych filtrów jest dość zrozumiała.

Ma również tę zaletę, że nie jest używane jako opakowanie aplikacji, jak w strace, i może być dość potężne.

Z przykładów Sysdig

Networking

Zobacz najlepsze procesy pod względem wykorzystania przepustowości sieci

sysdig -c topprocs_net 

Pokaż dane sieciowe wymieniane z hostem 192.168.0.1

Jako binarny:

sysdig -s2000 -X -c echo_fds fd.cip=192.168.0.1   

Jako ASCII:

sysdig -s2000 -A -c echo_fds fd.cip=192.168.0.1 

Zobacz najlepsze porty lokalnego serwera:

W zakresie ustanowionych połączeń:

sysdig -c fdcount_by fd.sport "evt.type=accept"   

Pod względem całkowitej liczby bajtów:

sysdig -c fdbytes_by fd.sport 

Zobacz najlepsze adresy IP klientów

Pod względem nawiązanych połączeń

sysdig -c fdcount_by fd.cip "evt.type=accept"   

Pod względem całkowitej liczby bajtów

sysdig -c fdbytes_by fd.cip 

Lista wszystkich połączeń przychodzących, które nie są obsługiwane przez apache.

sysdig -p"%proc.name %fd.name" "evt.type=accept and proc.name!=httpd"
Rui F. Ribeiro
źródło
1

Możesz użyć wireshark do wąchania całego ruchu wejściowego i wyjściowego interfejsu sieciowego. Jeśli potrzebujesz opcji bez GUI, możesz użyć tshark.

Dzięki obu opcjom możesz zobaczyć cały ruch sieciowy i zapisać go, aby później przeanalizować wszystkie ustanowione połączenia.

Ricard Molins
źródło
1
Jak powiedziałem wcześniej, jeśli uruchomię wiele poleceń związanych z siecią, to skąd mam wiedzieć, które polecenie pobiera, która strona?
Buvanesh Kumar
To jest bardziej ogólna odpowiedź. Że już wiem, że możemy śledzić aktywność sieciową interfejsu sieciowego :). Szukam śledzenia konkretnej statystyki sieci poleceń.
Buvanesh Kumar
Jeśli wiesz, z jakich portów korzysta polecenie, możesz przefiltrować wąchanie, aby ograniczyć je do żądanego polecenia. Jednak może to nie być wykonalne w twojej sytuacji.
Ricard Molins,