modified on 2 gru 2009 at 13:39 ••• 11 508 views

IPv6 w RouterOS: opis i przykłady

Z MikroTik Wiki

  • Wymagany pakiet: ipv6
  • Wersja systemu: 3.0beta10+

Spis treści

Wstęp do IPv6

Internet Protocol wersji 6 (IPv6) jest nowszą wersją Internet Protocol (IP). Początkowo spodziewano się, że zastąpi on IPv4 w stosunkowo krótkim czasie, ale w tej chwili obydwie wersje będą koegzystować w internecie przez dłuższy okres czasu. Jednakże IPv6 odgrywa coraz większą rolę, ponieważ nieuchronni zbliża się dzień, w którym wszystkie adresy IPv4 zostaną wykorzystane.

Dwie główne zalety jakie posiada IPv6:

  • dużo większa przestrzeń adresowa;
  • wsparcie autokonfiguracji adresów w trybie stateless.

Obsługiwane programy

W tej chwili MikroTik IPv6 (RouterOS 3.28/4.0beta4) obsługuje:

  • statyczne adresowanie i routing;
  • Routing dynamiczny:

static addressing and routing: protokoły BGP+, OSPFv3 i RIPng

  • firewall (filtr, znakowanie, adres lista)
  • serwery nazw DNS;
  • tunele 6in4 (SIT);
  • telnet;
  • ping;
  • traceroute;
  • web proxy;
  • sniffer i narzędzia pobierania;

Usługi niewspierane:

  • DHCPv6;
  • wszystkie PPP (Protokoły Point-to-point);
  • IPSEC;
  • SSH, FTP, API, Winbox, dostęp Webbox;
  • kolejki;
  • automatyczne tworzenie tuneli
  • polityki routingu
  • routingu multicastowego
  • torch, netwatch, testowanie pasma i inne narzędzia;

Adresacja IP

IPv6 używa 16 bajtowych adresów w porównaniu z 4 bajtowymi adresami w IPv4. Składnia adresów i typy IPv6 opisane są w RFC 4291.

Istnieje wiele typów adresów IPv6, które mogą być rozpoznawane po prefiksach. RouterOS rozróżnia poniższe:

  • multicast (prefix ff00::/8)
  • link-local (prefix fe80::/10)
  • loopback (adres ::1/128)
  • unspecified (adres ::/128)
  • other (wszystkie inne adresy, włączając przestarzałe adresy site-local i unikalne dla RFC 4139 adresy lokalne; wszystkie są traktowane jako globalne unicast).

Przykład prostej konfiguracji adresów IPv6:

ipv6 address add address=fc00:1::1/64 interface=ether1
ipv6 address add address=fc00:2::1/64 interface=ether2

Jedyna różnica pomiędzy adresami IPv6 a IPv4 jest to, że IPv6 automatycznie generuje adres link-local dla każdego aktywnego interfejsu wspierającego IPv6.

Przykład:

[admin@MikroTik] > ipv6 address print
Flags: X - disabled, I - invalid, D - dynamic, G - global, L - link-local
 #    ADDRESS                                     INTERFACE                  ADVERTISE
 0 DL fe80::20c:42ff:fe1d:3d3/64                  ether2                     no
 1 DL fe80::20c:42ff:fe1d:3d2/64                  ether1                     no
 2 DL fe80::20c:42ff:fe1d:3d4/64                  ether3                     no
 3  G fc00:1::1/64                                ether1                     yes
 4  G fc00:2::1/64                                ether2                     yes

Dla IPv6 automatycznie wygenerowane adresy są często używane. Takie adresy składają się z dwóch części:

  1. 64 bitowy prefiks sieci (zazwyczaj ręcznie wpisany w routerach i rozsyłane przez RADVD do hostów);
  2. 64 bitowy unikalny identyfikator.

64-bitowy unikalny ID jest generowany z numerów seryjnych sprzętu lub adresów MAC. W przypadku 48-bitowego adresu MAC, nazywanego EUI-64 (Extended Unique Identifier) adres jest generowany według poniższego algorytmu:

  1. pierwsze 3 bajty adresu MAC (OUI) jako pierwsze 3 bajty EUI-64, z tym, że najmniej znaczący bit najbardziej znaczącego bajtu jest odwrócony;
  2. wpisz 0xFF i 0xFE jako 4 i 5 bajt odpowiednio do EUI-64;
  3. użyj ostatnich 3 bajtów adresu MAC jako ostatnie 3 bajty EUI-64;

(Image)

W RouterOS, jeśli parametr eui-64 adresu jest skonfigurowany, ostateni 64 bity tego adresu zostaną automatycznie wygenerowane i zaktualizowane przy użyciu adresu MAC interfejsu. Te ostatnie bity muszą wynosić zero w tym przypadku.

Przykład:

[admin@MikroTik] > ipv6 address add address=fc00:3::/64 interface=ether3 eui-64=yes
[admin@MikroTik] > ipv6 address print
Flags: X - disabled, I - invalid, D - dynamic, G - global, L - link-local
 #    ADDRESS                                     INTERFACE                  ADVERTISE
 ...
 5  G fc00:3::20c:42ff:fe1d:3d4/64                ether3                     yes
[admin@MikroTik] > interface ethernet set ether3 mac-address=10:00:00:00:00:01
[admin@MikroTik] > ipv6 address print
Flags: X - disabled, I - invalid, D - dynamic, G - global, L - link-local
 #    ADDRESS                                     INTERFACE                  ADVERTISE
 ...
 5  G fc00:3::1200:ff:fe00:1/64                   ether3                     yes

Jeśli ustawiona jest opcja advertise=yes dla adresów IPv6, prefiks tego adresu jest automatycznie rozsyłany do hostów przez protokół ICMPv6. Opcja jest domyślnie ustawiona dla adresół z długością prefiksu 64. Długość prefiksu musi być równa 64, aby działała autokonfiguracja hosta. Polecenie konsoli /ipv6 nd prefixes print wyświetla informację o prefiksach, które są rozsyłane:

[admin@MikroTik] > ipv6 nd prefix print
Flags: X - disabled, I - invalid, D - dynamic
 0 D prefix=fc00:1::/64 interface=ether1 on-link=yes autoconfig=yes
      valid-lifetime=4w2d preferred-lifetime=1w

Przeczytaj również: http://www.tcpipguide.com/free/t_IPv6Addressing.htm

Routing IP

Dla statycznego routingu podstawowe zasady są takie same jak dla IPv4. Przykład:

[admin@MikroTik] > ipv6 route add dst-address=2001::/16 gateway=fc00:1::2
[admin@MikroTik] > ipv6 route print detail
Flags: X - disabled, A - active, D - dynamic,
C - connect, S - static, r - rip, o - ospf, b - bgp, U - unreachable
 0 A S  dst-address=2001::/16 gateway=fc00:1::2 reachable ether1 distance=1
        scope=30 target-scope=10

Najbardziej zauważalną różnicą jest to, że lokalne adresy mogą być używane jako następne skoki na trasie tylko jeśli jest to określone w interfejsie. Przykład:

[admin@MikroTik] > ipv6 route add dst-address=2002::/16 gateway=fe80::21a:4dff:fe56:1f4d%ether1
[admin@MikroTik] > ipv6 route print detail
Flags: X - disabled, A - active, D - dynamic,
C - connect, S - static, r - rip, o - ospf, b - bgp, U - unreachable
 ...
 1 A S  dst-address=2002::/16
        gateway=fe80::21a:4dff:fe56:1f4d%ether1 reachable distance=1
        scope=30 target-scope=10

Kolejną małą różnicą jest to, że nie ma tras blackhole czy prohibit, wyłącznie unreachable.

Routing IPv4 i IPv6 również różni się co do tras wielościeżkowych. Mówiąc technicznie, jądro linuksa nie obsługuje wielu następnych skoków przy trasowaniu IPv6. Jednakże, RouterOS pozwala ustawić więcej niż jeden adres bramki dla pojedynczej trasy. W tym przypadku, trasa jest umieszczona w jądrze dla każdego z interfejsów, do których należą następne skoki tras.

Przykład:

[admin@MikroTik] > ipv6 address p
Flags: X - disabled, I - invalid, D - dynamic, G - global, L - link-local
 #    ADDRESS                                     INTERFACE         ADVERTISE
 0  G fc00:1::1/64                                ether1            no
 1  G fc00:2::1/64                                ether2            no
[admin@MikroTik] > ipv6 route add dst-address=2001::/16 gateway=fc00:1::2,fc00:2::2
[admin@MikroTik] > ipv6 route print
Flags: X - disabled, A - active, D - dynamic,
C - connect, S - static, r - rip, o - ospf, b - bgp, U - unreachable
 #      DST-ADDRESS              GATEWAY                      DISTANCE
 0 A S  2001::/16                fc00:2::2 reachable ether1,  1
                                 fc00:1::2 reachable ether2

Podczas wyświetlania tablicy routingu jądra Linuksa, widzimy, że są dwie trasy, zamiast jednej:

# ip -6 route
2001::/16 via fc00:2::2 dev eth1  proto static  metric 1024  mtu 1500 advmss 1440 metric10 4294967295
2001::/16 via fc00:1::2 dev eth0  proto static  metric 1024  mtu 1500 advmss 1440 metric10 4294967295
...

Dynamiczne protokoły routingu

Uwaga: Łącza lokalnych adresów są wymagane, aby działały dynamiczne protokoły routingu
Uwaga: Aby wszystkie dynamiczne protokoły routingu działały poprawnie, musi być przydzielony poprawny IP Routera. Jeśli Router IP nie jest wpisany ręcznie, jeden z adresów IPv4 routera zostaje użyty jako Router IP. Jeśli nie ma przydzielonych żadnych adresów IPv4, proces wyboru ID zakończy się niepowodzeniem. Oznacza to, że routing dynamiczny nie będzie działać na routerze bez adresu IPv4, chyba że ręcznie wpiszesz Router ID!

BGP

Ponieważ z założenia BGP obsługuje wiele rodzin adresów, migracja do IPv6 jest w miarę prosta.

Przykład: konfiguracja iBGP pomiędzy routerami A i B, AS 65000, które będą wymieniać się trasami IPv4 i IPv6.

Router A:

[admin@A] > routing bgp peer add remote-address=10.0.0.134 remote-as=65000 address-families=ip,ipv6

Router B:

[admin@B] > routing bgp peer add remote-address=10.0.0.133 remote-as=65000 address-families=ip,ipv6

Dystrybucja trasy z routera A do routera B:

[admin@A] > ipv6 route add dst-address=2001::/16 gateway=fe80::1%ether1
[admin@A] > routing bgp network add network=2001::/16
[admin@A] > routing bgp advertisements print
PEER     PREFIX               NEXTHOP          AS-PATH  ORIGIN     LOCAL-PREF
peer1    2001::/16            fe80::1200:ff...          igp        100
[admin@B] > ipv6 route print
Flags: X - disabled, A - active, D - dynamic,
C - connect, S - static, r - rip, o - ospf, b - bgp, U - unreachable
 #      DST-ADDRESS              GATEWAY                  DISTANCE
 0 ADb  2001::/16                fe80::1200:ff:fe00:10... 200

Adresy IPv6 mogą być również używane do konfiguracji peerów w polach remote-address i update-source - aby umożliwić połączenia BGP przez IPv6.

OSPF

W przeciwieństwie do BGP, dodawanie wsparcia IPv6 do OSPF wymagało dużo zmian, w skutek czego powstała nowa, niekompatybilna wersja protokołu OSPF wersji 3 (Dla IPv4, używana była wersja 2). Nowa wersja została opisana w RFC 2740.

OSPFv3 używa tych samych podstawowych mechanizmów jak OSPFv2 - LSA, flooding, algorytm SPF, itp. Jednakże, nie dodano wyłącznie obsługi nowej rodziny adresów, ale również poprawiono niektóre mechanizmy protokołu. Nowa wersja unika niektórych ważnych problemów i niewydajności występujących w OSPFv2.

Składnia konfiguracji OSPFv3 w dużej mierze pozostała taka sama jak w OSPFv2. Jedną główną różnicą jest to, że nie ma konfiguracji sieci, a obowiązkowa stała się konfiguracja interfejsu, ponieważ OSPFv3 działanie opiera się na łączu, a nie na podsieci IP.

Przykład:

Konfiguracja OSPF na routerze A:

[admin@A] > routing ospf-v3 interface add interface=ether1 area=backbone

Konfiguracja OSPF na routerze B:

[admin@B] > routing ospf-v3 interface add interface=ether1 area=backbone

Dystrybucja trasy z rotuera A do routera B:

[admin@A] > ipv6 route add dst-address=2001::/16 gateway=fe80::1%ether1
[admin@A] > routing ospf-v3 instance set default redistribute-static=as-type-1
[admin@A] > routing ospf-v3 route print
 # DESTINATION                                 STATE          COST
 0 2001::/16                                   imported-ext-1 20
[admin@B] > ipv6 route print
Flags: X - disabled, A - active, D - dynamic,
C - connect, S - static, r - rip, o - ospf, b - bgp, U - unreachable
 #      DST-ADDRESS              GATEWAY                  DISTANCE
 0 ADo  2001::/16                fe80::1200:ff:fe00:10... 110

RIP

Podobnie jak w OSPF, należało zrobić nową wersję protokołu RIP z obsługą IPv6. Nowa wersja nazywana jest RPIng (RIP nowej generacji) i opisywana jest w RFC 2080. Podobnie jak OSPFv3, RIPng działa na łączu a nie podsieci IP - oznacza to że musisz skonfigurować interfejsy a nie sieci, na których działa RIPng.

Przykład:

Konfiguracja OSPF na routerze A:

[admin@A] > routing ripng interface add interface=ether1

Konfiguracja OSPF na routerze B:

[admin@B] > routing ripng interface add interface=ether1

Dystrybucja trasy z rotuera A do routera B:

[admin@A] > ipv6 route add dst-address=2001::/16 gateway=fe80::1%ether1
[admin@A] > routing ripng set redistribute-static=yes
[admin@A] > routing ripng route print
Flags: C - connect, S - static, R - rip, O - ospf, B - bgp
 #   DST-ADDRESS
 0 S 2001::/16
[admin@B] > ipv6 route print
Flags: X - disabled, A - active, D - dynamic,
C - connect, S - static, r - rip, o - ospf, b - bgp, U - unreachable
 #      DST-ADDRESS              GATEWAY                  DISTANCE
 0 ADr  2001::/16                fe80::1200:ff:fe00:10... 120

Autokonfiguracja adresów Stateless

Uwaga: Autokonfiguracja Stateless nie działa na routerach!


RouterOS ma wsparcie autokonfiguracji po stronie routera adresów IPv6 typu stateless przy użyciu Router Advertisement Daemon (RADVD). Prefiksy dla wszystkich adresów z 64 bitową maską są domyślnie rozsyłane.

Przykład:

[admin@MikroTik] > ipv6 address print
Flags: X - disabled, I - invalid, D - dynamic, G - global, L - link-local
 #    ADDRESS                                     INTERFACE         ADVERTISE
 0  G fc00:1::1/64                                ether1            yes
[admin@MikroTik] > ipv6 nd prefix print
Flags: X - disabled, I - invalid, D - dynamic
 0 D prefix=fc00:1::/64 interface=ether1 on-link=yes autoconfig=yes
      valid-lifetime=4w2d preferred-lifetime=1w

Na hoście bezpośrednio podłączonym do routera widzimy, że adres został dodany. Adres składa się z części prefiksu (pierwsze 64 bity), która jest pobierana z prefiksu z rozgłaszania prefiksu i części hosta (ostatnie 64 bity) która jest automatycznie wygenerowana z lokalnego adresu MAC:

atis@atis-desktop:~$ ip -6 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 fc00:1::21a:4dff:fe56:1f4d/64 scope global dynamic
       valid_lft 2588363sec preferred_lft 601163sec
    inet6 fe80::21a:4dff:fe56:1f4d/64 scope link
       valid_lft forever preferred_lft forever

Host otrzymał prefiks fc00:1::/64 od routera i z użyciem jego stworzył adres.

Jest również możliwość dystrybucji informacji o serwerze DNS przez RADVD:

[admin@MikroTik] > ip dns set secondary-dns=fc00:1::2
[admin@MikroTik] > ip dns print
            primary-dns: 10.0.0.1
          secondary-dns: fc00:1::2
...
[admin@MikroTik] > ipv6 nd set [f] advertise-dns=yes

Musisz mieć oprogramowanie działające po stronie klienta ze wsparciem Router Advertisement DNS aby móc wykorzystywać rozsyłaną informację o DNS.

Tunele 6to4

Opisane rozwiązanie używa globalnego przekazywania adresu 6to4. Aby zobaczyć rozwiązanie z tunnel bokerem zobacz Zestawianie tunelu IPv6 przez tunnel broker.

Najpierw musisz mieć globalny adres IPv4. W tym przykładzie zakładamy, że będzie to 1.2.3.4.

Następnie musisz stworzyć użytkownika, którego globalny anycastowy adres 6to4 192.88.99.1 jest osiągalny i zapewnia usługi przekazywania (ponieważ jest to adres anycastowy, Twoje połączenie powinno być kierowane do hosta mającego ten adres, który jest najbliżej Ciebie).

Dodaj interfejs 6to4 bez określenia konkretnego adresu zdalnego i użycia Twojego globalnego adresu IPv4 jako local-address:

interface 6to4 add mtu=1280 local-address=1.2.3.4 disabled=no

Teraz musisz dodać adres IPv6 do interfejsu tunelu. Adres powinien mieć formę "2002 + <IPv4 adres w heksach> + <własny id>" . Now you need to add a IPv6 address to the tunnel interface. The address should be in form "2002 + <IPv4 address in hex> + <custom id>" . Skrypt basha może być użyty go wygenerowania takie adresu IPv6 za Ciebie:

atis@atis-desktop:~$ ipv4="1.2.3.4"; id="1"; printf "2002:%02x%02x:%02x%02x::$id\n" `echo $ipv4 | tr "." " "`
2002:0102:0304::1

Dodaj wygenerowany adres do interfejsu 6to4:

ipv6 address add address=2002:0102:0304::1/128 interface=sit1

Dodaj trasę do Internetu IPv6 przez interfejs tunelowy używając adresu anycastowego IPv4:

ipv6 route add dst-address=2000::/3 gateway=::192.88.99.1,sit1

Składnia routing-test:

ipv6 route add dst-address=2000::/3 gateway=::192.88.99.1%sit1

Spróbuj spingować jakiegoś hosta IPv6 (np. ipv6.google.com, 2001:4860:a003::68) aby sprawdzić połączenie IPv6.

Zobacz również6to4 in Wikipedia. Nie myl tuneli 6to4 z 6in4 czy 6over4 - podobnie się nazywają, ale są to różne mechanizmy!

Używanie podwójnego stosu

Wszystkie usługi IP, które nasłuchują na IPv6 akceptują również połączenia IPv4. Weźmy na przykład web proxy.

Aby zmusić web proxy aby nasłuchiwało na połączenia IPv6:

/ip proxy set src-address=::

Aby zademonstrować, że podwójny stos działam połączmy się z web proxy w 10.0.0.131/fc00:1::1 przez telnet, wpisz zapytanie "GET /" i obserwuj wygenerowaną wiadomość o błędzie.

Łączenie przez IPv4:

$ telnet 10.0.0.131 8080
Trying 10.0.0.131...
Connected to 10.0.0.131.
Escape character is '^]'.
GET /

HTTP/1.0 404 Not Found
Content-Length: 518
...
Generated Mon, 18 Dec 2006 12:40:03 GMT by 10.0.0.131 (Mikrotik HttpProxy)

Łączenie przez IPv6:

$ telnet -6 fc00:1::1 8080
Trying fc00:1::1...
Connected to fc00:1::1.
GET /

HTTP/1.0 404 Not Found
Content-Length: 525
...
Generated Mon, 18 Dec 2006 12:38:51 GMT by ::ffff:10.0.0.131 (Mikrotik HttpProxy)