"""
        (0 0)
---oOO---(_)---------
| IPv6 i Neostrada  |
|    w Linuksie     |
--------------OOo----
       |__|__|
        || ||
       oOO OOo

Poniższy artykuł ma na celu przedstawienie - krok po kroku - w jaki sposób 
zestawić i skonfigurować tunel IPv6 na dynamicznym adresie IPv4 na 
przykładzie usługi Neostrada TP.

Czym w ogóle jest IPv6? Jest to protokół komunikacyjny, zwany też 
protokołem nowej generacji (IPng), który powstał w głównej mierze z powodu 
kończącej się ilości adresów IPv4. Protokół IPv6 jest protokołem 
128-bitowym, co pozwala na zaadresowanie 2^128 = 3,4x10^38 węzłów, w 
przeciwieństwie do 32-bitowego IPv4, który może zaadresować "tylko" 2^32 = 
4,3x10^9 węzłów.

Co nam będzie potrzebne:

1. Tunel IPv6
2. Domena A (DDNS), informująca tunnel brokera, o adresie IPv4, który 
będzie obsługiwał adresy IPv6
3. Domena NS (lub AAAA), potrzebna do revDNS
4. Zainstalowany w systemie serwer DNS, np. BIND

Zakładam, że system jest już odpowiednio przygotowany i odpowiednie opcje 
dotyczące obsługi IPv6 są wkompilowane w jądro.

Zaczniemy od najprostszej rzeczy, czyli zdobycia domeny na nasz dynamiczny 
adres IP. Dwa najpopularniejsze serwisy świadczące tego typu usługi to 
No-IP.com (http://www.no-ip.com/) oraz DynDNS (http://www.dyndns.com/). 
Rejestrujemy się na przykład na pierwszym z nich, konfigurujemy wybraną 
domenę i ściągamy program, który co minutę będzie sprawdzał aktualność 
naszego adresu i w razie potrzeby wysyłał dane z nowym adresem IP. W 
artykule przyjmiemy, że została założona domena serwer.no-ip.org.

Kolejnym krokiem jest domena typu NS (lub AAAA, jeśli znamy już zakres 
adresów przydzielony przez tunnel brokera, ale o tym później). Darmową 
domenę typu NS możemy założyć serwisie FreeDNS 
(http://freedns.afraid.org/). Oczywiście rejestrujemy się na stronie, 
następnie po zalogowaniu wybieramy z listy domen nazwę, która nas 
interesuje, niech będzie to mooo.com, wybieramy typ domeny: NS, wpisujemy 
nazwę subdomeny, np. serwer6, a w polu adresu podajemy nazwę wcześniej 
zarejestrowanej domeny DDNS, czyli w naszym przypadku serwer.no-ip.org. 
Tym oto sposobem staliśmy się posiadaczem subdomeny serwer6.mooo.com, 
która została wydelegowana na nasz serwer nazw.

Jeśli chodzi o konfigurację BIND-a, będę opierał się na standardowej 
instalacji tego serwera w dystrybucji Slackware. Główny plik 
konfiguracyjny to /etc/named.conf, pliki stref znajdują się w katalogu 
/var/named. Na początek edytujemy plik konfiguracyjny, dopisując na jego 
końcu:

zone "serwer6.mooo.com" IN {
     type master;
     file "serwer6.mooo.com";
     allow-update { none; };
     allow-transfer { none; };
     notify yes;
};

Następnie tworzymy plik /var/named/serwer6.mooo.com i uzupełniamy go:

$TTL 120
$ORIGIN serwer6.mooo.com.
@    IN    SOA    serwer6.mooo.com. hostmaster.serwer6.mooo.com. (
                  2007092701 ; serial
                  3600 ; refresh
                  1800 ; retry
                  1209600 ; expire
                  86400 ) ; minimum
@    IN    NS     serwer.no-ip.org.
@    IN    A      83.30.36.225      // twój aktualny adres IP

To na razie wstępna konfiguracja, po zrestartowaniu BIND-a sprawdźmy 
polecenie:

$ host -t A serwer6.mooo.com
serwer6.mooo.com has address 83.30.36.225

Komunikat podobny do powyższego oznacza, że na razie wszystko działa.

Czas na skonfigurowanie najważniejszego elementu, czyli tunelu IPv6. Jest 
kilku tunnel brokerów, którzy oferują darmowe tunele IPv6, najczęściej z 
prefiksami /48 lub /64, czyli odpowiednio 80- lub 64-bitową przestrzenią 
adresową dla użytkownika. Polecam założenie tunelu na stronie www.go6.net. 
Wystarczy wypełnić krótki formularz rejestracyjny i pobrać ze strony 
program Gateway6 Client. Ściągamy także program ipv6calc 
(ftp://ftp.bieringer.de/pub/linux/IPv6/ipv6calc/ipv6calc-0.71.0.tar.gz), 
który posłuży do obliczenia revDNS dla naszych adresów.

Rozpakowujemy klienta Gateway6 i wchodzimy do katalogu tspc-advanced, w 
którym z poziomu roota wykonujemy polecenie:

# make install target=linux installdir=/usr/local/gw6c

Edytujemy plik /usr/local/gw6c/bin/gw6c.conf. Najistotniejsze wpisy to:

userid=nazwa_uzytkownika     # zarejestrowana nazwa użytkownika
passwd=haslo                 # i hasło na www.go6.net
server=broker.freenet6.net
auth_method=any
host_type=router
prefixlen=48
if_prefix=ppp0               # interfejs WAN
dns_server=serwer.no-ip.org
log_console=3                # dzięki temu wpisowi uzyskamy
                             # informację o otrzymanym prefiksie

Resztę wpisów możemy pozostawić bez zmian. Uruchamiamy gw6c. Powinien 
pojawić się nowy interfejs sieciowy - sit1, a wśród logów, które pojawią 
się na ekranie powinna być linijka podobna do tej:

<prefix length="48">2001:05c1:8f6a:0000:0000:0000:0000:0000</prefix>

To właśnie informacja o adresach, których właśnie staliśmy się 
posiadaczami. 2001:05c1:8f6a::/48 oznacza adresy z przedziału 
2001:05c1:8f6a:0000:0000:0000:0000:0000 - 
2001:05c1:8f6a:ffff:ffff:ffff:ffff:ffff, czyli ponad 1,2x10^24 adresów. 
Wystarczy na jakiś czas...

Teraz musimy przypisać sobie kilka adresów do interfejsu sieciowego, aby 
były widoczne z zewnątrz. Najwygodniej jest to zrobić poleceniem ip z 
pakietu iproute2.

# ip a a 2001:5c1:8f6a::1 dev sit1
# ip a a 2001:5c1:8f6a::2 dev sit1
# ip a a 2001:5c1:8f6a::3 dev sit1

Na razie wystarczy. Musimy teraz obliczyć nasz revDNS, który będzie 
potrzebny w dalszej konfiguracji BIND-a. Ściągniętego ipv6calc'a 
kompilujemy, nie ma potrzeby go instalować, można go uruchomić 
bezpośrednio z katalogu:

$ ./ipv6calc -r 2001:5c1:8f6a::/48
No input type specified, try autodetection...found type: ipv6addr
a.6.f.8.1.c.5.0.1.0.0.2.ip6.int.

Uzyskaliśmy potrzebny nam adres, oczywiście można go było obliczyć 
ręcznie, ale łatwiej zrobić to programem. Dodam jeszcze, że od 1 czerwca 
2006 nie ma już domeny ip6.int., zastąpiła ją ip6.arpa., więc poprawny 
adres to a.6.f.8.1.c.5.0.1.0.0.2.ip6.arpa.

Wracamy do konfiguracji BIND-a. Ponownie edytujemy /etc/named.conf, 
dopisując konfigurację dla nowej strefy:

zone "a.6.f.8.1.c.5.0.1.0.0.2.ip6.arpa" IN {
     type master;
     file "revdns.ipv6";
};

Edytujemy także /var/named/serwer6.mooo.com, dopisując do niego poniższe 
linijki. Najlepiej dopisać je przed wcześniej dopisanym rekordem A 
(lokalizacja rekordu A na końcu pliku znacznie ułatwi późniejsze jego 
edytowanie za pomocą skryptu aktualizującego adres IPv4). Oczywiście można 
zrezygnować z rekordu A, ja zamierzam jedynie zademonstrować w jaki sposób 
może to działać.

@     IN    AAAA   2001:5c1:8f6a::1
root  IN    AAAA   2001:5c1:8f6a::2
mail  IN    AAAA   2001:5c1:8f6a::3

Tworzymy nowy plik strefy /var/named/revdns.ipv6, a w nim:

$TTL 120
$ORIGIN a.6.f.8.1.c.5.0.1.0.0.2.ip6.arpa.
@    IN    SOA    serwer6.mooo.com. hostmaster.serwer6.mooo.com. (
                  2007092701 ; serial
                  3600 ; refresh
                  1800 ; retry
                  1209600 ; expire
                  86400 ) ; minimum
@    IN    NS     serwer.no-ip.org.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR serwer6.mooo.com.
2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR root.serwer6.mooo.com.
3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR mail.serwer6.mooo.com.

Restartujemy BIND-a. Możemy dodać oczywiście jeszcze inne wpisy, po 
dodaniu dodatkowych adresów do interfejsu, chociażby coś takiego:

4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN A 83.30.36.225

W ten sposób uzyskujemy w pełni funkcjonalną domenę 
4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.a.6.f.8.1.c.5.0.1.0.0.2.ip6.arpa. 
Jeśli na serwerze działa Apache to adres ten śmiało możemy wpisać do 
przeglądarki.

Sprawdzamy oczywiście czy wszystko działa:

$ host serwer6.mooo.com
serwer6.mooo.com has address 83.30.36.225
serwer6.mooo.com has IPv6 address 2001:5c1:8f6a::1
$ host 2001:5c1:8f6a::1
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.a.6.f.8.1.c.5.0.1.0.0.2.ip6.arpa
domain name pointer serwer6.mooo.com.

Wpis podobny do powyższego oznacza, że wszystko jest w porządku. 
Podsumowując: stworzyliśmy trzy różne domeny, z których każda posiada 
własny adres IPv6 oraz revDNS.

Podam jeszcze przykład bardzo prostego skryptu do aktualizacji adresu IPv4 
w pliku strefy. Żeby skrypt działał właściwie wpis dotyczący rekordu A 
musi znajdować się na końcu pliku.

#!/bin/sh
MYIP=`/sbin/ifconfig ppp0 | grep "inet addr\:" | \
      awk '{ print (substr($2,6)) }'`
ZONE=/var/named/serwer6.mooo.com
BACKUP=/var/named/serwer6.mooo.com.bak
 
cat $ZONE > $BACKUP
sed -e '$d' $BACKUP > $ZONE
echo $'@\t\tIN\tA\t'$MYIP >> $ZONE
killall -HUP named

Do wyjaśnienia pozostała jeszcze kwestia, dlaczego zamiast domeny NS 
możemy użyć samego rekordu AAAA. Myślę, że teraz jest to oczywiste. 
Załóżmy, że mamy znajomego, który posiada domenę sklep.pl, w której 
wykorzystywany jest jedynie rekord A. AAAA jest nieużywany, więc możemy 
poprosić znajomego, żeby dopisał rekord AAAA wskazujący na nasz adres 
IPv6, np. 2001:5c1:8f6a::5. U siebie tworzymy odpowiedni wpis w pliku 
strefy revdns.ipv6 i w ten sposób mamy kolejną domenę dostępną razem z 
revDNS.

Obecnie do najpopularniejszych zastosowań tuneli IPv6 należy dostęp do 
sieci IRC, a to dzięki możliwości praktycznie nieograniczonego tworzenia 
domen odwrotnych, popularnie zwanych vhostami. Ponadto dzięki tunelowi 
IPv6 istnieje możliwość postawienia tzw. sesji na IRC-u. Nawet po 
zresetowaniu się modemu Neostrady i zmiany adresu IPv4, tunel IPv6 po 
ponownym zestawieniu może pracować bez przerwy i utraty fizycznego 
połączenia.

Zachęcam do eksperymentowania z IPv6. Przedstawione tutaj informacje to 
jedynie niewielka część ogromnych możliwości tego protokołu.

--
30.09.2007
Copyright 2007 Damian Pasternok http://www.pasternok.org/