Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
sk2:ipv6 [2022/01/16 22:39] jkonczak [Programy sieciowe a IPv6] |
sk2:ipv6 [2024/01/18 13:04] (aktualna) jkonczak [Dodatkowe materiały] |
||
---|---|---|---|
Linia 3: | Linia 3: | ||
=== Wyczerpanie się adresów IPv4 === | === Wyczerpanie się adresów IPv4 === | ||
Adresy IPv4 zostały [[https://www.icann.org/en/announcements/details/remaining-ipv4-addresses-to-be-redistributed-to-regional-internet-registries--address-redistribution-signals-that-ipv4-is-nearing-total-exhaustion-20-5-2014-en|podzielone do końca]] między RIRy w 2014 roku. \\ | Adresy IPv4 zostały [[https://www.icann.org/en/announcements/details/remaining-ipv4-addresses-to-be-redistributed-to-regional-internet-registries--address-redistribution-signals-that-ipv4-is-nearing-total-exhaustion-20-5-2014-en|podzielone do końca]] między RIRy w 2014 roku. \\ | ||
- | W 2015 roku [[https://www.arin.net/vault/announcements/2015/20150924.html|skończyły się adresy IPv4 w ameryce północnej]]. **W 2019 roku w naszym regionie (Europa, bliski wschód i część azji) [[https://www.ripe.net/publications/news/about-ripe-ncc-and-ripe/the-ripe-ncc-has-run-out-of-ipv4-addresses|przydzielono ostatni wolny blok IPv4]]**. | + | W 2015 roku [[https://www.arin.net/vault/announcements/2015/20150924.html|skończyły się adresy IPv4 w Ameryce Północnej]]. **W 2019 roku w naszym regionie (Europa, bliski wschód i część Azji) [[https://www.ripe.net/publications/news/about-ripe-ncc-and-ripe/the-ripe-ncc-has-run-out-of-ipv4-addresses|przydzielono ostatni wolny blok IPv4]]**. \\ |
- | W tej chwili w naszym regionie tylko firmy/organizacje którzy nigdy wcześniej nie dostały adresów IPv4 [[https://www.ripe.net/manage-ips-and-asns/ipv4/how-waiting-list-works|mogą liczyć na 256 adresów IPv4]] "odzyskany" po zakończeniu działalności firmy/organizacji której przydzielono blok adresów (wersja oficjalna). | + | W tej chwili w naszym regionie tylko firmy/organizacje którzy nigdy wcześniej nie dostały adresów IPv4 [[https://www.ripe.net/manage-ips-and-asns/ipv4/how-waiting-list-works|mogą liczyć na 256 adresów IPv4]] "odzyskanych" po zakończeniu działalności firmy/organizacji której przydzielono blok adresów (wersja oficjalna).\\ |
+ | Na określonych warunkach można wykonywać transfery już przydzielonych adresów ([[ | ||
+ | https://www.ripe.net/manage-ips-and-asns/resource-transfers-and-mergers/transfer-of-ip-addresses-and-as-numbers|transfer w RIPE]]). | ||
<html></small></html> | <html></small></html> | ||
Linia 28: | Linia 30: | ||
====== Adres IPv6 – struktura, podział ====== | ====== Adres IPv6 – struktura, podział ====== | ||
- | W IPv6 zamiast o sieci (jak w IPv4) mówi się o **prefiksie** sieci (network prefix). | + | W IPv6 zamiast o sieci (jak w IPv4) mówi się o **prefiksie** sieci (network prefix). \\ |
+ | Prefix składa się z ''adresu ipv6'' ''/'' ''długość prefiksu'', np. 2001:808:201::/48 \\ <html><small></html> Długość (rozmiar) prefiksu odpowiada długości maski w IPv4, notacja IPv6 jest identyczna jak ta wprowadzona dla IPv4 w CIDR <html></small></html> | ||
Struktura adresu IPv6 [[https://en.wikipedia.org/wiki/IPv6_address#Address_formats]] | Struktura adresu IPv6 [[https://en.wikipedia.org/wiki/IPv6_address#Address_formats]] | ||
* Adresy unicastowe (i anycastowe): | * Adresy unicastowe (i anycastowe): | ||
- | * Adres ma zwykle postać: ''Network prefix (Routing prefix + subnet, razem 64bit) | Interface ID (64bit)'' | + | * Adres ma zwykle postać: ''Network prefix (Routing prefix + subnet, razem 64bit) | Interface ID (64bit)'' \\ <html><small></html> Podział na //routing// i //network// prefix odnosi się do protokołów trasowania (głównie BGP)<html></small></html> |
- | * 64-bitowy interface ID pozwala na automatyczną konfigurację [[https://tools.ietf.org/html/rfc7136|RFC-7136]] | + | * 64-bitowy interface ID pozwala na automatyczną konfigurację. Wybór interface ID: [[https://tools.ietf.org/html/rfc7136|RFC 7136]] |
- | * Interface ID można stworzyć na podstawie adresu MAC (48-bitowego) zmieniając flagę unikalności adresu MAC na 1 i wstawiając ''0xfffe'' między pierwszą a drugą połowę MAC | + | * Interface ID można stworzyć na podstawie adresu MAC (48-bitowego) zmieniając flagę unikalności adresu MAC na 1 i wstawiając ''0xfffe'' między pierwszą a drugą połowę MAC [[https://datatracker.ietf.org/doc/html/rfc4291#page-20|RFC 4291, appendix A]] |
- | * Interface ID można ustawić losowy (dla prywatności, [[https://tools.ietf.org/html/rfc4941|RFC-4941]]) | + | * Interface ID można ustawić losowy (dla prywatności, [[https://tools.ietf.org/html/rfc4941|RFC 4941]]) |
+ | * Interface ID można generować powtarzalnie dla danej sieci((generowany używając m. inn. prefiksu sieci i wcześniej wylosowanego (i pamiętanego) sekretu)) [[https://www.rfc-editor.org/rfc/rfc7217|RFC 7217]] [[https://www.rfc-editor.org/rfc/rfc8064|RFC 8064]] | ||
* Interface ID można też ustawić ręcznie | * Interface ID można też ustawić ręcznie | ||
* do 64-bitów na prefix wystarczy | * do 64-bitów na prefix wystarczy | ||
* Adresy anycastowe – dowolny adres unicastowy można używać jako anycast, przy konfiguracji trzeba explicite dodać adres jako anycast. | * Adresy anycastowe – dowolny adres unicastowy można używać jako anycast, przy konfiguracji trzeba explicite dodać adres jako anycast. | ||
* W tej chwili wszystkie globalne adresy unicastowe są z sieci 2000::/3 | * W tej chwili wszystkie globalne adresy unicastowe są z sieci 2000::/3 | ||
- | * Multicast: adresy zaczynające się od ff, po których następują 4 bity flag i 4 bity zasięgu | + | * Multicast: adresy zaczynające się od ''ff'', po których następują 4 bity flag i 4 bity zasięgu: \\ <html><small></html>Czyli: ''ff⚐Z::/112'', gdzie ''⚐'' to miejsce flag, ''Z'' - zasięgu; np. ''ff15:1234::6789:abcd''<html></small></html> |
* Flagi: ''0b00PT'' \\ ''T==0'' oznacza że adres jest przydzielony przez "the global internet numbering authority"[[https://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses.xhtml|[1]]] \\ ''P==1'' oznacza że adres został utworzony z wykorzystaniem prefixu adresów unicastowych | * Flagi: ''0b00PT'' \\ ''T==0'' oznacza że adres jest przydzielony przez "the global internet numbering authority"[[https://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses.xhtml|[1]]] \\ ''P==1'' oznacza że adres został utworzony z wykorzystaniem prefixu adresów unicastowych | ||
* Zasięg: [[https://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses.xhtml#ipv6-scope|[2]]] \\ ''0x1'' - interface-local, ''0x2'' - link-local, ''0x5'' - site local, ''0x8'' - organization-local, ''0xe'' - global | * Zasięg: [[https://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses.xhtml#ipv6-scope|[2]]] \\ ''0x1'' - interface-local, ''0x2'' - link-local, ''0x5'' - site local, ''0x8'' - organization-local, ''0xe'' - global | ||
Linia 60: | Linia 64: | ||
====== Budowa pakietu IPv6 ====== | ====== Budowa pakietu IPv6 ====== | ||
- | Zmiany: | + | Zmiany w porównaniu do IPv4: |
- | * Nagłówek IPv6 jest stałej długości – usunięto zmiennej długości ''opcje'' i zastąpiono ''protokół'' polem ''następny nagłówek'' \\ Znika pole ''IHL'' (długość nagłówka w IPv4) i ''długość całkowita'' → ''długość "ładunku"'' (payload length - wszystiego po nagłówku) | + | * Nagłówek IPv6 jest stałej długości – usunięto zmiennej długości ''opcje'' i zastąpiono ''protokół'' polem ''następny nagłówek'' \\ Znika pole ''IHL'' (długość nagłówka w IPv4), a pole ''długość całkowita'' → ''długość "ładunku"'' (payload length - wszystiego po nagłówku) |
* Zrezygnowano z pól o fragmentacji – jeśli jest potrzebna, dodaje się jako następny nagłówek ''fragmentation header'' | * Zrezygnowano z pól o fragmentacji – jeśli jest potrzebna, dodaje się jako następny nagłówek ''fragmentation header'' | ||
* Zmiany ewolucyjno/porządkowe: ''TTL''→''Hop Limit'', ''ToS''→''Traffic class'' | * Zmiany ewolucyjno/porządkowe: ''TTL''→''Hop Limit'', ''ToS''→''Traffic class'' | ||
Linia 92: | Linia 96: | ||
Testowanie: | Testowanie: | ||
- | * ''ping6'' <html><small></html>(oraz nowsze implementacje zwykłego ''ping'')<html></small></html> | + | * ''ping6'' oraz nowsze implementacje zwykłego ''ping'' |
* ''traceroute -6'', ''tracepath6'' (w lab. dodatkowo jest potrzebny przełącznik ''-T'', np. ''traceroute -T -6'') | * ''traceroute -6'', ''tracepath6'' (w lab. dodatkowo jest potrzebny przełącznik ''-T'', np. ''traceroute -T -6'') | ||
* ''nc -6'' | * ''nc -6'' | ||
Linia 98: | Linia 102: | ||
| | ||
Wyświetlanie połączeń (domyślnie listuje zarówno IPv4 i IPv6): | Wyświetlanie połączeń (domyślnie listuje zarówno IPv4 i IPv6): | ||
- | * ''netstat -6 -a'' | + | * ''netstat -6 -a [--wide]'' |
* ''ss -6 -a'' | * ''ss -6 -a'' | ||
Linia 108: | Linia 112: | ||
* ''man 7 ipv6'' | * ''man 7 ipv6'' | ||
+ | W Linuksie preferencje wyboru IPv6/IPv4 można ustawić w pliku ''/etc/gai.conf'' | ||
====== Automatyczna konfiguracja i ICMPv6 ====== | ====== Automatyczna konfiguracja i ICMPv6 ====== | ||
- | ICMPv6 (następca ICMP dla IPv6), ponad funkcje poprzednika, implementuje protokół NDP (pozwalający na automatyczna konfigurację i zastępujący ARP) i przejmuje zadania IGMP | + | ICMPv6 (następca ICMP dla IPv6), ponad funkcje poprzednika, implementuje protokół NDP (pozwalający na automatyczną konfigurację i zastępujący ARP) i przejmuje zadania IGMP |
[[https://en.wikipedia.org/wiki/Neighbor_Discovery_Protocol|Neighbor Discovery Protocol]] i Stateless Adress Autoconfiguration (SLAAC) [[https://tools.ietf.org/html/rfc4861|RFC4861]] \\ | [[https://en.wikipedia.org/wiki/Neighbor_Discovery_Protocol|Neighbor Discovery Protocol]] i Stateless Adress Autoconfiguration (SLAAC) [[https://tools.ietf.org/html/rfc4861|RFC4861]] \\ | ||
Linia 118: | Linia 123: | ||
* Stacja przydziela sobie wybrany adres | * Stacja przydziela sobie wybrany adres | ||
* Stacja wysyła pytanie o routery (na adres multicastowy wszystkie-routery) | * Stacja wysyła pytanie o routery (na adres multicastowy wszystkie-routery) | ||
- | * Routery odpowiadają wiadomością o dostępnych prefiksach (i DNS'ach, [[https://tools.ietf.org/html/rfc6106|RFC6106]]) | + | * Routery odpowiadają wiadomością o dostępnych prefiksach (i DNS'ach, [[https://tools.ietf.org/html/rfc8106|RFC8106]]) |
* Stacja wybiera po jednym adresie z każdego dostępnego prefiksu | * Stacja wybiera po jednym adresie z każdego dostępnego prefiksu | ||
Linia 128: | Linia 133: | ||
Polecenie diagnostyczne z radvd do //pasywnego// zbierania Router Advertisment: | Polecenie diagnostyczne z radvd do //pasywnego// zbierania Router Advertisment: | ||
- | * ''radvdump'' \\ włącza program nasłuchujący na RA | + | * ''radvdump'' \\ włącza program nasłuchujący na RA \\ <html><small></html>Instalacja w OpenSuse: ''zypper install radvd'' <html></small></html> |
Pakiet narzędzi diagnostycznych [[https://www.remlab.net/ndisc6/|ndisc6]]: | Pakiet narzędzi diagnostycznych [[https://www.remlab.net/ndisc6/|ndisc6]]: | ||
- | * Instalacja w OpenSuse: <code>zypper ar https://download.opensuse.org/repositories/network:/utilities/openSUSE_Leap_15.3/network:utilities.repo | + | <html><!-- * Instalacja w OpenSuse: <code>zypper ar https://download.opensuse.org/repositories/network:/utilities/openSUSE_Leap_15.3/network:utilities.repo |
zypper ref | zypper ref | ||
- | zypper in -y ndisc6</code> | + | zypper in -y ndisc6</code>--></html> |
* ''rdisc6 //br0//'' \\ wysyła Router Solicit na interfejsie ''//br0//'' i czeka na RA | * ''rdisc6 //br0//'' \\ wysyła Router Solicit na interfejsie ''//br0//'' i czeka na RA | ||
* ''ndisc6 //fe80::20c:42ff:feb6:9452// //br0//'' \\ wysyła Neighbour Solicit o adres fe80:… na interfejsie ''//br0//'' i czeka na Neighbour Advertisment | * ''ndisc6 //fe80::20c:42ff:feb6:9452// //br0//'' \\ wysyła Neighbour Solicit o adres fe80:… na interfejsie ''//br0//'' i czeka na Neighbour Advertisment | ||
Linia 140: | Linia 145: | ||
''ping6 ff02::01%br0'' – żądanie ICMPv6 ping wysłane do grupy multicastowej all-nodes na ''br0'' (uzupełnia mapowania IP <-> MAC) | ''ping6 ff02::01%br0'' – żądanie ICMPv6 ping wysłane do grupy multicastowej all-nodes na ''br0'' (uzupełnia mapowania IP <-> MAC) | ||
<html></small></html> | <html></small></html> | ||
+ | |||
+ | ==== Path MTU discovery ==== | ||
+ | IPv6 unika fragmentacji jeśli to możliwe. Węzeł który nie może przesłać pakiety ze względu na MTU następnego łącza wysyła do nadawcy pakiet ICMPv6 //Packet Too Big// informując o MTU. Ostatecznie nadawca pozna w ten sposób najmniejsze MTU całej ścieżki do celu – Path MTU. Taki proces nazywa się [[https://en.wikipedia.org/wiki/Path_MTU_Discovery|Path MTU Discovery]] ([[https://datatracker.ietf.org/doc/html/rfc8201|RFC 8201]]). | ||
+ | |||
+ | Wartości Path MTU są zwykle cache'owane, np. w Linuksie w tablicy tras. | ||
+ | <html><small></html> | ||
+ | \\ Możesz sprawdzić działanie Path MTU discovery przez: | ||
+ | ip -6 route flush cache | ||
+ | ip route get 2001:470:647b::1 | ||
+ | ping -s 1500 2001:470:647b::1 | ||
+ | ip route get 2001:470:647b::1 | ||
+ | <html></small></html> | ||
+ | |||
====== Współistnienie IPv4 i IPv6 ====== | ====== Współistnienie IPv4 i IPv6 ====== | ||
+ | [[https://en.wikipedia.org/wiki/IPv6#Dual-stack_IP_implementation|Dual-stack]] – urządzenie ma jednocześnie adres z sieci IPv4 i IPv6 oraz bezpośrednią łączność do sieci IPv4 i IPv6. | ||
Tunele: | Tunele: | ||
- | * "proste": [[https://en.wikipedia.org/wiki/6in4|6in4]] , http://www.cs.put.poznan.pl/mlibuda/IPv6.pdf (uwaga: nie mylić z [[https://en.wikipedia.org/wiki/6to4|6to4]]!) | + | * "proste", [[https://en.wikipedia.org/wiki/6in4|6in4]]((uwaga: nie mylić z [[https://en.wikipedia.org/wiki/6to4|6to4]]!)) – pakiet IPv6 jest przesyłany jako dane pakietu IPv4 wysłanego z jednego końca tunelu do drugiego; tunel dla IPv6 widziany jest jako zwykłe połączenie IPv6 http://www.cs.put.poznan.pl/mlibuda/IPv6.pdf |
- | * tunnel broker https://en.wikipedia.org/wiki/Tunnel_broker | + | * tunnel broker – usługa konfigurująca automatycznie zdalny koniec tunelu tak, by użytkownik końcowy mógł połączyć się z internetem IPv6 https://en.wikipedia.org/wiki/Tunnel_broker |
Skąd brać tunele? Przykłady: | Skąd brać tunele? Przykłady: | ||
* https://www.tunnelbroker.net | * https://www.tunnelbroker.net | ||
- | * https://en.wikipedia.org/wiki/List_of_IPv6_tunnel_brokers | + | * <del>https://en.wikipedia.org/wiki/List_of_IPv6_tunnel_brokers</del> [[https://tunnelbroker.services]] |
* <html><small></html><del>[[https://www.sixxs.net/sunset/|https://www.sixxs.net]]</del><html></small></html> | * <html><small></html><del>[[https://www.sixxs.net/sunset/|https://www.sixxs.net]]</del><html></small></html> | ||
+ | |||
+ | Tłumaczenia adresów, różne: | ||
+ | * [[https://en.wikipedia.org/wiki/NAT64|NAT64 + DNS64]] – host nie ma wcale IPv4, co za tym idzie żadnej łączności do adresów IPv4. | ||
+ | * host może wysłać pakiet pod adresy IPv6 z sieci (zwykle) 64:ff9b::/96, w których w ostatnie 32 bity wpisuje adres IPv4. \\ pakiet trafia do translatora (NAT64) który ma adres publiczny IPv4 i taki pakiet przesyła dalej po IPv4. \\ NAT64 jest zwykle stanowy, ma wady i ograniczenia. | ||
+ | * żeby dostać się do stron dostępnych tylko po IPv4 host używa specjalnego DNSa (DNS64) który odpowiada adresem z sieci IPv6 powyższego tłumacza zawierającym adres IPv4 tłumaczonej domeny | ||
+ | * [[https://en.wikipedia.org/wiki/IPv6_transition_mechanism#464XLAT|464XLAT]] – host ma prywatny IPv4((Ten adres nie służy do łączności z żadnym innym urządzeniem, tylko do udawania przed oprogramowaniem że host ma łączność po IPv4)) i sam tłumaczy adresy IPv4 na IPv6 tłumacza (wyżej opisanego NAT64) | ||
+ | * [[https://en.wikipedia.org/wiki/IPv6_transition_mechanism#Dual-Stack_Lite_(DS-Lite)|DS-lite]] – host dostaje od usługodawcy, poza publicznym IPv6, prywatny adres IPv4, a usługodawca u siebie tłumaczy adresy (logicznie zwykły NAT z IPv4 na IPv4, tylko duży i po stronie usługodawcy: [[https://en.wikipedia.org/wiki/Carrier-grade_NAT|Carrier-grade_NAT]]) | ||
+ | |||
+ | |||
Linia 163: | Linia 190: | ||
* https://www.ripe.net/support/training/material/basic-ipv6-training-course/BasicIPv6-Slides.pdf | * https://www.ripe.net/support/training/material/basic-ipv6-training-course/BasicIPv6-Slides.pdf | ||
* https://www.ripe.net/support/training/material/ripe-ncc-training-material#IPV6 | * https://www.ripe.net/support/training/material/ripe-ncc-training-material#IPV6 | ||
- | * https://www.ripe.net/support/training/videos/ipv6/transition-mechanisms) | + | * **https://www.ripe.net/support/training/videos/ipv6/transition-mechanisms** |
- | * Materiały przygotowane w ramach finansowanego przez EU [[https://cordis.europa.eu/project/id/015926|projektu ]] //IPv6 dissemination and exploitation//: | + | * Materiały przygotowane w ramach finansowanego przez EU [[https://cordis.europa.eu/project/id/015926|projektu ]] [[http://6diss.6deploy.eu/tutorials/|IPv6 dissemination and exploitation]]: |
* http://6diss.6deploy.eu/tutorials/addressing.pdf | * http://6diss.6deploy.eu/tutorials/addressing.pdf | ||
* http://6diss.6deploy.eu/tutorials/ipv6_protocols.pdf | * http://6diss.6deploy.eu/tutorials/ipv6_protocols.pdf | ||
Linia 172: | Linia 199: | ||
<html><small></html> | <html><small></html> | ||
====== Ekstra ====== | ====== Ekstra ====== | ||
- | * Łączność (np. ping) do adresów ''fe80::/10'' – jako że więcej niż jedna karta może mieć adres z sieci ''fe80'', do jednoznacznego wskazania która karta ma być użyta trzeba przy łączeniu użyć składni ''adres_link_local%nazwa_interfejsu'', np. ''ping fe80::a6d:41ff:fee0:1860%eth0'' [ [[https://en.wikipedia.org/wiki/IPv6_address#Link-local_addresses_and_zone_indices]] ]. \\ Podobnie wygląda składnia dla multicastów, np. ''ping ff02::01%em1'' wysyła ping na adres all-nodes na karcie em1. | + | * Łączność (np. ping) do adresów ''fe80::/10'' – jako że więcej niż jedna karta może mieć adres z sieci ''fe80'', do jednoznacznego wskazania która karta ma być użyta trzeba przy łączeniu użyć składni ''adres_link_local%nazwa_interfejsu'' lub ''adres_link_local%indeks_interfejsu'' [[https://en.wikipedia.org/wiki/IPv6_address#Scoped_literal_IPv6_addresses_(with_zone_index)|[1]]], \\ np. ''ping fe80::a6d:41ff:fee0:1860%eth0'' \\ Podobnie wygląda składnia dla multicastów, np. ''ping ff02::01%em1'' wysyła ping na adres all-nodes na karcie em1. |
* Apple store wymaga od każdej aplikacji działania w sieciach z samym IPv6 https://developer.apple.com/support/ipv6/ | * Apple store wymaga od każdej aplikacji działania w sieciach z samym IPv6 https://developer.apple.com/support/ipv6/ | ||
<html></small></html> | <html></small></html> |