Monitoruj ruch TCP na określonym porcie

49

Szukałem tego dość szeroko, ale nie wydaje mi się, aby wymyślić działający przykład.

Moim celem jest monitorowanie ruchu TCP na określonym porcie, aby zobaczyć połączenia przychodzące i zapisać je w pliku tekstowym. Najważniejsze jest to, że potrzebuję także znacznika czasu w każdym wierszu, aby pokazać dokładnie, kiedy klient podłączył się do drugiego.

Wyczerpałem już funkcje netstat, nmap i tcptrack, ale żaden nie obsługuje sygnatury czasowej.

Myślałem, że skrypt powłoki Linuksa może działać, gdybym monitorował określony port lokalny i zapisywał tekst w pliku, gdy nawiązane jest połączenie, a następnie po prostu konkatenował datę w każdym wierszu.

Bawiłem się tym:

netstat -ano|grep 443|grep ESTABLISHED

tak dobrze jak to:

tcptrack -i eth0 port 443

ale żadne z nich nie odpowiada moim potrzebom, ponieważ potrzebuję czasu na połączenie.

Jeśli masz jakieś sugestie lub możesz skierować mnie w dobrym kierunku, byłbym bardzo wdzięczny.

Dzięki. :)


źródło
Haha przeprowadziła migrację z stackoverflow, ale musi przeprowadzić migrację do unix / linux
Kolob Canyon

Odpowiedzi:

70

edytuj : Wciąż otrzymuję przychylne głosy za te lata później. Proszę, nie wybieraj tej odpowiedzi, moim zdaniem odpowiedź wykorzystującaiptables tutaj jest o wiele lepsza.


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

lub tylko tcp-syn, lub tylko tcp-ack(przypuszczam, że byłby to jeden), w zależności od tego, czego potrzebujesz.

Wrikken
źródło
Czy zamiast sposobu wyświetlania nazwy hosta dla każdego połączenia można zastąpić ją adresem IP?
Tak, dodaj -npo tcpdump (man tcpdump: -n Nie konwertuj adresów (tj. Adresów hostów, numerów portów itp.) Na nazwy ) .
Wrikken
5
Twierdziłbym, że spamowanie dziennika jądra nie jest tak naprawdę lepsze. ;)
Daniel B
1
Ach, ale zrobiłbym to, pod warunkiem, że odpowiednio skonfiguruje się, które dzienniki powinny iść: P Ale hej, ta odpowiedź wciąż jest dostępna, jeśli to
łamie
1
@Wrikken Problem z używaniem dziennika jądra do tego polega na tym, że używając twojego rozwiązania, gdy ctrl + c poza tcpdump wszystko pozostaje jak wcześniej. Rozwiązanie iptables oznacza pozostawienie „niespodzianki”, jeśli nie usuniesz reguły ręcznie. Ta niespodzianka może szybko przełożyć się na posiadanie pełnego dysku głównego. Przepraszam, ale głosuję za tym (:
John Blackberry
31

Możesz w tym celu skorzystać z obsługi iptables w jądrze Linuksa. Plusem jest to, że nie wymaga żadnego dodatkowego oprogramowania, aby być umiarkowanie użytecznym. Minusem jest to, że wymaga skonfigurowania uprawnień roota (ale biorąc pod uwagę, że mówisz o porcie 443, który jest portem uprzywilejowanym, prawdopodobnie potrzebujesz uprawnień roota w przypadku 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 -I INPUTczęść do własnych upodobań).

Po uruchomieniu reguły jądro emituje wpis syslog. Na przykład w przypadku reguły wprowadzania wpis dziennika może wyglądać mniej więcej tak:

5 grudnia 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: 80: 08: 00 SRC = ABCD DST = WXYZ LEN = 52 TOS = 0x00 PREC = 0x20 TTL = 119 ID = 11901 DF PROTO = TCP SPT = 37287 DPT = 443 WINDOW = 8192 RES = 0x00 SYN URGP = 0

Następnie możesz użyć dowolnego narzędzia do monitorowania dzienników, aby zrobić coś użytecznego z tymi informacjami. Jeśli twoja implementacja syslog to obsługuje, możesz nawet skierować je do osobnego pliku dziennika, skutecznie spełniając wymóg zapisania danych połączenia do pliku oznaczonego czasem w sekundach bez dodatkowego oprogramowania.

Zauważ, że LOGcel jest celem nie kończącym się, co oznacza, że ​​wszelkie reguły następujące po nim będą nadal oceniane, a pakiet nie zostanie odrzucony ani zaakceptowany przez samą regułę LOG. To sprawia, że LOGcel jest przydatny również do debugowania reguł zapory.

Aby uniknąć zalania dziennika, rozważ użycie limitmodułu w połączeniu z tym. Szczegółowe informacje można znaleźć na stronie podręcznika użytkownika iptables (8).

CVn
źródło
czy jest możliwe uruchomienie skryptu Python, który to powoduje?
Karl Zillner,
Nie zapomnij usunąć tych reguł tabel IP, gdy skończysz, w przeciwnym razie będą spamować dzienniki dość mocno, w zależności od reguły. digitalocean.com/community/tutorials/...
Mo Beigi
26

Rozdzielczość mikro sekund

Domyślnie narzędzie tcpdump zgłasza czas z dokładnością do mikro sekundy. Na przykład:

$ sudo tcpdump -i any port 443

wyświetli dane wyjściowe podobne do następujących:

12: 08: 14.028945 IP localhost.33255> localhost.https: Flags [S], seq 1828376761, win 43690, options [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 tcpdump (8), aby uzyskać pełną listę opcji tcpdump, a pcap-filter (7), aby uzyskać pełną składnię filtrów, których możesz użyć.

CodeGnome
źródło
5

443 to zaszyfrowany ruch - tak trudno jest uzyskać ruch w tym porcie:

możesz to zrobić

mniam zainstaluj ngrep lub apt-get install ngrep

następnie uruchomić

ngrep -W byline -d any port 443 -q
Uznana Halcyon
źródło
2

Może to wymagać również monitorowania przychodzących i wychodzących pakietów z innych komputerów.

tcpflow -i eth0 -c port 7891

(opcja -iwspominania o sieci, opcja -cdrukowania pakietów w konsoli)

reegan vijay
źródło
To jest naprawdę komentarz, a nie odpowiedź na pierwotne pytanie. Aby skrytykować lub poprosić autora o wyjaśnienie, zostaw komentarz pod jego postem - zawsze możesz komentować własne posty, a gdy będziesz mieć wystarczającą reputację , będziesz mógł komentować każdy post . Proszę przeczytać Dlaczego potrzebuję 50 reputacji, aby móc komentować? Co mogę zamiast tego zrobić?
DavidPostill
1

Możesz użyć tcpdump lub Wireshark.

sigjuice
źródło
0

Jeśli potrzebujesz stałego rozwiązania, które zawsze będzie monitorować ruch na interesujących portach, sugeruję użycie QoS (polecenie tc w Linuksie). tc jest nieco tajemniczy i nieudokumentowany, więc używam FireQoS do konfiguracji QoS i netdata do monitorowania w czasie rzeczywistym.

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

Costa Tsaousis
źródło
Powiedziałbym, że jest to trochę więcej niż zabijanie tylko do rejestrowania połączeń, w których będą działać iPTables + --log.
djsmiley2k - CoW
Masz rację, to jest przesada, jeśli musisz zalogować połączenia. Używam tego rozwiązania nie do monitorowania, którzy klienci są podłączeni, ale ile przepustowości wykorzystuje usługa.
Costa Tsaousis