Pokaż połączenia sieciowe procesu

26

Czy istnieje sposób na pokazanie połączeń procesu? Coś w tym stylu:

show PID

w którym showjest to polecenie, i PIDjest pid procesu. Dane wyjściowe, które chcę, składają się z całego połączenia procesu (w czasie rzeczywistym). Na przykład, jeśli proces spróbuje połączyć się z 173.194.112.151, wynikiem jest 173.194.112.151.

Bardziej konkretny przykład z Firefoksem:

show `pidof firefox`

a wraz z firefoxem najpierw wchodzę na google.com , potem na unix.stackexchange.com i na końcu 192.30.252.129 . Wyjście, gdy zamykam przeglądarkę, musi wynosić:

google.com
stackexchange.com
192.30.252.129

(Oczywiście w przeglądarce dane wyjściowe nie są realistyczne, ponieważ istnieje wiele innych powiązanych powiązań, ale to tylko przykład.)

ᴜsᴇʀ
źródło
W jakim wariancie Uniksa? Większość ma do tego narzędzia, ale różne.
Gilles „SO- przestań być zły”
Więc zasadniczo chcesz dziennik wszystkich połączeń?
Sergiy Kolodyazhnyy
Myślę, że tcpdump lub Wireshark powinien wykonać to zadanie.
Sergiy Kolodyazhnyy
Niektóre możliwe sposoby na to: askubuntu.com/questions/11709/…
Mark Plotnick
@Gilles Ubuntu 14.04.3 LTS
ᴇʀsᴇʀ

Odpowiedzi:

24

Szukasz strace! Znalazłem tę odpowiedź na askubuntu , ale jest ona poprawna dla Uniksa:

Aby rozpocząć i monitorować nowy proces:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

Aby monitorować istniejący proces ze znanym PID:

strace -p $PID -f -e trace=network -s 10000

W przeciwnym razie, ale jest to specyficzne dla Linuksa, możesz uruchomić proces w izolowanej sieciowej przestrzeni nazw i użyć Wireshark do monitorowania ruchu . Prawdopodobnie będzie to wygodniejsze niż czytanie stracedziennika:

  • utwórz testową przestrzeń nazw sieci:

    ip netns add test
    
  • utwórz parę wirtualnych interfejsów sieciowych (veth-a i veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • zmień aktywną przestrzeń nazw interfejsu veth-a:

    ip link set veth-a netns test
    
  • skonfiguruj adresy IP wirtualnych interfejsów:

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • skonfiguruj routing w testowej przestrzeni nazw:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • aktywuj ip_forward i ustal regułę NAT, aby przekazywać ruch przychodzący z utworzonej przestrzeni nazw (musisz dostosować interfejs sieciowy i adres IP SNAT):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o YOURNETWORKINTERFACE -j SNAT --to-source YOURIPADDRESS
    

    (Jeśli wolisz, możesz także użyć reguły MASQUERADE)

  • wreszcie możesz uruchomić proces, który chcesz przeanalizować w nowej przestrzeni nazw, a także wireshark:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Będziesz musiał monitorować interfejs veth-a.

Olivier
źródło
2
stracejest właściwie specyficzny dla jądra Linuksa, więc nie działa na wszystkich systemach operacyjnych uniksopodobnych. Jak rozumiem, systemy podobne do BSD mają podobne narzędzia (DTrace i kratownice). W każdym razie dobra odpowiedź (tak pozytywnie oceniona). Witamy w Stack Exchange.
Anthony G - sprawiedliwość dla Moniki
Odpowiedź wydaje się punkt w dobrym kierunku, jednak mam problemy interpretacji na stracewyjście podczas badania git fetch. Spodziewałem się, że w danych wyjściowych pojawi się jakiś adres URL, zgodnie z żądaniem OP. Czy ktoś może pomóc?
andreee
14

Próbować

lsof -i -a -p `pidof firefox`
alxrem
źródło
Częściowo działa: drukuje niektóre z bieżących połączeń procesu, ale następnie zamyka się automatycznie. W przypadku niektórych programów wyjście zawiera tylko to ostrzeżenie:lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /home/user/.gvfs Output information may be incomplete.
ᴇʀsᴇʀ
Możesz dodać opcje -r1powtarzania wyjścia co sekundę i -wukrywania ostrzeżeń.
alxrem,
2
Pokazuje tylko połączenia w danym momencie, nie wyświetla wszystkich połączeń, które proces wykonuje przez cały okres jego użytkowania. Nawet jeśli umieścisz to polecenie w pętli, ominie ono krótkotrwałe połączenia.
Gilles „SO- przestań być zły”
Pytający nie poprosił o sprawdzenie połączeń przez cały okres jego użytkowania. Można interpretować (in real-time)jako from the point in time of tracking and forward.
llua
8

Oto inne podejście:

ss -nap | grep $(pidof firefox)

Przykładowe dane wyjściowe:

tcp    ESTAB      0      0          192.168.0.222:49050    216.58.218.164:443    users:(("firefox",3280,69))
tcp    ESTAB      0      0          192.168.0.222:48630    198.252.206.25:443    users:(("firefox",3280,106))
tcp    ESTAB      0      0          192.168.0.222:44220     216.58.217.38:443    users:(("firefox",3280,140))
tcp    ESTAB      0      0          192.168.0.222:52690    54.240.170.181:80     users:(("firefox",3280,107))
tcp    ESTAB      0      0          192.168.0.222:48744    198.252.206.25:443    users:(("firefox",3280,87))
tcp    ESTAB      0      0          192.168.0.222:48811    198.252.206.25:443    users:(("firefox",3280,73))
Sergiy Kolodyazhnyy
źródło
1
Pokazuje tylko połączenia w danym momencie, nie wyświetla wszystkich połączeń, które proces wykonuje przez cały okres jego użytkowania. Nawet jeśli umieścisz to polecenie w pętli, ominie ono krótkotrwałe połączenia.
Gilles „SO- przestań być zły”
5

Możesz spróbować również z netstat -p. Ze strony podręcznika:

netstat - Drukuj połączenia sieciowe, tabele routingu, statystyki interfejsu, połączenia maskaradowe i członkostwa multiemisji

Aby wyświetlić tylko połączenia sieciowe, użyj netstat -tup. Zauważ, że aby zobaczyć PID procesu, może być konieczne rootowanie.

Jeśli nie masz netstatw swoim systemie, możesz mieć ss, który ma prawie dokładną składnię. Możesz wtedy użyć ss -tup(jako root).

Abel
źródło
1
Pokazuje tylko połączenia w danym momencie, nie wyświetla wszystkich połączeń, które proces wykonuje przez cały okres jego użytkowania. Nawet jeśli umieścisz to polecenie w pętli, ominie ono krótkotrwałe połączenia.
Gilles „SO- przestań być zły”
1
netstat -p | grep firefox | grep tcp
Philip Kirkbride
@Gilles Co oznacza, że ​​jest to świetna odpowiedź dla każdego, kto chce zobaczyć połączenia w danym momencie. Tak jak ostatnio mój przypadek.
Jose Antonio przywraca Monikę