carsten’s blog

Natives IPv6 auf einem M-Net DSL Anschluss

by on Mar.17, 2011, under SLE

Bei M-Net läuft bereits seit geraumer Zeit ein IPv6 Testbetrieb an
dem man freiwillig teilnehmen kann. Support gibt es dafür allerdings
bisher nicht. Hilfe findet man allerdings im Forum.

Ich selbst habe einen Linux Router mit SLES 11 SP1 an dem ein
Standard DSL Modem hängt. Die Einwahl erfolgt mittels pppd und
pppoe und wurde initial über yast konfiguriert. In dem Router
befinden sich mehrere Netzwerkschnittstellen (eth0 – eth5) wovon ich mittels
Bridge Konfiguration eth0 – eth4 zu einem Interface br0 zusammengefasst habe.
Das DSL Modem selbst hängt an eth5. Bei der Einwahl über ppp wird dsl0 erzeugt.

Für die Nutzung von IPv6 über den ppp0 Link sind einige Anpassungen
am System nötig.

  • Loginname anpassen
  • Installation von wide-dhcpv6 und radvd

Der erste Punkt ist sehr einfach umzusetzen, dazu wird
in der Datei /etc/sysconfig/network/provides/provider0
in der Zeile USERNAME der Teil nach dem ‘@’ Symbol mit
“v6.mnet-online.de” ersetzt und in der Datei /etc/ppp/peers/pppoe diese Zeileangehängt.

+ipv6 ipv6cp-use-ipaddr

Der zweite Teil ist auf SLES11 etwas problematischer gewesen,
da es kein wide-dhcpv6 Paket gab. Das Standard dhcpv6 Paket
funktioniert leider nicht, es ist zwar von der Konfiguration
her ähnlich hat aber nicht den Umfang den wide-dhcpv6 bereit
stellt.

Ich habe daher ein eigenes wide-dhcpv6 Paket erstellt, welche
nun zum Einsatz kommt. Das Paket befindet sich in server:network
Repository. Das Repository wie folgt hinzufügen:

zypper ar -f http://download.obs.j0ke.net/server:/network/SLE_11_SP1/ server:network

Die Pakete im Anschluss wie folgt installieren:

zypper in wide-dhcpv6 radvd

Sollte das Paket dhcpv6 bereits installiert sein, muss die Deinstallation dieses Pakets
bestätigt werden.

Nach der Installation werden für beide Dienste Konfigurationsdateien angelegt:

/etc/dhcp6c.conf

#
# See dhcp6c.conf(5) man page for details.
#

interface dsl0 {
        send ia-pd 0;
        send rapid-commit;
        script "/usr/bin/dhcp6c-state";
        request domain-name-servers;
};

id-assoc pd 0 {
        prefix-interface lo {
                sla-id 0;
                sla-len 8;
        };
        prefix-interface br0 {
                sla-id 1;
                sla-len 8;
        };
};

/etc/radvd.conf

interface br0
{
        AdvSendAdvert on;
        MinRtrAdvInterval 30;
        MaxRtrAdvInterval 100;
        prefix ::/64 {
                AdvOnLink on;
                AdvAutonomous on;
        };
};

Zudem ein kleines Shellscript was vom dhcp6c ausgefürht wird:
/usr/bin/dhcp6c-state

#!/bin/bash
sleep 10
/etc/init.d/radvd restart 2>&1 >/dev/null

Auf meinem Router habe ich zur Überwachung der DSL Verbindung
ein weiteres Shellscript mitlaufen, welches prüft ob dsl0 aktiv
ist und andernfalls die DSL Verbindung herstellt. Zeitgleich
werden darin auch der dhcp6c gestartet und die Defaultroute
für IPv6 gesetzt.

/usr/local/bin/keepalive.ppp

#!/bin/sh
# restart the ppp connection whenever it goes down
export PATH=/bin:/usr/bin:/sbin:/usr/sbin
export LOG="logger -p daemon.notice -t `basename $0`[$$]"

$LOG "Monitoring PPP connection"
while [ 1 ]
do

        if `ifconfig | grep -q ^dsl0`
        then
                $LOG "PPP connection ok"
        else
                $LOG "Starting pppoed"
                # set dsl modem interface to up state
                ifconfig eth5 up
                # set dsl0 to off to be sure it's really off
                ifdown dsl0
                # start dsl0 connection
                ifup dsl0
                sleep 10
                # run dhcp6 client on dsl0 interface
                killall -9 dhcp6c 2>/dev/null
                dhcp6c -c /etc/dhcp6c.conf -p /var/run/dhcp6c.pid dsl0
                # set IPv6 default route to dsl0 interface
                ip -6 ro add default dev dsl0
        fi

        sleep 30
done

Das hier gezeigte Script wird beim Booten des Systems von einem init-Script
aufgerufen. Diese script so aus:

/etc/init.d/keepalive.init

#!/bin/sh
# keepalive.ppp wrapper startup script

### BEGIN INIT INFO
# Provides: keepalive.init
# Required-Start: $network $remote_fs sshd
# Required-Stop: $network $remote_fs
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Description: Start the keepalive.ppp script
### END INIT INFO
. /etc/rc.status
# Shell functions sourced from /etc/rc.status:
#      rc_check         check and set local and overall rc status
#      rc_status        check and set local and overall rc status
#      rc_status -v     ditto but be verbose in local rc status
#      rc_status -v -r  ditto and clear the local rc status
#      rc_failed        set local and overall rc status to failed
#      rc_reset         clear local rc status (overall remains)
#      rc_exit          exit appropriate to overall rc status    

# First reset status of this service
rc_reset
case "$1" in
        start)
                if [ -z "`find /proc -lname "/usr/local/bin/keepalive.ppp" 2>/dev/null |awk -F/ '{print $3}'`" ]; then
                        echo "starting keepalive.ppp..."
                        /usr/local/bin/keepalive.ppp &
                else
                        echo "keepalive.ppp is already running"
                        rc_failed
                fi
                        rc_status -v
        ;;
        stop)
                echo "stopping keepalive.ppp"
                PID=`find /proc -lname "/usr/local/bin/keepalive.ppp" 2>/dev/null |awk -F/ '{print $3}'`
                if [ -n "$PID" ]; then
                        kill -9 $PID
                else
                        rc_failed
                fi
                rc_status -v
        ;;

        status)
                PID=`find /proc -lname "/usr/local/bin/keepalive.ppp" 2>/dev/null |awk -F/ '{print $3}'`
                if [ -n "$PID" ]; then
                        echo "keepalive.ppp status: "
                else
                        echo "keepalive.ppp status: "
                        rc_failed
                fi
                rc_status -v
        ;;

        *)
                echo "Usage: $0 < start | stop | status >"
        ;;
esac
rc_exit

Das init-Script kann mit folgendem Befehl für den Startvorgang dauerhaft aktiviert werden:

chkconfig keepalive.init on

Sobald die DSL Verbindunzg per ‘/etc/init.d/keepalive.init start’ gestartet wird sollten im Anschluss auf den lokalen Netzwerkschnittstellen lo0 (loopback) und br0 (interne LAN Bridge) IPv6 Adressen zu sehen sein. Bei M-Net beginnen diese mit “2001:a60:”. Damit der Linux Rechner IPv6 auch von und zum internen Netz weiter leitet muss IPv6 Forwarding aktiv sein.

Dazu wird “net.ipv6.conf.all.forwarding=1″ in /etc/sysctl.conf eingetragen. Damit IPv6 forwarding sofort aktiv ist kann man es per Hand mit diesem Befehl aktivieren:

echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

Abschließend kann ich nur empfehlen, das jeder der IPv6 einrichtet sich mit einer entsprechenden Firewall ausrüstet,.da jeder PC im Netzwerk mittels einer automatisch zugewiesenen IPv6 Adresse von überall im Internet direkt erreichbar und somit auch direkt angreifbar ist.

:, , , , , , , , , , , , ,

3 Comments for this entry

1 Trackback or Pingback for this entry

Leave a Reply

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Blogroll

A few highly recommended websites...