Samstag, 22. April 2006

HOWTO_ OpenVPN mit HTTPTunnel durch Proxyserver bugsieren

Im ersten Teil ging es um die Einrichtung von OpenVPN-Server und Client. Nun ist allerdings der Zugriff auf das WWW aus vielen größeren Netzwerken durch Proxy-Server kontrolliert und beschränkt. Es gibt doch einige Mechanismen, wie sich eine VPN-Verbindung darüber aufbauen lässt.
  1. Tunneln per CONNECT

    Etliche Proxyserver erlauben auch Verbindungen zu HTTPS-Servern. Dabei hat der Proxy allerdings keinen Zugriff auf die aufgebaute Verbindung (wir erinnern uns: Verschlüsselung) und leitet die Daten einfach nur durch. Prinzipiell weiß er nicht einmal, dass am Ende eine SSL-Verbindung aufgebaut wurde, denn initial wird lediglich eine unverschlüsselte TCP/IP-Verbindung verwendet.
    Dieser Mechanismus ist im OpenVPN-Client bereits eingebaut und kann einfach in der Konfigurationsdatei eingestellt werden.
    http-proxy [proxy server] [proxy port #]

    Standardmäßig werden HTTPS-Verbindungen zum Port 443 aufgebaut, und daher beschränken Proxyadministratoren auch gerne das CONNECT-Kommando auf diesen Port. In meinem Falle "sitzt" da zu Hause aber bereits ein Webserver, so dass ich auf diese Methode leider nicht zurückgreifen kann. Mit ein wenig Herumprobieren ließe sich eventuell der Port mittels iptables sharen.
  2. HTTPTunnel

    Was aber erlaubt wird, sind unverschlüsselte, les- und cachebare HTTP-Verbindungen. Wer wirklich Pech hat, darf auch diese nur zu einem Port 80 aufbauen und - genau - da sitzt eben oft auch ein Webserver. Glücklicherweise wird der Port 8080 oftmals auch freigeschaltet, und über den lasse ich nun HTTPTunnel laufen. Tipps dazu habe ich aus diesem Artikel.
    1. Setup Server (Debian Sarge 3.1 "stable")
      Nach apt-get install httptunnel wird mit touch /etc/init.d/httptunnelein kleines Startupscript angelegt und mit folgendem Inhalt gefüllt:
      #!/bin/bash

      # Startup-script für HTTPTunnel
      # Tunnelendpunkt auf Port 8080 wird auf
      # 1194 (OpenVPN-Server) weitergeleitet
      echo Starting HTTPTunnel for OpenVPN
      hts --forward-port localhost:1194 8080
      Automatisch bei Systemstart laden:
      chmod +x /etc/init.d/httptunnel
      update-rc.d httptunnel defaults 98

      Damit ist der Tunnel eingerichtet, aber zwei Anpassungen für OpenVPN sind in der /etc/openvpn/server.conf noch vorzunehmen:
      # HTTP-Tunnelling funktioniert nur mit TCP-Paketen!
      proto tcp
      ;proto udp

      # Mit tun funktioniert das NAT-Routing auf dem VPN-Server nicht
      dev tap
      ;dev tun
      Nach einem Neustart sind die Änderungen übernommen:
      /etc/init.d/openvpn stop
      /etc/init.d/openvpn start
    2. Setup Client (Max OS X)
      Hier ist ein bisschen mehr Arbeit nötig. Auf jeden Fall müssen die aktuellen XCode-Tools installiert werden, da sonst die GCC nicht vorhanden ist.
      Die Sources müssen heruntergeladen und entpackt werden, aktuell ist 3.0.5. Nun in das Verzeichnis wechseln und mit
      ./configure
      make
      sudo make install
      sudo ./install-sh hts /usr/local/bin
      sudo ./install-sh htc /usr/local/bin
      kompilieren und installieren. Der Tunnelclient ist nun einsatzbereit:
      htc --forward-port 8080 --proxy <PROXY>[:<PORT>] [--proxy-authorization <USER>:<PASS>] <VPN_HOSTNAME>:8080

      Damit auch der VPN-Client über den HTTPTunnel geht, müssen ihm diese Änderungen über die Konfiguration bekannt gemacht werden. In den Utilities mit einem Doppelklick Tunnelblick starten, auf das Icon klicken, Details... auswählen und auf Edit Configuration klicken.
      # TAP statt TUN verwenden
      ;dev tun
      dev tap

      # HTTP verwendet TCP und nicht UDP
      ;proto udp
      proto tcp

      # Tunnel wird lokal geöffnet
      ;remote myserver.dyndns.org 1149
      remote localhost 8080
      Abspeichern und fertig ist.
    Damit lässt sich nun aus fast jedem Netzwerk heraustunneln. Die Pinglaufzeit ist mit rund 60ms akzeptabel, die Geschwindigkeit ist durch das zweifache Tunneln allerdings deutlich herabgesetzt, bei umfangreichen Webseiten dauert das Laden schon mal bis zu 5 Sekunden. Dazu muss ich allerdings sagen, dass mein Homeserver mit 1536/1024 kbps angebunden ist, letztendlich ist der Upstream der Flaschenhals. Wer nur 16 Kbyte (=128kbps) hat, wird auch nicht groß über ISDN-Geschwindigkeit hinauskommen können.
    Bei dem von mir verwendeten Proxy bricht leider die Verbindung nach kurzer Zeit immer wieder ab, eine runde halbe Minute später beendet sich dann auch der HTTPTunnel-Client und muss neu gestartet werden. Eventuell lässt sich dies aber noch über die verschiedenen Parameter (htc --help) optimieren.
    Last but not least fehlt noch ein elegantes (automatisches?) Startupscript für den HTTPTunnel-Client. Wenn ich mal wieder nichts zu tun habe...

HOWTO_ OpenVPN-Server unter Debian 3.1 "Sarge" und Mac OS X als Client

Im ersten Teil beschreibe ich, wie man innerhalb von wenigen Minuten unter Debian Sarge (der aktuellen "stable release") den OpenVPN-Server einrichtet und als Client einen Mac OS X-Rechner damit verbindet. Im zweiten Teil werde ich einige Tipps geben, wie man auch hinter einem Proxy-Server "nach Hause" kommt.
  1. Server (Debian Sarge 3.1 "stable)

    1. Installation
      Einfacher geht es nicht: apt-get install openvpn.
    2. Schlüssel und Zertifikate
      Hat so funktioniert, wie im offiziellen Quick-HOWTO beschrieben.
      Zuerst müssen die Installationsscripte in das vorgesehende Verzeichnis kopiert werden:
      cp -r /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn/
      Um nicht später bei der Erstellung der Zertifikate alles per Hand mehrfach eingeben zu müssen, werden in der Datei /etc/openvpn/easy-rsa/vars ein paar Variablen gesetzt:
      export KEY_COUNTRY=DE
      export KEY_PROVINCE=NA
      export KEY_CITY="<Stadt>"
      export KEY_ORG="<Organisation>"
      export KEY_EMAIL="<Mailadresse>"

      Das erste Zertifikat ist das er zertifizierenden Stelle, bei Common-Name ist ein beliebiger Name einzutragen, das Passwort ist nicht zu belegen.
      . ./vars; ./clean-all; ./build-ca
      Nun erstellt ./build-key-server server das Serverzertifikat, bei Common-Name ist server einzutragen, alle Nachfragen nach Zertifizierungen sind mit Y zu bejahen.

      Für jeden Client, der später zum Server connecten darf, muss nun ebenfalls ein Zertifikat und ein Schlüssel erstellt werden, dabei muss der Common-Name mit dem jeweils angegebenen Clientnamen des Kommandozeilenaufrufs (im Beispiel client1) übereinstimmen.
      ./build-key client1

      Die Diffie-Hellman-Parameter werden mit ./build-dh erstellt. Die folgende Tabelle zeigt, welche Dateien auf welchem Rechner benötigt werden:
      Datei Rechner Zweck
      ca.crt Serv+Cl Root CA Zertifikat
      ca.key Signierung Root CA Schlüssel
      dh{n}.pem Server Diffie Hellman Param.
      server.crt Server Server Zertifikat
      server.key Server Server Schlüssel
      client1.crt Client1 Client1 Zertifikat
      client1.key Client1 Client1 Schlüssel
      Alle Schlüssel (*.key) sind dabei geheim und sollten nicht öffentlich zugänglich sein. Die für den Betrieb von OpenVPN benötigten Dateien server.key, server.crt, ca.crt und dh{n}.pem sind nach /etc/openvpn zu kopieren.
    3. Konfiguration
      Die Vorlagen aus /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz nach /etc/openvpn kopieren und entpacken. Drei Änderungen sind vorzunehmen:
      # Ändert auf Clients den default Gateway auf
      # den VPN-Server um, so dass SÄMTLICHER
      # traffic über das VPN geleitet wird
      # (ausser für das jeweils lokale Netzwerk).
      push "redirect-gateway def1“

      # Aktivieren der Kompression, da
      # mehrfaches Tunnel massiv die
      # Geschwindigkeit drückt.
      comp-lzo

      # Standardwert ist nobody, doch diese
      # Gruppe existiert auf Debian Sarge nicht
      group nogroup
      Nach einem Neustart des OpenVPN-Servers wird die Konfiguration übernommen:
      /etc/init.d/openvpn stop
      /etc/init.d/openvpn start
    4. NAT-Routing
      Jetzt wird zwar sämtlicher Traffic von den Clients auf den Server geleitet, kommt von dort aber nicht mehr weiter. Daher muss hier noch etwas Arbeit geleistet werden, die Langfassung beschrieb T.J. Nelson.
      touch /etc/init.d/iptables.openvpn.sh legt eine neue Datei fürs Routing an. Folgende Zeilen sind in die Datei einzutragen:
      #!/bin/bash
      # get rid of previous iptables entries
      iptables -F
      iptables -F -t nat
      iptables -X
      
      iptables -t nat -A POSTROUTING -o eth0  -j SNAT --to 192.168.0.2
      iptables -A FORWARD  -j ACCEPT
      #iptables -L -t nat     (list all rules)
      
      # activate ip forwarding
      echo 1 > /proc/sys/net/ipv4/ip_forward
      Nun noch einmalig händisch starten
      chmod +x /scripts/iptables.ovpn.sh
      /etc/init.d/iptables.openvpn.sh
      und automatisch beim Systemstart ausführen lassen:
      update-rc.d iptbl.ovpn defaults 98
  2. Client (Max OS X)

    Die Hauptarbeit ist bereits getan, nach wenigen Schritten sollte sich nun der erste Client verbinden lassen. Der fertig geschnürte OpenVPN-Client Tunnelblick muss in der Version 3 heruntergeladen und alle enthaltenen Programme mit Doppelklick auf Tunnelblick-Complete.mpkg installiert werden.

    Nachdem die Schlüssel und Zertifkate client1.crt, client1.key und ca.crt (etwa per SCP) vom Server nach /Users/USERNAME/Library/openvpn/ gewandert sind, startet man Tunnelblick mit einem Doppelklick (zu finden unter Utilities). Ein Klick auf das Symbol öffnet das spartanische Menü, Details... öffnet den Log Output, bei dem sich ein Button Edit Configuration findet. Hier sind nur wenige Änderungen vorzunehmen:
    # Serveradresse angeben
    remote HOST PORT
    
    # Zertifikat und Schlüssel
    cert client1.crt
    key client1.key
    
    # Kompression
    comp-lzo
    Abspeichern und ein Klick auf Connect oder openvpn (Disconnected im Menü sollte erfolgreich Zugang zum Server gewähren.

Reflog

Informationstechnische Howtos, Hinweise und Merkwürdiges

Batchlib v1.0 2008-03-29

Aktuelle Beiträge

HOWTO_ O2 DSL Surf &...
Der O2 DSL Surf & Phone-Router ist für die alleinige...
cypressor - 12. Feb, 19:57
Uptweak Windows XP Home...
There are a lot of annoying limitations in Windows...
cypressor - 9. Okt, 19:30
BATCHLIB_ Batchlib package...
Download Batchlib package v1.0 (5 KB zip file) What...
cypressor - 29. Mär, 19:10
BATCHLIB_ Batchlib library...
The batchlib library string.cmd is part of the batchlib...
cypressor - 29. Mär, 18:10

Homepage Ticker

Links

Status

Online seit 6590 Tagen
Zuletzt aktualisiert: 28. Jun, 11:32
RSS XML 1.0 Button-Get-Firefox

batch
batchlib
howto
tech
video
Profil
Abmelden
Weblog abonnieren