Per Tunnel ins IPv6-Internet

Da bei vielen DSL-Anbietern IPv6 ein Fremdwort ist, muss man sich oft mit einem Tunnel behelfen. Die Erweiterung einer IOS-Umgebung (Router und Switch) um IPv6 ist zwar nicht sehr aufwendig, umfasst aber doch etliche Schritte, die ich hier beispielhaft zusammenfasse.
Dabei gehe ich von der folgenden Umgebung aus:

Beispiel-Netzwerk
Beispiel-Netzwerk

Die notwendigen Schritte:

  1. Registrieren eines IPv6-Tunnels bei einem Tunnel-Broker:
  2. Sehr leicht hat man die Einrichtung bei dem (kostenlosen) Anbieter Hurricane Electric: http://tunnelbroker.net/
    Dort muss man sich registrieren und bekommt seine Zugangsdaten per Mail zugesendet. Nachdem man sich angemeldet hat, kann man einen neuen Tunnel konfigurieren:
    tunnelbroker-1
    In dem dann folgenden Dialog wird die eigene IPv4-Adresse eingetragen. Weiterhin wird angegeben, wo der Tunnel im Internet terminiert werden soll. In Deutschland bietet sich evtl. Frankfurt an.
    tunnelbroker-2
    Um den Tunnel einrichten zu können, muss der Router, über den man sich ins Internet verbindet, anpingbar sein! Wenn das gewährleistet ist, kann der Dialog mit “Submit” abgeschlossen werden.
    In der dann folgenden Bestätigung wählt man die “Tunnel Details” aus, wo man sich noch Beispielkonfigurationen für verschiedene Systeme ausgeben lassen kann. Standardmäßig bekommt man ein /64er Netz. Wenn man hinter dem Router noch mehr Infrastruktur hat (wie in diesem Beispiel), muss man noch das “Routed /48” aktivieren:
    Tunnelbroker3

  3. Tunnelkonfiguration auf dem IOS-Router
  4. Die grundsätzliche Router-Konfiguration ist recht simpel und kann als Vorlage von der obigen Webseite generiert werden:

    
    interface Tunnel0
     description Hurricane Electric IPv6 Tunnel Broker
     no ip address
     ipv6 address [die zugewiesene /64-Adresse ]
     ipv6 enable
     tunnel source Dialer0        !!! <<----- 
     tunnel destination [Der ausgewählte Tunnelserver]
     tunnel mode ipv6ip
    end
    !
    ipv6 route ::/0 Tunnel0
    

    Abweichend von der vorgeschlagenen Konfiguration habe ich die “tunnel source” auf das verwendete Dialer-Interface geändert. Damit ist die Konfig unabhängig von der konfigurierten oder dynamisch empfangenen IP-Adresse.

    IPv6 muss auch noch global eingeschaltet werden:

    
    ipv6 unicast-routing
    ipv6 cef
    

    Die Access-Liste auf dem Public-Interface (Dialer0 bei mir) muss wie oben beschrieben anpingbar sein. Das lässt sich auch auf die richtige Source-IP (66.220.2.74) eingrenzen. Weiterhin muss das IP-Protokoll 41 für den Tunnel erlaubt sein:

    
    gw#sh ip access-lists interface Dialer 0 | i 41|icmp
        40 permit icmp any any echo (12 matches)
        50 permit 41 any any (3252 matches)
    
  5. Anpassungen bei der Verwendung dynamischer IP-Adressen
  6. Wenn man eine dynamsiche IP-Adresse hat, dann muss der Tunnel für jede neue IP neu registriert werden. Sehr einfach geht das mit einem EEM-Script von der Cisco EEM Scripting Community (danke an meinen Blogger-Kollegen Jens Link für den Tip):

    ipv6-tunnel-update

    Dieses Script wird heruntergeladen und muss um die eigenen Tunnel-Parameter ergänzt werden:

    set user    "USER_ID"
    set md5pass "MD5-PASSWORD"
    set tid     "TUNNEL-ID"
    

    Die User-ID ist nicht der Login sondern die Zeichenkette, die nach dem Login auf der Tunnelbroker.net-Seite zu sehen ist (32 Stellen).
    Die Tunnel-ID ist die “Global Tunnel ID” aus den Tunnel-Details der Tunnelbroker.net-Seite.
    Das MD5-Password ist das eigene Password, das mit MD5 gehashed wird. Auf dem Mac kann dafür das Programm “md5” verwendet werden, jedes andere anständige Betriebssystem bringt sicher ein entsprechendes Tool mit:

    karstens-macbook-pro:~ karsten$ md5 -s "Mein Password"
    MD5 ("Mein Password") = 4d3b73493102972e8b989fa5b563b150
    karstens-macbook-pro:~ karsten$ 
    

    Dieses Script wird ins Flash des Routers geladen und muss für den Embedded Event-Manager (EEM) aktiviert werden:

    event manager directory user policy "flash:/"
    event manager policy ipv6-tunnel-update.tcl type user
    

    Der erste Befehl gibt an, wo die Scripte liegen, der zweite meldet das gerade hochgeladene Script im System an.
    Als Nächstes steuert man, wann man die Aktualisierung der IP vornehmen möchte. Dafür habe ich das Script so modifiziert, dass es die Syslog-Ausgaben überwacht und immer dann aktiv wird, wenn der Dialer an das Ausgangs-Interface gebunden wird (ich habe nur einen Dialer im System, daher kann ich das recht einfach halten):

    ::cisco::eem::event_register_syslog pattern "%DIALER-6-BIND" priority all
    namespace import ::cisco::eem::*
    namespace import ::cisco::lib::*
    
    set url     "http://ipv4.tunnelbroker.net"
    set php     "ipv4_end.php"
    set ip      "ipv4b=AUTO"
    set user    "USER"
    set md5pass "PASS"
    set tid     "TUNNEL-ID"
    
    append url "/$php?$ip&pass=$md5pass&user_id=$user&tunnel_id=$tid"
    
    after 5000
    
    if {[catch {http::geturl $url -queryblocksize 50 -type "text/plain" } token]} {
      action_syslog priority info msg "http request failed"
    } else {
      action_syslog priority info msg "Response: [http::data $token]"
    }
    
    exit 0
    

    Damit wird die neue IP-Adresse auch bei einem Router-Neustart registriert, was das Original-Script nicht macht.

  7. Konfigurieren der Firewall
  8. Natürlich wird man auch für IPv6 eine Firewall aktivieren. Hier offenbart sich dann leider das Grauen bei Cisco. Zum einen unterstützt die Zone-Based-Firewall kein IPv6, und auch die traditionelle IOS-Firewall (CBAC) unterstützt nur TCP, UDP, ICMP und FTP. Keine weiteren Protokolle und auch keine Erweiterungen, wie das Inspizieren von Router-eigenem Traffic.
    Als erstes wird die FW-Policy angelegt und im Tunnel aktiviert:

    ipv6 inspect name FW tcp
    ipv6 inspect name FW udp
    ipv6 inspect name FW icmp
    ipv6 inspect name FW ftp
    !
    interface Tunnel0
     ipv6 inspect FW out
    

    Als Nächstes muss der eingehende Traffic gefiltert werden. Dabei muss man aufpassen, kein einfaches “deny ipv6 any any” zu konfigurieren, da dann das Neighbor-Discovery nicht mehr funktioniert. So könnte es aber aussehen:

    ipv6 access-list OUTSIDE-IN-v6
     permit icmp any any nd-na
     permit icmp any any nd-ns
     deny ipv6 any any
    !
    interface Tunnel0
     ipv6 traffic-filter OUTSIDE-IN-v6 in
    
  9. Konfigurieren der weiteren Router-Interfaces
  10. Aus dem zugewiesenen /48er Netz wird jedem Netz ein Subnet zugewiesen. Welche Subnet-Adressen man nehmen könnte, habe ich hier schon mal angedeutet. Da alle diese Netze die ersten 48 Bit gemeinsam haben, kann man sich die Konfiguration mit Hilfe der “General-Prefixes” erleichtern. Diese haben einen Namen (hier HE1) und beinhalten die ersten 48 Bit der IP-Adresse.

    ipv6 general-prefix HE1 2001:aaaa:bbbb::/48
    

    Auf den Interfaces kann bei der Konfiguration der IP-Adressen dieser Prefix referenziert werden:

    interface Vlan250
     ipv6 address HE1 ::250:0:0:0:1/64
     ipv6 enable
    

    Mit dieser Konfig kündigt sich der Router automatisch an, und der PC sollte sich mit einer IPv6-Adresse selbst konfigurieren. Die Funktion kann per Ping (“ping6 ipv6.google.com”) oder per Webbrowser (“http://ip6.me”) überprüft werden.

  11. Einbinden des internen Switches
  12. Um auf dem verwendeten Cisco Catalyst 3560 IPv6 konfigurieren zu können, muss der Switch erst vorbereitet werden. Das Default-“Switch Database Management-Template” unterstützt kein IPv6:

    
    c3560(config)#sdm prefer dual-ipv4-and-ipv6 default 

    Je nachdem, was man mit seinem Catalyst alles machen möchte, ist evtl. auch ein anderes Template nötig. Diese sind im Configuration-Guide beschrieben. Dieser Befehl taucht später nicht in der Konfiguration auf, kann aber mit “sh sdm prefer” kontrolliert werden.

    Der Rest der Konfiguration ist dann dem Router sehr ähnlich. IPv6 aktivieren, General-Prefix konfigurieren und Interfaces mit einer IPv6-Adresse versehen:

    
    ipv6 general-prefix HE1 2001:aaaa:bbbb::/48
    ipv6 unicast-routing
    !
    interface Vlan250
     ipv6 address HE1 ::250:0:0:0:2/64
    !
    interface Vlan255
     ipv6 address HE1 ::255:0:0:0:1/64
    

    Der Router muss jetzt natürlich noch die internen Netze lernen und der Switch eine Default-Route bekommen. In einem kleinen Netz reichen dafür ohne weiteres statische Routen, die mit “ipv6 route” anstelle “ip route” konfiguriert werden. Bei Bedarf kann man natürlich auch RIP, OSPF, EIGRP oder IS-IS benutzen.

2 Replies to “Per Tunnel ins IPv6-Internet”

  1. bzgl. ipv6-tunnel-update:
    Ich habe noch einen zweiten Tunnel zu SixXS. Dort ist der IP-Adressupdate wesentlich smarter möglich. In diesem Zusammenhang braucht man den Startup Event, um diese Config zu laden – da fällt das HE-ipv6 startup mit ab und man braucht es nicht explizit zu starten – zwecks Modularität. Allerdings würde ich das Script dank Deines (ich sag mal Du) Tips für einen single HE Broker Setup so erweitern. Btw. der HE Update dauert manchmal etwas lange (reply), da sollte man die default Runtime des EEM Scriptes u.U. etwas erhöhen.

    ciao

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.