Content from 2016-05

VDSL von der Telekom mit IPv6 und Debian

posted on

IPv6 is the new normal

Meine letzten IPv6-Tunnel werden langsam überflüssig. Seit letzter Woche haben wir auch im Büro natives IPv6. Die Telekom hat uns auf einen NGN-Anschluss umgestellt.

Setup

IPv6 aktivieren

Kurz zusammengefasst

Für den IPv6-Zugang muss der pppd IPv6 auf der PPP-Verbindung aktivieren. Die Telekom benutzt dann Router-Advertisements (radv) um dem ppp0-Device eine IPv6-Adresse zu geben. Soll IPv6 im LAN weiterverteilt werden, bekommen wir Präfixe hierfür über Präfix-Delegation per DHCPv6. Letzteres kann aber nicht als Ersatz für die Router-Advertisements genutzt werden, da die Telekom nur Präfixdelegation darüber macht.

pppd konfigurieren

Nachdem der IPv4-Internetzugang konfiguriert ist muss nur noch IPv6 im pppd aktiviert werden. Hierzu muss an das Ende von /etc/ppp/options eine Zeile +ipv6 eingefügt werden.

echo "+ipv6" >> /etc/ppp/options

poff
pon dsl-provider

Das ppp0-Device sollte jetzt eine link local IPv6-Adresse haben (fe80:…). Wir können das mit ifconfig ppp0 kontrollieren.

IPv6-Adresse per Router Advertisement (radv) erhalten

Wir benutzen das Linux-System als Router. Wenn wir das Routing von IPv6-Traffic einschalten bezieht Linux seine IPv6-Adressen normalerweise nicht mehr automatisch. Über den Config-Wert 2 für die Einstellung accept_ra lässt sich dies jedoch überschreiben:

echo net.ipv6.conf.all.forwarding = 1 > /etc/sysctl.d/01-ipv6-forward.conf
echo net.ipv6.conf.ppp0.accept_ra = 2 >> /etc/sysctl.d/01-ipv6-forward.conf

echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
echo 2 > /proc/sys/net/ipv6/conf/ppp0/accept_ra

Wir müssen jetzt gegebenfalls auf das nächste Router Advertisement der Telekom warten. Dies kommt nur alle fünf Minuten. Haben wir diese Gedult nicht, können wir mit poff und pon dsl-provider uns nochmals neu einwählen. Danach sollte unser Interface ppp0 auch eine öffentliche IPv6-Adresse haben (2003:…).

Präfixe für die Subnetzs von DHCPv6

Als DHCPv6-Client habe ich dibbler-client und wide-dhcpv6-client ausprobiert letzterer war in der Lage deutlich schneller zu starten und zu stoppen, so dass ich mich für die WIDE-Implementierung des DHCPv6-Clients entschieden habe:

apt update
apt install wide-dhcpv6-client

Folgende Konfiguration habe ich als /etc/wide-dhcpv6/dhcp6c.conf angelegt:

interface ppp0 {
        send ia-pd 0;
};

id-assoc pd 0 {
        prefix-interface eth1 {
                sla-len 8;
                sla-id 1;
        };
        prefix-interface eth2 {
                sla-len 8;
                sla-id 2;
        };
};

Mit dieser Konfiguration wird ein Präfix über das Interface ppp0 vom DHCPv6-Server der Telekom angefordert. Dieses Präfix wird dann benutzt um Subnetze für eth1 und eth2 abzuleiten. Hierzu wird das von der Telekom erhaltene Präfix um 0001 verlängert für eth1 (sla-id 1) und entsprechend um 0002 für eth2.

Abschließend muss der wide-dhcpv6-client noch über die Datei /etc/default/wide-dhcpv6-client für das Interface ppp0 aktiviert werden:

# Defaults for dhcpv6 client initscript
# Used by /etc/init.d/wide-dhcpv6-client

# Interfaces on which the client should send DHCPv6 requests and listen to
# answers. If empty, the client is deactivated.
INTERFACES="ppp0"
service wide-dhcpv6-client restart

Jetzt sollten auch unsere Netzwerkinterfaces eth1 und eth2 IPv6-Adressen (und zugehörige Subnetze /64) erhalten haben.

Den Rechnern im LAN eine IPv6-Adresse zuweisen

(Genauer: Den Rechnern im LAN ihr Präfix mitteilen, so dass diese sich eine IPv6-Adresse geben können.)

Wir müssen auf dem Linux-Router hierzu selbst Router Advertisements auf unseren LANs verschicken. Dies geschieht mit dem Router Advertisement Daemon radvd:

apt install radvd

Für diesen Dämon legen wir die Konfigurationsdatei /etc/radvd.conf an:

interface eth1
{
        AdvSendAdvert on;
        prefix ::/64
        {
                AdvOnLink on;
                AdvAutonomous on;
                AdvRouterAddr on;
        };

        RDNSS 2001:4860:4860::8888  2001:4860:4860::8844
        {
        };
};

interface eth2
{
        AdvSendAdvert on;
        prefix ::/64
        {
                AdvOnLink on;
                AdvAutonomous on;
                AdvRouterAddr on;
        };

        RDNSS 2001:4860:4860::8888  2001:4860:4860::8844
        {
        };
};

Das Präfix ::/64 in dieser Konfiguration ist ein spezieller Wert. Der radvd benutzt für die Advertisements die auf dem jeweiligen Interface konfigurierten IPv6-Adressen um den Präfix selbst zu erreichnen. Die IPv6-Adresse hat uns im vorherigen Schritt der DHCPv6-Client automatisch gesetzt.

Der radvd muss noch mit der neuen Konfiguration aktiviert werden:

service radvd restart

Rechner im LAN vor eingehenden Verbindungen schützen (optional)

Wer es wirklich will und NAT bisher als Schutz seiner Rechner angesehen hat, kann über ip6tables noch einrichten, dass auch über IPv6 nur Verbindungen vom LAN ins Internet aufgebaut werden. TCP-Verbindungen aus dem Internet ins LAN werden damit abgewiesen. Hier die Datei /etc/init.d/ipv6-firewall anlegen:

#!/bin/sh
# kFreeBSD do not accept scripts as interpreters, using #!/bin/sh and sourcing.
if [ true != "$INIT_D_SCRIPT_SOURCED" ] ; then
    set "$0" "$@"; INIT_D_SCRIPT_SOURCED=true . /lib/init/init-d-script
fi
### BEGIN INIT INFO
# Provides:          ipv6-firewall
# Required-Start:    $network $remote_fs $syslog
# Required-Stop:     $network $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starting IPv6 firewall
# Description:       This are some firewalling rules for our
#                    IPv6 connection to the internet.
### END INIT INFO

DESC="Starting IPv6 firewall"


case "$1" in
  start)
     /sbin/ip6tables -A FORWARD -m state --state NEW -i eth1 -o ppp0 -j ACCEPT
     /sbin/ip6tables -A FORWARD -m state --state NEW -i eth2 -o ppp0 -j ACCEPT
     /sbin/ip6tables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
     /sbin/ip6tables -A FORWARD -p tcp -j REJECT

     /sbin/ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
     /sbin/ip6tables -A INPUT -p tcp -j REJECT
     ;;
  stop)
     /sbin/ip6tables -F INPUT
     /sbin/ip6tables -F OUTPUT
     /sbin/ip6tables -F FORWARD
     ;;
  force-reload|restart)
     $0 stop
     $0 start
     ;;
  *)
     echo "Usage: /etc/init.d/ipv6-firewall {start|stop|restart}"
     exit 1
esac

exit 0

Dieses Skript installieren und aktivieren:

update-rc.d ipv6-firewall enable
service ipv6-firewall start

Das war's … die lokalen Netze haben jetzt IPv6-Zugang.

Worin ich mich 2016 verbessere: Clojure und Softwaretests

posted on

Mein einer Vorsatz für dieses Jahr ist es die Philosophie von Clojure zu denken. Seit 2011 spiele ich mit Lisp und 2014 hatte ich meinen ersten Kontakt zu Clojure, einem der Dialekte von Lisp. Der andere ist, ich möchte meine Erfahrungen mit Softwaretests ausbauen. Bisher hatte ich vor allem an meinen Fähigkeiten mit Unit-Tests gearbeitet und hierfür meinen Stil gefunden. Jetzt will ich automatische Integrationstests in mein Standardrepertoire von Entwicklungstechniken aufnehmen.

Jetzt im Mai?

Du kennst es bestimmt: an Silvester hast du gute Vorsätze für das neue Jahr und ab Neujahr ist es schwer diese einzuhalten. Die letzten Jahre bin ich gut damit gefahren mir nichts konkretes vorzunehmen, stattdessen ist mein Ziel etwas neues zu erreichen. Das heißt Anfang des Jahres bin ich noch auf der Suche was in diesem Moment das richtige für mich ist. Ich probiere verschiedene Dinge und experimentiere damit. Merke ich, dass es nicht das richtige ist, so muss ich nicht mit meinem Vorsatz brechen, sondern mache mich auf die Suche nach etwas anderem.

Für dieses Jahr bin mir inzwischen sicher, dass ein großes Thema für mich ist, dass ich in den beiden genannten Gebieten mehr Erfahrung sammeln will.

Lisp/Clojure

Web Deelopment with Clojure

Funktionale Programmierung fasziniert mich seitdem ich im ersten Semester an der TUM davon gehört habe. Auch wenn mein täglicher Berufsalltag objektorientiert ist, schreibe ich in diesem Rahmen funktional: Seiteneffekte wo nicht nötig vermeiden, bevorzugt verwende ich unveränderliche Value-Objekte und genieße wie ich in Java8 mit Streams ausdrücken kann was ich mit Daten machen möchte und nicht sagen muss, wie das geschehen soll.

Zu kämpfen habe ich noch damit herauszufinden wie ich ohne Klassen meine Programme auf höherer Ebene möglichst sauber strukturiere. Ich merke den Vorsprung, den die objektorientierte Denkweise in meinem Kopf hat: was ich in Java schreibe hat einfach noch die schönere Globalstruktur, es gelingt mir besser zusammen zu halten was zusammen gehört („high cohesion“) und getrennte Konzepte getrennt zu halten („loose coupling“). Ich denke, es liegt daran, dass ich schon deutlich mehr gute Beispiele für OOP als für funktionale Programme gesehen habe.

Clojure Applied

Vorwärts gebracht haben mich hier dieses Jahr bisher vorallem die Bücher Web Development with Clojure von Dmitri Sotnikov und Michael Swaine am Beispiel von Webanwendungen und Clojure Applied von Alex Miller und Ben Vandgrift für allgemeine Clojure-Programme. Nun muss ich in der Praxis probieren was ich gelesen habe. Hierzu schreibe ich ein Tool das ich brauche gerade als Clojure-Webanwendung. Mal schauen wie ich mit dem Ergebnis zufrieden sein werde …

Service- und Akzeptanztests

Nachdem ich meine Muster für Unittests mit jUnit, Hamcrest und Mockito gefunden habe arbeite ich jetzt daran die richtigen Werkzeuge und Muster für Tests auf höherer Ebene zu finden. Schon vor einiger Zeit hatte ich mit Fit einige Versuche unternommen. Inzwischen ist dieses Werkzeug Teil von FitNesse geworden. Tests werden hierbei in HTML-Dateien geschrieben. Diese können wahlweise zum Beispiel auch in Word oder einem Wiki erstellt werden. „Richtig“ fühlt sich das für mich bisher aber nicht an. Seit ein paar Monaten experimentiere ich stattdessen mit Cucumber. Die Tests werden dabei in (einigermaßen) natürlicher Sprache geschrieben und in einem Textdokument abgelegt. Für mich als Entwickler fühlt sich das sehr viel besser an.

In Fit wird damit argumentiert, dass ein Kunde/Auftraggeber besser in der Lage sei eine Spezifikation zu editieren, wenn er dies in seiner gewohnten Textverarbeitung tun kann. Ich denke aber, dass es immer ein Wunsch bleiben wird, dass man als Entwicklungsteam eine fertige Spezifikation erhält. Es ist wichtiger ein Tool in der Hand zu haben, das es mir ermöglicht mit dem Kunden/Auftraggeber zusammen dies zu erarbeiten. Das ist aber genauso in einem Texteditor möglich. Wichtig ist vielmehr, dass der Kunde ein Verständnis dafür hat, was niedergeschrieben wird. Hierfür eigent sich Gherkin, die Sprache von Cucumber, ausgezeichnet: die Spezifikation kann er als normalen Text lesen.


Unless otherwise credited all material Creative Commons License by Matthias Wimmer