OpenVPN-Site-to-Site-Bridged-German

From DD-WRT Wiki

Jump to: navigation, search

Contents

[edit] Vorwort

In diesem Tutorial will ich erklären, wie man mehrere Router und mobile Clients zu einem VPN zusammen schließt, in welchem alle eine IP-Adresse aus dem selben Adressraum haben, und sich gegenseitig im Netzwerk sehen können und auch Dateien hin-und-her kopiert werden können. Diese Anleitung basiert zum Großteil auf der englischen Anleitung für ein Site-to-Site Bridged VPN zwischen zwei Linksys WRT54GL Routern. (OpenVPN_-_Site-to-Site_Bridged_VPN_Between_Two_Routers) Allerdings waren in dieser Anleitung ein paar Fehler (zumindest funktionierte die Skripte bei mir nicht) weshalb ich sie ein wenig modifiziert habe (basierend auf ein paar anderen Tutorials, unter anderem das deutsche Tutorial OpenVPN-Tunnel_Server_/_Client,_Netzwerke_verbinden). Diese Anleitung funktioniert auch mit mehr als 2 Routern, zur Zeit laufen bei mir 3. Zusätzlich können sich auch noch mobile Clients ins Netzwerk verbinden.

[edit] Überblick

Die folgenden Skripte laufen bei mir auf 4 Linksys WRT54GL Routern, welche auf DD-WRT v23 SP3 geflasht sind. Auf den Windows-PC Clients läuft OpenVPN v2.0.9 mit dem GUI (zu bekommen unter http://openvpn.se/download.html). Die dd-wrt Konfigurationen müssen in Administration/Commands (http://dd-wrtrouter/Diagnostics.asp) als Startupscript gespeichert werden.

[edit] Zertifikate

Diesen Teil übernehme ich komplett aus der Anleitung für ein Routed-VPN. Die Zertifikate sollen wenn möglich auf einem Windows-XP Computer erstellt werden. Unter Vista spielt die UAC (User Account Control) irgendwie nicht so mit. Mir war es zumindest nicht möglich mit eingeschalteter UAC die notwendigen Schreibrechte etc. zu vergeben um die Zertifakte erstellen zu können. Unter XP ist das definitiv leichter.

[edit] Zertifikate

[edit] Erstellung von den notwendigen Zertifikaten unter Windows

  • Dos-Fenster öffnen:
Start
Ausführen
"cmd"
OK
  • Vorlagen erzeugen

vars.bat und openssl.cnf aus den Beispielen erzeugen

>c: 
>cd \programme\openvpn\easy-rsa 
>init-config 
  • Variablen anpassen
>notepad vars.bat 

set KEY_COUNTRY=DE
set KEY_PROVINCE=Berlin
set KEY_CITY=Berlin
set KEY_ORG=PrivatPerson
set KEY_EMAIL=mymail@gmx.net

Danach die Datei speichern und den Editor beenden.

  • Erstellen der Keys
>vars
>clean-all
>build-ca

hier alle Angaben bestätigen außer:
Eingabe "ca" (ohne Anführungsstriche) bei Organisational Unit Name
Eingabe "ca" (ohne Anführungsstriche) bei Common Name

>build-dh 
>build-key-server server1 

hier alle Angaben bestätigen außer:
Eingabe "server1" (ohne Anführungsstriche) bei Organisational Unit Name
Eingabe "server1" (ohne Anführungsstriche) bei Common Name
Eingabe "y" (ohne Anführungsstriche) bei Sign the Certificate?
Eingabe "y" (ohne Anführungsstriche) bei 1 of 1 certificate requests certi

>build-key client1 

hier alle Angaben bestätigen außer:
Eingabe "client1" (ohne Anführungsstriche) bei Organisational Unit Name
Eingabe "client1" (ohne Anführungsstriche) bei Common Name
Eingabe "y" (ohne Anführungsstriche) bei Sign the Certificate?
Eingabe "y" (ohne Anführungsstriche) bei 1 of 1 certificate requests certified, commit?

Dieser Schritt muss für jeden Client den man verbinden will wiederholt werden! Jeweils mit anderen Namen (z.B. client1, client2, mobile1, mobile2, etc...)

  • Client-Keys in eigenes Verzeichnis kopieren
>md austausch 
>cd keys 
>copy client1.crt  ..\austausch 
>copy client1.key  ..\austausch 
>copy ca.crt       ..\austausch 
>cd .. 

Der Inhalt des Ordners austausch kann / muss jetzt an die Clients versendet werden.
Die besten Übermittlungswege sind Diskette, USB-Stick oder ein verschlüsselter Datentransfer mit IM oder E-Mail (PGP, S-MIME).

Diesen Teil der Anleitung haben wir selbst von folgender Seite übernommen:
http://www.openvpn-forum.de/ext/VPN-Server.html

Danke an dem Ersteller dieser Anleitung

[edit] Konfiguration

[edit] IP-Adresse vergeben

Nachdem wir ein Bridged-VPN erstellen wollen, müssen alle Router eine IP-Adresse aus dem selben Pool bekommen, und auch an die Clients welche aus diesem Pool verteilen. Es darf aber natürlich keine IP-Adresse doppelt vorkommen, weil das zu Konflikten führen würden. Ich zeige hier die Einstellungen für den Adressraum 192.168.0.0-192.168.0.255 (Es kann natürlich jeder beliebiger Pool gewählt werden, nur muss er eben konsequent eingehalten werden.)

Router der als Server fungiert:

  • IP-Adresse des Routers: 192.168.0.1
  • DHCP-Startadresse: 192.168.0.50
  • Max. DHCP-User: 50

Router der als Client1 fungiert:

  • IP-Adresse des Routers: 192.168.0.2
  • DHCP-Startadresse: 192.168.0.101
  • Max. DHCP-User: 49

Router der als Client2 fungiert:

  • IP-Adresse des Routers: 192.168.0.3
  • DHCP-Startadresse: 192.168.0.151
  • Max. DHCP-User: 49

Wenn man Mehr als 3 Router ins Netzwerk aufnehmen will, muss man den einzelen Netzwerken einfach kleinere IP-Ranges zuteilen, einfach immer aufpassen, dass es zu keinen Überschneidungen kommt.


[edit] DDNS Eintrag erstellen

Solltet ihr von eurem ISP einen dynamische IP-Adresse zugewiesen bekommen, müsst ihr dem Router einen DDNS Eintrag verpassen. (Setup/DDNS) Damit können die Clients den Server auch erreichen, wenn ihr eine neue IP-Adresse bekommt.

[edit] Server Konfiguration (WRT54 - Linux)

Es ist zu empfehlen den Server am Standort mit der besten Internetanbindung einzurichten. (Höchster Upload)

#OpenVPN CFG (Server) 09.01.2008

cd /tmp
mkdir /tmp/myvpn
ln -s /usr/sbin/openvpn /tmp/myvpn/myvpn
/tmp/myvpn/myvpn --mktun --dev tap0
brctl addif br0 tap0
ifconfig tap0 0.0.0.0 promisc up

echo "
# Tunnel options
mode server       # Set OpenVPN major mode
proto udp         # Setup the protocol (server)
port 1194         # TCP/UDP port number
dev tap0          # TUN/TAP virtual network device
keepalive 15 60   # Simplify the expression of --ping 
daemon            # Become a daemon after all initialization
verb 3            # Set output verbosity to n 
comp-lzo          # Use fast LZO compression 

# OpenVPN server mode options
client-to-client  # tells OpenVPN to internally route client-to-client traffic 
duplicate-cn      # Allow multiple clients with the same common name
ifconfig-pool 192.168.0.201 192.168.0.210 255.255.255.0 # Define IP-Pool for OpenVPN clients

# TLS Mode Options
tls-server        # Enable TLS and assume server role during TLS handshake 
ca /tmp/myvpn/ca.crt
dh /tmp/myvpn/dh1024.pem
cert /tmp/myvpn/server.crt
key /tmp/myvpn/server.key
" > /tmp/myvpn/ipsec.config

 echo "
-----BEGIN CERTIFICATE-----
Insert the content of your ca.crt
-----END CERTIFICATE-----

" > /tmp/myvpn/ca.crt
echo "
-----BEGIN RSA PRIVATE KEY-----
Insert the content of your server.key
-----END RSA PRIVATE KEY-----

" > /tmp/myvpn/server.key
chmod 600 /tmp/myvpn/server.key
echo "
-----BEGIN CERTIFICATE-----
Insert the content of your server.crt
-----END CERTIFICATE-----

" > /tmp/myvpn/server.crt
echo "
-----BEGIN DH PARAMETERS-----
Insert the content of your dh1024.crt
-----END DH PARAMETERS-----
 " > /tmp/myvpn/dh1024.pem

route add -net 192.168.0.0/24 dev br0

sleep 5
/tmp/myvpn/myvpn --config /tmp/myvpn/ipsec.config

Diesen Teil müsst ihr im webfrontend unter Administration/Commands in das Textfenster kopieren und auf Save Startup' drücken.

Der Eintrag

duplicate-cn      # Allow multiple clients with the same common name

ist nur notwendig, wenn ihr für Alle Router/Clients ein einziges Zertifikat verwndet (nicht zu empfehlen, weil wenn jemand diese Zertifikat weiter gibt oder ihr jemanden ausschließen wollt werden alle anderen auch ausgeschlossen!).

Weiters müsst ihr folgenden Eintrag wieder in das Textfeld kopieren und diesesmal auf Save Firewall drücken.

iptables -I INPUT -p udp --dport 1194 -j ACCEPT

[edit] Client Konfiguration (WRT54 - Linux)

#OpenVPN CFG (Client) 09.01.2008
cd /tmp
mkdir /tmp/myvpn
ln -s /usr/sbin/openvpn /tmp/myvpn/myvpn

/tmp/myvpn/myvpn --mktun --dev tap0	# initialize tunnel
brctl addif br0 tap0			# create a new network-adapter
ifconfig tap0 0.0.0.0 promisc up
sleep 5

echo "
client				# Set OpenVPN mode to client
daemon
dev tap0			# TUN/TAP virtual network device
proto udp			# Set the protocol (udp/tcp)
remote xxx.xxx.xxx 1194	# Set the IP-adress/DNS-entry of the server
resolv-retry infinite
nobind
persist-key
persist-tun
ca /tmp/myvpn/ca.crt
cert /tmp/myvpn/client1.crt
key /tmp/myvpn/client1.key
ns-cert-type server
comp-lzo
verb 3
" > /tmp/myvpn/ipsec.config

echo "
-----BEGIN CERTIFICATE-----
 Insert the content of your ca.crt
-----END CERTIFICATE-----

" > /tmp/myvpn/ca.crt
echo "
-----BEGIN RSA PRIVATE KEY-----
 Insert the content of your client1.key
-----END RSA PRIVATE KEY-----

" > /tmp/myvpn/client1.key
chmod 600 /tmp/myvpn/client1.key
echo "
-----BEGIN CERTIFICATE-----
 Insert the content of your client1.crt
-----END CERTIFICATE-----
 
" > /tmp/myvpn/client1.crt

route add -net 192.168.0.0/24 dev br0

sleep 5
/tmp/myvpn/myvpn --config /tmp/myvpn/ipsec.config


Muss wieder unter Administration/Command eingefügt werden, und anschließend mit Save Startup gespeichert werden. Der DNS-Eintrag bzw. die IP-Adresse des Servers muss natürlich noch vorher geändert werden. Dieser Schritt muss natürlich auf jedem Router, der sich als Client zum Server verbinden soll, durchgeführt werden.

Wenn alles richtig hingehaut hat, sollte es nun möglich sein alle Router von einem Standort via webfrontend zu erreich, und auch zu pingen, gleiches gilt für die Clients hinter den Routern.


[edit] Externe Clients (Windows)

Auf den externen Clients welche Zugriff auf das Netzwerk erhalten sollen, z.B. Notebooks ohne festen Standort, muss natürlich zuerst der OpenVPN Client installiert werden, am besten mit GUI. (Download: http://openvpn.se/download.html ) Anschließend muss man die Schlüssel/Zertifikate für das Gerät übertragen (am besten so, dass sie niemand abhören/mitlesen kann.). Benötigt werden die Dateien:

* ca.crt
* mobile_XX.key
* mobile_XX.crt

Diese werden in einen neu erstellten Ordner im Programmordner von OpenVPN (standardmäßig C:\Programme\OpenVPN\ ) namens mobile_XX kopiert. Anschließend erstellt man eine Datei namens client.ovpn im Ordner config, in welche man folgende Parameter kopiert:

#OpenVPN CFG mobiler Client

port 1194 
remote xxx.xxx.xxx #Serveradresse  anpassen(URL oder IP)
proto udp
dev tap
tls-client
ns-cert-type server
ca C:\\Programme\\OpenVPN\\mobile_XX\ca.crt   #Pfad gegebenen Falls anpassen!
cert C:\\Programme\\OpenVPN\\mobile_XX\\mobile_XX.crt  #Pfad und Dateinamen gegebenen Falls anpassen!
key C:\\Programme\\OpenVPN\\mobile_XX\mobile_XX.key  #Pfad und Dateinamen gegebenen Falls anpassen!
pull   #Client verliert ohne das Pull bei Inaktivität die Verbindung


Anschließend kann man sich, nachdem man das GUI gestartet hat, verbinden, indem man in der Taskleiste einen Rechtsklick auf das OpenVPN GUI Symbol macht, und auf Connect klickt.


[edit] Fehlerdiagnose

Nachdem meistens nicht alles auf Anhieb so hinhaut wie man will, kann man sich den Log vom Router zum Computer schicken lassen, und sieht so ob sich etwas tut.

Am leichtesten geht dies so: 1. Zuerst verbindet man sich zum Router via webfrontend, geht auf Administration/Services und scrollt runter, und setzt ein Häckchen bei Syslog, und trägt die IP-Adresse vom Computer ein, an den man die Log schicken will

  Image:Syslogview.JPG 

2. Müsst ihr euch einen Syslog-Viewer herunterladen. Z.B. hier http://www.kiwisyslog.com/kiwi-syslog-daemon-overview/

3. Installiert das Programm und startet es (wenn ihr es nicht als Dienst installiert habt), und schaut dass es aktiv ist.

Wenn ihr jetzt einen Reboot beim Router durchführt 'Administration/Management (Bottom of the site), sollten alles Status Meldungen an den PC weitergeleitet werden, den ihr angegeben habt. Wenn eurer VPN erfolgreich läuft, könnt ihr natürlich sämlichte Logs an einen zentralen Computer schicken lassen.


[edit] Schlussworte

Ich hoffe diese Anleitung ist halbwegs verständlich. Viel Vergnügen beim Basteln!

An english version of this tutorial will follow!