Openvpn SNOM

Aus metasec wiki
Wechseln zu: Navigation, Suche

--Aq 12:28, 10. Jan. 2011 (UTC)

Snom bietet eine alternative Firmware für ihre Telefone an, die openVPN Verbindungen ermöglicht. Hiermit kann sich das Telefon in ein VPN einwählen und über diese Tunnel ein Verbindung zum entsprechenden Server aufbauen.

Vorteile sind:

  • Nur ein Port muss nach außen geöffnet werden
  • Tunnel komplett verschlüsselt

Firmware

Die entsprechende Firmware basiert auf einer offiziellen 7er Firmware.

Zum flashen des Telefons kopiert man diesen Link FIRMWARE und fügt ihn im Web Interface des Telefons auf der "Software Update" Seite ein. Anschliessend muss man mit "Load" bestätigen und die Firmware wird geladen.

(Alternativ existiert auch schon eine vpn Firmware, die auf der 8er Firmware basiert. Diese wurde von uns aber noch nicht ausreichend getestet)

openVPN

Das Herz bildet ein openVPN Server im lokalen Netzwerk. Zunächst sollte, wenn noch nicht vorhanden eine PKI aufgebaut werden. Folgende Beisiele basieren auf easy-rsa 2.0, welches mit openvpn mitgeliefert wird.

Hinweis: openVPN unter Verwendung von TCP setzt eine hohe Bandbreite vorraus. Ausserdem ist die Sprachqualität hörbar verschlechtert im Vergleich zu einem Einsatz von UDP. TCP(UDP(RTP)) -> Die Sprachpakete werden in UDP verpackt. Den daraus resultierenden Geschwindigkeitsvorteil macht eine weitere Kapselung in TCP Pakete zu nichte. Allerdings gilt es zu beachten, dass beim Einsatz von UDP Probleme in Verbindung mit NAT auftreten können.

CA erstellen

Wechsel in das easy-rsa Verzeichniss, editieren der Datei "vars", und generieren der CA Zertifikate.

cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/
vi vars
source ./vars
./clean-all
./build-ca

Die Datei vars sollte entsprechend der eigenen Bedürfnisse editiert werden. Veränderungen müssen an den unteren EInträgen vorgenommen werden.

# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="DE"
export KEY_PROVINCE="NRW"
export KEY_CITY="Witten"
export KEY_ORG="Metasec"
export KEY_EMAIL="admin@metasec.de"

Zertifikate erstellen

Neben dem CA Zertifikat muss nun ein Zertifikat für den Server und für jeden CLienten (Snom Telefon) erstellt werden. Zunächst wird erneut die vars editiert, gesourcet und anschliessend das Zertifikat erzeugt.

vi vars
source ./vars
./build-key-server $SERVER
./build-key $CLIENT

Alle Zertifikate werden im Unterverzeichniss keys gespeichert.

Möchte man ALLES rückgängig machen reicht ein ./clean-all aus. Dies löscht alle Zertifikate (CA, Server, Client) sowie alle Listen.

Für den Server werden noch Diffie-Hellmann Parameter benötigt:

./build-dh

Server Konfig

Im Prinzip kann eine klassische openVPN Server Konfig genommen werden. Zu beachten ist, das lzo-compression deaktiviert ist und das Netzwerk, welches den VoIP Server beherbergt gepusht wird.

port 1198

proto tcp ;proto udp
;dev tap dev tun
ca /etc/openvpn/Server/ca.crt cert /etc/openvpn/Server/server.crt key /etc/openvpn/Server/server.key # This file should be kept secret dh dh1024.pem
server 10.8.123.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "route 192.168.44.0 255.255.255.0"  ;push "route 192.168.20.0 255.255.255.0"  ;push "redirect-gateway"  ;push "dhcp-option DNS 10.8.0.1"  ;push "dhcp-option WINS 10.8.0.1" client-to-client keepalive 10 120
#comp-lzo
;max-clients 100 ;user nobody ;group nogroup persist-key persist-tun status openvpn-status.log ;log openvpn.log ;log-append openvpn.log verb 2 ;mute 20

Client Konfiguration

Dies ist der etwas komplizierte Part. Die Konfiguation muss eine exakte Struktur aufweisen. Anschliessend muss die Konfiguration zusammen mit den Zertifikaten in ein tar Archiv gepackt werden und auf einem http(s) Server bereitgestellt werden.
Die Konfiguration muss den Namen vpn.cnf habe!!
Der Pfad der Zertifikate auf dem Telefon ist /openvpn (Angabe im Konfig File)!!!

client
dev tun

# (TCP(UDP(RTP))) :) ;proto udp proto tcp remote 80.153.181.30 1198
resolv-retry infinite nobind persist-key persist-tun
ca /openvpn/ca.crt cert /openvpn/client.crt key /openvpn/client.key
ns-cert-type server
#comp-lzo
# Set log file verbosity. verb 0 ;mute 20 ping 10 ping-restart 60

Diese Konfig legt man in ein Verzeichniss, in dem auch ca.crt, client.crt und client.key liegen und erzeugt den tarball:

cd /in/das/Verzeichniss
chown -R root:root *
chmod -R 700 *
tar cvpf vpnclient.tar *

Dieses Archiv legt man nun auf einen http(s) Server. Anmerkungen:

  • Client Konfig MUSS vpn.cnf heissen
  • Zertifikate können beliebig heissen, aber in der Konfig muss /openvpn/$ZERT angegeben sein
  • Der Tarball darf nur Dateien ohne Verzeichnissstruktur entahlen.
  • comp-lzo MUSS deaktiviert sein
  • tcp verlangsamt die Verbindung tcp(udp(rdp)), aber umgeht NAT Problematik.

Telefon einrichten

Im Webinterface wechselt man auf "Advanced->QoS/Security" und aktiviert VPN. Ein Neustart ist nötig! Nun kann man die Adresse des tarballs auf dem http Server angeben und erneut speichern und rebooten. Sind alle Konfigurationen korrekt, so erscheint nach erfolgreichem Boot im Display des Snom rechts unten ein VPN Symbol.

Automatik

Die Erstellung von weiteren Zertifikaten kann auch automatisiert werden. Dazu müssen einfach eingegebene Variablen in die vars geschrieben werden. Anschliessend startet man ein Script, das die vars sourced und dann ./build-key $CLIENT startet.

build-key muss so modifiziert werden, dass es nicht interaktiv durchläuft.

#!/bin/bash

# Make a certificate/private key pair using a locally generated # root certificate.
export EASY_RSA="${EASY_RSA:-.}" #"$EASY_RSA/pkitool" $* "$EASY_RSA/pkitool" $*

Das selbe kann auch für CA oder Server Zertifikate erfolgen. Anschliessend müssen einfach alle Zertifikate, die $CLIENT.* heissen in ein Unterverzeichniss kopiert werden. Hinzu wird noch das ca.crt kopiert, sowie eine modifizierte vpn.cnf (Anpassung der Zertifikatnamen). Der Inhalt des Verzeichniss muss getart werden und man hat einen funktionierenden tarball.

Debugging

Das OpenVPN kann seine Logausgaben an einen Netcat "Server" ausgeben. Dazu muss auf einem Linuxrechner einfach nur eine NC Instanz aufgerufen werden

netcat -l -p 5000

und im Telefon den Parameter "vpn netcatserver" setzen mit folgender Syntax ( IP/DNS-Name Port)

1.2.3.4 5000


Konfig 2.0

Nach einigem Hin und Her hat sich die folgende Konfiguration als optimal raus gestellt

Server Seite


client-to-client
port 5000
proto udp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key  # This file should be kept secret
dh dh1024.pem
server 10.9.123.0 255.255.255.0
ifconfig-pool-persist ipp.txt
# push "route 10.10.10.0 255.255.255.0"
client-to-client
keepalive 10 60
persist-key
persist-tun
status  /var/log/openvpn/openvpn-status.log
log     /var/log/openvpn/openvpn.log
verb 4
client-config-dir /etc/openvpn/ccd/
mssfix 1200
fragment 1200
script-security 2

Client / Telefon

client
dev tun
proto udp
remote tkh-voip.metasec.de 5000
resolv-retry infinite
nobind
persist-key
persist-tun
ca /openvpn/ca.crt
cert /openvpn/57.crt
key /openvpn/57.key
ns-cert-type server
verb 5
ping 10
ping-restart 60
mssfix 1200
fragment 1200
script-security 2


Wichtig ist das mssfix-ing. Die Telefone neigen dazu, dass der Tunnel zusammenbricht, wenn es s.g. Klampingprobleme gibt hinter NAT Routern.

Provisionierung

vpn_on: on
vpn_tarball_url: http://host/download/{mac}.tar
vpn_netcatserver: 192.168.1.1 5000