Monthly Archives: September 2011

Konfiguracja IPv6 we FreeBSD 8.2

Posted by Maciej Suszko on September 17, 2011
FreeBSD / No Comments

Pod koniec lutego 2011 IANA rozdała ostatnie wolne pule /8… No tak, wygląda na to, że nadchodzi zmierzch IPv4, chociaż osobiście nie sądzę, aby migracja do IPv6 nastąpiła jakoś błyskawicznie.

Nic nie stoi na przeszkodzie, aby zainteresować się tym, co jednak nieuniknione, a przy okazji trochę oswoić się z nową adresacją, żeby nie obudzić się z przysłowiową ręką w nocniku.

 

Zatem otwieram nasz program, już… Mój ISP nie oferuje ze swojej strony bezpośredniego dostępu do IPv6, potrzebny jest jakiś tunel – wybór padł na Hurricane Electric, a dokładniej na jego darmowego tunnel brokera. Wystarczy założyć sobie konto, o ile jeszcze go nie posiadamy i ,,wyklikać‘’ konfigurację tunelu – w moim przypadku koniec HE znajduje się we Frankfurcie – całkiem stabilne połączenie, krótkie czasy odpowiedzi.

Jeżeli już przydzielono nam pulę, to możemy zabrać się za konfigurację systemu. Jądro GENERIC FreeBSD 8.2-RELEASE, jak i już wcześniejsze domyślnie obsługuje IPv6, tak więc do dzieła.

Tunel, jaki został dla mnie skonfigurowany przez brokera wygląda następująco:

IPv6 Tunnel Endpoints
Server IPv4 Address: 216.66.80.30
Server IPv6 Address: 2001:470:1f0a:e2c::1/64
Client IPv4 Address: 89.76.240.115
Client IPv6 Address: 2001:470:1f0a:e2c::2/64
Routed IPv6 Prefixes
Routed /64:2001:470:1f0b:e2c::/64

Do tunelowania IPv6 po IPv4 użyjemy gif(4) – obsługa tego interfejsu jest już wkompilowana w GENERIC-owy kernel, a więc w /etc/rc.conf powinny pojawić się wpisy:

ipv6_enable="YES"
ifconfig_gif0="tunnel 89.76.240.115 216.66.80.30"
ifconfig_gif0_alias0="inet6 2001:470:1f0a:e2c::2 2001:470:1f0a:e2c::1 prefixlen 128"
ipv6_defaultrouter="2001:470:1f0a:e2c::1"

Teoretycznie na tym koniec… tunel zestawiony. Wystarczy zrestartować maszynę (no… niekoniecznie, ale tak będzie najbezpieczniej) i sprawdzić działanie tunelu:

tlhscd@ibox:~ $ ping6 -c3 ipv6.google.com
PING6(56=40+8+8 bytes) 2001:470:1f0a:e2c::2 --> 2a00:1450:8006::68
16 bytes from 2a00:1450:8006::68, icmp_seq=0 hlim=56 time=51.045 ms
16 bytes from 2a00:1450:8006::68, icmp_seq=1 hlim=56 time=53.400 ms
16 bytes from 2a00:1450:8006::68, icmp_seq=2 hlim=56 time=49.879 ms

--- ipv6.l.google.com ping6 statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 49.879/51.441/53.400/1.465 ms

Zakładam oczywiście, że maszyna zezwala na ruch z/do niej z użyciem protokołu ipv6 (41) – jeżeli nie stosujesz żadnego filtrowania pakietów, a twój dostawca internetu nie filtruje tego typu ruchu, to wszystko powinno działać jak należy.

 

Włączając obsługę IPv6 w /etc/rc.conf pamiętać należy, że w przypadku podwójnych rekordów A / AAAA (tak jak w przypadku tego bloga):

tlhscd@ibox:~ $ host blog.suszko.eu
blog.suszko.eu has address 89.76.240.115
blog.suszko.eu has IPv6 address 2001:470:1f0b:e2c::2

prefereowane będą te w wersji 6-tej – wszystko za sprawą /etc/rc.d/ip6addrctl, które domyślnie jest aktywowane przez /etc/defaults/rc.conf. Jak widać w skrypcie:

ip6addrctl_start()
{
    if ifconfig lo0 inet6 >/dev/null 2>&1 then
    # We have IPv6 support in kernel.

        # install the policy of the address selection algorithm.
        if [ -f /etc/ip6addrctl.conf ]; then
            ip6addrctl flush >/dev/null 2>&1
            ip6addrctl install /etc/ip6addrctl.conf
            checkyesno ip6addrctl_verbose && ip6addrctl
        else
            if checkyesno ipv6_enable; then
                ip6addrctl_prefer_ipv6
            else
                ip6addrctl_prefer_ipv4
            fi
        fi
    fi
}

…możemy utworzyć plik /etc/ip6addrctl.conf o poniższej zawartości i po przeładowaniu skryptu, preferować adresy 32-bitowe, przy aktywnym tunelu IPv6:

# default policy table based on RFC 3484.
# Prefix       Precedence Label

::ffff:0:0/96 50 0
::1/128       40 1
::/0          30 2
2002::/16     20 3
::/96         10 4

A co z pulą do nas przeroutowaną (Routed /64)? – cała jest do naszej dyspozycji, więć śmiało możemy z niej dodawać adresy na interfejsach maszyny, np.:

tlhscd@ibox:~ $ sudo ifconfig re0 inet6 2001:470:1f0b:e2c::1 prefixlen 64 alias

Odpowiedni wpis w /etc/rc.conf:

ifcongig_re0="inet 81.76.240.115 netmask 255.255.252.0"
ifconfig_re0_alias0="inet6 2001:470:1f0b:e2c::1 prefixlen 64"

i proszę:

tlhscd@ibox:~ $ ping6 -c 3 -S 2001:470:1f0b:e2c::1 www.v6.facebook.com
PING6(56=40+8+8 bytes) 2001:470:1f0b:e2c::1 --> 2620:0:1cfe:face:b00c::3
16 bytes from 2620:0:1cfe:face:b00c::3, icmp_seq=0 hlim=47 time=191.561 ms
16 bytes from 2620:0:1cfe:face:b00c::3, icmp_seq=1 hlim=47 time=186.319 ms
16 bytes from 2620:0:1cfe:face:b00c::3, icmp_seq=2 hlim=47 time=186.318 ms

--- www.v6.facebook.com ping6 statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 186.318/188.066/191.561/2.471 ms

 

Jeżeli nasza maszyna jest routerem, to pomijając (…) oczywiste oczywistości jak na przykład przekazywanie pakietów między interfejsami, co jest materiałem na oddzielny artykuł, możemy chcieć uruchomić daemona rtadvd(8), który w naszej (do tej pory lokalnej) sieci będzie rozgłaszał swoją chęć do routowania pakietów IPv6. Dzięki temu, interefejsy urządzeń sieciowych w LAN-ie będą autokonfigurowane. Zakładając, że w maszynie z tunelem IPv6 interfejsem do LAN-u jest em0, to najprostszy /etc/rtadvd.conf będzie wyglądał następująco:

em0:\
    :addrs#1:addr="2001:0470:1f0b:e2c::":prefixlen#64:tc=ether:

Tags: , , ,