Att utföra paketfångar med en sniffer kan vara en extremt kraftfull metod för att diagnostisera komplexa problem. När allt annat misslyckas är det ofta bra att se rådata som skickas över kabeln. Paketen ljuger inte och att analysera din applikationstrafik på låg nivå kan avslöja djupare symtom på ett problem (eller avslöja ett problem som du inte ens visste existerade).
I den här artikeln har vi Kommer att täcka några grundläggande faktorer för att använda det CLI-baserade tcpdump
-verktyget.
Grunderna för sniffer
Så först saker först: Vad menar vi när vi säger ”packet sniffer?” En paketsniffer är helt enkelt en mjukvara som låter dig fånga paket i ditt nätverk. Tcpdump och Wireshark är exempel på paketsniffare. Tcpdump tillhandahåller en CLI-paketsniffer och Wireshark ger ett funktionsrikt GUI för att sniffa och analysera paket.
Som standard fungerar tcpdump
i promiskuöst läge. Detta betyder helt enkelt att alla paket som når en värd kommer att skickas till tcpdump
för inspektion. Den här inställningen inkluderar även trafik som inte var avsedd för den specifika värden som du fångar på, som sändning och multicast-trafik. Självklart är tcpdump
inte något magiskt program: Den kan bara fånga de paket som på något sätt når ett av de fysiska gränssnitten på din maskin.
Installera tcpdump
är enkelt. Den är tillgänglig i standardpaketförvaren på ditt Red Hat-system och du kan installera den med namn:
Vanliga paket sniffande scenarier
Att fånga all trafik som kommer in i din maskin kanske låter begreppsmässigt coolt, men det låter också ganska låg nivå för många av de aktiviteter som vi utför i vårt dagliga arbete som sysadminer. Så när skulle du använda ett verktyg för att fånga paket? Jag vänder mig vanligtvis till en paketförstörare när jag felsöker ett problem med nätverksapplikationer och jag har tömt alla andra alternativ. Ofta har jag redan utfört grundläggande nätverksfelsökning och granskat alla applikationsloggfiler, men jag kan fortfarande inte komma till botten med ett problem. Vid denna tidpunkt kan det vara lärorikt att bryta ut en paketförskjutare för att observera den faktiska informationen som skickas på ledningen.
Ett annat bra användningsfall för en paketsniffer är pedagogiskt. Att titta på paketen som är inblandade i ett applikationsutbyte kan gå långt för att förbättra din förståelse för de underliggande protokollen. Det kan till exempel vara ovärderligt att följa hela paketflödet i en rekursiv DNS-fråga när du försöker förstå hur DNS fungerar.
Utföra grundläggande paketfångst
Det bästa sättet att lära sig är genom att bara dyka in, så låt oss komma igång med några grundläggande paketfångster. Låt oss först prova tcpdump
utan några speciella alternativ. Observera att du måste vara superanvändare för att utföra paketfångster (tekniskt sett kan du köra det från ett vanligt konto med speciella funktioner, men det är vanligtvis lättare att köra det som root). Använd Ctrl + C eller skicka ett SIGTERM till tcpdump
process-ID (PID) för att stoppa inspelningen.
Standard tcpdump
Till se standardutgången för tcpdump
, skriv bara kommandot:
Obs: I stället för att ha en hel del utdata innan du trycker på Ctrl + C kan du ange hur många paket du vill se med -c
flaggan. Kommandot ovan kan istället vara tcpdump -c 6
för att få samma resultat (sex paket fångas).
Utdata från tcpdump
kan vara lite skrämmande först, men du kommer att vänja dig vid att titta på det efter att du har använt det här verktyget några gånger. Låt oss bryta ner fälten, från vänster till höger:
Sniffa ett specifikt gränssnitt
Lägg märke till att toppen av föregående exempel visar att du ser gränssnittet som tcpdump
börjar fånga på (eth0) och längst ner i fångsten innehåller sammanfattningsstatistik om de fångade paketen.
Det första du förmodligen vill göra när du använder tcpdump
är att ange ett visst gränssnitt för att utföra inspelningar. Som standard väljer tcpdump
det lägsta numrerade gränssnittet som är ”upp”. Många servrar har flera gränssnitt och du vill vara tydlig om gränssnittet som du använder för att fånga. Dessutom kan vissa ”speciella” gränssnitttyper, såsom ett netfilter
-gränssnitt, flyta till toppen av listan. Detta beteende kan orsaka förvirring, så det är bäst att ange gränssnittet som du är intresserad av.
Låt oss börja med att se de gränssnitt som är tillgängliga för att fånga:
Med en lista över gränssnitt till vårt förfogande, kan vi nu specificera gränssnittet att lyssna på med -i
flaggan.Observera att antingen gränssnittsnamnet eller numret från --list-interfaces
-kommandot kan användas:
Om vi tittar på ovanstående fångster får vi grundläggande information om paketen som passerar våra nätverk. Det ser ut som om dessa paket innehåller Spanning Tree Protocol (STP) -utdata, kanske från en uppströmsomkopplare. Tekniskt sett är det här inte paket utan de är lager två ramar. Men du kommer att höra termerna som används omväxlande när du diskuterar paketfångster.
Få mer information
Det tidigare exemplets enkla felsökningsresultat kan vara bra för att identifiera uppenbara problem, men ibland behöver vi mer information för att verkligen gräva i ett komplext problem. Det är viktigt att veta hur man justerar detaljnivån för din fångst, eftersom det gör att du kan gräva djupare in i de faktiska uppgifterna i paketen.
Nivåen av detaljnivån för tcpdump
styrs genom att lägga till mellan en och tre -v
flaggor till kommandot:
Observera att genom att ange den maximala nivån på information, kan jag se mycket mer information om paketkroppen. Ovan kan vi se ytterligare information om data i STP-paketet, såsom root bridge ID och root path cost. Om du inte känner till STP, oroa dig inte för det. Det viktiga att lägga märke till här är att genom att öka ordligheten kan vi få ytterligare information om vår nätverkstrafik.
Att se ett pakets exakta byte
Att öka ordligheten är praktiskt, men vi ser fortfarande inte köttet från paketens innehåll. Om du verkligen vill se de exakta byten som finns i paketen kan du använda flaggorna -x
och -X
. -x
-flaggan skriver ut data i varje paket i hex, medan -X
-flaggan också skriver ut data i ASCII. Här är utdata med -x
:
Och här är utdata med -X
:
Lägg märke till hex- och ASCII-data i ovanstående exempel. I det här fallet utförde jag en DNS A-postfråga för . Observera också att jag använde flaggan
-c
för att ange antalet paket som skulle fångas, och jag tillhandahöll ett fångningsfilter av port 53
. Vi kommer att diskutera filter i nästa artikel.
Att hålla fast vid siffrorna
När du arbetar med tcpdump
kanske du märker att dess standardbeteende är att automatiskt lösa IP-adresser till fullt kvalificerade domännamn (FQDN). Tcpdump kommer också att översätta portnummer (som 22) till vänliga namn (som SSH). Även om detta beteende är bra vill vi ofta se de numeriska uppgifterna så att vi inte döljer vår felsökning på något sätt. Det här standardbeteendet kan ändras genom att lämna antingen -n
för att inaktivera IP-adressuppslag, eller -nn
för att inaktivera både IP-adress och portuppslag. / p>
Här är resultatet när du använder -nn
:
Spara din dumpning
Vid något tillfälle kanske du vill för att spara dina paketfångster för senare analys eller för djupare analys med ett grafiskt verktyg som Wireshark. Denna uppgift kan enkelt utföras med -w
-flaggan, som låter dig skriva en paketfångstfil:
Obs! Du kan läsa din sparade fil med tcpdump
med -r
-flaggan eller med ett annat program som stöder filformatet pcap.
Som vi kan se ovan , -w
-flaggan skapade en praktisk pcap-fil som vi kan ta med oss.
Slå ihop
Att utföra paketfångster är en kraftfull teknik i ditt nätverk felsökning kompetens inventering, särskilt när du har fastnat i ett problem och resten av nätverket ser OK. Att förstå hur du använder tcpdump
på kommandoraden kan spara timmar av frustration när du försöker lösa problem med nätverksapplikationer, och syntaxen är ganska intuitiv när du väl är van vid det.