Debian, OpenVPN i IPv6
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