Archive for March, 2011
Natives IPv6 auf einem M-Net DSL Anschluss
by carsten 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.
SLES11 SP1 Kernel 2.6.32.29-0.3.1 mISDN broken?
by carsten on Mar.12, 2011, under SLE, VoIP
Die letzten zwei abende habe ich damit verbracht einen merkwürdigen Fehler auf einem SLES11 System zu finden auf dem eine Asterisk Telefonanlage (1.6.2.x) mit chan_lcr läuft. Über eine HFC ISDN Karte und dazu gehörigem mISDN Treiber werden eingehende ISDN Anrufe auf SIP gebridged.
Seit dem neuesten Kernel Update kamen die Anrufe zwar noch durch, es läutet, man konnte abheben und die Verbindung war da, aber eine Sprachverbindung war nicht möglich (in beide Richtungen).
Nach langem Suchen inklusive Austausch von ISDN Kabel und HFC Karte blieb am Ende nur noch der Kernel übrig.
Im Changelog des Kernels bin ich über folgenden Eintrag gestolpert, der unter Umständen für dieses Verhalten verantwortlich ist.
* Mo Jan 17 2011 jeffm@suse.com
– patches.fixes/misdn-add-support-for-group-membership-check:
mISDN: Add support for group membership check (bnc#564423).
Dieser Eintrag brachte mich dann zu folgenden Commit
Mit diesem Patch wird ein neuer Modulparameter zu mISDN_core hinzugefügt welcher vermutlich in meiner Umgebung extra gesetzt werden muss:
parm: gid:Unix group for accessing misdn socket (default 0) (uint)
Ich habe vorerst ein Kerneldowngrade durchgeführt, damit die Produktivität des Systems nicht weiter leidet, werde den Parameter aber noch ausprobieren.
Update: 27.03.2011
Ich hatte nun Gelegenheit den gid Parameter von mISDN_core zu testen. Mein lcr bzw. asterisk selbst läuft als Benutzer asterisk mit gid 330. Ich habe also gid=330 an modprobe mISDN_core als Parameter übergeben. Danach lcr und asterisk wieder gestartet. Alles funktioniert nun auch mit dem neuen Kernel wieder.