Die letzten Tage habe ich damit verbracht ein Telefon sicher und zuverlässig mit einer SIP Telefonanlage zu verbinden, welches im Homeoffice stehen soll. Jeder der mit VoIP zu tun hat, weiß, das SIP/RTP sich nicht sehr gut mit diversen NAT Routern oder Firewalls verträgt. Auch wenn die Ports alle offen sind (was ja wieder ein Sicherheitsrisiko darstellt), sind einfach die verschiedensten Router, Fritzboxen und Firewalls dieser Welt einfach zu unüberschaubar in ihrer Konfigurationsvielfalt.

Und dabei geht es doch so viel einfacher. Mit OpenVPN.

Ganz einfach ausgedrückt: OpenVPN ist wie eine Art virtuelles Netzwerkkabel, welches zwischen dem Telefon und der Telefonanlage gespannt wird und eine verschlüsselte Kommunikation gewährleistet.
Besser noch: Durch dieses virtuelle Netzwerkkabel IST das Telefon Teil des Firmennetzwerkes und funktionert haargenau so, als wenn es IN den Büroräumen stehen würde.

Vorher (verinfacht):
Telefon -> Router  -> Internet -> Router -> Telefonanlage

Nachher (vereinfacht):
Telefon -> OpenVPN -> Telefonanlage

Damit entfällt eine Konfiguration und die Fehlerquelle Router komplett, die Verbindung auf dem Weg vom Telefon zur Telefonanlage wird nicht zig mal angefasst oder verändert. Yay!

Diese Lösung wurde (das sie nur sehr wenige Nutzer hat) denkbar einfach realisiert und verbraucht so gut wie nix an Strom. Mit einem RaspberryPI3, Raspian (Debian) und OpenVPN.

Im wesentlich sind das meine Aufzeichnungen der Installation, da ich keine zusammenhängende und gültige Anleitung gefunden habe. Irgendwie war immer irgendwas falsch oder überholt.

Inhaltsverzeichnis

 


Variablen

Hier werden bestimme Namen und Dateinamen vorgegeben, die man tunlichst auf die eigene Bedürfnisse anpassen sollte (sind unten in Rot markiert):

# sip.cc.local = Serverzertifikat
# snom.cc.local = Zertifikat des Telefons
# firma.dyndns.biz = Hostname des OpenVPN Servers (idealerweise ein externer FQDN)
# 192.168.22.0 = VPN Subnetz
# 192.168.2.0 = Lokales Netz
# vpnclient-snom-user1 = VPN Benutzername


Vorraussetzung auf der Serverseite

  • Raspberry: Ein aktuelles Rasbian ist installiert und betriebsbereit
  • Raspberry: Interne feste IP Adresse
  • Router: Von außer per DNS oder DynDNS erreichbar
  • Router: einkommende NAT Regel Port 8443, Protokoll TCP auf interne IP und Port 443 des OpenVPN Servers
  • Router: einkommende NAT Regel Port 1194, Protokoll UDP auf interne IP und Port 1194 des OpenVPN Servers


Vorraussetzung auf der Clientseite (Telefon)

  • Nichts besonderes, hauptsache Strom und ein Netzwerkkabel welches per DHCP eine IP Adresse zuweist und das Routing ins Internet ermöglicht.
  • Die zugewiesene IP Adresse muss aber bekannt sein, damit die Konfiguration auf dem Telefon vorgenommen werden kann (steht unter Info im Display)
  • Das Snom benötigt eine OpenVPN Firmware die aufgespielt werden muss, bevor es weitergeht.


Wie ist der Ablauf

  • Das Telefon bekommt eine URL zu einer Datei, die automatsch vom Telefon runtergeladen wird:
    • Diese wird intern verarbeitet und die Informationen und Zertifikate zum Aufbau einer VPN Verbinung eingelesen und im Telefon hinterlegt
    • Diese Datei wird per HTTPS verschlüsselt übertragen und vorher wurde ein Benutzername und Kennwort abgefragt. Sonst könnte sich JEDER nur duch das auslesen der Datei und Zertifikate mit dem Firmennetzwerk verbinden!
  • Das Telefon kann dann die VPN Verbindung schließlich aufbauen

Hier in der Anleitung arbeiten wir mit der LAN IP 192.168.2.0/24
und OpenVPN bekommt 192.168.22.0/24

Alle Dinge beginnen mit einem beherzten root-fähigem Login per SSH oder Putty auf den frisch installierten RaspberryPi.

Ich hasse sudo, lasst uns die Befehle direkt eingeben:

# sudo -i

OpenVPN und Apache installieren

# apt-get install openvpn apache2

OpenVPN Grundkonfiguration

# cd /usr/share/doc/openvpn/examples/sample-config-files/
# cp server.conf.gz /etc/openvpn/
# cd /etc/openvpn/
# gunzip server.conf.gz

OpenVPN Zertifikate vorbereiten

Die Verbindung wird mittels Zertifikate ermöglicht und nicht per Benutzername und Kennwort. Dazu brauchen wir:

  • Ein Stammzertifikat,
  • ein Serverzertifikat (was von dem Stammzertifikat bestätigt wird) und
  • das Zertifikat für das Telefon (welches auch von dem Stammzertifikat bestätigt wird.
    „bestätigen“ bedeutet signieren. Damit vertrauen sich die Zertifikate dann gegenseitig.

Die vorausgefüllten Felder sind Beispielinhalte sind durch eure eigenen Angaben natürlich zu ersetzen.

# mkdir /etc/openvpn/easy-rsa/ && cp -R /usr/share/easy-rsa/ /etc/openvpn/
 # cd /etc/openvpn/easy-rsa
 # mkdir keys
 # cp openssl-1.0.0.cnf openssl.cnf
 # nano vars

export KEY_COUNTRY=“DE“
export KEY_PROVINCE=“NRW“
export KEY_CITY=“ERKRATH“
export KEY_ORG=“CC“
export KEY_EMAIL=“info@computing-competence.de“
export KEY_OU=“IT“

# source ./vars
# ./clean-all

OpenVPN Rootzertifikat erstellen

# ./build-ca

Common Name (eg, your name or your server’s hostname) [CC CA]:

OpenVPN Serverzertifikat

# ./build-key-server sip.cc.local

name :PRINTABLE:’OpenVPN Server‘

OpenVPN Clientzertifikat

Hier wird nur ein Clientzertifikat erstellt. Entweder man benutzt dieses eine für mehrere Telefone oder für jedes Telefon wird ein eigenes erstellt. Eure Entscheidung, die sich aber in der OpenVPN Server Konfiguration wiederspiegeln muss (duplicate-cn). Hier braucht erstmal jeder ein eigenes.

# ./build-key snom.cc.local

name :PRINTABLE:’OpenVPN Client‘

Und schließlich alles zusammenfügen und fertig machen. Das dauert etwas.

# ./build-dh

OpenVPN Server einrichten

# nano /etc/openvpn/server.conf

port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/vpn.local.crt
key /etc/openvpn/easy-rsa/keys/vpn.local.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem
server 192.168.22.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push „route 192.168.2.0 255.255.255.0″
keepalive 10 120
cipher AES-256-CBC
persist-key
persist-tun
status openvpn-status.log
log-append /var/log/openvpn.log
verb 4
mute 20
explicit-exit-notify 1

OpenVPN Client vorbereiten

# mkdir /etc/openvpn/client/tmp
 # cd /etc/openvpn/client/tmp
 # cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client/tmp/vpn.cnf
 # nano vpn.cnf

client
dev tun
proto udp
remote firma.dyndns.biz 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /openvpn/ca.crt
cert /openvpn/client.crt
key /openvpn/client.key
ns-cert-type server
verb 0
ping 10
ping-restart 60
cipher AES-256-CBC

Snom VPN Paket erstellen

Die oben erwähnte geheimnisvolle Datei ist eigentlich ein Paket, muss noch erstellt und in ein Webserververzeichnis gelegt werden.

# cp /etc/openvpn/easy-rsa/keys/snom.cc.local.crt /etc/openvpn/client/tmp/client.crt
# cp /etc/openvpn/easy-rsa/keys/snom.cc.local.key /etc/openvpn/client/tmp/client.key
# cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn/client/tmp/ca.crt
# cd /etc/openvpn/client/tmp/
# chown -Rf root:root *
# chmod -R 700 *
# tar cvpf vpnclient-snom-user.tar *
# cp /etc/openvpn/client/tmp/vpnclient-snom-user.tar /var/www/html/openvpn/

Passwortschutz für das OpenVPN Verzeichnis

# mkdir /var/www/html/openvpn/
# touch /var/www/html/openvpn/.htaccess
# nano /var/www/html/openvpn/.htaccess

AuthType Basic
AuthName „vpnclient-snom-user1
AuthUserFile .htpasswd
Require user vpnclient-snom-user1

# htpasswd -c /var/www/html/openvpn/.htpasswd vpnclient-snom-user1

New password:
Re-type new password:

SSL Erweiterung bei Apache aktivieren

# a2enmod ssl
 # nano /etc/apache2/sites-available/default-ssl.conf

SSLCertificateFile /etc/openvpn/easy-rsa/keys/vpn.local.crt
SSLCertificateKeyFile /etc/openvpn/easy-rsa/keys/vpn.local.key
SSLCertificateChainFile /etc/openvpn/easy-rsa/keys/ca.crt

# a2ensite default-ssl.conf

Dienst beim Bootvorgang mitstarten

# service apache2 enable
 # service openvpn enable

Nun alle Dienste starten

# service apache2 start
# service openvpn start

Routing zwischen 192.168.2.0 und 192.168.22.0 ermöglichen

# sysctl -w net.ipv4.ip_forward=1
# nano /etc/sysctl.conf

net.ipv4.ip_forward=1

 

Test

Versucht nun mal die Datei von dem Webserver runterzuladen:
https://vpnclient-snom-user1:PASSWORT@firma.dyndns.biz:8443/openvpn/vpnclient-snom-user1.tar
Wenn das geklappt hat kann nun das Telefon eingerichtet werden:

Dem Snom Telefon die VPN Konfig hinterlegen

Snom- Erweitert – QoS/Sicherheit –
VPN: an
Unkomprimierter VPN Konfig. Tarball: https://vpnclient-snom-user1:PASSWORT@firma.dyndns.biz:8443/openvpn/vpnclient-snom-user1.tar
Neustarten (Das Telefon startet 2x selbstständig neu)