=== 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. \\ 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]] "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]]). ====== Adres IPv6 – zapis ====== Adresacja IPv6 [[https://tools.ietf.org/html/rfc4291|RFC4291]] Długość adresu – 128 bitów Zapis adresu: adres dzieli się na bloki 16-sto bitowe, zapisuje się je **szesnastkowo** (''0''÷''ffff'') oddzielając **dwukropkiem**: \\ Przykład: ''2001:0808:0201:0000:0000:0000:0005:0114'' Dla czytelności adres skraca się według następujących reguł: * W każdym bloku pomija się początkowe zera (czyli: ''0123'' → ''123'' ; ''00ab'' → ''ab'' ; ale ''0000'' → ''0'') * Najdłuższy (jeśli jest więcej najdłuższych – pierwszy) ciąg bloków zerowych zastępuje się przez **::** (czyli: ''fe80:0:0:0:0:0:0:cafe'' → ''fe80::cafe'' ; ''fe80:0:0:0:beef:0:0:0'' → ''fe80::beef:0:0:0'') Skrócony przykład: ''2001:808:201::5:114'' Z powodów technicznych zaleca się stosowanie zawsze najkrótszego zapisu i używanie małych liter (tzn. zawsze ''a''-''f'', nigdy ''A-''''F'') [[http://tools.ietf.org/html/rfc5952|RFC5952]] Zapis adresu IPv6 i portu: **IPv6 w nawiasach kwadratowych**, port po dwukropku, np: ''[fe80::dead:beef]:80'' , przykład użycia: http://[::1]:631/ czy http://[2001:808:2:3003::2]/ ====== Adres IPv6 – struktura, podział ====== 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 \\ Długość (rozmiar) prefiksu odpowiada długości maski w IPv4, notacja IPv6 jest identyczna jak ta wprowadzona dla IPv4 w CIDR Struktura adresu IPv6 [[https://en.wikipedia.org/wiki/IPv6_address#Address_formats]] * Adresy unicastowe (i anycastowe): * Adres ma zwykle postać: ''Network prefix (Routing prefix + subnet, razem 64bit) | Interface ID (64bit)'' \\ Podział na //routing// i //network// prefix odnosi się do protokołów trasowania (głównie BGP) * 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 [[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 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 * 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. * 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: \\ Czyli: ''ff⚐Z::/112'', gdzie ''⚐'' to miejsce flag, ''Z'' - zasięgu; np. ''ff15:1234::6789:abcd'' * 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 * Brak adresów broadcastowych - do wysłania do wszystkich używa się adresu multicastowego "wszystkie węzły" Zasięg adresów: * Globalny (globally routable / global) * Ograniczony do łącza (link-local / local) - wydzielony blok fe80::/10, formalnie adres localhost [[https://tools.ietf.org/html/rfc4291#section-2.5.3|[3]]] Podział adresów; adresy specjalne w IPv6 * [[http://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml|podział całej puli]] * [[http://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml|adresy/sieci specjalne]] * dowolny adres – **::** (same zera) * localhost – **::1** * adresy link-local – **fe80::/10** * adresy unique local unicast adresses – fc00::/7 [[https://tools.ietf.org/html/rfc4193|RFC4193]], [[https://en.wikipedia.org/wiki/Unique_local_address|[4]]] [[http://www.iana.org/assignments/ipv6-unicast-address-assignments/ipv6-unicast-address-assignments.xhtml|Przydzielone bloki IPv6]] (proszę zwrócić uwagę na "przerwy", np. między 2a10:0000::/12 i 2c00:0000::/12) ====== Budowa pakietu IPv6 ====== 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), 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'' * Zmiany ewolucyjno/porządkowe: ''TTL''→''Hop Limit'', ''ToS''→''Traffic class'' {{:sk2:pakiet_ipv4_vs_ipv6.svg|}} \\
źródło: https://www.ripe.net/support/training/material/ripe-ncc-training-material Pole ''następny nagłówek'' może zawierać wartość wskazującą na to, że kolejny nagłówek: * to nagłówek protokołu warstwy transportowej (TCP, UDP) * to nagłówek definiowany w protokole IPv6 ([[https://en.wikipedia.org/wiki/IPv6_packet#Extension_headers|[1]]]) \\ każdy taki nagłówek ma kolejne pole ''następny nagłówek'' Nagłówki mają określoną kolejność, tak by na początku znajdowały się te przetwarzane przez wszystkie urządzenia, dalej nagłówki potrzebne niektórym węzłom, na końcu te przetwarzane tylko przez urządzenie docelowe [[https://datatracker.ietf.org/doc/html/rfc2460#section-4.1|[2]]] {{:sk2:pakiet_ipv6_naglowki.svg?x500}}
źródło: https://www.ripe.net/support/training/material/ripe-ncc-training-material ====== Programy sieciowe a IPv6 ====== Przykładowe strony z IPv6: * put.poznan.pl * ipv6ripeness.ripe.net * ipv6.he.net * 6lab.cisco.com * google.com/ipv6 Wiele programów sieciowych pozwala na wymuszenie IPv6 / IPv4 podając przełącznik ''-6'' / ''-4'' Konfiguracja: * ''ip -6 address'' \\ (w ramach ćwiczenia proponuję dodać adresy [[https://en.wikipedia.org/wiki/Unique_local_address|ULA]] w laboratoriach) * ''ip -6 route'' Testowanie: * ''ping6'' oraz nowsze implementacje zwykłego ''ping'' * ''traceroute -6'', ''tracepath6''      (w lab. dodatkowo jest potrzebny przełącznik ''-T'', np. ''traceroute -T -6'') * ''nc -6'' * ''socat'' + TCP6:host:port, TCP6-LISTEN:port, … \\ ''socat tcp:[::1]:13 -'' \\ ''socat tcp6:localhost:13 -'' Wyświetlanie połączeń (domyślnie listuje zarówno IPv4 i IPv6): * ''netstat -6 -a [--wide]'' * ''ss -6 -a'' Firewall: * ''ip6tables'' * ''nft'' pozwala łączyć reguły IPv4 i IPv6 w tabelach [[https://wiki.nftables.org/wiki-nftables/index.php/Nftables_families|inet]] Programowanie a IPv6: * ''man 7 ipv6'' W Linuksie preferencje wyboru IPv6/IPv4 można ustawić w pliku ''/etc/gai.conf'' ====== Automatyczna konfiguracja i ICMPv6 ====== 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]] \\ Typowy przebieg autokonfiguracji: * Stacja wybiera adres w sieci fe80::/10 na podstawie identyfikatora interfejsu (adresu MAC dla kart ethernetowych) * Stacja wysyła zapytanie w sieć czy ktoś nie ma takiego adresu (na adres multicastowy wszystkie-węzły) * Stacja przydziela sobie wybrany adres * 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/rfc8106|RFC8106]]) * Stacja wybiera po jednym adresie z każdego dostępnego prefiksu W Linuksie do ogłaszania prefiksów używa się [[https://en.wikipedia.org/wiki/Radvd|radvd]] Do podstawowej konfiguracji IPv6 NIE potrzebuje DHCP. Jeśli do żądanej konfiguracji nie wystarczy przydzielenie adresów, ustawienie bramy domyślnej i ustawienie DNS'ów, można w NDP wymusić użycie DHCPv6. ==== [Ekstra] Diagnostyka NDP ==== Polecenie diagnostyczne z radvd do //pasywnego// zbierania Router Advertisment: * ''radvdump'' \\ włącza program nasłuchujący na RA \\ Instalacja w OpenSuse: ''zypper install radvd'' Pakiet narzędzi diagnostycznych [[https://www.remlab.net/ndisc6/|ndisc6]]: * ''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 Pakiet iproute 2 i lista MAC <-> IP * ''ip -6 neighbour'' \\ Wyświetla znanych sąsiadów IPv6 ''ping6 ff02::01%br0'' – żądanie ICMPv6 ping wysłane do grupy multicastowej all-nodes na ''br0'' (uzupełnia mapowania IP <-> MAC) ==== 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. \\ 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 ====== 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: * "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 – 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: * https://www.tunnelbroker.net * https://en.wikipedia.org/wiki/List_of_IPv6_tunnel_brokers [[https://tunnelbroker.services]] * [[https://www.sixxs.net/sunset/|https://www.sixxs.net]] 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]]) ====== IPsec ====== ====== IPv6 + Firewall ====== ====== Dodatkowe materiały ====== Prezentacje: * Materiały przygotowane przez RIPE NCC: * 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/videos/ipv6/transition-mechanisms** * 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/ipv6_protocols.pdf * http://6diss.6deploy.eu/tutorials/associated_protocols.pdf * http://6diss.6deploy.eu/tutorials/transitioning.pdf (od 14) ====== 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'' 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/