Det Àr bara nÄgra dagar kvar till starten av den nya kursen frÄn OTUS. I samband med detta vill vi dela med oss av en översÀttning av anvÀndbart material i Àmnet.

En serie artiklar i bloggen, dedikerade till tips och rekommendationer för att ÄtgÀrda problem relaterade till IPv6-ping (ICMPv6 Echo Request/Echo Reply)
Observera att jag anvÀnder Linux (sÀrskilt Fedora 31), men syntaxen för ping-kommandot bör, hoppas jag, vara mycket liknande för andra operativsystem.
Pinga alla noder i IPv6 över kanalen
Det första och enklaste rÄdet Àr att pinga alla IPv6-noder pÄ kanalen.
IPv6 anvÀnder multicast-adresser för alla typer av samband "en till mÄnga". Det finns inga broadcast-alternativ (eller sÀndande) IPv6-adresser. Detta skiljer IPv6 frÄn IPv4, dÀr det finns flera typer av broadcast-adresser, till exempel den "begrÀnsade broadcast"-adressen 255.255.255.255 [RFC1122].
Det finns dock en âall-nodes multicastâ (gemensam multicast) IPv6-adress, sĂ„ vi kommer att anvĂ€nda den för att pinga alla IPv6-noder i kanalen. (Den "sĂ€ndande" adressen Ă€r faktiskt bara en specialnamn för en multicastadress som omfattar alla noder. Observera att till exempel biten "grupp" eller multicast-adressen ingĂ„r i broadcast-adresser pĂ„ Ethernet-nivĂ„).
All-nodes multicast IPv6-adress för kanalen: ff02::1. ff representerar multicast IPv6-adressen. Det följande 0:et Àr en del av flaggan med icke-instÀllda bitar.
NÀsta 2 definierar omrÄdet för multicast-gruppen. Till skillnad frÄn multicast IPv4-adresser har multicast IPv6-adresser scope (synlighetsomrÄde). Scope-vÀrdet anger den del av nÀtverket som multicast-paketet fÄr vidarebefordras över. SÄ snart paketet nÄr grÀnsen för det angivna scope, mÄste paketet kasseras, oavsett om dess hopcount-fÀlt Àr noll. Om hopcount nÄr noll innan den angivna grÀnsen för multicast-gruppen nÄs, kasseras det ocksÄ omedelbart. HÀr Àr hela listan över multicast scope IPv6.
Slutligen, ::1 indikerar all-nodes multicast-gruppen.
Om adressen ff02::1 bör det noteras att den Ă€r tvetydig. PĂ„ en IPv6-nod med flera grĂ€nssnitt, som en router eller multihoming-vĂ€rd, i adressen ff02::1 Det finns inget stĂ€lle dĂ€r man kan ange vilken grĂ€nssnitt som ICMPv6-eko-förfrĂ„gningar ska skickas till eller vĂ€nta pĂ„ att ta emot ICMPv6-eko-svar nĂ€r de kommer. ff02::1 Ăr giltig och kan anvĂ€ndas pĂ„ nĂ„got av de grĂ€nssnitt och kanaler som Ă€r kopplade till en multigrĂ€nssnittsnod.
DÀrför, nÀr vi pinger alla IPv6-noder pÄ kanalen, mÄste vi ocksÄ pÄ nÄgot sÀtt informera verktyget ping för IPv6, vilket grÀnssnitt som ska anvÀndas.
Definition av grÀnssnitt Àr en kommandoradsparameter.
Som vi redan har sett, all-nodes multicast-adressen som vi vill anvĂ€nda â ff02::1 â ger ingen information om vilket grĂ€nssnitt som ska anvĂ€ndas för att skicka och ta emot ICMPv6-eko-förfrĂ„gningar och -svar.
SÄ hur anger vi det grÀnssnitt som ska anvÀndas för multicast-adresser eller unicast Link-Local-adresser?
Det första och mest uppenbara sÀttet Àr att tillhandahÄlla det som en parameter för applikationen vi anvÀnder.
För verktyget ping tillhandahÄller vi det via alternativet -I.
[mark@opy ~]$ ping -w 1 -I enp3s2 ff02::1
ping: Varning: kÀlladress kan vÀljas pÄ en annan enhet Àn: enp3s2
PING ff02::1(ff02::1) frÄn :: enp3s2: 56 databyte
64 byte frÄn fe80::1d36:1fff:fefd:82be%enp3s2: icmp_seq=1 ttl=64 tid 0.438 ms
64 byte frÄn fe80::f31c:ccff:fe26:a6d9%enp3s2: icmp_seq=1 ttl=64 tid 0.589 ms (DUP!)
64 byte frÄn fe80::7e31:f5ff:fe1b:9fdb%enp3s2: icmp_seq=1 ttl=64 tid 5.15 ms (DUP!)
64 byte frÄn fe80::f7f8:15ff:fe6f:be6e%enp3s2: icmp_seq=1 ttl=64 tid 58.0 ms (DUP!)
64 byte frÄn fe80::877d:4ff:fe1a:b881%enp3s2: icmp_seq=1 ttl=64 tid 62.3 ms (DUP!)
64 byte frÄn fe80::877d:4ff:fe1a:ad79%enp3s2: icmp_seq=1 ttl=64 tid 62.8 ms (DUP!)
--- ff02::1 ping-statistik ---
1 paket skickat, 1 mottaget, +5 dubbletter, 0% paketförlust, tid 0 ms
rtt min/medel/max/mdev = 0.438/31.544/62.786/29.566 ms
[mark@opy ~]$Med den hÀr all-nodes multicast-pingen fick vi svar frÄn 6 IPv6-noder. Svaren kom frÄn noder med Link-Local IPv6-adresser som börjar med prefixet fe80::/10.
För att ping fortsatte inte att skicka ICMPv6-eko-förfrÄgningar oÀndligt tills vi avbröt den, vanligtvis anger vi antalet paket som ska skickas via alternativet -c. Men detta möjliggör inte heller att ping tar emot och visar mer Àn ett ICMPv6-eko-svar vid sÀndning av multicasts ICMPv6-eko-förfrÄgningar. IstÀllet anvÀnde vi alternativet -w för att ange att ping skulle avslutas efter 1 sekund, oavsett hur mÄnga ICMPv6-eko-förfrÄgningar eller -svar som har skickats eller tagits emot.
En annan sak att notera Àr (DUP!) visning pÄ andra och efterföljande svar. Dessa paket identifieras som dubbletter av svaret, eftersom de har samma ICMP-sekvensvÀrde som de individuella ICMPv6-echo-förfrÄgningar som skickades först. De visas eftersom multicast-echo-förfrÄgningar ICMPv6 resulterar i flera individuella unicast-svar. Antalet dubbletter anges ocksÄ i sammanstÀllningen av statistiken.
Definiera grĂ€nssnitt â Zon-ID
Ett annat sÀtt att tillhandahÄlla ett grÀnssnitt för anvÀndning Àr som en del av parameteradressen IPv6.
Vi kan observera ett exempel pÄ detta i pingresultatet, dÀr adresserna frÄn svarande IPv6-noder ocksÄ har suffix %enp3s2, till exempel:
64 bytes frĂ„n fe80::1d36:1fff:fefd:82be%enp3s2: icmp_seq=1 ttl=64 time=0.438 msDetta sĂ€tt att definiera grĂ€nssnitt beskrivs formellt i [RFC4007], "Arkitektur med angivna IPv6-adresser". Ăven om de vanligtvis kallas operativsystemets grĂ€nssnitt, definierar de faktiskt nĂ„got mer generellt â en "zon" eller "rĂ€ckvidd".
Anledningen till att det finns mer allmÀnna zoner eller rÀckviddszoner Àr att, som nÀmns i [RFC4007], kan en IPv6-nod ha flera olika IPv6-grÀnssnitt anslutna till samma nÀtverk. Dessa grÀnssnitt Àr medlemmar av samma zon.
Det bör vara möjligt att gruppera flera grÀnssnitt inom zonen under operativsystemet; just nu vet jag inte om detta Àr möjligt under Linux och hur man gör det.
Genom att anvÀnda suffixet %, kan vi ta bort kommandoradsparametern -I ping.
[mark@opy ~]$ ping -w 1 ff02::1%enp3s2
PING ff02::1%enp3s2(ff02::1%enp3s2) 56 databytes
64 bytes frÄn fe80::2392:6213:a15b:66ff%enp3s2: icmp_seq=1 ttl=64 time=0.106 ms
64 bytes frÄn fe80::1d36:1fff:fefd:82be%enp3s2: icmp_seq=1 ttl=64 time=0.453 ms (DUP!)
64 bytes frÄn fe80::f31c:ccff:fe26:a6d9%enp3s2: icmp_seq=1 ttl=64 time=0.606 ms (DUP!)
64 bytes frÄn fe80::7e31:f5ff:fe1b:9fdb%enp3s2: icmp_seq=1 ttl=64 time=6.23 ms (DUP!)
64 bytes frÄn fe80::f7f8:15ff:fe6f:be6e%enp3s2: icmp_seq=1 ttl=64 time=157 ms (DUP!)
64 bytes frÄn fe80::877d:4ff:fe1a:ad79%enp3s2: icmp_seq=1 ttl=64 time=159 ms (DUP!)
64 bytes frÄn fe80::877d:4ff:fe1a:b881%enp3s2: icmp_seq=1 ttl=64 time=161 ms (DUP!)
64 bytes frÄn fe80::23d:e8ff:feec:958c%enp3s2: icmp_seq=1 ttl=64 time=179 ms (DUP!)
--- ff02::1%enp3s2 pingstatistik ---
1 paket skickade, 1 mottagen, +7 dubbletter, 0% paketförlust, tid 0ms
rtt min/avg/max/mdev = 0.106/82.858/179.216/81.281 ms
[mark@opy ~]$Svar frÄn Link-Local adresser
FrÄn denna multicast-ping till alla noder fick vi totalt 6 unika svar.
Dessa svar kom frÄn unicast Link-Local adresser pÄ IPv6-noder. Till exempel, hÀr Àr det första svaret:
64 bytes frÄn fe80::2392:6213:a15b:66ff%enp3s2: icmp_seq=1 ttl=64 time=0.106 msUnicast Link-Local IPv6-adresser behövs pÄ alla grÀnssnitt som stöder IPv6 [RFC4291], "Arkitektur för IP-version 6-adressering". Anledningen till detta Àr att en IPv6-nod alltid automatiskt har en unicast IPv6-adress som den kan anvÀnda, Ätminstone för att kommunicera med andra noder över sina direkt anslutna kanaler. Detta inkluderar kommunikation med andra vÀrdas applikationer via Link-Local-adresser.
Detta förenklar utveckling och implementering av protokoll som IPv6 Neighbor Discovery och OSPFv3. Det gör det ocksÄ möjligt för slutanvÀndarapplikationer pÄ vÀrdar att byta data över kanalen utan att behöva nÄgon annan stödjande infrastruktur för IPv6. För direkt kommunikation mellan anslutna IPv6-vÀrdar krÀvs ingen IPv6-router eller DHCPv6-server i anslutningen.
Link-Local-adresser börjar med en 10-bitars prefix fe80, följt av 54 nollbitar och sedan en 64-bitars identifierare för grĂ€nssnittet (IID). I det första svaret ovan 2392:6213:a15b:66ff â Ă€r det 64-bitars IID.
Looped Multicast
Som standard skickas multicast-paket tillbaka internt till noden som skickar dem. Detta gÀller bÄde för IPv6- och IPv4-adressering.
Anledningen till detta standardbeteende Àr att nÀr multicast-paket skickas kan det ocksÄ förekomma en lyssnande lokal multicast-applikation som körs pÄ samma sÀndande vÀrd, sÄvÀl som nÄgonstans i nÀtverket. Denna lokala applikation mÄste ocksÄ ta emot multicast-paketen.
Vi kan se denna multicast-lokala cykel i vÄr ping-utgÄng:
[mark@opy ~]$ ping -w 1 ff02::1%enp3s2
PING ff02::1%enp3s2(ff02::1%enp3s2) 56 data bytes
64 bytes from fe80::2392:6213:a15b:66ff%enp3s2: icmp_seq=1 ttl=64 time=0.106 ms
64 bytes from fe80::1d36:1fff:fefd:82be%enp3s2: icmp_seq=1 ttl=64 time=0.453 ms (DUP!)
...Det första och snabbaste svaret (0,106 ms jÀmfört med 0,453 ms) kommer frÄn Link-Local-adressen som Àr instÀlld pÄ sjÀlva grÀnssnittet enp3s2.
[mark@opy ~]$ ip addr show dev enp3s2 | grep fe80
inet6 fe80::2392:6213:a15b:66ff/64 scope link noprefixroute
[mark@opy ~]$Verktyg ping ger ett sÀtt att undertrycka lokal Äterkoppling av multicastutskick med hjÀlp av parametern -L. Om vi skickar ett ping till alla noder multicast med denna flagga, begrÀnsas svaren till avlÀgsna noder. Vi fÄr inget svar frÄn Link-Local-adressen för avsÀndarens grÀnssnitt.
[mark@opy ~]$ ping -L -w 1 ff02::1%enp3s2
PING ff02::1%enp3s2(ff02::1%enp3s2) 56 data bytes
64 bytes from fe80::1d36:1fff:fefd:82be%enp3s2: icmp_seq=1 ttl=64 time=0.383 ms
64 bytes from fe80::f31c:ccff:fe26:a6d9%enp3s2: icmp_seq=1 ttl=64 time=0.467 ms (DUP!)
...Ping Link-Local Adresser
Som du kan gissa, erbjuder unicast Link-Local-adresser i sig inte tillrÀcklig information för att ange vilken grÀnssnitt som ska anvÀndas för att nÄ dem. Precis som med all-nodes multicast-ping behöver vi ocksÄ ange grÀnssnittet som en kommandoradsparameter. ping eller zone ID med adressen nÀr vi pingar Link-Local-adresser.
Den hÀr gÄngen kan vi anvÀnda -c, för att begrÀnsa antalet paket och svar som skickas och mottas ping, eftersom vi utför unicast-ping.
[mark@opy ~]$ ping -c 1 fe80::f31c:ccff:fe26:a6d9%enp3s2
PING fe80::f31c:ccff:fe26:a6d9%enp3s2(fe80::fad1:11ff:feb7:3704%enp3s2) 56 data bytes
64 bytes from fe80::f31c:ccff:fe26:a6d9%enp3s2: icmp_seq=1 ttl=64 time=0.395 ms
--- fe80::f31c:ccff:fe26:a6d9%enp3s2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.395/0.395/0.395/0.000 ms
[mark@opy ~]$Pinga (alla) andra IPv6-adresser?
I den hÀr artikeln har vi sett hur man pingar alla IPv6-noder i kanalen med hjÀlp av all-nodes multicast IPv6-adressen. ff02::1Vi har ocksÄ sett hur man anger vilket grÀnssnitt som ska anvÀndas med all-nodes multicast IPv6-adressen, eftersom adressen i sig inte kan ge denna information. Vi anvÀnde antingen kommandoradsparametern ping, eller angav grÀnssnittet via suffixet %.
Sedan lÀrde vi oss om unicast Link-Local-adresser, som Àr adresser som anvÀnds för att svara pÄ all-nodes multicast ekonfrÄgor ICMPv6.
Vi har ocksÄ sett hur multicast-paket ÄtervÀnder till den sÀndande noden som standard och hur man stÀnger av detta för verktyget. ping.
Till slut pingade vi enstaka Link-Local-adress med suffixet %, eftersom Link-Local-adresser i sig inte heller ger information om den utgÄende grÀnssnittet.
Vad sÀgs om att pinga alla andra noder och fÄ deras globala unicastadresser (GUA) (det vill sÀga deras publika adresser pÄ Internet) eller deras unika lokala unicastadresser (ULA)? Vi kommer att behandla detta i nÀsta bloggartikel.
Det Àr allt.
LÀs mer om vÄr kurs i.
KĂ€lla: habr.com
