Eigenen IPv6-Tunnel bauen

(2008-11-02)

Da alle Tunnelanbieter, die ich bisher probierte (SixXS, tunnelbroker.net, go6.net) entweder langsam waren oder gelegentlich nicht erreichbar (das ist echt nervig, wenn man die Websites, die man am häufigsten besucht, via IPv6 erreicht), habe ich mir meinen eigenen IPv6-Tunnel gebaut. Hier nun die Anleitung, wie das funktioniert:

Mein Setup sieht wie folgt aus:

Prinzip Mit Adressen
IPv6-Tunnel-Prinzip IPv6 mit Adressen

Es gibt also, vereinfacht gesagt, eine virtuelle Maschine und einen Linux-Router, die einen IPv6-Tunnel aufbauen wollen. Die virtuelle Maschine und ihre dom0 laufen auf NetBSD, die Anleitung sollte jedoch mit kleinen Modifikationen auch für Linux gültig sein.

Voraussetzungen/Bezeichnungen

  • Eine IP-Adresse, am besten eine dedizierte, als Endpunkt für den Tunnel.
    IPv4-Endpunkt: 999.11.22.33
  • Zwei /64-Subnetze für den Tunnel, eins als Transfernetz, eins zum benutzen. Effektiv brauchst du also ein eigenes /48.
    IPv6-Transfernetz: 2001:dead:beef:2323::/64
    IPv6-Subnetz: 2001:dead:beef:4242::/64
  • Entweder eine statische IPv4-Adresse auf beiden Seiten oder ein Script, welches die IPv4-Adresse auf der Gegenseite updated.
    Dynamische IPv4-Adresse: 888.11.22.33
  • Auf dem Endpunkt muss natives (oder anderweitig beschafftes) IPv6 vorhanden sein und funktionieren.
  • domU/Tunnelendpunkt: 2001:cafe:babe::1

Tunnelendpunkt konfigurieren

In der domU, wo der Tunnel laufen soll (in der dom0 soll nichts laufen aus Sicherheitsgründen), richten wir ihn folgendermaßen ein:

# ifconfig xennet0 alias 999.11.22.33

# ifconfig gif0 create
# ifconfig gif0 tunnel 999.11.22.33 888.11.22.33
# ifconfig gif0 inet6 2001:dead:beef:2323::1/64

# route add -inet6 2001:dead:beef:4242:: 2001:dead:beef:2323::2

Wenn du Xen benutzt…

Der dom0 müssen wir noch sagen, dass sie Pakete an das Transfernetz und das Subnetz durch die domU schicken soll:

# route add -inet6 2001:dead:beef:2323:: 2001:cafe:babe::1
# route add -inet6 2001:dead:beef:4242:: 2001:cafe:babe::1

Wenn du Linux benutzt…

Es sollte mit folgenden Befehlen gehen (ungetestet):

# ip addr add 999.11.22.33 dev eth0

# ip tunnel add v6 mode sit remote 888.11.22.33 local 999.11.22.33 ttl 255
# ip -6 addr add 2001:dead:beef:2323::1/64 dev v6

# ip -6 route add 2001:dead:beef:4242:: via 2001:dead:beef:2323::2

Wenn du eine dynamische IPv4-Adresse hast…

…brauchst du ein Script, welches folgendes nach einem Wechsel der IP-Adresse macht:

#!/bin/sh
ssh [email protected] 'ifconfig gif0 tunnel 999.11.22.33 $(echo ${SSH_CONNECTION} | cut -d \' \' -f 1)'

(Danke an Raphael für den Tipp mit ${SSH_CONNECTION}.

Tunnel daheim konfigurieren

Nun richten wir den Tunnel zuhause ein:

# ip tunnel add v6 mode sit remote 999.11.22.33 local 888.11.22.33 ttl 255

# ip link set v6 up
# ip -6 addr add 2001:dead:beef:2323::2/64 dev v6
# ip -6 addr add 2001:dead:beef:4242::1/64 dev eth0
# ip -6 route add default via 2001:dead:beef:2323::1 dev v6

Außerdem soll der Linux-Rechner via radvd automatisch Adressen zuweisen, sodass IPv6 out-of-the-box funktioniert:

# emerge radvd
# vi /etc/radvd.conf
interface eth0
{
    AdvSendAdvert on;
    prefix 2001:dead:beef:4242::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
    };
};
# /etc/init.d/radvd start
# rc-update add radvd default

Ab jetzt sollten alle IPv6-fähigen Geräte im Netz eine IPv6-Adresse bekommen haben und können IPv6 benutzen.

Wenn du NAT benutzt

Solltest du NAT benutzen und den Tunnel auf einem Rechner hinter deinem Router einrichten, musst du als Adresse für local statt der externen Adresse (888.11.22.33) deine interne IP-Adresse (zum Beispiel 192.168.1.2) benutzen und auf deinem Router Protocol 41 auf 192.168.1.2 weiterleiten. Auf OpenWRT geht das mit:

iptables -t nat -A prerouting_rule -i ppp0 -p 41 -j DNAT --to 192.168.1.2
iptables -t filter -A forwarding_rule -i ppp0 -p 41 -d 192.168.1.2 -j ACCEPT

Bei vielen kommerziellen (nicht-freien) Routern hast du hier leider ein Problem. Diese haben einfach nicht bedacht, dass man bestimmte Protokolle weiterleiten können wollte. Eventuell klappt es, wenn du den entsprechenden Rechner als DMZ einrichtest.

Packet filter

Auf jedem Router sollte ein Packet filter laufen, sofern dahinter potentiell leicht exploitbare Rechner sind. Für mein Netz trifft das gelegentlich zu, da manchmal andere Menschen komische Fenster-Betriebssysteme mitbringen. Also machen wir lieber mal alles dicht standardmäßig:

# Direkte Verbindungen zum Linux-Router (da laufen auch Dienste):
    # Internes Netz darf auf alles zugreifen
    ip6tables -A INPUT -s 2001:dead:beef:4242::/64 -j ACCEPT
    # Rest ist dicht:
    ip6tables -A INPUT -p tcp -m state --state NEW -j REJECT

# Verbindungen durch das Gateway:
    # Aus dem internen Netz darf alles durch
    ip6tables -A FORWARD -s 2001:dead:beef:4242::/64 -j ACCEPT
    # identd ist freigeschaltet auf der Workstation:
    ip6tables -A FORWARD -d 2001:dead:beef:4242:21d:33ff:fe6f:efe6/128 -p tcp --dport 113 -j ACCEPT
    # Der Rest ist dicht:
    ip6tables -A FORWARD -d 2001:dead:beef:4242::/64 -m state --state new -j REJECT

Fertig

$ traceroute6 noc.sixxs.net
traceroute to noc.sixxs.net (2001:838:1:1:210:dcff:fe20:7c7c) from 2001:dead:beef:4242:21d:33ff:fe6f:efe6, 30 hops max, 16 byte packets
 1  2001:dead:beef:4242::1 (2001:dead:beef:4242::1)  1.74 ms  0.159 ms  0.136 ms
 2  2001:dead:beef:2323::1 (2001:dead:beef:2323::1)  35.483 ms  19.846 ms  24.145 ms
 3  2001:cafe::1 (2001:cafe::1)  52.695 ms  21.539 ms  18.451 ms
 4  2001:4d88:ffff:ffff:2:b341:abbf:1 (2001:4d88:ffff:ffff:2:b341:abbf:1)  21.399 ms  21.041 ms  20.602 ms
 5  2001:4d88::1 (2001:4d88::1)  19.954 ms *  20.723 ms
 6  v-transit-net.r1.fra3.de.opencarrier.eu (2001:7f8:3a:e104::1)  23.621 ms  23.663 ms  23.583 ms
 7  oc-r1-fra3.r1.ams2.nl.opencarrier.eu (2001:7f8:3a:e002::2)  31.535 ms  47.19 ms  70.552 ms
 8  ams-ix2.ipv6.concepts.nl (2001:7f8:1::a501:2871:2)  32.426 ms  34.049 ms  31.618 ms
 9  2001:838:0:14::2 (2001:838:0:14::2)  32.141 ms  138.99 ms *
 10  2001:838:0:10::2 (2001:838:0:10::2)  65.431 ms  72.294 ms  35.185 ms
 11  noc.sixxs.net (2001:838:1:1:210:dcff:fe20:7c7c)  34.476 ms  34.152 ms  66.029 ms

Die einzelnen Hops dabei sind:

  1. Linux-Router
  2. Tunnelendpunkt
  3. dom0
  4. Transfernetz von vollmar
  5. vollmars Netz