Hvis du kjører en server, vil du utvilsomt komme til et punkt hvor du trenger å fikse noen nettverksrelaterte problemer. Selvfølgelig ville det være lett å bare sende en e-post til supportavdelingen, men noen ganger må du skitne på hendene. I dette tilfellet tcpdumper verktøyet for den jobben. Tcpdump er en nettverkspakkeanalysator som kjører under kommandolinjen.
Denne artikkelen vil deles inn i tre deler:
- Grunnleggende funksjoner.
- Filtrering basert på visse trafikkegenskaper.
- Et kort utdrag av de mer avanserte funksjonene (som logiske uttrykk, filtrering etter TCP-flagg).
Siden tcpdump ikke er inkludert i de fleste basissystemer, må du installere det. Imidlertid har nesten alle Linux-distribusjoner tcpdump i sine kjernelager. For Debian-baserte distribusjoner er kommandoen for å installere tcpdump:
apt-get install tcpdump
For CentOS/RedHat, bruk følgende kommando:
yum install tcpdump
FreeBSD tilbyr en forhåndsbygd pakke som kan installeres ved å utstede:
pkg install tcpdump
Det er også en port tilgjengelig, net/tcpdumpsom kan installeres via:
cd /usr/ports/net/tcpdump
make install clean
Hvis du kjører tcpdumputen noen argumenter, vil du bli slått med resultater. Å kjøre den på en nyopprullet instans her på Vultr i mindre enn fem sekunder gir følgende resultater:
2661 packets captured
2663 packets received by filter
0 packets dropped by kernel
Før du går inn på flere detaljer om hvordan du filtrerer inndata, bør du ta en titt på noen parametere som kan sendes til tcpdump:
-i- Spesifiserer grensesnittet du vil lytte på, for eksempel: tcpdump -i eth0.
-n- Ikke prøv å gjøre omvendte oppslag på IP-adresser, for eksempel: tcpdump -n(hvis du legger til en annen nvil tcpdump vise deg portnumre i stedet for navn).
-X- Vis innholdet i de innsamlede pakkene: tcpdump -X.
-c- Bare fangst xpakker, som xer et vilkårlig tall, tcpdump -c 10fanger for eksempel nøyaktig 10 pakker.
-v- Øk mengden pakkeinformasjon du blir vist, mer vs legg til mer ordlyd.
Hver av parametrene nevnt her kan kombineres sammen. Hvis du ønsket å fange 100 pakker, men bare på VPN-grensesnittet tun0, ville tcpdump-kommandoen se slik ut:
tcpdump -i tun0 -c 100 -X
Det er dusinvis (om ikke hundrevis) av alternativer i tillegg til de få, men de er de vanligste. Les gjerne tcpdumps manpage på systemet ditt.
Nå som du har en grunnleggende forståelse av tcpdump, er det på tide å se på en av tcpdumps mest fantastiske funksjoner: uttrykk. Uttrykk vil gjøre livet ditt mye enklere. De er også kjent som BPF- eller Berkeley-pakkefiltre. Ved å bruke uttrykk kan du selektivt vise (eller ignorere) pakker basert på visse egenskaper - som opprinnelse, destinasjon, størrelse eller til og med TCP-sekvensnummer.
Så langt har du klart å begrense søket til en viss mengde pakker på et bestemt grensesnitt, men la oss være ærlige her: det etterlater fortsatt for mye bakgrunnsstøy til å fungere effektivt med de innsamlede dataene. Det er der uttrykk spiller inn. Konseptet er ganske enkelt, så vi utelater den tørre teorien her og støtter forståelsen med noen praktiske eksempler.
Uttrykkene du sannsynligvis kommer til å bruke mest er:
host - Se etter trafikk basert på vertsnavn eller IP-adresser.
srceller dst- Se etter trafikk fra eller til en bestemt vert.
proto- Se etter trafikk av en bestemt protokoll. Fungerer for tcp, udp, icmp og andre. Å utelate protonøkkelordet er også mulig.
net - Se etter trafikk til/fra et visst utvalg av IP-adresser.
port - Se etter trafikk til/fra en bestemt havn.
greatereller less- Se etter trafikk som er større eller mindre enn en viss mengde byte.
Mens manpage for tcpdumpbare inneholder noen få eksempler, har manpage for pcap-filtersvært detaljerte forklaringer på hvordan hvert filter fungerer og kan brukes.
Hvis du vil se hvordan kommunikasjonen din med en bestemt server går, kan du hostfor eksempel bruke nøkkelordet (inkludert noen av parameterne ovenfra):
tcpdump -i eth0 host vultr.com
Noen ganger er det datamaskiner på nettverket som ikke respekterer MTU eller spammer deg med store pakker; å filtrere dem ut kan noen ganger være vanskelig. Uttrykk lar deg filtrere ut pakker som er større eller mindre enn et visst antall byte:
tcpdump -i eth0 -nn greater 128
or
tcpdump -i eth0 -nn less 32
Kanskje bare en viss havn er av interesse for deg. I dette tilfellet bruker du portuttrykket:
tcpdump -i eth0 -X port 21
Du kan også se etter portområder:
tcdump -i eth0 -X portrange 22-25
Siden NAT-gatewayer er ganske vanlige, kan du bare se etter destinasjonsporter:
tcpdump dst port 80
Hvis du ser på trafikk til webserveren din, vil du kanskje bare se på TCP-trafikk til port 80:
tcpdump tcp and dst port 80
Du spør deg sikkert hva søkeordet andgjør der. Godt spørsmål. Det bringer oss til den siste delen av denne artikkelen.
tcpdump tilbyr grunnleggende støtte for logiske uttrykk, mer spesifikt:
and/ &&- Logisk "og".
or/ ||- Logisk "eller".
not/ !- Logisk "ikke".
Sammen med muligheten til å gruppere uttrykk sammen, lar dette deg lage svært kraftige søk etter innkommende og utgående trafikk. Så la oss filtrere ut trafikk som kommer fra vultr.com på port 22 eller 443:
tcpdump -i eth0 src host vultr.com and (dst port 22 or 443)
Å kjøre dette på kommandolinjen vil gi deg følgende feil:
bash: syntax error near unexpected token `('
Det er fordi det er et forbehold: bashprøver å evaluere hver karakter den kan. Dette inkluderer den (og )tegn. For å unngå denne feilen bør du bruke enkle anførselstegn rundt det kombinerte uttrykket:
tcpdump -i eth0 'src host vultr.com and (dst port 22 or 443)'
Et annet nyttig eksempel: Når du feilsøker SSH-problemer med en av brukerne dine, vil du kanskje ignorere alt som er relatert til SSH-økten din:
tcpdump '!(host $youripaddress) && port 22)'
Igjen, brukstilfellene er uendelige, og du kan spesifisere i ekstreme dybder hva slags trafikk du vil se. Følgende kommando vil bare vise deg SYNACK-pakker av et TCP-håndtrykk:
tcpdump -i eth0 'tcp[13]=18'
Dette fungerer ved å se på den trettende forskyvningen til TCP-overskriften og den attende byten i den.
Hvis du kom deg helt hit, er du klar for de fleste brukstilfeller som vil dukke opp. Jeg kan knapt ta på overflaten uten å gå inn i for mange detaljer. Jeg anbefaler på det sterkeste at du eksperimenterer litt videre med de forskjellige alternativene og uttrykkene; og som vanlig: referer til manpage når du går deg vill.
Sist men ikke minst – et raskt tilbakeblikk. Husker du begynnelsen av denne artikkelen? Med tusenvis av pakker fanget i løpet av sekunder? Kraften til tcpdumpkan trimme det ned mye:
tcpdump -i eth0 tcp port 22
Resultatet er nå:
81 packets captured
114 packets received by filter
0 packets dropped by kerne
Dette er mye sunnere og lettere å feilsøke. Godt nettverk!