Aus Linux-Magazin 11/2006

Von WAP zu IP: OpenVPN tunnelt und schützt mobile

© photocase.com

Dass OpenVPN zu mehr taugt als für simple virtuelle Netze, bestätigt ein trickreiches Szenario. Es wertet kurzerhand einen vermeintlich beschränkten WAP-Zugang zu einer kompletten IP-Anbindung auf, die sogar das Mitlauschen des Netzbetreibers verhindert.

Schade, wenn sich hinter der erhofften Handy-Internet-Flatrate in Wahrheit nur ein lausiger WAP-Zugang verbirgt. Gestandene Netzwerker hindert das aber nicht daran, nach Herzenslust mit allen erdenklichen Protokollen im Internet zu arbeiten und dabei auch Schnüffelei am WAP-Gateway zu unterbinden. Ihr wichtigstes Werkzeug ist OpenVPN ([1] bis [3]) zusammen mit geschicktem Tunneln und Routing. Die folgenden Betrachtungen bedienen sich zu Demonstrationszwecken der O2-WAP-Flatrate (Abbildung 1 und [4]), passen aber auch auf andere Angebote.

Abbildung 1: Ein nettes Angebot: Das Surf & E-Mail-Paket von O2 kostet 4,95 Euro im Monat bei unbegrenztem Datenvolumen. Jedoch gilt es, wie bei allen Mobilfunk-Angeboten, das Kleingedruckte zu studieren.

Abbildung 1: Ein nettes Angebot: Das Surf & E-Mail-Paket von O2 kostet 4,95 Euro im Monat bei unbegrenztem Datenvolumen. Jedoch gilt es, wie bei allen Mobilfunk-Angeboten, das Kleingedruckte zu studieren.

GPRS (General Packet Radio Service, siehe Kasten “GPRS”) ist fast flächendeckend verbreitet und damit trotz beschränkter Bandbreiten für viele Datennomaden eine interessante Online-Option. Für den Zugang sorgen ein Modem-fähiges Mobiltelefon (für diesen Artikel getestet mit einem Nokia 6680) oder eine Datenkarte für GPRS oder UMTS (Universal Mobile Telephone Service, [5], [6]). Die erste Variante verlangt eine Verbindung zwischen Telefon und Laptop, je nach Gerät klappt das per Bluetooth (BT), Infrarot (Irda), USB oder seriellem Kabel. Eine GPRS- oder UMTS-Karte setzt einen passenden Schacht im Laptop voraus. Zudem sollte der Linux-Kernel die Karte unterstützen.

GPRS

Der General Packet Radio Service (GPRS) benötigt keine eigene Infrastruktur, er erweitert bestehende GSM-Netze. GPRS-Handys stellen für den schnellen Austausch der Datenpakete eine dauerhafte Verbindung zu einem Einwahlpunkt her (APN, Access Point Name). Die Endgeräte dürfen mehrere GSM-Kanäle zusammenfassen. Wie viele Kanäle sie schaffen, hängt vom jeweiligen Endgerät ab sowie von der Anzahl freier Kanäle in der Funkzelle. Üblicherweise haben Sprachverbindungen Vorrang.

In der Einführungsphase von GPRS haben die Betreiber netzseitig eine Bandbreite von 53,6 KBit/s pro Funkzelle vorgesehen (vier Kanäle à 13,4 KBit/s). Stehen alle acht Kanäle für GPRS zur Verfügung, würde die Bandbreite auf 107,2 KBit/s klettern. Weitere Steigerungen durch bessere Fehlerprotokolle erlauben theoretisch 171,2 KBit/s (8 Kanäle à 21,4 KBit/s). Die aktuelle Handys können zwei bis vier Kanäle à 13,4 KBit/s zusammenfassen, noch mehr ist mit speziellen Datenkarten möglich.

Diese Angaben beziehen sich auf den Download. Beim Upload begnügen sich Mobiltelefone gern mit einem oder zwei Kanälen. Die oft zu findende Klassifizierung versucht das zu verbergen: Class-10-Geräte nutzen vier Down- und zwei Upstream-Kanäle. Class 8 deutet auf vier Down-, aber nur einen Upstream hin.

Wie bei GSM halten alle eingebuchten GPRS-Teilnehmer permanent über Signalisierungskanäle Kontakt mit dem Netz. Der Teilnehmer ist während dieser Zeit immer online. Die Kanäle müssen aber nicht ständig aufgebaut bleiben – das Telefon schaltet sie hinzu, wenn es tatsächlich Daten abrufen will.

Komprimieren, aber richtig

GPRS arbeitet mit starker Datenkompression. Der Endanwender kann daher auf Kompression in höheren Protokollschichten verzichten – vorausgesetzt er reicht die Daten im Klartext weiter. Wer eine Verschlüsselungsschicht einfügt, entzieht der GPRS-Kompression die Grundlage. Weil OpenVPN&Co. das Problem bereits von Analogmodems kennen, implementieren sie eine Kompression, die zuschlägt, bevor die Verschlüsselung die Daten bearbeitet.

GPRS verwendet zur Paketvermittlung das Internet Protocol. Üblicherweise bieten die Mobilfunkanbieter ihren Datenkunden eine private Netzwerkadresse an. Die IP-Parameter übermittelt das von anderen Diensten bekannte Point-to-Point-Protokoll (PPP). Jedes Datenpaket besitzt somit eine eindeutige Empfängeradresse im Funknetz, um zum Endgerät zu gelangen. Hierfür ist es unerheblich, über welchen der Funkkanäle es eintrifft.

Die GPRS-Telefonnummer ist bei allen Anbietern identisch: »*99***1#« sollte bei den meisten Geräten funktionieren. Einige Nutzer älterer Nokias berichten, dass es bei ihnen nur mit »*99#« oder »*98*#« funktioniert. Bei den Autoren hat die GPRS-Einwahl mit einem Sony-Ericsson T610 und einem Nokia 6680 ohne spezielle Anpassungen geklappt.

Steht die Verbindung zum Einwahl-Device, muss es die Anweisungen für die GPRS-Verbindung erhalten. Das übernimmt traditionellerweise der PPP-Daemon mit einem Skript. Anschließend stehen einige zusätzliche Routing-Konfigurationen an. Ein geschickt angepasstes OpenVPN sorgt für den Rest.

Handy als Modem

Am besten verbinden sich Laptop oder PC mit dem Mobiltelefon per Bluetooth. Fehlt dieser Drahtlosfunk am Rechner, dann rüsten ein USB-Dongle oder eine PCMCIA-Steckkarte diese Fähigkeit problemlos nach. Dank der drahtlosen Verbindung bleibt das Telefon frei für optimalen Empfang positionierbar. Die Verbindung mittels Kabel (USB oder seriell) ist unhandlicher, dafür leidet der Akku des Mobiltelefons weniger.

Bluetooth richten die meisten Distributionen inzwischen automatisch ein. Bei einigen Dongles oder Karten muss der Anwender eventuell die Firmware nachinstallieren. Umfangreiche Hilfe geben die Projektseiten zum Linux-Bluetooth-Stack ([7] bis [9]). Das Kommando »hciconfig« (Listing 1, Zeile 1) zeigt anschließend die Daten der Schnittstelle. Alternativ reicht auch der Aufruf »hcitool dev« (Zeile 8), der bei Erfolg die MAC-Adresse des BT-Dongle ausgibt.

Listing 1:
Bluetooth-Verbindung

01 # hciconfig
02 hci0:   Type: PCCARD
03         BD Address: 00:04:76:C8:4A:E8 ACL MTU: 128:8  SCO MTU: 64:8
04         UP RUNNING PSCAN ISCAN AUTH ENCRYPT
05         RX bytes:1046 acl:0 sco:0 events:58 errors:0
06         TX bytes:850 acl:0 sco:0 commands:35 errors:0
07 
08 # hcitool dev
09 Devices:
10         hci0    00:04:76:C8:4A:E8
11 
12 # hcitool scan
13 Scanning ...
14         00:0E:07:47:93:1B       BT-Phone
15 
16 # l2ping 00:0E:07:47:93:1B
17 Ping: 00:0E:07:47:93:1B from 00:04:76:C8:4A:E8 (data size 20) ...
18 0 bytes from 00:0E:07:47:93:1B id 200 time 63.05ms
19 0 bytes from 00:0E:07:47:93:1B id 201 time 48.13ms
20 0 bytes from 00:0E:07:47:93:1B id 202 time 45.13ms
21 3 sent, 3 received, 0% loss
22 
23 # hcitool cc 00:0E:07:47:93:1B
24 # hcitool dc 00:0E:07:47:93:1B

Als einfachen Test prüft »l2ping« (Zeile 16), ob das Mobiltelefon auf Pings an seine MAC-Adresse antwortet. Diese MAC ist am schnellsten durch einen Scan der Umgebung herauszubekommen (Zeile 12). Damit es klappt, muss die lokale Nahfunk-Fähigkeit auf dem Handy aktiviert sein. Nach einer gewissen Verzögerung sollte sich mindestens das eigene Gerät melden.

Paare finden sich

Anschließend wird es Zeit, die beiden Geräte zu paaren (Pairing). Dieser Vorgang führt zu einer verschlüsselten Verbindung mit Shared Secret; ohne erfolgreiches Pairing ist kein Datenaustausch möglich. Wieder ist das Kommando »hcitool« zuständig, das nun dringend Administrator-Rechte benötigt.

Der Parameter »cc« (Listing 1, Zeile 23) dient dem Verbindungsaufbau zum Gerät mit der MAC-Adresse 00:0E:07:47:93:1B. Kennt das Mobiltelefon die Gegenstelle nicht, fordert es den Benutzer auf das Passwort einzugeben, das er am PC in »/etc/bluetooth/pin« hinterlegt hat. Als Code taugen nur Zahlen, sonst wird die Eingabe am Telefon schwierig.

Der Parameter »dc« in Zeile 24 löst die Verbindung wieder. Damit hat sich das Telefon den Partner gemerkt und zum Verbindungsaufbau genügt das Kommando »rfcomm« – bis sich der Rechnername ändert oder ein neuer Dongle im Computer steckt. In dem Fall müsste der Anwender das Passwort für ein erneutes Pairing eingeben.

Über die Bluetooth-Strecke gilt es nun, eine serielle Verbindung aufzubauen: »rfcomm connect 1 00:0E:07:47:93:1B 1« erledigt das. Es quittiert den Vorgang mit folgender Ausgabe:

Connected /dev/rfcomm1 to 00:0E:07:47:93:1B on channel 1
Press CTRL-C for hangup

Das Kommando legt bei einem erfolgreichen Aufruf eine serielle Schnittstelle an, im Beispiel »/dev/rfcomm1«. Auf diese greift im nächsten Schritt der PPP-Daemon zu.

Traditionell übernimmt der PPP-Daemon die Internet-Einwahl, egal ob mit klassischem Modem, ISDN oder GPRS. Die meisten Distributionen halten die Konfiguration unterhalb des »/etc/ppp«-Verzeichnisses vor. Die Skripte »ip-up« und »ip-down« führt der PPP-Daemon nach erfolgreichem Auf- und Abbau der Verbindung aus. Wer zu diesem Zeitpunkt weitere Aktionen triggern will, legt zwei Skripte »ip-up.local« und »ip-down.local« im selben Verzeichnis an.

Gesprächige Skripte

Je nach Distribution landen die Chat-Skripte für die Unterhaltung mit dem Modem in einem eigenen Unterverzeichnis oder ebenfalls in »/etc/ppp«. Üblicherweise ist hierfür das Verzeichnis »peers« vorgesehen. Eine bei der Einwahl nötige Authentifizierung mit Username und Passwort verhandeln Computer und Einwahlserver per PAP (Password Authentication Protocol) oder besser per CHAP (Challenge Authentication Protocol). Die Daten hierfür landen in den nur für Root lesbaren Dateien »pap.secrets« oder »chap.secrets«.

Die meisten Mobilfunkanbieter arbeiten ohne Authentifizierung, da sich der Nutzer bereits mit seiner SIM-Karte (Subscriber Identification Module) eindeutig ausweist. Im »peers«-Unterverzeichnis dürfen mehrere Provider-Profile liegen, der »call«-Parameter beim Aufruf des PPP-Daemon wählt den gewünschten Provider. Für das Beispiel hieß die Datei bei den Autoren »o2-gprs«. In dieser Datei stehen eine Reihe von PPP-Verbindungsoptionen und die Namen der Chat-Skripte (Listing 2, Zeile 14 und 23). Diese Skripte sind in den Listings 3a und 3b abgedruckt.

Listing 2:
»o2-gprs«

01 #/etc/peers/o2-gprs
02 hide-password
03 noauth
04 debug
05 #/dev/ircomm0  # IRDA
06 #/dev/ttyS0    # serielles Kabel
07 /dev/rfcomm1   # Bluetooth
08 # Serial port line speed
09 115200
10 nocrtscts # IrDA
11 # To keep pppd on the terminal
12 nodetach
13 # Connect script
14 connect "/etc/ppp/peers/gprs-o2wap-connect"
15 # pppd must not propose any IP address to the peer!
16 noipdefault
17 # Accept peers idea of our local address
18 ipcp-accept-local
19 ipcp-accept-remote
20 # Ignore carrier detect signal from the modem
21 local
22 # Disconnect script
23 disconnect "/etc/ppp/peers/gprs-o2wap-discon"
24 remotename gprs
25 ipparam gprs
26 mtu 660
27 lcp-echo-failure 0
28 lcp-echo-interval 0

Listing 3a: Connect

01 #!/bin/sh
02 # /etc/ppp/peers/gprs-o2wap-connect
03 exec chat 
04    TIMEOUT   5                             
05    ECHO      ON                            
06    ABORT     'nBUSYr'                    
07    ABORT     'nERRORr'                   
08    ABORT     'nNO ANSWERr'               
09    ABORT     'nNO CARRIERr'              
10    ABORT     'nNO DIALTONEr'             
11    ABORT     'nRINGINGrnrnRINGINGr'  
12    ''        rATZ                         
13    TIMEOUT   12                            
14    SAY       "Press CTRL-C to close the connection at any stage!" 
15    SAY       "ndefining PDP context...n" 
16    OK        'AT&F'                        
17    OK        'ATV1E0S0=0&D2&C1'            
18    OK        AT+CMEE=1                     
19    OK        'AT+cgdcont=1,"IP","wap.viaginterkom.de"'  
20    OK-AT-OK  ATD*99***#                    
21    SAY       "nwaiting for connect...n"  
22    CONNECT   ""                            
23    SAY       "nConnected."                
24    SAY       "nIf the following ppp negotiations fail,n" 
25    SAY       "try restarting the phone.n"

Listing 3b:
Disconnect

01 #!/bin/sh
02 # /etc/ppp/peers/gprs-o2wap-discon
03 exec chat 
04    ABORT     "BUSY"          
05    ABORT     "ERROR"         
06    ABORT     "NO DIALTONE"   
07    SAY       "nSending break to the modemn" 
08    ""        "K"            
09    ""        "+++ATH"        
10    SAY       "nPDP context detachedn"

AT-Kommandos

Das Handy-Modem verwendet spezielle AT-Befehle, etwa um den GPRS-Modus zu aktivieren. Als Telefonnummer dienen der Code »*99***CID#« oder »*98*CID#«. Das Kürzel CID steht für die Nummer des im Handy angelegten GPRS-Datenkontos. Es ist meist möglich, auf die CID zu verzichten – so geschehen im vorliegenden Beispiel (Connect-Skript in Listing 3a, Zeile 20). Als Basis für dieses Skript diente [10].

Der Modembefehl »+cdgcont=1, “IP”, “Internet”« (Zeile 19) wählt den APN aus (Access Point Name), an den die Verbindung geht. Einige Telefone, etwa das Nokia 6310i, verlangen, dass die Angabe des Datenkontos hinter »cdgcont« unterbleibt. Hier heißt die Eingabe also »+cdgcont=, “IP”, “Internet”«. In einem Anbieternetz kann es durchaus verschiedene Accesspoints geben: O2 kennt »internet« für den allgemeinen Internetzugang sowie »wap.viaginterkom.de« für spezielle WAP-only-Pakete [4], zu denen auch die Flatrate gehört.

Die Verbindung startet per »pppd call o2-gprs«. In Abbildung 2 ist die Ausgabe des Chat-Skripts zu sehen. Ging alles bei der Initialisierung des Mobiltelefons glatt, erscheinen die Debug-Meldungen der PPP-Verbindung, die sich über den Debuglevel in der Konfiguration steuern lassen. Zu sehen sind die Übermittlung der lokalen und der Gegenstellen-IP sowie je nach Art des Accesspoints die Übertragung der IP-Adressen der DNS-Server des Providers. Bei passender Konfiguration trägt der »pppd« die DNS-Server in »/etc/resolv.conf« ein und legt ein Backup der Ursprungsdatei an.

Abbildung 2: Der PPP-Daemon kümmert sich um die Aufnahme der Verbindung zum Accesspoint und die anschließende IP-Konfiguration. Üblicherweise erfährt er dabei die IP des Clients und das Gateway, bei klassischer Internet-Einwahl zusätzlich bis zu drei DNS-Serveradressen.

Abbildung 2: Der PPP-Daemon kümmert sich um die Aufnahme der Verbindung zum Accesspoint und die anschließende IP-Konfiguration. Üblicherweise erfährt er dabei die IP des Clients und das Gateway, bei klassischer Internet-Einwahl zusätzlich bis zu drei DNS-Serveradressen.

Sparversion ohne DNS

Wählt sich der Kunde nur in einen WAP-Dienst ein, teilt ihm der Server üblicherweise keine DNS-Dienstadressen mit. WAP leitet alle Verbindungen über einen Proxy, der sich unter anderem um die DNS-Auflösung kümmert. Es bleiben zwei Möglichkeiten: Einen DNS-Server fest einstellen und den »pppd« daran hindern, die »resolv.conf« zu ändern, oder das Einwahlskript »ip-up.local« so ändern, dass es den bevorzugten DNS selbst einträgt.

Ob die Einwahl geklappt hat, zeigt die Ausgabe von »ifconfig«. Das Device »ppp0« sollte eine öffentliche IP-Adresse haben und im Up-Zustand sein. Noch leitet das Routing im Kernel per Default den Verkehr an diesem Interface vorbei. Der PPP-Daemon kann das zwar ändern und die Defaultroute anpassen. Das geht aber schief, wenn der Server keine Remote-IP übermittelt. Dann würde der »pppd« versuchen die Defaultroute auf eine sinnlose PPP-Defaultadresse zu legen. An dieser Stelle wäre ein Routing auf die eigene lokale PPP-IP sinnvoller.

Per Default durchs Handy

Genau diesen Weg beschreitet das Skript »ip-up.local« aus Listing 4. Es erhält folgende Parameter vom aufrufenden Skript »ip-up« übermittelt: »$1« ist der Interfacename, in den meisten Fällen »ppp0«. In »$2« steht das TTY-Device, es hängt von der Art der Verbindung zum Modem ab. »$3« enthält die Geschwindigkeit. »$4« und »$5« sind relevant: Die lokale und die ferne IP-Adresse. In »$6« stehen noch Parameter, so der Name der Datei beim PPP-Call (im Beispiel »o2-gprs«). Zeile 8 in Listing 4 setzt die Defaultroute entsprechend auf die lokale PPP-IP-Adresse.

Listing 4:
IP-Up-Skript

01 #!/bin/sh
02 # ip-up.local
03 case "$6" in
04    gprs*)
05       killall -9 privoxy 2&>1 >> $LOG
06       rcprivoxy start >> $LOG
07       modprobe tun
08       /sbin/ip route add 195.182.114.52 via $4
09       echo "/sbin/ip route add 195.182.114.52 via $4" >> $LOG
10       /sbin/ip route show >> $LOG
11       test -c /dev/net/tun || {
12          mkdir /dev/net;
13          mknod /dev/net/tun c 10 200; }
14       /usr/sbin/openvpn.wap --cd /etc/openvpn --config wap.conf >> $LOG &
15       #ip route add default via 10.8.0.2
16    ;;
17 esac

Die Privoxy-Arbeit in den Zeilen 5 und 6 erklärt ein Abschnitt gegen Ende des Artikels. Das Skript könnte auch die oben angesprochenen DNS-Server eintragen. Je nach Tarif sind Routing und DNS aber gar nicht wichtig, da der Betreiber nur eine Verbindung zu dem WAP-Proxy (siehe Kasten “Proxy, WAP und Connect”) erlaubt und erst ein überlagertes VPN die IP-Anbindung ans Internet herstellt (Abbildung 3a).

Abbildung 3a: Per OpenVPN tunneln IP-Pakete unbeschadet und unbemerkt vom Providernetz über den WAP-Proxy zum OpenVPN-Server. Cleveres Routing gaukelt dem Laptop eine direkte Internetanbindung vor.

Abbildung 3a: Per OpenVPN tunneln IP-Pakete unbeschadet und unbemerkt vom Providernetz über den WAP-Proxy zum OpenVPN-Server. Cleveres Routing gaukelt dem Laptop eine direkte Internetanbindung vor.

Proxy, WAP und
Connect

WAP 1 war ein eigenständiges Protokoll für mobile Netze und deren geringe Bandbreite. Der Standard hat sich bis heute nicht durchgesetzt, es gibt nur wenige WAP-1-Seiten. WAP 2.0 schwenkt daher auf das etablierte HTTP-Protokoll und TCP-Verbindungen über. Die zentrale Gegenstelle des Providers ist ein WAP-2.0-Gateway, das er durch einen modifizierten HTTP-Proxy realisiert. Ähnliches findet oft in Firmennetzen Anwendungen, die keinen direkten Zugang zum Internet gewähren. Ein HTTP-Proxy kann Seiten zwischenspeichern, sperren oder das Datenaufkommen analysieren.

Der Client stellt seine HTTP-Requests an den Proxy, dieser wertet sie aus und leitet gegebenenfalls den Request ins Internet weiter. Die Außenwelt kommuniziert also nur mit dem Proxy. Bei sicheren SSL-Verbindungen über den Proxy stößt dieses Prinzip aber an eine Grenze: Aus Sicht von Client und Server ist der Proxy ein Angreifer, der die direkte und geschützte Kommunikation behindert. Da SSL genau dies verhindert, muss der Proxy geeignet reagieren: Er bietet eine HTTP-»CONNECT«-Methode an. Schickt ein Client einen Connect-Request an den Proxy, baut dieser eine TCP-Verbindung zum Server auf. Anschließend leitet er die verschlüsselten Daten transparent und unverändert durch.

Für den Aufbau von virtuellen privaten Netzwerken hat sich neben dem umständliche IPsec das viel einfacher zu benutzende OpenVPN etabliert ([1] bis [3]). Es kommt auch gut mit Hindernissen zurecht, tunnelt beispielsweise durch HTTP-Proxies oder überwindet Network-Address Translation, wie sie an vielen Access-Routern auftritt.

OpenVPN überwindet Hinternisse

Das Hindernis im vorliegenden Fall ist WAP (Wireless Application Protocol). Waren lange Zeit das komplexe WAP 1.0 und seine teilweise inkompatiblen Nachfolger WAP 1.X Standard, so sind die Anbieter aufgrund des hohen Aufwands bei geringer Resonanz zu den Internetprotokollen zurückgekehrt. Das mittlerweile verbreitete WAP 2.0 lehnt sich stark an HTTP an und transportiert unfreiwillig auch OpenVPN-Verbindungen, die einen IP-over-WAP-Tunnel bereitstellen. Ganz ohne manuelle Anpassungen auf der Client-Seite klappt dieser Trick aber nicht. Zudem verlangt der Ansatz eine Gegenstelle im Internet, also einen Server, auf dem der Tunnel endet. Der Server dient dann als Gateway ins Netz (Abbildungen 3a und 3b).

Abbildung 3b: Beim Einsatz der Connect-Methode mit einem Proxy sendet der Client erst das Schlüsselwort »CONNECT«. Der Proxy baut daraufhin die Verbindung zum Server auf (2. und 3.). Bei erfolgreichem Verbindungsaufbau meldet er »200 Connection established« zurück.

Abbildung 3b: Beim Einsatz der Connect-Methode mit einem Proxy sendet der Client erst das Schlüsselwort »CONNECT«. Der Proxy baut daraufhin die Verbindung zum Server auf (2. und 3.). Bei erfolgreichem Verbindungsaufbau meldet er »200 Connection established« zurück.

OpenVPN muss auf dem Client und dem Gateway installiert sein. Da der Server auf Requests des Clients reagiert, genügt dort die Standardversion der jeweiligen Distribution. Er sollte aber die gleiche Versionsnummer tragen wie der Client, am besten Version 2.0.x. Der Provider-Proxy akzeptiert die Verbindung allerdings erst nach einer Änderung am OpenVPN-Client, daher steht beim Client das Kompilieren aus den Quellen auf dem Programm.

Client-OpenVPN

Die folgenden Beschreibungen beziehen sich auf das aktuelle OpenVPN 2.0.7, sollten aber leicht abgewandelt auch auf andere 2er Versionen passen. Die Sourcen hängen von ein paar Paketen ab. Debian-User installieren dazu »openssl-lib«, »lzo-lib« und »pthread« via »apt-get install Paketname«.

OpenVPN verwendet das so genannte TUN/TAP-Interface. Die meisten Distributionen haben dieses Kernelmodul schon in ihrem Standardumfang, andernfalls ist ein zusätzlicher Kompilierschritt fällig. Beim Kernel 2.6 versteckt sich das Modul im Untermenü »Device Drivers | Networking support | Universal TUN/TAP device driver support«.

Die Änderungen an OpenVPN beschränken sich auf die Datei »openvpn-2.0.7/proxy.c«. Der Proxy-Code gibt sich als Browser aus. Damit der O2-Proxy die Pakete akzeptiert, muss sich OpenVPN als WAP-Browser auf einem Handy tarnen. In den Zeilen 285 bis 288 stellt der Code die Connect-Anfrage zusammen, mit der er den Proxy anweist künftig alle Paket an die Zieladresse durchzureichen. In dieser Anfrage fehlt jegliche Angabe zum User-Agent. Steht Folgendes in den Zeilen 285 bis 288, gleicht die Anfrage der eines Sony-Ericsson-Telefons:

openvpn_snprintf (buf, sizeof(buf), "CONNECT %s:%d HTTP/1.1rnHost: %srnUser-Agent: Mozilla/1.22 (compatible; MSIE 5.01; PalmOS 3.0) EudoraWeb 2.1rnProfile: http://wap.sonyericsson.com/UAprof/P800R102.xml",
   host,
   port,
   host);

Anschließend übersetzt »./configure && make && make install« die Quellen und installiert das Programm.

Gut tarnen und den Proxy austricksen

OpenVPN kennt zwei Prinzipien, nach denen sich Client und Server authentifizieren und ihre Sitzungsschlüssel aushandeln: ein simples Preshared Secret und der Verbindungsaufbau mit X.509-Zertifikaten wie von SSL/TLS/HTTPS bekannt. Da das vorliegende VPN mit nur einem Tunnel sehr simpel ausfällt, genügt der Preshared-Secret-Modus.

Der Admin erzeugt einen symmetrischen Schlüssel und teilt diesen dem Client und dem Server mit. Diese einfache Methode ist zudem flotter, spart sie doch den langwierigen Austausch von Zertifikaten über die schmalbandige GPRS-Verbindung. Zertifikate sind hingegen für Setups anzuraten, bei denen viele Clients ein Gateway frequentieren.

Der Aufruf »openvpn –genkey –secret secret.key« erstellt einen 2048-Bit-Key und speichert ihn in der Datei »secret.key«. Diese muss der Admin anschließend auf Client und Server in das Konfigurationverzeichnis kopieren, also nach »/etc/openvpn«.

Die Enden des Tunnels

Eine für den OpenVPN-Server geeignete Konfigurationsdatei mit dem Namen »server.conf« ist in Listing 5a zu sehen. Der Server braucht im realen Internet eine bekannte IP-Adresse (Zeile 1); diese ist an die jeweiligen Gegebenheiten anzupassen. Die restlichen Einträge dürften meist passen.

Listing 5a:
OpenVPN-Server

01 local     192.168.0.120  # Gateway-IP
02 port      443
03 proto     tcp-server
04 dev       tun
05 secret    secret.key
06 ifconfig  10.8.0.1  10.8.0.2
07 link-mtu  620
08 keepalive 10 120
09 comp-lzo
10 status    openvpn-status.log
11 verb      3

Besonders erwähnenswert sind die Parameter »port« (Zeile 2), »comp-lzo« (Zeile 9) und »link-mtu« (Zeile 7). Da die Verbindung über GPRS läuft, dürfen die getunnelten Pakete nicht zu groß sein. Die Erfahrung zeigt, dass ein MTU-Wert (Maximum Transmission Unit) von 620 für gute Ping-Zeiten sorgt.

Zur Geschwindigkeitsoptimierung komprimiert OpenVPN dank »comp-lzo« die übertragenen Daten. Trickreich lauscht der OpenVPN-Server mit der vorliegenden Konfiguration auf Port 443. Der ist normalerweise für SSL-Verbindungen reserviert. Da bei echten SSL-Verbindungen auch Client und Server direkt verbunden sein müssen, erlaubt der Provider-Proxy den Connect.

Doppelt belegt

Wer den SSL-Port auf seinem Webserver nicht komplett für OpenVPN opfern will, kann durch DNAT (Destination Network Address Translation) den eingehenden Verkehr geschickt multiplexen. Die folgende IPtables-Regel leitet beispielsweise jeglichen vom O2-Gateway kommenden Traffic an den OpenVPN-Server weiter, der in diesem Alternativszenario auf Port 4443 lauscht.

Alle anderen anfragenden Clients (die nicht zum O2-Netz 82.113.100.0/24 gehören) bekommen den HTTPS-Zugang zu sehen, wie sie es erwarten:

iptables -t nat -A PREROUTING  -p tcp -s 82.113.100.0/24 --dport 443 -j DNAT --to 129.30.134.173:4443

Damit der OpenVPN-Server seine Konfiguration auch findet und verwendet, muss ihm der Aufruf den Namen und Ort der Datei mitteilen: »openvpn –cd /etc/openvpn –config server.conf«. Das TUN/TAP-Device des Gateway erhält daraufhin die IP-Adresse 10.8.0.1 (Zeile 6 in Listing 5a). Ein »ip route show«-Aufruf bestätigt das bei Bedarf (siehe auch Abbildung 4).

Abbildung 4: Zuerst bestätigt das Kommando »ip route show«, dass der Kernel die Pakete in den Tunnel senden will. Ein »ping« auf die TUN/TAP-IP-Adresse des OpenVPN-Servers gibt dann Gewissheit: Der Tunnel durch das WAP-2.0-Gateway steht.

Abbildung 4: Zuerst bestätigt das Kommando »ip route show«, dass der Kernel die Pakete in den Tunnel senden will. Ein »ping« auf die TUN/TAP-IP-Adresse des OpenVPN-Servers gibt dann Gewissheit: Der Tunnel durch das WAP-2.0-Gateway steht.

Routen finden

Das Routing des Gateway muss die Pakete vom TUN/TAP-Device ins Internet leiten und die Rückrichtung ebenso bedienen. Dazu ist Paketweiterleitung (Routing) nötig, die global im Kernel zu aktivieren ist. Zudem braucht das Szenario Masquerading (SNAT, Source Network Address Translation), um die virtuellen Tunneladressen mit gültigen Netzwerkadressen zu ersetzen:

echo 1 >/proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0

Nun leitet Linux die Pakete des virtuellen TUN/TAP-Device an die reale Netzwerkschnittstelle des Gateway.

Damit der Tunnel zustande kommt, muss der Client eine Verbindung initiieren. Die läuft dann vom eigenen Rechner über das Handy und über den Provider-Proxy bis zum OpenVPN-Gateway. Im WAP-2.0-Standard arbeitet der WAP-Proxy als HTTP-Proxy. Praktischerweise unterstützt OpenVPN seit Version 2.0 diese Funktionalität (Listing 5b). Die weiter oben genannten Änderungen sorgen für passende HTTP-Header, die dem Proxy einen Telefonbrowser vorgaukeln.

Listing 5b:
OpenVPN-Client

01 dev        tun
02 proto      tcp-client
03 remote     192.168.0.120  443
04 ifconfig   10.8.0.2  10.8.0.1
05 http-proxy 195.182.114.52 8080
06 http-proxy-retry
07 http-proxy-timeout 1
08 resolv-retry infinite
09 nobind
10 link-mtu   620
11 persist-tun
12 secret     secret.key
13 comp-lzo
14 verb       3

Passender Client

Einige Einträge der Client-Konfiguration gleichen den Einstellungen des Servers (Listing 5a). Hierzu zählen die MTU (Zeile 10 in Listing 5b) und die IP-Verbindungsdaten (Zeile 4). Die Kombination aus »proto tcp-client« (Zeile 2) und »http-proxy« (Zeile 5) sorgt dafür, dass OpenVPN eine TCP-Verbindung über den eingetragenen Proxy vornimmt. Der »remote«-Wert in Zeile 3 gibt die OpenVPN-Gegenstelle an.

Nach dem Start des Clients mit »openvpn –cd /etc/openvpn –config wap.conf« ist der Tunnel betriebsbereit. Der Client informiert über seine Aktionen dank der hohen Protokollierungsstufe 3 (Option »verb« in Zeile 14) recht ausführlich auf der Standardausgabe. Wer gleichzeitig mit einem Sniffer wie Ethereal (Abbildungen 5a und 5b) auf der PPP-Schnittstelle mitlauscht, sieht, wie sich der Client an den WAP-Proxy wendet und diesen anweist die Verbindung zum Gateway herzustellen.

Abbildung 5a: Ethereal verfolgt den Datenverkehr am PPP-Device. Per »CONNECT«-Verbindungsaufbau überwindet der OpenVPN-Client den WAP-Proxy. Im mittleren Bereich ist der komplette HTTP-Header erkennbar, der ein Sony-Ericsson-Telefon nachahmt. Der Proxy bestätigt brav mit »HTTP 1/1 200 Connected«.

Abbildung 5a: Ethereal verfolgt den Datenverkehr am PPP-Device. Per »CONNECT«-Verbindungsaufbau überwindet der OpenVPN-Client den WAP-Proxy. Im mittleren Bereich ist der komplette HTTP-Header erkennbar, der ein Sony-Ericsson-Telefon nachahmt. Der Proxy bestätigt brav mit »HTTP 1/1 200 Connected«.

Abbildung 5b: Der TCP-Stream von OpenVPN zeigt, dass der Verbindungsaufbau noch unverschlüsselt erfolgt. Nach der Connected-Bestätigung des Proxy schaltet OpenVPN auf authentifizierten und chiffrierten Betrieb um, unter Verwendung des Preshared-Key. Das hier mitgesniffte Ping bleibt unerkannt.

Abbildung 5b: Der TCP-Stream von OpenVPN zeigt, dass der Verbindungsaufbau noch unverschlüsselt erfolgt. Nach der Connected-Bestätigung des Proxy schaltet OpenVPN auf authentifizierten und chiffrierten Betrieb um, unter Verwendung des Preshared-Key. Das hier mitgesniffte Ping bleibt unerkannt.

Sparmaßnahme sorgt für weniger Daten

Ähnlich wie sich viele einen “Werbung nein danke”-Aufkleber am Briefkasten gönnen, hilft es gerade bei schwachbrüstigen Verbindungen, diesen schwergewichtigen Teil von Webseiten wegzulassen. Privoxy ([11], [12]), auf dem Client-Rechner installiert, fördert das Surfvergnügen und verringert die Menge an Daten, die sich durch die GPRS-Verbindung quälen. Im Browser auf dem Notebook muss dann Privoxy als HTTP-Proxy eingetragen sein, wie im Quickstart-Guide angegeben die 127.0.0.1 sowie Port 8118. Um den Start dieses Proxy kümmert sich Listing 4 bereits (Zeilen 5 und 6).

Nebenbei sorgt der Proxy auf Wunsch dafür, dass die angesurften Webseiten eine zum Setup passende Browserkennung sehen. Eine entsprechende Action-Konfiguration für Privoxy ist in Listing 6 zu sehen: Sie fügt die Sony-Ericsson-Browserkennung ein, mit dem weiter oben bereits OpenVPN dem WAP-Proxy ein Mobiltelefon vorgegaukelt hat. Zusätzlich verbirgt Zeile 5 die umstrittenen Referrer-Header.

Listing 6: Default
Action

01 # default.action
02 { 
03 +add-header{Profile: http://wap.sonyericsson.com/UAprof/P800R102.xml} 
04 -block 
05 +hide-referrer{forge} 
06 +hide-user-agent{Mozilla/1.22 (compatible; MSIE 5.01; PalmOS 3.0) EudoraWeb 2.1} 
07 [...]

Wilde Tunnelei

In Summe ergibt sich ein reichlich wilder Stapel an Protokollen: Der Rechner kommuniziert via Bluetooth mit einem Handy. Auf der Spitze dieses in sich schon komplexen Protokollberges liegt eine serielle Verbindung. Mit der steuert der Rechner das Modem im Mobiltelefon und öffnet eine PPP-Verbindung zum Provider. Als nächste Schichten folgen IP, TCP und schließlich HTTP.

In bester WAP-2.0-Manie ist HTTP das einzige mögliche Protokoll – aber nur bis zum WAP-Proxy. Der Client nötigt dem Proxy einen Connect zu einem Gateway-Rechner ab. Dieser Connect transportiert nicht das vom Proxy erwartete HTTPS, sondern OpenVPN. Darüber laufen dann erneut IP und – als eine mögliche Anwendung – TCP und erneut HTTP, das einen weiteren Proxy nutzt, der diesmal die Privatsphäre des Benutzers und die GPRS-Bandbreite schont. Alternativ sind über OpenVPN alle IP-Anwendungen machbar.

Die leichte Bedien- und Konfigurierbarkeit von OpenVPN küren die IPsec-Alternative zum guten Spielzeug auch in ungewöhnlichen Setups. Gerade die Aufgabe, durch schmale Pfade aus einem geschützten Netzwerk ins Internet zu kommen, verdreht die ursprüngliche Intention eines VPN. Achtung: Die Sicherheitsphilosophie der Firewall-Administratoren oder das Kleingedruckte im Mobilfunkvertrag verbieten es vielleicht auch auf nicht-technischer Ebene, einen WWW-Port zum vollen Internetzugang aufzublasen. (fjl)

Infos

[1] OpenVPN: [http://www.openvpn.net]

[2] Mirko Dölle, “Daten-Unterführung – Firewalls untertunneln mit OpenVPN”: Linux-Magazin 08/05, S. 46

[3] Achim Leitner, “Funkgeheimnis – Sichere WLAN-Vernetzung mit verschlüsseltem OpenVPN-Tunnel”: LinuxUser 12/04, S. 35

[4] Surf & E-Mail-Pack von O2: [http://shop2.o2online.de/o2/interessenten/necos/packs/surfemail/]

[5] Konstantin Agouros, “Mobil online mit hohen Datenraten – GPRS und HSCSD unter Linux”: Linux-Magazin 10/02, S. 92

[6] Konstantin Agouros, “Daten-Düse – UMTS-Karten unter Linux benutzen”: Linux-Magazin 10/04, S. 82

[7] Blue-Z: [http://www.bluez.org]

[8] Marcel Hilzinger, “Telefonflirt – Acht Bluetooth-Mobiltelefone im Test”: LinuxUser 01/05, S. 51

[9] Mirko Dölle, “Kurzstreckenfunker – Mit Bluetooth ins Netz”: Linux-Magazin 12/03, S. 48

[10] GPRS-Connect-Skript: [http://www.benhare.org/gprs-connect-chat]

[11] Privoxy: [http://www.privoxy.org]

[12] Kristian Kißling, “Der unsichtbare Dritte – Privoxy und Tor schützen die Privatsphäre”: Linux-Magazin 03/06, S. 82

Die Autoren

Dirk von Suchodoletz arbeitet als Assistent am Lehrstuhl für Kommunikationssysteme der Universität Freiburg. Datennetze und clevere Arten, darüber IP zu übertragen, gehören zu seinem Aufgabengebiet. Linux erleichtert die Experimente erheblich.

Ullrich Dittmer ist wissenschaftlicher Mitarbeiter am Lehrstuhl für Rechnernetze und Telematik der Uni Freiburg. Er entwickelt Telematiksysteme, die Lokalisierungs- und Kommunikationsverfahren auf Embedded-Linux integrieren.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 7 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben