Send a link

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.

Schließen
Kommentar Hinweis
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.


Schließen
warning Hinweise zur verwendeten OpenWRT-Version
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!



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

Schließen
note Hinweis
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.



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!

Schließen
warning Achtung
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!


Wir nehmen hierzu einen Linux Homeserver für die Zertifizierungsstelle; dieser trägt den Namen: "certserver".

Schließen
tip Optionaler Benutzer
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:

[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-ca
erstellen 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


Schließen
warning Achtung
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. :-)


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 ~/bin


Dann 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
fi

Achtung: 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


Schließen
warning Achtung
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    dhcp



Auch 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/


Schließen
note Hinweis
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.lan



und 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

Schließen
note Hinweis
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. ;)


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 (external link) herunter und installiert es.

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"


Schließen
tip Tip
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:

# 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.

Link Beschreibung
8.09RC2 fix to install OpenVPN to WRT54GL (external link) Dieser Forenbeitrag zeigt die Lösung für Speicherplatzprobleme bei neueren OpenWRT Versionen (z.B.: 8.09) auf.
Erzeugen einer PKI mit EasyRSA (external link) PKI erstellung



Neuen Kommentar posten

Anti-Bot Prüf-Code: Zufälliges Bild
Neuen Kommentar posten
Schließen
note Hinweis
Your comment will have to be approved by the moderator before it is displayed.