Podczas świątecznej nudy zdecydowałem wreszcie dodać IPv6 do mojego VPSa, + do geek karma i w końcu World IPv6 day się zbliża ;]. Żeby strona widoczna była przez IPv6 w sumie wiele nie trzeba,”wystarczy” adres i odpowiedni wpis do DNS.

Niestety niewiele hostingów (w tym mój VPS na linode.com) obsługuje natywnie IPv6 więc żeby mieć IPv6 trzeba sie gdzieś tunelować. Na szczęście sam serwer DNS w linode obsługiwał wpisy AAAA (mimo że same serwery ipv4 only) więc tu nie miałem problemu.

Zdecydowałem się na tunel przez Hurricane Electric

Tunnelbroker; config jest banalnie prosty, po zarejestrowaniu tunelu wystarczy na stronie wygenerować parę komend do wybranego OSa (wliczająć parę OSów routerowych), właściwie jedyne o czym trzeba pamiętać to to że firewall obsługuje ip6tables więc trzeba “zdublować” regułki IPv4 żeby być zabezpieczonym.

Sam Tunnelbroker jest świetny ping do google po IPv4 wynosi około 23-24ms a IPv6 25-26ms. Na starcie dostajemy /64 czyli 2**32 razy więcej IPków niż ma cały istniejący internet ;]. Można też wziąć /48 jakby ktoś (lol) potrzebował. Oraz jest darmowy ;].

Zapomniałbym o jeszcze jednej rzeczy, mianowicie serwerze DNS, niestety nie wszystkie DNS proxy ISP obsługują rekordy AAAA, ja użyłem 74.82.42.42 od tunnelbrokera. Jest potrzebne żeby ping6 google.com działał ;]

I tu bym zakończył gdyby nie to że właściwie nie miałem jak testować IPv6.Widziałem rozwiązania aktualizujące IPek w tunnelbrokerze a’la DynDNS ale nie działało to z NATem, jest toredo ale na devrandom miałem już postawionego OpenVPN

Próbowałem po prostu zmienić linijkę ifconfig w configu OpenVPN ale to nie do końca było supportowane (czytaj: ni chuja nie działało) więc musiałem to obejść. Device TUN/TAP którego używa OpenVPN są “zwykłymi” interfejsami tyle że podłączone do userspace a nie do sieciówki/wifi/whatever więc wystarczy

ip -6 addr add 2001:470:abcd:abcd:dcba::1/80 dev tunX

po stronie serwera i

ip -6 addr add 2001:470:abcd:abcd:dcba::2/80 dev tunX
ip -6 route add default via 2001:470:abcd:abcd:dcba::1

po stronie klienta. Ofc najpierw trzeba mieć działający tunel OpenVPN IPv4 ale tutoriali od tego jest sporo :). A po tym możemy się przechwalać że nasz stunelowany laptop ma więcej IPków niż 65535 internetów. Trzeba tylko pamiętać o wspomnianym wcześniej serwerze DNS bo inaczej z klienta nigdzie się nie podłączymy. Po wspomnianej konfiguracji np. update Debiana leci mi po IPv6 ;].

Ofc po dodaniu kolejnego tunelu znudziło mi się klepanie ręczne to oskrypciłem sobie to:

#!/usr/bin/perl
# including trailing ':'
my $prefix = '2001:470:1f08:163d:dead::';
my $netmask = '80';
my $action = $ENV{'script_type'};
my $ipv4_local_ip = $ENV{'ifconfig_local'};
my $ipv4_remote_ip = $ENV{'ifconfig_remote'};
my $dev = $ENV{'dev'};

if ($action =~ /up/) {
    my $ipv6_local = get_ipv6_ip($ipv4_local_ip) . '/' . $netmask;
    print "Adding $ipv6_local to $dev\n";
    system("ip -6 addr add $ipv6_local dev $dev");
    if ($ENV{'proto_1'} =~ /client/) {
        my $ipv6_gateway = get_ipv6_ip($ipv4_remote_ip);
        print "Adding gateway via $ipv6_gateway\n";
        system("ip -6 route add default via $ipv6_gateway");
        }
}

sub get_ipv6_ip() {
    my $ipv4_ip = shift;
    my ($b1, $b2, $b3, $b4) = split(/\./,$ipv4_ip);
    return $prefix . sprintf("%x", $b3) . ':' . sprintf("%x", $b4);
}

Wtedy wystarczy ustawić prefix poprawnie i dodać:

script-security 3
up /usr/local/bin/add_ipv6

do swojego configa OpenVPN po obu stronach i voila, automatyczne tunelowanie. Skrypt bierze adres z prefixu + 2 ostatnich cyfr ipv6 IP, w formacie $prefix + 00$3rd_octet:00$4th_octet i ustawia bramę na remote hosta jeżeli jest klientem