IPv6 i Neostrada w Linuksie

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?

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 oraz DynDNS. 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ę NS możemy założyć serwisie FreeDNS. 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, 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.


Copyright 2007 Damian Pasternok.
Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.
Zezwala się na wykonywanie i dystrybucję wiernych kopii tego tekstu, niezależnie od nośnika, pod warunkiem zachowania niniejszego zezwolenia.

Aktualizowane: $Date: 2007/12/13 23:05:31 $ $Author: crh $