Mittwoch, 21. August 2013

OpenVPN Debian Wheezy + Seagate Dockstar

Dieser Blogpost beschreibt die Einrichtung einer sicheren Verbindung zwischen 2 gesicherten Netzwerken - kurz eines VPN-Netzwerks. Das folgende Bild beschreibt meinen Aufbau.

Wir haben 2 Netzwerke (Netzwerk A: 192.168.100.0/24 und Netzwerk B: 192.168.0.0/24) welche wir via VPN miteinander verbinden wollen. Im Netzwerk A gibt es einen öffentlich erreichbaren Rechner der als Router, Firewall und VPN Gateway funktioniert. Im Netzwerk B gibt es eine Router&Firewall Box, ebenfalls mit öffentlicher IP, welche die Verbindung zum Internet über einen gängigen Provider herstellt. Im Netzwerk B verwenden wir den Dockstar als VPN Gateway, da die Router&Firewall Box keine VPN Funktionalität bietet. In beiden Netzwerken befinden sich weitere Rechner welche von jeder Seite aus erreichbar sein sollen. Im folgenden werden wir Schritt für Schritt ein Zertifikat basiertes VPN installieren und konfigurieren.
OpenVPN unterscheidet in seiner Konfiguration zwischen Clients und Servern. Wir werden daher den OpenVPN Server auf den Gateway in Netzwerk A und den Client auf der Dockstar in Netzwerk B installieren.

Installation und Konfiguration (Netzwerk A)


Als erstes installieren wir das openvpn Packet mittels apt-get.
apt-get install openvpn
Nun nutzen wir easy-rsa um die benötigten Zertifikate für den Server zu erstellen. Wir erstellen uns als erstes ein Zertifikat Verzeichnis /etc/openvpn/easy-rsa und kopieren dann den Inhalt von easy-rsa in dieses Verzeichnis.
mkdir -p /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
cp /usr/share/doc/openvpn/examples/easy-rsa/2.0/* .
Nun editieren wir die vars Datei entsprechend unseren Bedürfnissen und passen folgende Werte an.
export KEY_SIZE=2048
export KEY_COUNTRY="DE"
export KEY_PROVINCE="yourProvince"
export KEY_CITY="yourCity"
export KEY_ORG="yourOrganization"
export KEY_EMAIL="yourEMail"
Anschliessend erzeugen wir als erstes unsere Certificate Authority (ca).
. ./vars
./clean-all
./build-ca
Es werden nun hauptsächlich die default Werte aus der vars verwendet. Bei der Frage nach den common-name geben wir unseren Servernamen ein, z.B. "vpn.example.com". Nun erzeugen wir noch ein Zertifikat für den Server und unsere Client Zertifikate.
./build-key-server vpn.example.com
Bei der Abfrage nach den common Name geben wir erneut "vpn.example.com" ein. Anschliessend bestätigen wir noch die beiden Fragen "Sign the certificate? [y/n]" und "1 out of 1 certificate requests certified, commit? [y/n]" jeweils mit y. Um ein Client Zertifikat für "client1" zu erzeugen geben wir nun noch folgendes Kommando ein. Bei der Frage nach dem common Name geben wir wieder "vpn.example.com" ein.
./build-key client1
Als nächstes erzeugen wir nun die Diffie-Hellman Parameter. Dieser Vorgang kann eine Weile dauern...
./build-dh
Wir haben jetzt alle benötigten Zertifikate und Schlüsselim Verzeichnis /etc/openvpn/easy-rsa/keys vorliegen. Wir haben ebenfalls bereits für einen Client (client1) ein Zertifikat erstellt. Ein Client (clientX) benötigt bei sich lokal dann jeweils 3 Dateien (clientX.crt, clientX.key und die ca.crt).

Erstellen der Konfigurationsdatei für Netzwerk A

Wir erstellen uns nun eine serverseitige openvpn Konfiguration. Dazu erstellen wir uns eine networkA.conf Datei im /etc/openvpn Verzeichnis.
touch /etc/openvpn/networkA.conf
Anschliessend editieren wir die Datei wie folgt...
#dynamic tun device
dev tun
# P2P local VPN endpoint is 10.0.0.1, remote VPN endpoint is 10.0.0.2
ifconfig 10.0.0.1 10.0.0.2
#SSL/TLS key exchange
tls-server
#Certs/Keys/DH parameters
dh /etc/openvpn/easy-rsa/keys/dh2048.pem
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/vpn.mindfab.net.crt
key /etc/openvpn/easy-rsa/keys/vpn.mindfab.net.key

#downgrade to UID,GID nobody after initialization
user nobody
group nobody
#enable LZO compression
comp-lzo
#ping every 15 seconds (keep statefull firewalls open)
ping 15
#verbosity level (3 medium)
verb 3


#push our own network (192.168.100.0/24 - see picture above) to the client
push "route 192.168.100.0 255.255.255.0"

#allow routing to the client network (192.168.0.0/24)
route 192.168.0.0 255.255.255.0

#openvpn 2.0 introduced script security, we need at least level 2.
script-security 2
#execute external script to add tun routing...
up ./networkA.up
Die einzelnen Parameter sind in den openvpn Beispielen ganz gut dokumentiert - siehe auch /usr/share/doc/openvpn/examples/sample-config-files/. Als Anhaltspunkt kann hierzu tls-office.conf dienen. Nun erstellen wir noch die networkA.up Datei welche die Routing Tabelle beim aufbauen der VPN Verbindung anpassen soll.
touch networkA.up; chmod +x networkA.up
Wir fügen folgende Route hinzu:
#!/bin/sh
route add -net 10.0.0.0 netmask 255.255.255.0 gw $5
Der interessante Teil unsere Konfiguration ist der, wo wir die verschiedenen Netzwerke für den Client verfügbar machen. Dies geschieht über den push "route 192.168.100.0 255.255.255.0" Befehl. Dieser Befehl veranlasst den Client bei Verbindungsaufbau lokal bei sich eine Route (route add -net 192.168.100.0 netmask 255.255.255.0 gw 10.0.0.1) einzufügen. Der Befehl route 192.168.0.0 255.255.255.0 veranlasst den Server einen entsprechenden Routing Eintrag in seine Routing Tabelle einzufügen. Somit kann dann Netzwerk A nach Netzwerk B als auch umgekehrt Netzwerk B nach Netzwerk A routen.

Achtung, bitte auch die Anmerkungen ganz unten lesen...

Installation und Konfiguration (Netzwerk B)

Als erstes installieren wir das benötigte openvpn Packet auf der Dockstar. Anschliessend kopieren wir die erzeugten Client Schlüssel von den Gateway aus Netzwerk A auf den VPN Gateway(Dockstar) in Netzwerk B.
root@dockstar: cd /etc/openvpn
scp root@222.100.100.222:/etc/openvpn/easy-rsa/keys/client1.crt .
scp root@222.100.100.222:/etc/openvpn/easy-rsa/keys/client1.key .
scp root@222.100.100.222:/etc/openvpn/easy-rsa/keys/ca.crt .

Erstellen der Konfigurationsdatei für Netzwerk B

Auf unserer Dockstar erstellen wir nun eine Client Konfigurationsdatei...
touch /etc/openvpn/client.conf
und editieren diese wie folgt.
client
dev tun
remote 222.100.100.222 1194
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
ns-cert-type server
comp-lzo
verb 3
ifconfig 10.0.0.2 10.0.0.1

Firewall/Gateway Anmerkungen

In unseren Setup sind wir auf die Konfiguration (öffnen der Firewalls) nicht eingegangen. In unseren Beispiel ist es daher noch nötig die Firewall auf den Gateway in Netzwerk A auf UDP Port 1194 (default OpenVPN Port) zu öffnen. Weiterhin ist es notwendig, das Packete von den tun Interfaces auf das lokale Netzwerk geroutet werden dürfen (Forwarding chain), sowie das IP Forwarding aktiviert ist (siehe auch hier unter Punk 2) - dieser Punkt muss für beide Gateways erfüllt sein.
Da auf der Client Seite (Netzwerk B) der VPN Server nicht auf den Gateway liegt bedarf es hier noch weiterer Anpassungen bzgl. des Routings. In der Firewall&Gateway Box fügen wir daher noch 2 weitere (erweiterte) Routing Einstellungen hinzu.

route add -net 10.0.0.0 netmask 255.255.255.0 gw 192.168.0.2
route add -net 192.168.100.0 netmask 255.255.255.0 gw 192.168.0.2
Mit diesen Einstellungen werden Packete die für Netzwerk A bestimmt sind an unseren VPN Gateway 192.168.0.2 weitergeleitet.

Testen der Konfiguration

Wir starten nun den openvpn Daemon auf beiden Gateways...
service openvpn start #restart
Debug Informationen können wir über die daemon.log erhalten.
tail -f /var/log/daemon.log
Wir sollten nun die Gegenseiten der tun Devices pingen können.
root@dockstar: ping 10.0.0.1
ping 192.168.100.100

root@workstation1: ping 192.168.0.2
ping 192.168.0.1
ping 192.168.0.100

Referenzen

  • http://openvpn.net/index.php/open-source/documentation/howto.html
  • http://dev.shyd.de/2011/02/dockstar-howto-setup-openvpn-debian/

Keine Kommentare:

Kommentar veröffentlichen