Tja dess nu torsdag så jag tänkte att det är dags att publicera svaren på förra helgens utmaning. ![]()
Först, varför skulle du bry dig även om IPv6 om du inte har börjat distribuera den? Jag kände ungefär på samma sätt tills jag hittade IPv6 används som en förtäckt kommunikationskanal inom en kunds nätverk. Uppgifterna var då knuffas ut till Internet via Teredo. Om du inte är bekant med tekniken har Scott Hogg några utmärkta inlägg i ämnet.
Så även om du för närvarande inte använder IPv6, lönar det sig att börja skära botemedlet på teknik samt att titta efter den på ditt lokala nätverk.
Så för att se över var utmaningen:
Skriv en tcpdump eller Windump filter som kommer att fånga all trafik med en källa IPv6-adress 2001: DB8:: 10 till 2001: DB8:: 20.
Det finns ett par varningar med att skriva det här filtret. De första jag täckte i förra inlägget. Den sista en, som jag visste men aldrig riktigt trodde var ett problem tills jag började jobba med IPv6 ganska tungt, det är tcpdump / Windump bara låter dig använda 1, 2 eller 4 byte masker. Så medan vi skulle älska att lösa detta med ett första filter uttalande "ip6 [8:14] =", kan vi inte eftersom vi är begränsade till 4 byte. Det är i själva verket ett sätt att komma runt detta, men jag kommer tillbaka till det.
Så här är filtret jag har jobbat med:
(Ip6 [08:04] = 0x20010db8 och ip6 [00:04] = 0 och ip6 [16:04] = 0 och (ip6 [20:04]> = 0 × 0010 och ip6 [20:04] <= 0050 ))
Lite lång, men det fungerar. Elizabeth kom med en lösning som är långt mer elegant än min egen:
src netto 2001: DB8:: / 122 och ip6 [23]> = 0 × 10 & & ip6 [23] <= 0 × 20
Så genom att börja med libpcap formatet, hon kunna kombinera mina första tre uttalanden till en. Inte att vara en storlek drottning, men det gör hennes lösning är mycket kortare än mitt. I det här fallet att det är en bra sak. ![]()
Det om det. Jag kommer lägga upp en annan IPv6 typ utmaning i morgon.
Relaterade inlägg:


Chris,
klingande i slutet men efter tillsammans med timtowtdi
vad sägs om ...
"Src netto 2001: DB8:: / 122 och ((ip6 [23] & 0xE0 == 0) eller (ip6 [23] == 0 × 20))"
Uppdatera mitt svar på grund av koffein:
src netto 2001: DB8:: / 122
Vi maskering på 122 bitar. Detta anger att bitar från 33 till 122 är lika med 0.
ip6 [23] & 0xE0 == 0
Detta filter säger bitar från 121 till 123 måste vara 0.
ip6 [23] == 0 × 20
Detta filter säger lite 123 måste 1.
Så för att bara fokusera på de sista byte, säger ditt uttalande "bitar 121 och 122 måste vara avstängd och (lite 123 måste vara avstängd eller lite 123 måste vara på)". Detta får oss nära, men vad händer om lite 124 är avstängd? Detta kunde matcha filtret men ändå sätta oss utanför det angivna intervallet för adresser.
ok så att matcha den första Nibble i sista byte. (Jag bara vill att det ska matcha 1 (vilket ger 16 till 31) kommer
ip6 [23] & F0 == 1
göra susen?
Filtret:
IP [23] & F0 == 1
kommer att titta på fyra höga ordning bitar och match på * lägsta * För lite sätts. Med andra ord skulle det angivna värdet (1) uppfattas som decimal och är utanför masken sortimentet. Om du kör filtret ser du att tcpdump ger dig ett syntaxfel.
Låt oss titta på detta sista byte i binär att se om det gör problemet lättare.
Vi försöker matcha alla binära värdet från:
00010000 till 00100000
Den "src net" delen av filtret tar hand om att se de två high Beställ bitar (64 & 128) sätts till 0, så vi behöver inte oroa dig för dem.
Resten av våra filter behöver kontrollera:
1) Är lite 32 påslagen, med allt lägre för bit avstängd (exakt 00.100.000).
eller ...
2) Är lite 32 avstängd, lite 16 påslagen bortse från eventuella lägre ordning bitar (värde serien är 00.010.000 till 00.011.111).
Så det enklaste sättet att filtrera på detta är att inkludera större än och mindre än primitiver. Vad vi vill säga är:
00010000 <= värde <= 00100000
Nu, omvandla denna till Hex och du får:
0x10 <= värde <= 0x20
I tcpdump tala, skriva du detta uttryck som:
ip6 [23]> = 0 × 10 & & ip6 [23] <= 0 × 20
eller:
ip6 [23]> = 0 × 10 och ip6 [23] <= 0 × 20
Gör lite mer känsla?
Vettigt Jag vill bara vara svårt
Jag försöker att se om det är ett sätt att uppnå detta med hjälp av lite maskering. Bara insåg mitt tidigare svar försökte matcha en knapra inte byte så här går ett sista försök
src netto 2001: DB8:: / 122 och ((ip6 [23] & 0xF0 = 0 × 10) eller (ip6 [23] = 0 × 20)) "
Så
ip6 [23] & 0xF0 = 0 × 10 (ska matcha decimal 16 till 31) och sedan ip6 [23] = 0 × 20 ska matcha 32. Eller är det dags att kasta in handduken?