[Company Logo Image]  

Home ] Up ] News ] Szukaj ] Index ] NetMapa ] Ankieta ] Sprawy GroszNetu ] Forum ] FAQ ] Download ]

IPv6 i Linux

 

 

Home
Up

Email

IPv6 i Linux

Strona została ostatnio znacznie uaktualniona, w szczególności jeśli chodzi o sposób konfiguracji tuneli za pomocą iproute. W niedługim czasie mam także nadzieję opisać konfigurację BGP4+. Należy podkreślić, że nie jest to HOWTO dla każdego - trochę wiadomości trzeba już mieć. Jeśli nie wiesz nic o IPv6, to zajrzyj najpierw na stronę Petera Bieringera.

Spis treści

Kernel

Obsługa IPv6 jest dostępna w Linuxach nowszych niż 2.1.8. W moim przypadku używam IPv6 od wersji 2.1.87, po obecne 2.1.128.

Podczas konfiguracji kernela należy włączyć następujące opcje:

Sekcja Opcja Ustawienie
Code maturity level options Prompt for development and/or incomplete code/drivers Yes
Networking options IP: tunneling Yes
Networking options The IPv6 protocol (EXPERIMENTAL) Yes
Networking options IPv6: enable EUI-64 token format Yes
Networking options IPv6: disable provided based addresses Yes

Wszystkie opcje wkompilowałem do kernela na stałe. Niektóre z nich nie chciały działać jako moduły, w szczególności tunneling.

Oprogramowanie

W tej sekcji zaszły najbardziej znaczące zmiany od poprzedniej wersji tego tekstu, gdzie opierałem się głownie na net-tools. Obecnie wspólnymi siłami polskiego 6bone udało sie opracować nową technikę stawiania tuneli IPv6, IMHO znacznie lepszą od poprzedniej. Przypomnijmy, że stara metoda polegała na konfigurowaniu tuneli za pomocą "ifconfig sit0 tunnel aaa.bbb.ccc.ddd" i wymagała jedynie zainstalowani w miarę nowego pakietu net-tools.

W nowej metodzie wszystkie operacje na tunelach i tablicy routingu wykonujemy za pomocą programu iproute Aleksieja N. Kuźniecowa (ANK). Podsumowując, należy zainstalować:

 

Instalowanie glibc-2.1 (obecnie w wersjach pre - 2.0.103 itp) nie jest chyba konieczne. Co więcej inet6-apps w wersjach wcześniejszych niż 0.34 nie kompiluje się pod glibc bez poprawek, a iproute wymaga patcha by skompilować się pod glibc. Niemniej większośc polskich Linuxów z IPv6 chodzi pod glibc-2.0.xx.

Jeśli chodzi o RedHata, to dzięki ekipie PLD wszystkie w/w pakiety włącznie z glibc są dostępne jako RPMy. Można je znaleźć pod adresem ftp://magellan.shadow.eu.org/pub/PLD-devel/ lub na mirrorach.

 

net-tools

Pakiet net-tools zawiera programy ifconfig, route itp. uzupełnione o obsługę IPv6 oraz tuneli. Najnowszą wersję można ściągnąć z ftp://ftp.cs-ipv6.lancs.ac.uk/pub/Code/Linux/Net_Tools/. Jeśli kompilujesz net-tools ze źródeł, to włącz następujące opcje dotyczące IPv6:

 

INET6 (IPv6) protocol family (HAVE_AFINET6) [y]
IPIP Tunnel support (HAVE_HWTUNNEL) [y]
SIT (IPv6-in-IPv4) support (HAVE_HWSIT) [y]

inet6-apps

Pakiet inet6-apps zawiera bibliotekę wykorzystywaną przez inne programy IPv6 oraz podstawowe narzędzia, klienty i demony IPv6: ping, traceroute, inetd itp. Najnowszą wersję można ściągnąć z ftp://ftp.inner.net/pub/ipv6/,

Jeśli kompilujesz inet6-apps ze źródeł, w pliku GNUmakefile.config ustaw następujące opcje:

 

OS=Linux
HAVE_POSIX1G_TYPES=0
LIBCAPI=1
INET6=1
LOCAL=1
NETSEC=0
NETSEC_EMULATE=0
RESOLVER=1
LIBRESOLV=-lresolv
LIBCRYPT=-lcrypt
HOSTTABLE=1
OFFSETPORT=0
FASTCTO=10
DESTDIR=/usr/inet6
DEBUG=0

Przygotowanie systemu pod IPv6

 

/etc/hosts

Do pliku /etc/hosts należy dodać:

 

::1             ipv6-localhost ipv6-loopback
fe00::0         ipv6-localnet
ff00::0         ipv6-mcastprefix
ff02::1         ipv6-allnodes
ff02::2         ipv6-allrouters
ff02::3         ipv6-allhosts

/etc/protocols

Do pliku /etc/protocols należy dodać:

 

ipv6    	41      IPv6            # Internet Protocol, version 6
icmpv6  	58      ICMPV6          # Internet Control Message Protocol version 6
ipv6-route      43      IPv6-Route      # Routing Header for IPv6
ipv6-frag       44      IPv6-Frag       # Fragment Header for IPv6
ipv6-crypt      50      IPv6-Crypt      # Encryption Header for IPv6
ipv6-auth       51      IPv6-Auth       # Authentication Header for IPv6
ipv6-nonxt      59      IPv6-NoNxt      # No Next Header for IPv6
ipv6-opts       60      IPv6-Opts       # Destination Options for IPv6

Konfiguracja interfejsów

Przed zrobieniem czegokolwiek z tej sekcji należy skontaktować się z Rafałem Maszkowskim <rzm@icm.edu.pl> i poprosić go o przydzielenie odpowiedniej puli adresów IPv6 oraz postawienie tunelu. Tunel można postawić również do kogokolwiek innego podpiętego do 6BONE, wystarczy napisać na listę 6bone-pl.

Mając już pulę adresów można ostatecznie przystąpić do konfigurowania tunelu. Poniższy plik rezyduje u mnie jako /etc/rc.d/init.d/inet6 i jest podlinkowany do katalogu /etc/rc.d/rc3.d/. Nie jest to w pełni zgodne z filozofią RedHata, ale tak jest IMHO prościej.

Adres mojego routera IPv6 to 3ffe:902:3::2/48, należy go zastąpić własnym. Routing defaultowy należy również uzyskać od Rafała, chociaż pewnie będzie taki sam.

 

#!/bin/sh
case "$1" in
        start)

        echo "Configuring IPv6..."
        # konfiguracja kernela - forwarding pakietów IPv4 i IPv6
        echo 1 >/proc/sys/net/ipv6/conf/all/forwarding

        ip addr add 3ffe:902:3::2/48 dev eth0	# [1]

		# 193.219.28.246 = 6bone-gw.6bone.pl
		# 195.116.211.11 = druid.ceti.com.pl
		ip tunnel add icm mode sit remote 193.219.28.246 local 195.116.211.11 ttl 64	# [3]
		ip link set icm up	# [4]
		ip route add 3f00::/8 via fe80::193.219.28.246 dev icm	# [5]

        ;;

        stop)
		ip link set icm down	
        ;;
esac

 

Kilka słów komentarza

Powyższa konfiguracja robi następujące rzeczy:
  • dodaje adres IPv6 hosta do interfejsu eth0, co powinno równocześnie spowodować pojawienie się routingu na sieć lokalną (linijka 1)
  • tworzy tunel SIT (IPv6 tunelowane w IPv4) między dwoma hostami: 6bone-gw.6bone.pl (remote) oraz druid.ceti.com.pl (local). Interfejs tunelu otrzymuje nazwę icm (linijka 3)
  • podnosi interfejs icm. W tym przypadku iproute robi dokładnie to samo co "ifconfig icm up" (linijka 4)
  • dodaje routing domyślny IPv6 na interfejs tunelu tunelu (linijka 5)

Wyjaśnienia także wymaga kierowania routingu przez adres fe80::193.219.28.246", Jest to adres typu link-local dodawany automatycznie do interfejsu tunelu podczas jego tworzenia. Jak widać, zawiera on przedrostek fe80 oraz adres IPv4 drugiego końca tunelu.

Adresy link-local bardzo upraszczają konfigurację tuneli. W stosowanej przez nas poprzednio metodzie każdemu końcowi tunelu należało przydzielić "prawdziwy" adres IPv6 z prefiksem /126 i na niego ustawiać routing.

Jeśli chodzi o zamykanie tuneli, to w obecnej wersji IPv6 w kernelu nie jest zalecane usuwanie ich za pomocą "ip tunnel del". Według wyjaśnień ANK kasowanie interfejsów nie jest jeszcze dopracowane i nie należy z niego korzystać.

Testy

Po uruchomieniu powyższego skryptu adresy interfejsów oraz routing powinien być poprawnie skonfigurowany pod kątem IPv6. Wyniki działania następujących poleceń powinny zawierać adresy IPv6:

Adresy interfejsu głównego

 

[root@druid /root]# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast
    link/ETHER 00:80:c8:79:a4:46 brd ff:ff:ff:ff:ff:ff
    inet 195.116.211.11/26 brd 195.116.211.255 scope global eth0
    inet6 fe80::280:c8ff:fe79:a446/10 scope link 
    inet6 3ffe:902:3::2/48 scope global 

Routing

 

[root@druid /root]# ip route list table main6
local ::1 via :: dev lo  metric 0  mtu 3924 rtt 300
local 3ffe:902:3::2 via :: dev lo  metric 0  mtu 3924 rtt 300
3ffe:902:3::/48 dev eth0  proto kernel  metric 256  mtu 1500 rtt 300
local fe80::c374:d30b via :: dev lo  metric 0  mtu 3924 rtt 300
local fe80::280:c8ff:fe79:a446 via :: dev lo  metric 0  mtu 3924 rtt 300
fe80::/10 dev eth0  proto kernel  metric 256  mtu 1500 rtt 300
fe80::/8 dev icm  proto kernel  metric 256  mtu 1500 rtt 300
ff00::/8 dev eth0  proto kernel  metric 256  mtu 1500 rtt 300
ff00::/8 dev icm  proto kernel  metric 256  mtu 1480 rtt 300
unreachable default dev lo  metric -1  error -101

Adresy interfejsu tunelu

 

[root@druid /root]# ip addr show icm
7: icm@NONE: <POINTOPOINT,NOARP,UP> mtu 1480 qdisc noqueue
    link/SIT c3:74:d3:0b brd c1:db:1c:f6
    inet6 fe80::c374:d30b/128 scope link 

Ping

Jeśli tunel z drugiej strony jest już skonfigurowany, to powinien również działać ping na adresy IPv6:

 

[root@druid /root]# ping 3ffe:902::1
PING 3ffe:902::1 (3ffe:902::1): 56 data bytes
64 bytes from 3ffe:902::1: icmp_seq=1 ttl=64 time=129.354 ms
64 bytes from 3ffe:902::1: icmp_seq=5 ttl=64 time=274.319 ms
64 bytes from 3ffe:902::1: icmp_seq=6 ttl=64 time=365.049 ms
64 bytes from 3ffe:902::1: icmp_seq=7 ttl=64 time=293.874 ms
64 bytes from 3ffe:902::1: icmp_seq=8 ttl=64 time=291.153 ms
64 bytes from 3ffe:902::1: icmp_seq=9 ttl=64 time=127.219 ms

--- 3ffe:902::1 ping statistics ---
10 packets transmitted, 6 packets received, 40% packet loss
round-trip min/avg/max = 127.219/246.828/365.049 ms

 

Resolver

Jeśli zainstalowany w systemie resolver obsługuje IPv6 (glibc-2.0.92 i nowsze), to można także używać nazw kanonicznych, np. "6bone-gw.6bone.pl", które powinno się rozwiązać na adres 3ffe:902::1. Należy zauważyć, że hosty mogą mieć równocześnie adres IPv4 oraz IPv6:

 

[root@druid /root]# host -t a 6bone-gw.6bone.pl
6bone-gw.6bone.pl has address 193.219.28.246
[root@druid /root]# host -t aaaa 6bone-gw.6bone.pl
6bone-gw.6bone.pl IPv6 address 3ffe:902::1

DNS

Adresy IPv6 są przechowywane w rekordach AAAA (w odróżnieniu od rekordów A dla IPv4). Są one obsługiwane przez BIND 4.9.7 oraz 8.1.2. Dla potrzeb IPv6 warto stworzyć w swojej domenie poddomenę ipv6 (np. ipv6.ceti.com.pl) i w niej dodawać adresy maszyn podłączonych do 6BONE. Poniższe przykłady dotyczą BIND 8.1.2, przykłady dla wersji 4.9.7 można znaleźć na stronie http://www.visc.vt.edu/ipv6/doc/dns.html.

 

domena ipv6

Wpis w /etc/named.conf:

 

zone "ipv6.ceti.com.pl" {
        type master;
        file "ipv6.hosts";
};

Plik ipv6.hosts:

 

@               IN      SOA     tau.ceti.com.pl.  hostmaster.tau.ceti.com.pl.  (
                                1998040301
                                21600
                                7200
                                1209600
                                172800 )

                IN      NS      tau.ceti.com.pl.
                IN      NS      zatoka.icm.edu.pl.
                IN      MX      10 tau.ceti.com.pl.
                IN      MX      20 alfa.ceti.com.pl.
                IN      MX      30 pipeta.chemia.pk.edu.pl.

druid           IN      AAAA    3ffe:902:3::2
inny_host	IN	AAAA	3ffe:902:3::3
inny_host	IN	AAAA	3ffe:902:3::4

 

domena odwrotna

Do mapowania adresów IPv6 na nazwy kanoniczne służy domena IP6.INT, w której adres jest zapisywany od końca, cyferka po cyferce. Delegację domen w IP6.INT prowadzi węzeł od którego otrzymujemy podsieć, w naszym przypadku Rafał Maszkowski <rzm@icm.edu.pl>. Przykładowo, dla sieci 3ffe:0902:0003::/48 delegowana jest domena 3.0.0.0.2.0.9.0.e.f.f.3.ip6.int. Dla znajdującego się w tej sieci hosta 3ffe:902:3::2 należy stworzyć rekord:

 

2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR druid.ipv6.ceti.com.pl.

Jak można się domyślić, po połączeniu łańcucha cyfr odpowiadającego adresowi hosta z łańcuchem odpowiadającym adresowi delegowanej sieci całość powinna mieć długość 32 cyferek. Przykładowe pliki dla BIND 8.1.1 znajdują się poniżej:

Wpis w /etc/named.conf:

// 3ffe:902:3::2
zone "3.0.0.0.2.0.9.0.e.f.f.3.ip6.int" {
        type master;
        file "3ffe:902:3";
};

Plik /var/named/3ffe:902:3:

 

@               IN      SOA     tau.ceti.com.pl. hostmaster.tau.ceti.com.pl. (
                                1998040601 ; YYYYMMDDxx
                                86400
                                7200
                                1209600
                                21600 )

                IN      NS      tau.ceti.com.pl.
                IN      NS      zatoka.icm.edu.pl.
;                       hosty w domenie 3.0.0.0.2.0.9.0.e.f.f.3.ip6.int
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0         IN      PTR     zatoka.ipv6.icm.edu.pl.
2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0         IN      PTR     druid.ipv6.ceti.com.pl.

Po skonfigurowaniu DNSu i odwrotnego DNSu programy powinny prawidłowo rozwiązywać zarówno nazwy hostów w domenie ipv6. oraz adresy w domenie odwrotnej:

 

[root@druid /root]# /usr/inet6/bin/traceroute druid.ipv6.ceti.com.pl
traceroute to druid.ipv6.ceti.com.pl (3ffe:902:3::2), 30 hops max, 60 byte packets
 1  druid.ipv6.ceti.com.pl (3ffe:902:3::2)  0.424 ms *  0.277 ms
[root@druid /root]# /usr/inet6/bin/traceroute 3ffe:902:3::2
traceroute to 3ffe:902:3::2 (3ffe:902:3::2), 30 hops max, 60 byte packets
 1  druid.ipv6.ceti.com.pl (3ffe:902:3::2)  0.441 ms *  0.305 ms

Zasoby

 

WWW

Pierwsze dwie strony są częsciowo nieaktualne (szczególnie w sekcjach dotyczących uzyskiwania adresów IPv6), ale zawierają wiele przydatnych informacji na temat oprogramowania IPv6 pod Linuxa.

 

Listy dyskusyjne

 

6bone-pl@sunsite.icm.edu.pl
zapisy na petidomo@sunsite.icm.edu.pl, z tekstem subscribe 6bone-pl w treści listu
netdev@nuclecu.unam.mx
zapisy na majordomo@nuclecu.unam.mx, z tekstem subscribe netdev w treści listu
6bone@isi.edu
zapisy na majordomo@zephyr.isi.edu, z tekstem subscribe 6bone w treści listu

 

Podziękowania

 

  • Artur Frysiak
  • Maciej Grzeszczuk
  • Rafał Maszkowski
  • Sergiusz Pawłowicz
  • Grzegorz Stanisławski
  • Wojciech Ślusarczyk
Oraz pozostali uczestnicy 6bone w Polsce i za granicą.

 


Paweł Krawczyk <kravietz@ceti.com.pl>

 




 

 

Wyślij E-mail MMalinow@bigfoot.com z pytaniami lub komentarzem.
Copyright © 2000 GroszNet Osiedlowa Sieć Komputerowa
Ostatnia modyfikacja: March 01, 2000