2013-06-07 15:55:48 +0000 2013-06-07 15:55:48 +0000
51
51

Monitorowanie ruchu TCP na konkretnym porcie

Szukałem tego dość obszernie, ale nie wydaje mi się, aby mógł powstać działający przykład.

Moim celem jest monitorowanie ruchu TCP na konkretnym porcie, aby zobaczyć przychodzące połączenia i zapisać je do pliku tekstowego. Problem w tym, że potrzebuję również znacznika czasu na każdym wierszu, aby pokazać dokładnie kiedy klient połączył się do drugiego.

Wyczerpałem już netstat, nmap i tcptrack, ale żaden nie obsługuje znacznika czasu.

Myślałem, że skrypt powłoki linuksa mógłby zadziałać, gdybym monitorował konkretny port lokalny i zapisywał tekst do pliku po nawiązaniu połączenia, a następnie po prostu konkatenerował datę na każdej linii.

Bawiłem się tym:

netstat -ano|grep 443|grep ESTABLISHED

jak również tym:

tcptrack -i eth0 port 443

ale nie odpowiadało to moim potrzebom, ponieważ potrzebowałem czasu na połączenie.

Jeśli masz jakieś sugestie lub możesz wskazać mi właściwy kierunek, będzie to bardzo mile widziane.

Dziękuję. :)

Odpowiedzi (7)

73
73
73
2013-06-07 16:03:28 +0000

Edit : Wciąż będę głosował za tym po latach. Please don’t go for this answer, the answer using iptables here is far superior in my opinion.

  • *
tcpdump port 443 and '(tcp-syn|tcp-ack)!=0'

or only tcp-syn, or only tcp-ack (my guess would be that one), depending on what you need.

33
33
33
2014-12-05 15:08:24 +0000

Do tego celu możesz użyć wsparcia iptables w jądrze Linuksa. Zaletą jest to, że nie wymaga ono żadnego dodatkowego oprogramowania, aby było umiarkowanie użyteczne. Minusem jest to, że wymaga uprawnień roota do konfiguracji (ale biorąc pod uwagę, że mówisz o porcie 443, który jest portem uprzywilejowanym, prawdopodobnie potrzebujesz uprawnień roota w większości rozwiązań).

Dodaj regułę iptables z czymś takim jak:

sudo iptables -I INPUT -p tcp --dport 443 --syn -j LOG --log-prefix "HTTPS SYN: "

(Dostosuj część -I INPUT do swojego gustu)

Gdy reguła zostanie uruchomiona, wpis syslog będzie emitowany przez jądro. Na przykład, z regułą wejściową, wpis logu może wyglądać jak:

Dekada 5 09:10:56 jądro nazwy hosta: [1023963.185332] HTTPS SYN: IN=ifX OUT= MAC=80:80:80:80:80:80:80:80:80:80:80:08:00 SRC=A.B.C.D DST=W.X.Y. Z LEN=52 TOS=0x00 PREC=0x20 TTL=119 ID=11901 DF PROTO=TCP SPT=37287 DPT=443 WINDOW=8192 RES=0x00 SYN URGP=0

Można wtedy użyć dowolnego narzędzia do monitorowania dziennika pracy, aby zrobić coś użytecznego z tymi informacjami. Jeśli twoja implementacja syslogu to obsługuje, możesz nawet skierować je do osobnego pliku dziennika, skutecznie spełniając wymóg zapisu danych połączenia do pliku opatrzonego znacznikiem czasu na sekundę, bez dodatkowego oprogramowania.

Zauważ, że cel LOG jest celem niekończącym się, co oznacza, że wszelkie reguły następujące po nim nadal będą oceniane, a pakiet nie zostanie ani odrzucony ani zaakceptowany przez samą regułę LOG. To sprawia, że cel LOG jest użyteczny także do debugowania reguł firewalla.

Aby uniknąć zalania logu, rozważ użycie modułu limit w połączeniu z tym. Zobacz stronę manuala iptables(8), aby dowiedzieć się więcej.

26
26
26
2013-06-07 16:13:36 +0000

Micro-Second Resolution

Domyślnie, narzędzie tcpdump będzie raportować czas z mikrosekundową rozdzielczością. Na przykład:

$ sudo tcpdump -i any port 443

pokaże wynik podobny do:

12:08:14.028945 IP localhost.33255 > localhost.https: Flagi [S], seq 1828376761, win 43690, opcje [mss 65495,sackOK,TS val 108010971 ecr 0,nop,wscale 7], długość 0 12:08:14.028959 IP localhost.https > localhost.33255: Flagi [R.], seq 0, ack 1828376762, win 0, length 0

Zobacz pełną listę opcji tcpdump(8), oraz pcap-filter(7) dla pełnej składni filtrów, których możesz użyć.

5
5
5
2013-06-07 16:09:31 +0000

443 jest ruchem zaszyfrowanym - tak trudnym do wykonania heads or tails ruchu na tym porcie i tak:

można zrobić

yum install ngrep lub apt-get install ngrep

następnie uruchomić

ngrep -W byline -d any port 443 -q
2
2
2
2016-06-02 09:48:03 +0000

Możesz tego wymagać również do monitorowania pakietów przychodzących i wychodzących z innych maszyn.

tcpflow -i eth0 -c port 7891

(opcja -i do podania sieci, opcja -c do wydruku pakietów w konsoli)

1
1
1
2013-06-07 15:59:57 +0000

Możesz użyć tcpdump lub Wireshark.

0
0
0
2017-05-26 11:08:35 +0000

Jeśli potrzebujesz stałego rozwiązania, które zawsze będzie monitorować ruch na interesujących Cię portach, proponuję użyć QoS (komenda tc w linuksie). tc jest nieco zaszyfrowany i nieudokumentowany, więc używam FireQoS do ustawienia QoS i netdata do monitorowania go w czasie rzeczywistym.

Sprawdź to, aby uzyskać więcej informacji: https://github.com/firehol/netdata/wiki/You-should-install-QoS-on-all-your-servers