Surfstick Huawei E352s-5


von Prof. Jürgen Plate

Surfstick Huawei E352s-5 unter Linux

Der Huawei E 352s-5 ist in Deutschland bekannt als "Telekom Web´n´walk Stick Fusion III".

Nach Telekom-Unterlagen funkt der Stick mit HSPA+ und HSPA in UMTS-Netzen auf den Frequenzen 850 MHz, 1700 MHz, 1900 MHz und 2100 MHz. Hier erlaubt er maximal 21,6 Megabit/s beim Herunterladen (Download) und 5,76 Megabit/s beim Senden (Upload). sowie mit EDGE und GPRS auf den GSM-Frequenzen 850 MHz, 900 MHz, 1800 MHz und 1900 MHz. Mit EDGE erreicht er im Down- und Upload bis zu 248 kbit/s, mit GPRS bis zu 86 kbit/s.

Der Stick identifiziert sich einerseits als Speicher und andererseits als Modem (per Software-Konfiguration umschaltbar). Als Speicher versorgt er den Erwerber gleich mit der nötigen Software für Windows, Mac OS und Linux. Der Stick kann zusätzlich mit einer Micro-SD-Karte bis 32 GByte erweitert werden.

Der  Stick arbeitet unter den Microsoft-Betriebssystemen Windows 7, Vista und XP, jeweils mit dem aktuellen Update des Servicepacks. Apple-Rechner brauchen als Betriebssystem MAC OS X 10.6.x (Snow Leopard), 10.5.x (Leopard)  oder 10.4.9 (Tiger). Unter Linux wird die Kernelversion ab 2.6.18 benötigt.

Als Verbindungsprogramm dient die Telekom-Variante des firmeneigenen Telekom Internet Manager eingesetzt, eine Variante des Huawei Mobile Partner Verbindungsmanagers. Dieser funktioniert nach dem Prinzip Plug & Play - jedoch nicht bei Linux.

SMS und externe Antenne

Der Stick unterstützt auch den Versand und Empfang von SMS (sofern vertraglich freigegeben). Er hat eine dreifarbige LED-Anzeige, die über den Verbindungsstatus informiert (Blinken = "bereit", Dauerleuchten = "verbunden", die Farbe gibt an, über welchen Dienst die Datenübertragung erfolgt). Leider ist die LED beim schwarzen Surfstick kaum zu erkennen. Ein externer Antennenanschluss (CRC-9-Stecker) bringt mit angeschlossener Antenne einen deutlichen Gewinn an Empfangsqualität.

Wird der Stick von der deutschen Telekom angeliefert, gibt es im Lieferpaket noch ein 17 Zentimeter langes USB-Verlängerungskabel, eine Schnellstart- und eine Bedienungsanleitung.

Technische Daten Huawei E352s-5

Huawei E352s-5
USB-ID 12D1:1506
Netze GSM, UMTS
Frequenzen GSM 850, 900, 1800, 1900
Frequenzen UMTS 850, 1700, 1900, 2100
Frequenzen LTE -
Datenübertragung via

GPRS, EDGE, HSDPA, HSUPA, HSPA+

Download, Upload 21,6 Mbit/s, 5,76 Mbit/s
mit MicroSD erweiterbar 32 GB
ext. Antennenanschluss ja
Betriebssysteme Windows: 7, Vista, XP
Apple: Mac OS X ab 10.4
Linux ab Kernel 2.6
automatische Installation Windows/MAC: ja
Linux: nein
Maße 68 x 26 x 12,3 mm
Besonderheiten -
Handelsname Telekom web'n'walk Stick Fusion III
Gewicht 30 g
EGPRS-Klasse 12
HSDPA-Kategorie Kategorie 12 mit 21,6 Mbit/s
HSUPA-Kategorie Kategorie 6 mit 5,76 Mbit/s
LTE-Kategorie -
Antennenbuchsen-Typ CRS5001
Treiber-Download www.huawei.com
Lieferumfang USB-Verlängerungskabel, Kurzanleitung
Chipsatz Qualcomm MSM7225

LED-Codes

Betrieb unter Linux

Für Linuxer ist ein Tar-Ball beigelegt, der möglichst im Heimatverzeichnis von Root entpackt werden sollte (und nicht wie vorgeschlagen auf dem Desktop). Schon daran sieht man, dass seitens Huawei davon ausgegangen wird, dass eine grafische Benutzeroberfläche läuft. Auch das Installscript impliziert eine GUI, ohne sich davon zu überzeugen, ob das vielleicht nicht stimmt.

Geradezu grotesk ist die beiliegende PDF-Anleitung für den Linux-Besitzer. Der Aufruf von install ist gerade noch richtig beschrieben. Man muss hier nämlich den Pfad zu dem gerade frisch entpackten Verzeichnis angeben, denn das Script ist nicht in der Lage, selbst nachzusehen. Auch andere Voraussetzungen werden keinesfalls vorher geprüft, sondern der vielleicht nicht so erfahrene Anwender mit dann auftauchenden Fehlermeldungen alleine gelassen. Ähnlich salopp werden auch ggf. vorhandene Dateien ohne Rückfrage gelöscht.

Aber zurück zur Anleitung: Die folgende Beschreibung für die Einrichtung der Kommunikation mit der Karte zum Aufbau einer PPP-Verbindung führt den Anfänger vollends in die Irre. Sie ist nämlich höchstens für die Einrichtung eines Modems der 80er Jahre des vergangenen Jahrhunderts geeignet. Interessanterweise muss diese Information auch bis zu T-Mobile gedrungen sein. Inzwischen wird Linux auf der Webseite zum Stick nämlich nicht mehr erwähnt.

Bei der vorgesehenen Anwendung sollte ein kleiner Server zeitlich gesteuert Daten per Funk ins Internet übertragen. Der Server ist etwa so groß wie eine Zigarrenkiste und hat natürlich keine GUI (nicht mal Tastatur oder Monitor). Er steht in den bayerischen Bergen fern jeglicher Zivilisation und wird per Solarpanel mit Strom versorgt. Für diesen Server hat sich folgende Konfiguration als funktionsfähig erwiesen:

  1. Die mitgelieferte Datei mit udev-Regeln hatte einen monströsen Umfang. Sie wurde durch eine in der Zeitschrift c't empfohlene Version ersetzt, die nur wenige Zeilen enthält (für die Darstellung wurden die Zeilen umbrochen):
    # This file maintains special treatment for some UMTS-Sticks
    # See udev(7) for syntax.
    #
    
    # 4G XS Stick TV
    ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="1c9e", ATTRS{idProduct}=="9a00", 
      → RUN+="/sbin/modprobe usbserial vendor=0x1c9e product=0x9a00"
    ACTION=="remove", ATTRS{idVendor}=="1c9e", ATTRS{idProduct}=="9a00", RUN+="/sbin/modprobe -r usbserial"
    
    # Huawei E173
    ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1c0b", 
      → RUN+="/usr/sbin/usb_modeswitch -v 12d1 -p 1c0b 
      → -M '55534243123456780000000000000011062000000100000000000000000000'"
    ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1c05", 
      → RUN+="/sbin/modprobe usbserial vendor=0x12d1 product=0x1c05"
    ACTION=="remove", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1c05", RUN+="/sbin/modprobe -r usbserial"
    
    # Huawei E352s-5
    ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14fe", 
      → RUN+="/usr/sbin/usb_modeswitch -v 12d1 -p 14fe 
      → -M '55534243123456780000000000000011062000000100000000000000000000'"
    
    # Huawei E352s-5 und E367
    ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1506", 
      → RUN+="/sbin/modprobe usbserial vendor=0x12d1 product=0x1506"
    ACTION=="remove", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1506", RUN+="/sbin/modprobe -r usbserial"
    
    # Huawei E398
    ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1505", 
       → RUN+="usb_modeswitch -v 12d1 -p 1505 -V 12d1 -P 1506 
       → -M "'55534243123456780000000000000011062000000100000000000000000000'"
    ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14c3", 
       → RUN+="usb_modeswitch -v 12d1 -p 14c3 -V 12d1 -P 14c
    
    Die Datei wurde als /etc/udev/rules.d/20-Huawei-Datacard.rules gespeichert.
  2. Für den PPP-Dämon muss der Surfstick wie ein Modem im Verzeichnis /etc/ppp/peers eingetragen werden. Als Dateiname wurde tmobile gewählt. Die Kommandos pon und poff verwenden als Defaultwert die Datei provider. Für andere Definitionen muss der Name der gewünschten Datei als Parameter mitgegeben werden. Die Datei tmobile hat folgenden Inhalt:
    # This optionfile was generated by pppconfig 2.3.18. 
    # 
    #
    hide-password 
    noauth
    novj
    noccp
    connect "/usr/sbin/chat -v -f /etc/chatscripts/tmobile"
    debug
    /dev/ttyUSB_utps_modem
    115200
    defaultroute
    noipdefault 
    usepeerdns
    
  3. Für den Verbindungsaufbau gibt es - auch wieder wie beim guten alten Modem - ein entsprechendes Chatscript im Verzeichnis /etc/chatscripts. Die Datei mit dem Chatscript wurde ebenfalls tmobile genannt. Die einzelnen Schritte der Unterhaltung mit dem "Modem" (der Surfstick verhält sich wie ein Modem) bestehen immer aus einen String, der vom Modem gesendet wird (erwartete Daten) und einer Antwort darauf. Im Unterschied zum Modem muss hier natürlich die PIN gesendet werden und der gewünschte Dienst (in diesem Fall die Internet-Verbindung). Dagegen sind Username und Passwort nicht nötig und die Telefonnummer lautet *99#. Das Chatscript hat folgenden Inhalt, wobei anstelle von "????" natürlich die richtige PIN eingetragen werden muss:
    # This chatfile was generated by pppconfig 2.3.18.
    # Please do not delete any of the comments.  Pppconfig needs them.
    # 
    # ispauth PAP
    # abortstring
    ABORT BUSY ABORT 'NO CARRIER' ABORT VOICE ABORT 'NO DIALTONE' 
    ABORT 'NO DIAL TONE' ABORT 'NO ANSWER' ABORT DELAYED
    # modeminit
    '' ATZ
    TIMEOUT 120
    'OK' 'AT+CPIN=????'
    'OK' 'AT+CGDCONT=1,"IP","internet.t-mobile"'
    # ispnumber
    'OK' 'ATDT*99#'
    # ispconnect
    CONNECT \d\c
    
    Manchmal dauert es etwas, bis der Stick auf die PIN reagiert, weshalb der Timeout auf 120 Sekunden gesetzt wurde.

Das war eigentlich schon alles. Wenn man nun das Kommando pon tmobile eingibt, sollte die Verbindung zum Internet aufgebaut werden. Die Protokollierung des Verbindungsaufbaus kann man sich mit dem Kommando plog ansehen, das im Prinzip wie tail funktioniert und auch dessen Parmeter kennt. Ein typisches Log siht folgendermaßen aus:

Jul  5 16:40:02 zerberus pppd[1209]: pppd 2.4.5 started by root, uid 0
Jul  5 16:40:04 zerberus chat[1212]: abort on (BUSY)
Jul  5 16:40:04 zerberus chat[1212]: abort on (NO CARRIER)
Jul  5 16:40:04 zerberus chat[1212]: abort on (VOICE)
Jul  5 16:40:04 zerberus chat[1212]: abort on (NO DIALTONE)
Jul  5 16:40:04 zerberus chat[1212]: abort on (NO DIAL TONE)
Jul  5 16:40:04 zerberus chat[1212]: abort on (NO ANSWER)
Jul  5 16:40:04 zerberus chat[1212]: abort on (DELAYED)
Jul  5 16:40:04 zerberus chat[1212]: send (ATZ^M)
Jul  5 16:40:04 zerberus chat[1212]: timeout set to 30 seconds
Jul  5 16:40:04 zerberus chat[1212]: expect (OK)
Jul  5 16:40:04 zerberus chat[1212]: ATZ^M^M
Jul  5 16:40:04 zerberus chat[1212]: OK
Jul  5 16:40:04 zerberus chat[1212]:  -- got it
Jul  5 16:40:04 zerberus chat[1212]: send (AT+CPIN=1234^M)
Jul  5 16:40:04 zerberus chat[1212]: send (^M)
Jul  5 16:40:04 zerberus chat[1212]: expect (OK)
Jul  5 16:40:05 zerberus chat[1212]: AT+CPIN=1234^M^M^M
Jul  5 16:40:05 zerberus chat[1212]: OK
Jul  5 16:40:05 zerberus chat[1212]:  -- got it
Jul  5 16:40:05 zerberus chat[1212]: send (AT+CGDCONT=1,"IP","internet.t-mobile"^M)
Jul  5 16:40:05 zerberus chat[1212]: expect (OK)
Jul  5 16:40:05 zerberus chat[1212]: ^M
Jul  5 16:40:05 zerberus chat[1212]: AT+CGDCONT=1,"IP","internet.t-mobile"^M^M
Jul  5 16:40:05 zerberus chat[1212]: OK
Jul  5 16:40:05 zerberus chat[1212]:  -- got it
Jul  5 16:40:05 zerberus chat[1212]: send (ATDT*99#^M)
Jul  5 16:40:05 zerberus chat[1212]: expect (CONNECT)
Jul  5 16:40:05 zerberus chat[1212]: ^M
Jul  5 16:40:06 zerberus chat[1212]: ATDT*99#^M^M
Jul  5 16:40:06 zerberus chat[1212]: CONNECT
Jul  5 16:40:06 zerberus chat[1212]:  -- got it
Jul  5 16:40:06 zerberus chat[1212]: send (\d)
Jul  5 16:40:07 zerberus pppd[1209]: Script /usr/sbin/chat -v -f /etc/chatscripts/tmobile finished (pid 1211), status = 0x0
Jul  5 16:40:07 zerberus pppd[1209]: Serial connection established.
Jul  5 16:40:07 zerberus pppd[1209]: using channel 1
Jul  5 16:40:07 zerberus pppd[1209]: Using interface ppp0
Jul  5 16:40:07 zerberus pppd[1209]: Connect: ppp0 <--> /dev/ttyUSB_utps_modem
Jul  5 16:40:08 zerberus pppd[1209]: sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x797728b> <pcomp> <accomp>]
Jul  5 16:40:08 zerberus pppd[1209]: rcvd [LCP ConfReq id=0x1 <accomp> <pcomp> <asyncmap 0x0> <mru 1500> <magic 0x543> <auth chap MD5>]
Jul  5 16:40:08 zerberus pppd[1209]: sent [LCP ConfNak id=0x1 <auth pap>]
Jul  5 16:40:08 zerberus pppd[1209]: rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x797728b> <pcomp> <accomp>]
Jul  5 16:40:08 zerberus pppd[1209]: rcvd [LCP ConfReq id=0x2 <accomp> <pcomp> <asyncmap 0x0> <mru 1500> <magic 0x543> <auth pap>]
Jul  5 16:40:08 zerberus pppd[1209]: sent [LCP ConfAck id=0x2 <accomp> <pcomp> <asyncmap 0x0> <mru 1500> <magic 0x543> <auth pap>]
Jul  5 16:40:08 zerberus pppd[1209]: sent [LCP EchoReq id=0x0 magic=0x797728b]
Jul  5 16:40:08 zerberus pppd[1209]: sent [PAP AuthReq id=0x1 user="zerberus" password=<hidden>]
Jul  5 16:40:08 zerberus pppd[1209]: rcvd [LCP EchoRep id=0x0 magic=0x543]
Jul  5 16:40:08 zerberus pppd[1209]: rcvd [PAP AuthAck id=0x1 "Greetings!!"]
Jul  5 16:40:08 zerberus pppd[1209]: Remote message: Greetings!!
Jul  5 16:40:08 zerberus pppd[1209]: PAP authentication succeeded
Jul  5 16:40:08 zerberus pppd[1209]: sent [IPCP ConfReq id=0x1 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
Jul  5 16:40:08 zerberus pppd[1209]: rcvd [IPCP ConfReq id=0x1]
Jul  5 16:40:08 zerberus pppd[1209]: sent [IPCP ConfNak id=0x1 <addr 0.0.0.0>]
Jul  5 16:40:08 zerberus pppd[1209]: rcvd [IPCP ConfNak id=0x1 <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
Jul  5 16:40:08 zerberus pppd[1209]: sent [IPCP ConfReq id=0x2 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
Jul  5 16:40:08 zerberus pppd[1209]: rcvd [IPCP ConfReq id=0x2]
Jul  5 16:40:08 zerberus pppd[1209]: sent [IPCP ConfAck id=0x2]
Jul  5 16:40:09 zerberus pppd[1209]: rcvd [IPCP ConfNak id=0x2 <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
Jul  5 16:40:09 zerberus pppd[1209]: sent [IPCP ConfReq id=0x3 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
Jul  5 16:40:10 zerberus pppd[1209]: rcvd [IPCP ConfNak id=0x3 <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
Jul  5 16:40:10 zerberus pppd[1209]: sent [IPCP ConfReq id=0x4 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
Jul  5 16:40:10 zerberus pppd[1209]: rcvd [IPCP ConfNak id=0x4 <addr 10.174.130.115> <ms-dns1 10.74.210.210> <ms-dns2 10.74.210.211>]
Jul  5 16:40:10 zerberus pppd[1209]: sent [IPCP ConfReq id=0x5 <addr 10.174.130.115> <ms-dns1 10.74.210.210> <ms-dns2 10.74.210.211>]
Jul  5 16:40:10 zerberus pppd[1209]: rcvd [IPCP ConfAck id=0x5 <addr 10.174.130.115> <ms-dns1 10.74.210.210> <ms-dns2 10.74.210.211>]
Jul  5 16:40:10 zerberus pppd[1209]: Could not determine remote IP address: defaulting to 10.64.64.64
Jul  5 16:40:10 zerberus pppd[1209]: Cannot determine ethernet address for proxy ARP
Jul  5 16:40:10 zerberus pppd[1209]: local  IP address 10.174.130.115
Jul  5 16:40:10 zerberus pppd[1209]: remote IP address 10.64.64.64
Jul  5 16:40:10 zerberus pppd[1209]: primary   DNS address 10.74.210.210
Jul  5 16:40:10 zerberus pppd[1209]: secondary DNS address 10.74.210.211
Jul  5 16:40:10 zerberus pppd[1209]: Script /etc/ppp/ip-up started (pid 1260)
Jul  5 16:40:11 zerberus pppd[1209]: Script /etc/ppp/ip-up finished (pid 1260), status = 0x0

Danach kann man mittels ifconfig sehen, dass nun auch ein Netzwerkinterface namens "ppp0" existiert. Auch die Nameserver von T-Mobile sind eingetragen. Beim Arbeiten mit der Internetverbindung fällt nur auf, dass alles etwas langsamer und zäher verläuft - je nach Netzgüte. Übrigens verbinden sich alle Surfsticks immer mit der Remote-Adresse 10.64.64.64. Die lokale IP-Adresse ist sehr zufällig, mal sind es 10.x.y.z-Adressen, mal andere IP-Adressen.

Des weiteren ist mir aufgefallen, dass nach einem Beenden der Kommunikation der Stick in einen "seltsamen" Zustand verbleibt: die LED blinkt blau und ein neuerlicher Verbindungsaufbau ist nicht möglich, bzw. erst nach Abziehen und Wiederanstecken des Stiftes.

Verbindungsaufbau per Startscript

Aus diesem Grund wird der Stick per Startscript /etc/init.d/StartPPP beim Booten des Systems automatisch hochgefahren. Da manchmal das Script schon gestartet wird, obwohl die USB-Treiber für den Stick noch nicht aktiviert sind, wartet das Script, bis das entsprechende Device im Verzeichnis auftaucht. Mit dieser Massnahme fährt das System stabil hoch.

#! /bin/sh
### BEGIN INIT INFO
# Provides:          skeleton
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Example initscript
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

# Author: J. Plate <plate@netzmafia.de>

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="PPP und Reverse SSH-Tunnel starten/stoppen"
NAME=StartPPP
DAEMON=/root/bin/$NAME
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
  {
	# Return
	#   0 if daemon has been started
	#   1 if daemon was already running
	#   2 if daemon could not be started
        #
        # PPP-Verbindung ueber Surfstick aufbauen
        # warten, bis Stick eingehaengt ist - aber nicht ewig
        sleep 30
        CNT=100
        until [ -c /dev/ttyUSB_utps_modem -o "$CNT" -eq 0 ]
          do
          CNT=`expr $CNT - 1`
          /bin/sleep 2
          done
        # testen, ob Verbindung schon besteht
        /sbin/ifconfig | /bin/grep -q "ppp0" && return 1
        # Verbindungsaufbau starten
        /usr/bin/pon tmobile
        # warten, bis Verbindung steht
        # Ende nach CNT*2 Sekunden oder wenn PPP-Verbindung steht
        CNT=100
        while [ "$CNT" -gt 0 ]
          do
          CNT=`expr $CNT - 1`
          /bin/sleep 2
          /sbin/ifconfig | /bin/grep -q "ppp0"  && CNT=0
          done
        # Erfolg?
        /sbin/ifconfig | /bin/grep -q "ppp0"  || return 2
        echo "Hochgefahren: $(date)" >> /root/bin/stick.log
        return 0
  }

#
# Function that stops the daemon/service
#
do_stop()
  {
	# Return
	#   0 if daemon has been stopped
	#   1 if daemon was already stopped
	#   2 if daemon could not be stopped
	#   other if a failure occurred
    #
    # PPP-Verbindung ueber Surfstick schliessen
    if /sbin/ifconfig | /bin/grep -q "ppp0"
    then
      /usr/bin/poff tmobile
      RETVAL="$?"
      test "$RETVAL" -gt 0 && return 2
      return 0
    else
      return 1
    fi
  }

case "$1" in
  start)
	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
	do_start
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  stop)
	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
	do_stop
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  status)
       /sbin/ifconfig
       exit 0
       ;;
   *)
	echo "Usage: $SCRIPTNAME {start|stop|status}" >&2
	exit 3
	;;
esac

SSH Reverse Tunnel - ich bohre ein Loch in die Firewall

Einen SSH-Reverestunnel benötigt man z. B. wenn man auf einen Rechner zugreifen will, der hinter einem Firewallsystem steht und zwar sebst ins Internet kommt, jedoch eine sogenannte private IP-Adresse besitzt. Da man den Rechner von ausserhalb nicht erreichen kann, muss dieser von innen einen SSH-Tunnel durch die Firewall zu einem externen Rechner aufbauen. Bis dahin wäre das ein "normaler" SSH-Tunnel. Dieser wird aber so eingerichtet, dass er auch Verbindungen von externen Rechner nach innen zuläßt.

Dazu muss der folgende Befehl am internen Rechner ausgeführt werden:

/usr/bin/ssh -N -f -R 2222:localhost:22 user@externer.rechner
2222 ist der Port über den die Verbindung vom externen Rechner aus geöffnet werden muss, 22 ist der Port, der dann vom internen System verwendet wird (in diesem Fall SSH). Nachdem der Tunnel steht, kann man sich vom externen System aus mit dem Befehl ssh localhost -p 2222 zum internen Rechner verbinden. Zu bedenken ist, dass man quasi ein Loch in die Firmenfirewall bohrt. In unserm Fall bietet der Reversetunnel die Möglichkeit, sich per SSH auf dem System einzuloggen, das über den Surfstick am Internet hängt, obwohl es eine private Adresse besitzt. Solange der Tunnel steht, ist das System natürlich auch angreifbar.

Insofern ist es günstig, durch crontab gesteuert den Tunnel nur für eine bestimmte Zeit aufzumachen. In dieser Zeit kann dann das Surfsticksystem aus der Ferne administriert werden. In diesem Fall muss der Login automatisiert werden, denn sonst hinge der cron-Job mit einer Passwortabfrage. Deshalb erfolgt der Login des internen Systems auf dem externen Rechner per ssh-key und Zertifikat. Wie man das einrichtet, steht im folgenden Abschnitt.

Für den Auf- und Abbau des Tunnels dienen die beiden folgenden kurzen Shellscripts, zuerst das Script für den Aufbau des Tunnels:

#!/bin/sh
# Baut einen reverse-SSH-Tunnel zu Netzmafia auf
# Mit 'ssh user@localhost -p 2222' kann man sich
# auf dem Rechner einloggen
#
PIDFILE=/var/run/sshtunnel.pid   # Datei mit der Prozessnumme des ssh-Tunnels
# Prozess-Id ermitteln
PID=`/bin/ps ax | /bin/grep "22 zerberus" | /bin/grep -v "grep" | awk '{ print $1; }'`
if [ "$PID" != "" ]
  then
  /bin/kill -HUP $PID        # ggf. alten ssh-Tunnel schliessen
  /bin/rm -f $PIDFILE
fi
# Tunnel starten (im Hintergrund)
/usr/bin/ssh -N -f -R 2222:localhost:22 zerberus@www.netzmafia.de &
RETVAL="$?"
test "$RETVAL" -gt 0 && exit 2  # Tunnelaufbau ging schief
# Prozess-Id ermitteln und speichern
PID=`/bin/ps ax | /bin/grep "22 zerberus" | /bin/grep -v "grep" | awk '{ print $1; }'`
echo $PID > $PIDFILE
exit 0
Das Script zum Abbau des Tunnels verwendet die gespeicherte Prozessnummer:
#!/bin/sh
# Schliesst einen Reverse-SSH-Tunnel zu Netzmafia
#
PIDFILE="/var/run/sshtunnel.pid"   # PID-File ssh-Tunnel
# Wenn die Datei existiert, laeuft vermutlich ein Tunnel
if [ -f $PIDFILE ]
  then
  # Prozess beenden
  /bin/kill -s 1 `cat $PIDFILE`
  RETVAL="$?"
  # im Fehlerfall nochmal brutal versuchen
  test "$RETVAL" -gt 0 && kill -s 9 `cat $PIDFILE`
  # delete pidfile
  /bin/rm -f $PIDFILE
  fi
exit 0

SSH-Login ohne Passwort

Dafür muss auf dem internen Rechner ein Zertifikat erstellt und auf den externen Computer übertragen werden, was mit Hilfe der beiden Kommandos ssh-keygen und ssh-copy-id erledigt werden kann. Zuerst wird ein Schlüssel-Paar (Public- und Private-Key) erstellt und dann der öffentliche Schüssel zum Webserver übertragen.

Der Private-Key ist dann dem normalen Passwort gleichgestellt. Im Gegensatz zum Passwort existiert er aber als Datei, die vor fremdem Zugriff zu schützen ist. Deswegen besteht die Möglichkeit, den Private Key mit einer Passphrase zu schützen. Die Passphrase muss in unserem Fall leer bleiben, da sonst bei Verbindungsaufnahme diese Passphrase abgefragt würde und so kein automatischer Dateitransfer möglich wäre.

Das folgende Shellscript erzeugt die Schlüssel und übertägt sie dann (den Account "user@www.netzmafia.de" gibt es natürlich nicht, er dient nur als Beispiel):

#!/bin/bash
# Generiert Public/Private-Keys und kopiert sie zur Netzmafia
# damit ein Login bzw. Aufbau eines SSH-Tunnels dorthin ohne
# Passwort-Eingabe moeglich ist
#
# zuerst werden die Keys generiert
ssh-keygen -t rsa
ssh-keygen -t dsa
# nun befinden sich im Verzeichnis ~/.ssh vier Dateien:
# id_rsa  id_dsa  id_rsa.pub  id_dsa.pub
#
# nun werden die public kesy zur Netzmafia kopiert und dort
# an die Datei ~/.ssh/authorized_keys angehaengt
ssh-copy-id -i ~/.ssh/id_rsa.pub user@www.netzmafia.de
ssh-copy-id -i ~/.ssh/id_dsa.pub user@www.netzmafia.de
# ab jetzt kann sich der User vom internen System als
# "user@www.netzmafia.de" ohne Passworteingabe auf
# Netzmafia einloggen


Copyright © Hochschule München, FK 04, Prof. Jürgen Plate
Letzte Aktualisierung: