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 openvpnNun 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-rsaNun editieren wir die vars Datei entsprechend unseren Bedürfnissen und passen folgende Werte an.
cd /etc/openvpn/easy-rsa
cp /usr/share/doc/openvpn/examples/easy-rsa/2.0/* .
export KEY_SIZE=2048Anschliessend erzeugen wir als erstes unsere Certificate Authority (ca).
export KEY_COUNTRY="DE"
export KEY_PROVINCE="yourProvince"
export KEY_CITY="yourCity"
export KEY_ORG="yourOrganization"
export KEY_EMAIL="yourEMail"
. ./varsEs 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.
./clean-all
./build-ca
./build-key-server vpn.example.comBei 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 client1Als nächstes erzeugen wir nun die Diffie-Hellman Parameter. Dieser Vorgang kann eine Weile dauern...
./build-dhWir 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.confAnschliessend editieren wir die Datei wie folgt...
#dynamic tun deviceDie 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.
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
touch networkA.up; chmod +x networkA.upWir fügen folgende Route hinzu:
#!/bin/shDer 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.
route add -net 10.0.0.0 netmask 255.255.255.0 gw $5
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.confund 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.2Mit diesen Einstellungen werden Packete die für Netzwerk A bestimmt sind an unseren VPN Gateway 192.168.0.2 weitergeleitet.
route add -net 192.168.100.0 netmask 255.255.255.0 gw 192.168.0.2
Testen der Konfiguration
Wir starten nun den openvpn Daemon auf beiden Gateways...service openvpn start #restartDebug Informationen können wir über die daemon.log erhalten.
tail -f /var/log/daemon.logWir 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