08/11/2009
At navigere i den komplekse verden af netværksanalyse kan være en udfordring, men med de rigtige værktøjer bliver det markant lettere. Wireshark er et af de mest kraftfulde værktøjer til analyse af netværksprotokoller, og kernen i dets effektivitet ligger i dets displayfiltersprog. Dette sprog giver dig mulighed for præcist at kontrollere, hvilke pakker der vises, hvilket gør det muligt at isolere specifik trafik og hurtigt diagnosticere problemer. Uanset om du vil tjekke for tilstedeværelsen af en protokol, værdien af et specifikt felt eller endda sammenligne to felter, giver Wiresharks filtre dig magten til at skære igennem støjen. Denne artikel vil guide dig gennem alt, hvad du behøver at vide for at bygge effektive filterudtryk, fra de mest basale sammenligninger til komplekse kombinationer med logiske operatorer.

Grundlæggende om Displayfiltre
Det simpleste displayfilter er et, der viser en enkelt protokol. For kun at vise pakker, der indeholder en bestemt protokol, skal du blot skrive protokollens navn i Wiresharks displayfilter-værktøjslinje. Hvis du for eksempel kun vil se TCP-pakker, skriver du tcp. På samme måde kan du filtrere efter et specifikt felt. For eksempel, for kun at vise HTTP-anmodninger, kan du skrive http.request. Du kan filtrere på enhver protokol, som Wireshark understøtter, og på ethvert felt, som en dissektor har tilføjet til trævisningen, forudsat at feltet har en forkortelse. En komplet liste over tilgængelige protokoller og felter kan findes via menupunktet View → Internals → Supported Protocols.
Sammenligning af Værdier
En af de mest grundlæggende funktioner i Wiresharks filtersprog er evnen til at sammenligne værdier. Dette gøres ved hjælp af forskellige sammenligningsoperatorer. For eksempel, for kun at vise pakker, der sendes til eller fra IP-adressen 192.168.0.1, kan du bruge filteret ip.addr == 192.168.0.1. Der findes en række operatorer, som kan bruges til at skabe meget specifikke forespørgsler.

Tabel over Sammenligningsoperatorer
Nedenstående tabel viser en komplet liste over de tilgængelige sammenligningsoperatorer. Bemærk, at engelske og C-lignende operatorer kan bruges i flæng.
| Engelsk | C-lignende | Beskrivelse | Eksempel |
|---|---|---|---|
| eq | == | Lig med | ip.src == 10.0.0.5 |
| ne | != | Ikke lig med | ip.src != 10.0.0.5 |
| gt | > | Større end | frame.len > 10 |
| lt | < | Mindre end | frame.len < 128 |
| ge | >= | Større end eller lig med | frame.len >= 0x100 |
| le | <= | Mindre end eller lig med | frame.len <= 0x20 |
| contains | Protokol, felt eller udsnit indeholder en værdi | sip.To contains "a1762" | |
| matches | ~ | Protokol- eller tekstfelt matcher et regulært udtryk (PCRE) | http.host matches "acme\.(org|com|net)" |
| bitwise_and | & | Bitvis AND er forskellig fra nul | tcp.flags & 0x02 |
Kombinering af Udtryk
For at skabe mere avancerede og specifikke filtre kan du kombinere flere udtryk ved hjælp af logiske operatorer. De mest almindelige er and, or og not. Dette giver dig mulighed for at bygge komplekse betingelser for at indsnævre din søgning.
For eksempel, hvis du vil finde pakker, der kommer fra IP-adressen 10.0.0.5 OG har FIN-flaget sat i TCP-headeren, kan du bruge følgende udtryk: ip.src == 10.0.0.5 and tcp.flags.fin. Hvis du i stedet vil se pakker, der kommer fra enten 10.0.0.5 ELLER 192.1.1.1, ville udtrykket være: ip.src == 10.0.0.5 or ip.src == 192.1.1.1.

Tabel over Logiske Operatorer
| Engelsk | C-lignende | Beskrivelse | Eksempel |
|---|---|---|---|
| and | && | Logisk AND | ip.src==10.0.0.5 and tcp.flags.fin |
| or | || | Logisk OR | ip.src==10.0.0.5 or ip.src==192.1.1.1 |
| xor | ^^ | Logisk XOR | tr.dst[0:3] == 0.6.29 xor tr.src[0:3] == 0.6.29 |
| not | ! | Logisk NOT | not llc |
| in | Medlemskab i et sæt | http.request.method in {"HEAD" "GET"} |
Avancerede Operatorer og Funktioner
Udover de grundlæggende sammenligninger og logiske kombinationer tilbyder Wireshark mere avancerede måder at filtrere data på, herunder slice-operatøren, medlemskabsoperatøren og en række indbyggede funktioner.
Slice Operatøren ([])
Slice-operatøren giver dig mulighed for at vælge en delsekvens af et felt. Dette er især nyttigt, når du arbejder med felter som MAC-adresser eller andre byte-sekvenser. Du kan specificere et område ved hjælp af forskellige formater:
n:m- Vælgermbytes startende fra offsetn. Eksempel:eth.src[0:3] == 00:00:83n-m- Vælger bytes fra offsetntil og med offsetm. Eksempel:eth.src[1-2] == 00:83:m- Vælger alt fra begyndelsen op til offsetm. Eksempel:eth.src[:4] == 00:00:83:00n:- Vælger alt fra offsetntil slutningen af sekvensen. Eksempel:eth.src[4:] == 20:20
Medlemskabsoperatøren (in)
Med medlemskabsoperatøren kan du teste, om et felt er en del af et specificeret sæt af værdier. Dette er en mere elegant måde at skrive lange or-kæder på. For eksempel, for at vise pakker med en TCP kilde- eller destinationsport på 80, 443 eller 8080, kan du bruge: tcp.port in {80 443 8080}. Dette er ækvivalent med tcp.port == 80 || tcp.port == 443 || tcp.port == 8080, men er ofte lettere at læse og skrive.

Funktioner
Wireshark har indbyggede funktioner, der kan manipulere feltværdier, før de sammenlignes. Dette åbner op for endnu mere sofistikerede filtreringsmuligheder.
upper()/lower(): Konverterer en streng til store eller små bogstaver. Nyttigt for case-insensitive matches. Eksempel:lower(http.server) contains "apache"len(): Returnerer længden af et streng- eller bytefelt i bytes. Eksempel:len(http.request.uri) > 100count(): Tæller antallet af forekomster af et felt i en ramme. Eksempel:count(ip.addr) > 2for at finde pakker med tunneling eller ICMP-fejl.string(): Konverterer et ikke-strengfelt til en streng. Eksempel:string(frame.number) matches "[13579]$"for at finde rammer med ulige numre.
En Almindelig Fejl: Brug af `!=`
En hyppig faldgrube for nye Wireshark-brugere er den forkerte brug af 'ikke lig med'-operatøren (!=). Mange forventer, at ip.addr != 1.2.3.4 vil udelukke alle pakker, der involverer denne IP-adresse. Dette er dog ikke tilfældet. Udtrykket læses som "pakken indeholder et felt ved navn ip.addr med en værdi, der er forskellig fra 1.2.3.4". Da en IP-pakke har både en kilde- og en destinationsadresse, vil udtrykket være sandt, så længe blot én af adresserne er forskellig fra 1.2.3.4. Den korrekte måde at udelukke al trafik til og fra en bestemt IP-adresse er ved at bruge den logiske NOT-operator på et positivt match: !(ip.addr == 1.2.3.4). Dette udtryk betyder "vis mig alle pakker, for hvilke det IKKE er sandt, at der findes et ip.addr-felt med værdien 1.2.3.4", hvilket er det ønskede resultat.
Ofte Stillede Spørgsmål (FAQ)
- Hvad er forskellen på et 'display filter' og et 'capture filter'?
- Et 'capture filter' anvendes, FØR dataindsamlingen starter, og bestemmer, hvilke pakker der overhovedet gemmes i filen. Et displayfilter anvendes, EFTER data er indsamlet, og bestemmer blot, hvilke af de indsamlede pakker der vises i brugergrænsefladen. Displayfiltre er meget mere fleksible og kraftfulde.
- Hvad betyder det, når min filterlinje bliver grøn, gul eller rød?
- Grøn betyder, at syntaksen er korrekt, og filteret er anvendt. Gul betyder, at syntaksen er gyldig, men filteret vil sandsynligvis ikke fungere som forventet (f.eks. ved brug af `!=` på `ip.addr`). Rød betyder, at der er en syntaksfejl i dit filterudtryk.
- Hvad er 'matches' operatøren?
- Operatøren matches (eller
~) giver dig mulighed for at søge i tekststrenge ved hjælp af et Perl-kompatibelt regulært udtryk (PCRE). Det er et ekstremt kraftfuldt værktøj til at finde mønstre i data, f.eks. specifikke URL-strukturer eller brugernavne. - Kan jeg gemme mine filtre til senere brug?
- Ja, Wireshark giver dig mulighed for at gemme dine mest brugte displayfiltre. Ved siden af filterinputfeltet er der en knap til at bogmærke filtre, så du nemt kan genbruge dem i fremtidige sessioner uden at skulle skrive dem igen.
Hvis du vil læse andre artikler, der ligner Wireshark Filtre: En Komplet Guide, kan du besøge kategorien Teknologi.
