Jak mogę monitorować wszystkie wychodzące żądania / połączenia z mojego komputera?

71

Moja maszyna jest serwerem, więc chcę zignorować połączenia z moim serwerem (np. Gdy ktoś odwiedza moją stronę internetową). Chcę, aby mój serwer wysyłał tylko połączenia / żądania do innych miejsc.

Jak wyświetlić tylko te połączenia wychodzące?

EDYCJA: Jestem nowy w tego typu rzeczach. Próbuję tylko sprawdzić, czy wysyłane są cokolwiek z mojego serwera poza danymi dla moich aplikacji internetowych. Na przykład, jeśli ktoś odwiedzi moje strony, to oczywiście mój serwer wyśle ​​dane do przeglądarki klienta. Załóżmy jednak, że gdzieś w środowisku mojej aplikacji internetowej znajduje się kod, który przesyła dane statystyczne w inne miejsce, o którym nie wiem. Chciałbym zobaczyć te miejsca, do których mój serwer wysyła dane, jeśli takie istnieją. Prawdopodobnie nie jest to prawdopodobne, ale przypuśćmy, że zdecydujesz się na użycie frp lub nodejs frameworka, którego nie napisałeś: istnieje niewielka szansa, że ​​może wysłać gdzieś jakiś rodzaj danych. Jeśli tak, to chciałbym to zobaczyć.

trusktr
źródło

Odpowiedzi:

76

Użyj netstat. Na przykład

$ netstat -nputw
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
[...]
tcp        0      0 192.168.25.222:22       192.168.0.134:42903     ESTABLISHED 32663/sshd: gert [p

wyświetla listę wszystkich połączeń wychodzących UDP ( u), TCP ( t) i RAW ( w) (nieużywających llub a) w postaci liczbowej ( nzapobiega możliwym długotrwałym zapytaniom DNS) i obejmuje pzwiązany z tym program ( ).

Rozważ dodanie copcji ciągłej aktualizacji danych wyjściowych.

gertvdijk
źródło
Dzięki. To dobra informacja. Czy możesz spojrzeć na moje zaktualizowane pytanie?
trusktr
1
Całkowicie nieodpowiedni porwanie (z wyjątkiem tego, że ta odpowiedź googlowała): Ta odpowiedź działa również w systemie Windows. Używanie tam netstatw „trybie ciągłym” -cnie działa. Zamiast tego używasz liczb, na przykład netstat -na 1 | find "[Scan_Host_IP_Addr]"w celu aktualizacji co 1sekundę (w tym przykładzie). ( źródło ).
ruffin
4
To ankieta, więc nie zawsze złapie wszystkie połączenia.
reinierpost
Czy istnieje sposób wyświetlania bardziej przyjaznych dla użytkownika informacji, takich jak nazwy domen, informacje o adresie IP? Być może używasz niestandardowego skryptu?
awm,
@awm Cóż, byłoby to wykonalne stracew procesie, filtrując wyszukiwania serwerów nazw (brak szczegółów, to nie jest pełna odpowiedź na to pytanie). Alternatywnie możesz pokazać odwrotny DNS adresów IP wymienionych w netstat, pomijając nopcję zawartą w mojej odpowiedzi.
gertvdijk
11

Jeśli chcesz tylko rejestrować każdą próbę połączenia, najłatwiej jest prawdopodobnie iptables LOGcelować w systemie Linux (lub w równoważnej funkcji rejestrowania zapory ogniowej w systemie).

Jeśli potrzebujesz więcej informacji, takich jak czas trwania połączenia i ilość danych wymienianych w obu kierunkach, to conntrackd(w systemie Linux) jest prawdopodobnie najlepszą opcją.

Należy jednak pamiętać, że te dwa powyżej rejestrują tylko ruch przechodzący przez netfilter, który jest generalnie całym ruchem, ale nie uwzględnia ruchu generowanego przez stosy IP w przestrzeni użytkownika (np. Maszyny wirtualne lub cokolwiek używającego surowych gniazd) lub ruchu zmostkowanego.

Aby uzyskać więcej ogólnych rozwiązań, można rzucić okiem na takie rzeczy jak argus, bro-ids, sancplub ntop, że rejestrować wszystkie rodzaje informacji w oparciu o ich powąchać ruchu na interfejsie.

Stéphane Chazelas
źródło
8

Próbowałem kilka narzędzi, w tym iftop, ntop, iptraf, i oczywiście bardzo przydatne wbudowanych netstat -tupln(obsługiwane opcje są zależne od OS), ale najbardziej praktyczne dla mojego przypadku użycia okazało się nethogs- to agreguje połączenia przez pochodzącego aplikacja i jest najmniej głośna ze wszystkich.

Instalowalny przez:

sudo apt-get install nethogs

Uruchom jako root:

sudo nethogs

Jeśli Twoim celem jest zobaczenie wszystkich połączeń TCP inicjowanych przez dowolną aplikację, możesz użyć:

sudo tcpdump -i lo -A | grep Host:
ccpizza
źródło
6

To, co myślę, że chcesz zrobić, to uzyskać listę portów nasłuchiwania, a następnie usunąć je z innych połączeń TCP, to będą wszystkie połączenia wychodzące. Komenda ss (status gniazda) wyprowadza kolumny „Adres lokalny: port” i „Adres równorzędny: port”, musimy usunąć porty nasłuchujące z kolumny „Adres lokalny: port”, a nie kolumnę „Adres równorzędny: port”, w przeciwnym razie możesz przegapić niektóre połączenia wychodzące. Aby to osiągnąć, używam \s{2}+za ciągiem „: $ port” w grep, aby pasował do spacji istniejących za kolumną „Adres lokalny: port”; ta kolumna ma za sobą co najmniej dwie białe spacje, gdzie „Adres równorzędny: port” ma jedną spację, a następnie nową linię (grrr ... powinien mieć tylko nową linię, IMO,\s+\s{2}+.) Normalnie mogę spróbować użyć funkcji filtrowania ss, jak z ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>. Ale wydaje się, że istnieje limit długości tego ciągu, który zbombardował w systemie, w którym miałem dużo portów nasłuchujących. Więc próbuję zrobić to samo z grep. Wierzę, że następujące będą działać:

FILTER=$(ss -tn state listening | gawk 'NR > 1 {n=split($3,A,":"); B[NR-1]=A[n]} END {for (i=1; i<length(B); i++) printf ":%s\\s{2}+|", B[i]; printf ":%s\\s{2}+", B[i]}')

ss -tn state established dst :* | grep -P -v "$FILTER"

Uwaga: zależy to od używanej wersji ss, starsze wersje (takie jak: ss narzędzie, iproute2-ss111117) mają inny format wyjściowy, więc może być konieczne użycie 3 $ zamiast 4 $ w awk. Zauważ też ss -tlni ss -tn state listeningdaje różne wyniki, co jest dla mnie trochę sprzeczne z intuicją. YMMV.

Znalazłem nieco bardziej eleganckie rozwiązanie, które nie wymaga znajomości adresu IP hosta, ss -tn state established dst :*działa dobrze, zmodyfikowałem powyższe wiersze poleceń.

Dołek
źródło
Czy mógłbyś dodać wyjaśnienie, jak to działa? ( Edytuj odpowiedź; nie publikuj wyjaśniających informacji jako komentarzy.) Myślę, że częściowo to rozgryzłem. Wygląda na to, że może wymagać trochę więcej pracy. Uruchomiłem ss -tn state listeningna hoście, na którym działa serwer FTP, i oczywiście polecenie pokazało, że maszyna nasłuchuje na porcie 21. Nie oznacza to, że egrep -vodfiltruje wszystkie hosty zdalne, których adres IP zawiera „21” (w tym „210” ”,„ 211 ”,„ 212 ”, ...)? Ponadto, czy asortnaprawdę jest to konieczne, czy może tylko ozdabianie okien?
G-Man,
Musiałem naprawić prawie całą rzecz, poprawiony skrypt jest powyżej.
Dale
Ostatecznie byłoby o wiele przyjemniej, gdyby ss lub netstat po prostu zawierałyby tę funkcjonalność. Zrób, ss --outaby uzyskać listę połączeń wychodzących.
Dale
Fajnie, podoba mi się ta odpowiedź. Wypróbuję to, kiedy wrócę do poprawy bezpieczeństwa na moim serwerze. : D
trusktr
Wygląda na to, że można to również zastosować do UDP, ale oczywiście musisz po prostu użyć różnych flag i stanów.
Dale
4

tcpdumppozwala zobaczyć cały ruch IP przepływający do / z określonego interfejsu z możliwością filtrowania według określonych kryteriów. tcpdumpjest zazwyczaj instalowany domyślnie w większości systemów * nix, jeśli nie, zwykle jest gdzieś port, w którym można go pobrać dla określonej dystrybucji.

txtechhelp
źródło
2

netstat jest dobrą opcją Użyj wymaganych parametrów. (patrz strony podręcznika) Na przykład

netstat -antup

Tutaj może monitorować wszystkie (a) nasłuchiwanie numeryczne (n) tcp (t) i udp (u) proces (p).

Możesz także spróbować wykonać sspolecenie. W celach informacyjnych:

SS Linux TCP / UDP Informacje o sieci i gniazdach

Kratos
źródło