ACHTUNG: jetzt läuft lucabert.de nicht mehr unter Virtuozzo! Bitte fragt mich keine weitere Hilfe oder Implementationen des Programms. Jetzt kann ich es nicht mehr machen. Ich habe jetzt eine native IPv6-Anbindung!
Radoslaw Kamil Ejsmont entwickelt mein Projekt weiter. Die aktuellste Version findet ihr auf GitHub.

Seit langer Zeit habe ich mir Gedanken gemacht, weil die Anzahl der IPv4-verfügbaren Adressen immer kleiner wird und war selbstverständlich nicht überrascht, als ich im Februar 2011 gelesen habe, dass die letzte IPv4-Blöcke zugewiesen worden sind.
Da die Deutsche Telekom (mein DSL-Provider für zuhause) immer noch keine native IPv6-Konnektivität geschaltet hat (lieber nicht fragen! Ich habe einen Freund, der bei der Telekom arbeitet, und er hat mir erzählt, wie die Manager die Situation verwaltet haben!), habe ich mich entschieden einen der vielen IPv6-Tunnelprovider zu nutzen.
Nach einer kurzen Zeit bei SixXS (gelassen wegen der langen Wartezeiten und weil sie nicht die E-Mail beantworten und sogar die Tickets und die Forumsbeiträge löschen!) bin ich bei Hurrican Electric gelandet.
10 Minuten nach der Anmeldung hatte ich meinen funktionsfähigen Tunnel und mein /48-Subnet. Weitere 5 Minuten später konnten auch meine Frau und mein Roboter IPv6 verstehen. Eine kleine Firewall mit ip6tables und fertig! Nächster Punkt in meiner Liste: IPv6 auf lucabert.de.

Und nun beginnen die Probleme... lucabert.de ist ein virtueller Server, der auf einem Virtuozzo-Host bei meinem Provider läuft.
Virtuozzo erlaubt keine neue Kernelmodule zu laden und, bei den verfügbaren Modulen, war sit nicht dabei, also ich hatte keine Möglichkeit den Tunnel zu bauen.
Nach einer kurzen Suche bin ich bei diesem Projekt gelandet.
Ein Test hat ergeben, dass das Programm funktioniert und ich habe begonnen die Firewall zu schreiben. Und nun kam das zweite Problem: bei den verfügbaren Modulen auf dem vServer waren die ip6tables-Module nicht dabei und mein Provider will sie nicht installieren, bevor er mir eine native IPv6-Anbindung gibt (sie sagen irgendwann dieses Jahr)...
Und so kann ich die Firewall vergessen. Nach einer Woche, in der ich eine alternative Lösung gesucht habe, habe ich entschieden, selber eine alternative Lösung zu schreiben. Ein E-Mail-Tausch mit dem Autor von TB-TUN hat mir bestätigt, dass sein Programm unter GPL2 verbreitet ist, also darf ich es für meine Zwecke anpassen.
Da alle IPv6-Pakete über dem Tunnel laufen, sollte es möglich sein, eine Filtrierung zu implementieren, so habe ich gedacht.
Die Sache war leider etwas komplexer als ich dachte, aber mit einigen Hilfen von Newsgroup und Wikipedia habe ich es geschafft! Selbstverständlich ist mein System hier unter GPL2 verbreitet und besteht aus drei Programmen: ustun für die Verwaltung der Tunnel, us6tables um die Firewall einzurichten (mit der gleichen Syntax von ip6tables) und usctrl um Informationen über das System im laufendem Betrieb sehen zu können. Alle diese Programme nutzen SharedMemory um miteinander zu kommunizieren.
Das ganze wird mit einem pre-up Skript in /etc/network/interfaces (auf Debian/Ubuntu) gestartet und funktioniert einwandfrei!
Das einzige Problem ist, dass Virtuozzo diese Datei bei jedem Reboot des vServer neuschreibt, und alle Änderungen gehen verloren.
Laut Dokumentation, sollte ich das ganze in /etc/network/interfaces.template schreiben, aber ein Test mit Reboot hat mir den vServer blockiert und ich musste ihn im Rettungsmodus neustarten.
Am Ende habe ich ein kleines Skript in /etc/rc.local geschrieben, so dass bei dem Boot die Datei /etc/network/interfaces automatisch generiert wird.

Das Skript sieht so aus:
/bin/cat /etc/network/interfaces /etc/network/myinterfaces > /etc/network/interfaces.1 && \
    /bin/mv /etc/network/interfaces.1 /etc/network/interfaces
/sbin/ifup he-ip6
Die Konfiguration der IPv6-Schnittstelle ist wie folgendermaßen:
auto he-ip6
iface he-ip6 inet6 static
# Hauptadresse
        address    xxxx:yyyy:zzzz:kkkk::1
        netmask    64
        pre-up     /usr/local/sbin/ustun -n he-ip6 -r <IP des Tunnelbetreibers> -l <IP des vServers> -m tunnelbroker
# Eventuelle andere IPs
        post-up    /sbin/ip -6 addr add xxxx:yyyy:zzzz:kkkk::2/64 dev he-ip6
        pre-down   /sbin/ip -6 addr del xxxx:yyyy:zzzz:kkkk::2/64 dev he-ip6
# Routes
        post-up    /sbin/ip route add ::/0 dev he-ip6
        post-up    /etc/rc.ipv6
        post-down  /usr/local/sbin/usctrl -q
        mtu        1480
Wenn man sudo usctrl -i startet, bekommt man diese Informationen:
TUN name is he-ip6
TUN mode is tunnelbroker
IPv4 SOCK_RAW created: 5
Bind local IPv4 address: <IP des vServers>
Using remote IPv4: <IP des Tunnelbetreibers>
Verbose level set to 0
Ein Beispiel für eine Firewall ist:
/usr/local/sbin/us6tables -P INPUT ACCEPT
/usr/local/sbin/us6tables -F INPUT
/usr/local/sbin/us6tables -F OUTPUT

/usr/local/sbin/us6tables -A INPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -j ACCEPT -m comment --comment "PING-Anfragen erlauben"
/usr/local/sbin/us6tables -A INPUT -p ipv6-icmp --icmpv6-type 129 -j ACCEPT -m comment --comment "PING-Antworten erlauben"
/usr/local/sbin/us6tables -A INPUT -p tcp -m multiport --dports smtp,smtps,submission -m comment --comment "SMTP+SMTPs und Submission erlauben" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -p tcp -m multiport --dports www,https -m comment --comment "HTTP+HTTPs erlauben" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -p tcp -m multiport --dports pop3,pop3s -m comment --comment "POP3+POP3s erlauben" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -p tcp --dport domain -m comment --comment "DNS erlauben" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -p udp --dport domain -m comment --comment "DNS erlauben" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -s xyzk:zkxy:kyzx::/48 -m comment --comment "Alles von meinem Hausnetz erlauben" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -j LOG --log-prefix IPv6 --log-level 7 -m comment --comment "Der Rest wird auf syslog geloggt"
/usr/local/sbin/us6tables -P INPUT DROP
Und nun ist auch lucabert.de für den world IPv6 day am nächsten 8. Juni vorbereitet...
ATTENTION: now runs lucabert.de no more under Virtuozzo! Please do not ask me for further implementation of this program. Now I can't to that anymore. I use now a native IPv6-connection.
Radoslaw Kamil Ejsmont started a new branch of my project. The current version could be found on GitHub.

For a long time I observed how fast the number of IPv4 address reduced and, in februar 2001 as I read that the last blocks was assigned I wasn't surprised.
Since Deutsche Telekom (my provider for DSL at home) does not supply a IPv6 connectivity yet I decided that I can use an IPv6-Tunnel. After a short time by SixXS (abandoned because they don't answer to E-Mail and actualy they delete the tickets and the entry in the forum!), I discovered Hurrican Electric.
10 minutes after the registration I had my Tunnel working and my /48 subnet active. Other 5 minutes and the PC of my wife and my Robot used IPv6, too. A little Firewall with ip6tables and go. Next item in my list: IPv6 on lucabert.de.

And now come the problems... lucabert.de is a virtual Server on a Virtuozzo Host by my Provider.
Virtuozzo doesn't allow to load new Kernel modules and, in the given modules, there was not sit, the module used to create the Tunnel.
After a short search I found this project.
A very fast test and I decided that it can work, then I began to write the Firewall. And now the second problem: in the (very few) modules available on my vServer there were not the ones to manage ip6tables and my Provider didn't want to enable them, at least as long as they don't supply IPv6 (maybe sometime this year)...
So can I forgot my Firewal. After a week searching for another solution, I decided that I can write my own solution. I asked the author of TB-TUN and, since it was distributed under GPL2, I can modify it. Since all Bits of the IPv6 packets will go through this program, so I thought, it must be possible to filter them.
It was a little bit more difficult as I expected, but with some help from Newsgroup and Wikipedia, I got it! My system, of course, if available here under GPL2 and it supply three programs: ustun for the management of the Tunnel (the UserSpace module), us6tables, which use the same syntax of ip6tables and will be used to manage the Firewall, and usctrl to get some realtime information about the program and the actual connection, and to terminate the Tunnel. All these programs communicate using SharedMemory.
I can start the Tunnel with a pre-up script in /etc/network/interfaces (on Debian/Ubuntu) and works perfectly!
I have just a little problem, too, because Virtuozzo, by booting the vServer, rewrite the file /etc/network/interfaces, so all changes will be lost. The documentation says, that I have to write my changes in /etc/network/interfaces.template, but after a reboot the vServer couldn't be started and I must use the recovery mode.
Finally I decided to wait to have my IPv4 connection working before starting the module, and I wrote a little script in /etc/rc.local that modify /etc/network/interfaces adding the code for the Tunnel.

Here an example of the configuration of the IPv6 interface:
auto he-ip6
iface he-ip6 inet6 static
# Main address
        address    xxxx:yyyy:zzzz:kkkk::1
        netmask    64
        pre-up     /usr/local/sbin/ustun -n he-ip6 -r <IP of the Tunnel provider> -l <IP of the vServer> -m tunnelbroker
# Optionally other IPs...
        post-up    /sbin/ip -6 addr add xxxx:yyyy:zzzz:kkkk::2/64 dev he-ip6
        pre-down   /sbin/ip -6 addr del xxxx:yyyy:zzzz:kkkk::2/64 dev he-ip6
# Routes
        post-up    /sbin/ip route add ::/0 dev he-ip6
        post-up    /etc/rc.ipv6
        post-down  /usr/local/sbin/usctrl -q
        mtu        1480
If I start sudo usctrl -i I get these information:
TUN name is he-ip6
TUN mode is tunnelbroker
IPv4 SOCK_RAW created: 5
Bind local IPv4 address: <IP of the vServer>
Using remote IPv4: <IP of the Tunnel provider>
Verbose level set to 0
An example of the Firewall is:
/usr/local/sbin/us6tables -P INPUT ACCEPT
/usr/local/sbin/us6tables -F INPUT
/usr/local/sbin/us6tables -F OUTPUT

/usr/local/sbin/us6tables -A INPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -j ACCEPT -m comment --comment "Accept the PING queries"
/usr/local/sbin/us6tables -A INPUT -p ipv6-icmp --icmpv6-type 129 -j ACCEPT -m comment --comment "Accept the PING answers"
/usr/local/sbin/us6tables -A INPUT -p tcp -m multiport --dports smtp,smtps,submission -m comment --comment "Accept SMTP+SMTPs and Submission" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -p tcp -m multiport --dports www,https -m comment --comment "Accept HTTP+HTTPs" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -p tcp -m multiport --dports pop3,pop3s -m comment --comment "Accept POP3+POP3s" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -p tcp --dport domain -m comment --comment "Accept DNS" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -p udp --dport domain -m comment --comment "Accept DNS" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -s xyzk:zkxy:kyzx::/48 -m comment --comment "Accept all from my home subnet" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -j LOG --log-prefix IPv6 --log-level 7 -m comment --comment "Log the rest on syslog"
/usr/local/sbin/us6tables -P INPUT DROP
And now lucabert.de, too, is ready for the world IPv6 day next 8 june...
ATTENZIONE: adesso lucabert.de non gira più sotto Virtuozzo! Non chiedetemi altre notizie o implementazioni di questo programma che oramai non lo posso più fare! Ora ho una connessione IPv6 nativa!
Radoslaw Kamil Ejsmont ha deciso di proseguire lo sviluppo di questo progetto. La versione aggiornata si trova su GitHub.

Da tempo mi preoccupavo della penuria di indirizzi IP e, ovviamente, a febbraio 2011 ho letto con ben poca sorpresa la notizia che gli ultimi blocchi erano stati assegnati.
Visto che Deutsche Telekom (il mio provider per la DSL a casa) ancora non si decide a fornire una connettività con IPv6 (meglio non chiedere! Ho un amico che lavora in Telekom e mi ha raccontato cose assurde con Manager incapaci che ritengono che, per risparmiare qualche soldino ora, sia meglio aspettare il tracollo e spendere milioni dopo), ho deciso di usare uno dei tanti Tunnel IPv6. Dopo un breve periodo presso SixXS (lasciato sia per i tempi di attesa biblici, sia perchè non rispondono assolutamente alle E-Mail, arrivando a cancellare i Ticket aperti e i messaggi nel forum) sono approdato a Hurrican Electric.
10 minuti dopo la registrazione avevo il mio Tunnel e la mia sottorete /48 attiva. Altri 5 minuti dopo anche mia moglie e il mio Robot parlavano IPv6. Un piccolo Firewall con ip6tables e via che si va. Prossimo punto della lista: IPv6 su lucabert.de.

E qui cominciano i problemi... lucabert.de è un Server virtuale che gira su Virtuozzo dal mio Provider.
Virtuozzo non consente di caricare nuovi moduli per il Kernel e, tra quelli già caricati, non c'è sit, ovvero il modulo necessario per creare il Tunnel.
Una breve ricerca mi ha portato a questo progetto.
Dopo una breve prova, mi sono convinto che la cosa poteva funzionare e mi appresto quindi a scrivere il Firewall. Ed ecco il secondo problema: tra i (pochi) moduli disponibili sul mio vServer non ci sono quelli per gestire ip6tables e il Provider, ad una mia richiesta, ha detto di non avere intenzione di installarli prima di avere tutto pronto per offrire la connettività su IPv6 (dicono quest'anno)...
E quindi mi posso scordare il Firewall. Dopo una settimana spesa a cercare soluzioni alternative, ho deciso che, come per tante altre cose, una soluzione alternativa dovevo farmela io. Un breve scambio di E-Mail con l'autore di TB-TUN mi ha confermato che il programma è rilasciato sotto GPL2, quindi posso modificarlo a mio piacimento. Visto che da quel programma passano tutti i Bits che compongono i pacchetti IPv6, mi sono detto, dovrebbe essere possibile implementare dei filtri.
La cosa è stata più semplice a dirsi che non a farsi, ma con qualche aiuto dai Newsgroup e da Wikipedia sono riuscito nell'impresa! Il mio sistema, ovviamente, è disponibile qui sotto GPL2 e si compone di tre programmi separati: ustun per la gestione del Tunnel (è il modulo in UserSpace), us6tables, che usa la stessa sintassi di ip6tables e viene usato per la gestione del Firewall e usctrl per avere in tempo reale informazioni sullo stato di salute del modulo e delle connessioni eventualmente pendenti, nonchè per poter terminare il Tunnel. Tutti questi programmi comunicano tra di loro via SharedMemory.
Il tutto viene lanciato con un pre-up script in /etc/network/interfaces (su Debian/Ubuntu) e funziona alla perfezione!
L'unico problema è che Virtuozzo riscrive, all'avvio del vServer, il file /etc/network/interfaces, quindi le modifiche sarebbero andate perse. Secondo la documentazione, avrei dovuto scrivere il tutto in /etc/network/interfaces.template, ma una prova di reboot mi ha fatto capire che le cose non stanno proprio così, bloccandomi la macchina e costringendomi ad un riavvio in modalità di ripristino.
Alla fine, visto che devo aspettare di avere la connessione IPv4 funzionante prima di lanciare il modulo, mi sono fatto un breve script lanciato da /etc/rc.local che mi modifica /etc/network/interfaces aggiungendomi il tunnel.

Lo script è questo:
/bin/cat /etc/network/interfaces /etc/network/myinterfaces > /etc/network/interfaces.1 && \
    /bin/mv /etc/network/interfaces.1 /etc/network/interfaces
/sbin/ifup he-ip6
La configurazione dell'interfaccia di rete IPv6 è quindi simile a questa:
auto he-ip6
iface he-ip6 inet6 static
# Indirizzo principale
        address    xxxx:yyyy:zzzz:kkkk::1
        netmask    64
        pre-up     /usr/local/sbin/ustun -n he-ip6 -r <IP del fornitore del Tunnel> -l <IP del vServer> -m tunnelbroker
# Eventuali altri IPs
        post-up    /sbin/ip -6 addr add xxxx:yyyy:zzzz:kkkk::2/64 dev he-ip6
        pre-down   /sbin/ip -6 addr del xxxx:yyyy:zzzz:kkkk::2/64 dev he-ip6
# Routes
        post-up    /sbin/ip route add ::/0 dev he-ip6
        post-up    /etc/rc.ipv6
        post-down  /usr/local/sbin/usctrl -q
        mtu        1480
Lanciando sudo usctrl -i ottengo queste informazioni:
TUN name is he-ip6
TUN mode is tunnelbroker
IPv4 SOCK_RAW created: 5
Bind local IPv4 address: <IP del vServer>
Using remote IPv4: <IP del fornitore del Tunnel>
Verbose level set to 0
Un semplice esempio di Firewall è questo:
/usr/local/sbin/us6tables -P INPUT ACCEPT
/usr/local/sbin/us6tables -F INPUT
/usr/local/sbin/us6tables -F OUTPUT

/usr/local/sbin/us6tables -A INPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -j ACCEPT -m comment --comment "Accetta le richieste di PING"
/usr/local/sbin/us6tables -A INPUT -p ipv6-icmp --icmpv6-type 129 -j ACCEPT -m comment --comment "Accetta le risposte ai PING"
/usr/local/sbin/us6tables -A INPUT -p tcp -m multiport --dports smtp,smtps,submission -m comment --comment "Accetta SMTP+SMTPs e Submission" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -p tcp -m multiport --dports www,https -m comment --comment "Accetta HTTP+HTTPs" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -p tcp -m multiport --dports pop3,pop3s -m comment --comment "Accetta POP3+POP3s" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -p tcp --dport domain -m comment --comment "Accetta DNS" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -p udp --dport domain -m comment --comment "Accetta DNS" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -s xyzk:zkxy:kyzx::/48 -m comment --comment "Accetta tutto dalla mia rete di casa" -j ACCEPT
/usr/local/sbin/us6tables -A INPUT -j LOG --log-prefix IPv6 --log-level 7 -m comment --comment "Logga tutto il resto su syslog"
/usr/local/sbin/us6tables -P INPUT DROP
E ora anche lucabert.de è pronto per il world IPv6 day del prossimo 8 giugno...