Mit OpenVPN zwei Netzwerke verbinden
Das Gateway läuft perfekt im eigenen Netzwerk, doch nun möchte man noch ein anderes Netzwerk, z.B. das der Eltern, oder der Firma mit dem eigenen verbinden - Die Möglichkeit heutzutage auf billig-Routern ein Linux, wie OpenWRT installieren zu können, macht dies relativ einfach möglich!Vorwort
In diesem Workshop werden wir als erstes ein zweites Netzwerk mit der Netzadresse 10.1.2.0/24 (subnet: 255.255.255.0) erstellen, dass wir dann über VPN Verbinden.Im zweiten Teil, wird aufgezeigt, wie man sich auch "unterwegs" an seinem VPN-Netzwerk anmelden kann.
Ich werde hier nicht gross auf die Grundlagen über VPNs eingehen - Für diese empfehle ich das sehr tolle Buch: "OpenVPN Kompakt" von Thomas Zeller.
Hardware
Grundsätzlich könnte man auch auf beiden Seiten einen OpenWRT Router haben; wir werden aber in diesem Workshop das bereits vorhandene Gateway aus Router / Firewall selbst Bauen verwenden und das Netzwerk um ein zweites erweitern; dieses hat ein auf OpenWRT basierendes System als VPN-Gateway am laufen.
Leider ändert das OpenWRT-Projekt bei fast jedem neuen release die Konfigurationsmethoden wieder radikal; d.H., was in Version 7.09 galt, gilt nicht mehr für Version 8.09, usw.
Dieses Tutorial bezieht sich deshalb ausdrücklich auf die Version 8.09!
Dieses Tutorial bezieht sich deshalb ausdrücklich auf die Version 8.09!
Voraussetzungen
- Setup wie in: Router / Firewall selbst Bauen beschrieben- Ein OpenWRT-fähiger router mit OpenWRT installiert (siehe: Einen OpenWRT router installieren )
- Je eine öffentliche IP-Adresse auf dem VPN-Server und dem OpenWRT Router
IP Schema
Damit ein VPN funktioniert, müssen alle Netzwerke ein separates IP-Netz haben.Wir entscheiden uns hier für das 10.1.X.X Netz, d.h.:
Das erste Netzwerk hat die IP-Adressen 10.1.1.0 bis 10.1.1.254,
das zweite 10.1.2.0 bis 10.1.2.254,
das dritte 10.1.3.0 bis 10.1.3.254, usw.
Alle Netzwerke haben die Subnetz-Maske 255.255.255.0.
Zusätzlich braucht man noch ein IP-Netz fürs VPN selber, dieses wählen wir mit 10.1.20.0 / 255.255.255.0
Software
Im nachfolgenden wird das Gateway aus dem ersten Workshop als "vpnserver", das OpenWRT Gateway als "vpnclient-1" und der PC/Notebook eine einzelnen Benutzers als "vpnuser-1" bezeichnet.
Der Rechner auf dem wir die Zertifikate erstellen heisst: certserver.
Der Rechner auf dem wir die Zertifikate erstellen heisst: certserver.
Zertifizierungsstelle einrichten
Damit wir für den server und den client SSL-Zertifikate erstellen können, müssen wir zuerst eine sog. "Zertifizierungsstelle" einrichten; diese wird nur an einer zentralen Stelle benötigt!
Mithilfe der Zertifizierungsstelle kann man beliebig Zertifikate erstellen um über VPN uneingeschränkt auf dein Netzwerk zuzugreifen!
Aus diesem Grunde sollte sich die Zertifizierungsstelle nicht auf dem VPN-Server befinden, sondern am besten auf einem Server oder Client innerhalb des Netzwerkes.
Ansonsten könnte ein Hacker, wenn er die Kontrolle über den VPN-Server erlangt sich selbst ein Zertifikat ausstellen und hätte dann uneingeschränkten Zugriff auf dein ganzes Netzwerk!
Aus diesem Grunde sollte sich die Zertifizierungsstelle nicht auf dem VPN-Server befinden, sondern am besten auf einem Server oder Client innerhalb des Netzwerkes.
Ansonsten könnte ein Hacker, wenn er die Kontrolle über den VPN-Server erlangt sich selbst ein Zertifikat ausstellen und hätte dann uneingeschränkten Zugriff auf dein ganzes Netzwerk!
Wir nehmen hierzu einen Linux Homeserver für die Zertifizierungsstelle; dieser trägt den Namen: "certserver".
Da man auf einem Linux System als "root" nur administrative Arbeiten durchführen sollte, kann man sich einen Optionalen Benutzer (z.B.: "certadmin") erstellen und dann entweder per direktem login, oder root und dann "su - certadmin" auf diesen Benutzer wechseln:
Alle nachfolgenden Schritte für das Einrichten der Zertifizierungsstelle können ab jetzt mit dem Benutzer "certadmin" erledigt werden.
[root@certserver ~]$ useradd -m certadmin [root@certserver ~]$ su - certadmin
Alle nachfolgenden Schritte für das Einrichten der Zertifizierungsstelle können ab jetzt mit dem Benutzer "certadmin" erledigt werden.
Die scripte, die beim Umgang mit der Zertifizierungsstelle helfen sind in einem Verzeichnis namens "easy-rsa" gespeichert, die mit der OpenVPN installation mitgeliefert werden.
Als erstes kopieren wir diese Scripte ins Home-Verzeichnis des der Zertifizierungsstelle (z.B. /home/certadmin):
[certadmin@certserver ~]$ cp -Rv /usr/share/doc/openvpn/examples/easy-rsa/2.0 ~/easy-rsa; cd ~/easy-rsa
Durch ausführen von
[certadmin@certserver ~]$ ./build-caerstellen wir nun erst das root-zertifikat.
Zertifikate erstellen und kopieren
Jetzt können noch die Zertifikate für die clients erstellt werden; als common name nehmen wir hier "server" für den server und "client-1" für den client und zum Schluss noch das Key-Exchange Schlüssel-File:[certadmin@certserver ~]$ ./build-key-server server [certadmin@certserver ~]$ ./build-key client-1 [certadmin@certserver ~]$ ./build-dh
Während die Zertifikate (*.crt) jeweils "öffentlich" sind, d.h. sowohl auf dem Server, wie auch auf den clients verteilt werden dürfen, sind die entsprechenden Schlüssel (*.key) streng Geheim zu halten und NUR auf den Rechnern, für die der key gedacht ist.
D.h. client-1.key ist NUR auf dem client-1 vorhanden und das des OpenVPN Servers (server.key und ca.key) am besten in einem safe.
D.h. client-1.key ist NUR auf dem client-1 vorhanden und das des OpenVPN Servers (server.key und ca.key) am besten in einem safe.
Kleiner Exkurs: Mehrere SSL Zertifikate
Da wir schon eine Zertifizierungsstelle haben, kann ma diese acuh für andere Dinge rund um VPN und auch SSL brauchen; denn der Prozess um ein VPN Zertifikat zu erstellen ist grundsätzlich der gleiche wie ein SSL Zertifkat für beispielsweise einen Webserver zu erzeugen.Dazu richten wir in unserem "certadmin" home für jeden "typ" (VPN Netz, SSL, usw.) ein Verzeichnis ein:
mkdir -pv ~/configs/{VPN,SSL}
[certadmin@certserver ~]$ mkdir -pv ~/keys/{VPN,SSL}
[certadmin@certserver ~]$ mkdir -v ~/binDann legen wir im configs/ Verzeichnis für jeden Zertifikattyp, bzw. jedes unabhängige VPN Netz eine Datei mit deren Namen an, z.B. SSL Zertifikate für einen Webserver:
configs/webserver-ssl
export EASY_RSA="/home/certadmin/easy-rsa" export OPENSSL="openssl" export PKCS11TOOL="pkcs11-tool" export GREP="grep" export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA` export KEY_DIR="/home/certadmin/keys/home-vpn" echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR export PKCS11_MODULE_PATH="dummy" export KEY_SIZE=1024 export CA_EXPIRE=3650 export KEY_EXPIRE=3650 export KEY_COUNTRY="" export KEY_PROVINCE="" export KEY_CITY="" export KEY_ORG="" export KEY_EMAIL=""
Die diversen "KEY_"-Variablen sind noch nach eigenem Geschmack anzupassen.
Dann kann man jewils ins entsprechende Verzeichnis wechseln und mittels den Scripten "build-ca" und "build-dh" eigene Root-Zertifikate errichten.
Und danmit das ganze noch etwas einfacher wird erstellen wir im bin/ Verzeichnis der Zertifizierungsstelle ein script namens: "certpasswd":
~/bin/certpasswd
#!/bin/bash
CERT_EMAIL=$1
CERT_ROOT="$HOME"
CERT_EASYRSA="$CERT_ROOT/easy-rsa"
CERT_ENV="home"
CERT_TYPE="vpn"
#CERT_TYPE="ssl"
CERT_KEYS="$CERT_ROOT/keys/$CERT_ENV-$CERT_TYPE"
if [ -z "$CERT_EMAIL" ]; then
echo "usage: certpasswd user.name@provider.tld"
exit 1
fi
# Change to the easy-rsa directory and source vars
cd $CERT_ROOT
. "configs/$CERT_ENV-$CERT_TYPE"
if [ -f $CERT_KEYS/$CERT_EMAIL.p12 ]; then
# user already has a .p12 file and wants to change his password
cd $CERT_KEYS/
openssl pkcs12 -export -inkey $CERT_EMAIL.key -in $CERT_EMAIL.crt -certfile ca.crt -out $CERT_EMAIL.p12
mutt -s "Your new OpenVPN Certificate" $CERT_EMAIL -a $CERT_KEYS/$CERT_EMAIL.p12 < $CERT_ROOT/templates/mail-changedpw.tpl
else
# user does not have a p12-file, so generate a new cert for him
export KEY_EMAIL=$CERT_EMAIL
export EASY_RSA="${EASY_RSA:-.}"
"$EASY_RSA/pkitool" --pkcs12 $*
mutt -s "Your OpenVPN Certificate" $KEY_EMAIL -a $CERT_KEYS/$KEY_EMAIL.p12 < $CERT_ROOT/templates/mail.tpl
fiAchtung: Einige Variablen/Pfade müssen in obigem Script noch an die eigene Umgebung angepasst werden!
Dieses Script ist vor allem sehr nützlich, wenn man VPN Zertifikate für viele Benutzer Verwalten muss; so kann man ein Zertifikat entweder erstellen, oder von einem bestehenden das Passwort ändern, in dem man einfach:
certpasswd <USER oder EMAIL>aufruft.
Dies war alles was wir benötigen um Zetifikate zu erstellen und wir können nun Server und Client einrichten.
Den VPN-Server einrichten
Nun installieren wir openvpn auf dem server:[root@vpnserver ~]$ yum install openvpn [root@vpnserver ~]$ mkdir -v /etc/openvpn/
Jetzt werden Zertifikat und Keys vom Zertifizierungsserver auf den VPN-Server kopiert:
[certadmin@certserver ~]$ scp ~/easy-rsa/keys/ca.crt vpnserver:/etc/openvpn/ [certadmin@certserver ~]$ scp ~/easy-rsa/keys/dh1024.pem vpnserver:/etc/openvpn/ [certadmin@certserver ~]$ scp ~/easy-rsa/keys/server.crt vpnserver:/etc/openvpn/ [certadmin@certserver ~]$ scp ~/easy-rsa/keys/server.key vpnserver:/etc/openvpn/
Auf dem server muss nun noch das Verzeichnis für die Client-Konfiguration erstellt werden
[root@vpnserver ~]$ mkdir -v /etc/openvpn/client-config
Dann können wir das config-file für den VPN-Server erstellen:
/etc/openvpn/server.conf
mode server daemon proto udp port 1194 dev tun management 127.0.0.1 44000 client-config-dir /etc/openvpn/client-config ca /etc/openvpn/ca.crt cert /etc/openvpn/server.crt key /etc/openvpn/server.key dh /etc/openvpn/dh1024.pem server 10.1.20.0 255.255.255.0 route 10.1.2.0 255.255.255.0 route 10.1.3.0 255.255.255.0 client-to-client push "route 10.1.1.0 255.255.255.0" push "route 10.1.2.0 255.255.255.0" # usw., z.B. für client-2: push "route 10.1.3.0 255.255.255.0" ifconfig-pool-persist ipp.txt keepalive 10 120 comp-lzo user openvpn group openvpn persist-key persist-tun status /var/log/openvpn.status verb 3
Dieses file muss _genau_ so heissen wir der gewählte "Common Name" für den client!
/etc/openvpn/client-config/client-1
iroute 10.1.2.0 255.255.255.0
Zusätzlich muss noch auf dem Server das firewall-script erweitert werden:
/etc/firewall.conf
# Enable VPN-Server echo -n "Turning VPN on..." $IPTABLES -A INPUT -p udp --dport 1194 -j ACCEPT $IPTABLES -A OUTPUT -p udp --dport 1194 -j ACCEPT #Enable everything what goes through the tunnel $IPTABLES -A INPUT -i tun0 -j ACCEPT $IPTABLES -A OUTPUT -o tun0 -j ACCEPT echo_done
Den client einrichten
Zuerst müssen wir noch das IP-Schema auf dem client ändern, dies lässt sich ganz einfach in der Datei: /etc/config/network machen:/etc/config/network
#### VLAN configuration
config switch eth0
option vlan0 "0 1 2 3 5*"
option vlan1 "4 5"
#### Loopback configuration
config interface loopback
option ifname "lo"
option proto static
option ipaddr 127.0.0.1
option netmask 255.0.0.0
#### LAN configuration
config interface lan
option type bridge
option ifname "eth0.0"
option proto static
option ipaddr 10.1.2.1
option netmask 255.255.255.0
#### WAN configuration
config interface wan
option ifname "eth0.1"
option proto dhcpAuch auf dem client muss nun noch openvpn installiert werden:
[root@client-1 ~]$ opkg update [root@client-1 ~]$ opkg install openvpn [root@client-1 ~]$ mkdir /etc/openvpn/
Sollte beim client eine Meldung wegen ungenügendem Speicherplatz kommen, kann man folgendes probieren:
echo 'option force_space' >> /etc/opkg.conf- Aus irgendeinem Grund funktioniert das häufig sogar.
Nun kopieren wir die client-keys entsprechend:
[certadmin@certserver ~]$ scp ~/easy-rsa/keys/ca.crt client-1:/etc/openvpn/ [certadmin@certserver ~]$ scp ~/easy-rsa/keys/client-1.crt client-1:/etc/openvpn/ [certadmin@certserver ~]$ scp ~/easy-rsa/keys/client-1.key client-1:/etc/openvpn/
Nun erstellen wir das config file des clients:
/etc/openvpn/client-1.conf
client dev tun proto udp port 1194 comp-lzo daemon remote vpnserver resolv-retry infinite #nobind persist-key persist-tun ca /etc/openvpn/ca.crt cert /etc/openvpn/client-1.crt key /etc/openvpn/client-1.key ns-cert-type server verb 3
Bitte den ganzen Rest in dem File vorher weg löschen, z.B. durch: "echo>/etc/config/openvpn")
/etc/config/openvpn
package openvpn config openvpn custom_config option enable 1 option config /etc/openvpn/client-1.conf
Und auch hier noch die firewall unter /etc/firewall.user (nur der zusätzliche Teil, evtl. bestehende rules sollten beibehalten werden):
/etc/firewall.user
#========================== Rulesets ========================================== ### Open ports to WAN ## -- This allows port 22 to be answered by (dropbear on) the router iptables -t nat -A prerouting_wan -p tcp --dport 22 -j ACCEPT iptables -A input_wan -p tcp --dport 22 -j ACCEPT ### VPN ## -- VPN-Connection settings iptables -t nat -A prerouting_rule -i eth0.1 -p udp --dport 1194 -j ACCEPT iptables -A input_rule -i eth0.1 -p udp --dport 1194 -j ACCEPT iptables -A input_rule -i tun0 -j ACCEPT iptables -A forwarding_rule -i tun0 -j ACCEPT iptables -A forwarding_rule -o tun0 -j ACCEPT iptables -A output_rule -o tun0 -j ACCEPT
Als letztes definieren wir auf dem client noch, dass der DNS-Server des 10.1.1.0-er Netzwerks verwendet werden soll durch anfügen folgender Zeilen in /etc/config/dhcp:
Unterhalb: "config dhcp lan"
/etc/config/dhcp
option dhcp-option=6,10.1.1.10
option domain-suffix=home.lanund weisen den festen hosts wiederum feste IP-Adressen zu:
/etc/ethers
# pc01 00:00:00:00:00:00 10.1.2.10 # pc02 00:00:00:00:00:00 10.1.2.20 #usw.
Einen einzelnen Benutzer einrichten
Im Gegensatz zu den OpenVPN Gateways, gehen wir beim Benutzer-Client davon aus, dass es sich um einen Windows Rechner (und nicht Linux) handelt.
Die Konfiguration ist jedoch auch auf Linux fast identisch und wer Linux als Client benutzt wird wissen wie er es entsprechend abändern muss. ;)
Die Konfiguration ist jedoch auch auf Linux fast identisch und wer Linux als Client benutzt wird wissen wie er es entsprechend abändern muss. ;)
Falls man sich nun mittels eines einzelnen Benutzers Unterwegs (z.B. mit einem Notebook oder von der Arbeitsstelle aus) in sein VPN Netz einwählen möchte, muss man eigentlich nur ein zusätzliches client Zertifikat erstellen (entweder mittels "build-key" oder "certpasswd" (wenn man den exkurs weiter oben mitgemacht hat ;) )
Anstatt "client-x" sollte man aber dann zur besseren übericht die E-Mail Adresse des benutzers nehmen.
Zuerst lädt man für diesen ebenfalls OpenVPN
Dann erstellen wir auf dem Zertifikatsserver ein Zertifikat für den Benutzer:
[certadmin@certserver ~]$ ./build-key user@email.tld
oder:
[certadmin@certserver ~]$ certpasswd user@email.tld
Das daraus resultierende .p12 file (certpasswd) oder das .crt und .key file (build-key) müssen nun auf den PC des Benutzers ins Verzeichnis: C:\Programme\OpenVPN\config kopiert werden.
Im Verzeichnis C:\Programme\OpenVPN\config erstllen wir dann ein file vpn.opvn:
C:\Programme\OpenVPN\config\vpn.ovpn
remote vpnserver 1194 ;ca ca.crt pkcs12 user@email.tld.p12 client dev tun proto udp resolv-retry infinite nobind persist-key persist-tun keepalive 10 120 ns-cert-type server comp-lzo verb 3 mute 20 route-up "ipconfig /flushdns"
Möchte man noch zusätzliche routen einbinden kann man diese in der Konfigurationsdatei des clients vor dem: route-up "ipconfig /flushdns" Kommando angeben, z.B:
Dies würde man z.B. benötigen, wenn das VPN Netz selbst wieder mit einem anderen VPN Netz verbunden ist und der VPN-Server von diesem "fremden" Netz die routen nicht pushen soll.
# 10.1.20.13 steht für die IP Adresse des tunnels, die der client bekommt route-up "route ADD 192.168.1.0 MASK 255.255.255.0 10.1.20.13" route-up "route ADD 10.11.0.0 MASK 255.255.255.0 10.1.20.13"
Dies würde man z.B. benötigen, wenn das VPN Netz selbst wieder mit einem anderen VPN Netz verbunden ist und der VPN-Server von diesem "fremden" Netz die routen nicht pushen soll.
Nun kann man sich mittels des OpenVPN GUI oder per direktem Aufruf von "openvpn --config" auf der Kommandozeile verbinden.
Abschluss
Als letztes starten wir auf dem server OpenVPN und die Firewall neu:/etc/init.d/openvpn start /etc/init.d/firewall restart
Und dann noch auf dem client:
/etc/init.d/openvpn enable /etc/init.d/openvpn start /etc/init.d/dnsmasq restart /etc/init.d/firewall restart
Nun müsste der PC 10.1.1.10 den PC 10.1.2.10 anpingen können und umgekehrt.
Related Links
| Link | Beschreibung |
| 8.09RC2 fix to install OpenVPN to WRT54GL | Dieser Forenbeitrag zeigt die Lösung für Speicherplatzprobleme bei neueren OpenWRT Versionen (z.B.: 8.09) auf. |
| Erzeugen einer PKI mit EasyRSA | PKI erstellung |

Neuen Kommentar posten