Openvpn

Aus Vosp.info
Wechseln zu: Navigation, Suche

setup unter lxc debian jessie

debian_jessie_lxc_vpn

Einfaches Setup für zwei Maschinen

Auf beiden Maschinen

apt-get install openvpn

Server side

openvpn --genkey --secret secret.key
scp secret.key root@<remote host>
vim /etc/openvpn/simple.conf
dev tun
ifconfig 10.8.0.1 10.8.0.2
secret secret.key
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
user nobody
group nogroup
daemon

Client side

Der <remote.host> muss durch den Clienten aufgelöst werden können.
Entweder per /etc/hosts oder DNS

vim /etc/openvpn/simple.conf
remote <remote.host>
dev tun
ifconfig 10.8.0.2 10.8.0.1
secret secret.key
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
user nobody
group nogroup
daemon

Sternförmiges Setup mit zentralem Server

OpenVPN-Server mit CentOS 7

Installation

OpenVPN befindet sich nicht in den Repos des CentOS-Projektes.
Deshalb müssen Fedora EPEL repos eingebunden werden.

yum install epel-release
yum makecache
yum install openvpn easy-rsa -y

Ifconfig wird benötigt, es ist per default nicht installiert.

yum install net-tools -y

Zertifikate erstellen

Wir bauen uns unsere eigene Certification Authority.
Wichtiger Hinweiß: Aus Sicherheitsgründen sollten der ca.key niemals auf dem Server verbleiben!

Easy-rsa findet sich bei CentOS 7 in

/usr/share/easy-rsa/2.0

Das verzeichniss 2.0 kopieren wir an einen Platz unserer Wahl, der Ordner kann jeden Namen haben.
Empfehlenswert ist ein Verzeichnissname, der den Namen des VPN widerspiegelt.

In vars folgende Positionen ändern

vim vars
export KEY_COUNTRY="<Dein Länderkürzel>"
export KEY_PROVINCE="<Dein Bundesland>"
export KEY_CITY="<Deine Stadt>"
export KEY_ORG="<Deine Organisation/Firma>"
export KEY_EMAIL="<Deine E-Mail-Adresse>"
export KEY_OU="<Abteilung>"

export KEY_NAME="<irgendwas sinnvollen, VPN-Name mit Name>"

Danach folgende Schritte ausführen.

. ./vars
./clean-all
./build-ca

./build-ca wird die Frage nach dem Common Name aufwerfen.
Irgendwas sinnvolles, vielleicht VPN-Name.

Server Key und Zertifikat

<Servername> sollte der gleiche String wie Common Name, der bei der Erstellung abgefragt wird, sein.
Die anfallenden Files weirden den Prefix <Servername> haben.

./build-key-server <Servername> 

Client Key und Zertifikat

<Clientname> sollte der gleiche String wie Common Name, der bei der Erstellung abgefragt wird, sein.
Die anfallenden Files weirden den Prefix <Clientname> haben.

./build-key <Clientname>

Sollen später weitere Clienten in das VPN aufgenommen werden, müssen vorher wieder die Variablen aus vars exportiert werden.

. ./vars

Danach können neue Keys und Zertifikate erstellt werden.

./build-key <neuer Cient>

Diffie Hellman Parameter erstellen

./build-dh

Verteilung und Zugriffsrechte der Dateien

Bei Erstellung der Schlüssel und Zertifikate für den Server und die Clienten wurden folgende Namen verwendet.

./build-key-server server
./build-key client1
./build-key client2
Dateiname Benötigt von Zweck Geheim
ca.crt Server + alle Clienten Root CA Zertifikat Nein
ca.key Zertifikat signierende Maschine Root CA Schlüssel Ja
dh{n}.pem Nur Server Diffie Hellman parameter Nein
server.crt Nur Server Server Zertifikat Nein
server.key Nur Server Server Schlüssel Ja
client1.crt Client1 Client1 Zertifikat Nein
client1.key Client1 Client1 Schlüssel Ja
client2.crt Client2 Client2 Zertifikat Nein
client2.key Client2 Client2 Schlüssel Ja

Config

Server Config

#
# /etc/openvpn/newvpn.conf
# Files liegen in /etc/openvpn/newvpn
# und /etc/openvpn/newvpn/ccd-dir


# Port, default ist 1124, alles ist besser als 1124. Minimiert Script-Angriffe.
port <Port des VPN-Servers>
#Protokoll-Typ
proto udp

# Device Typ, möglich sind tun und tap
dev-type tun
# Devicename
dev newvpn

# Speicherort der Zertifikate, Schlüssel usw. Pfade sind relativ zum Configfile
ca newvpn/ca.crt
cert newvpn/server.crt
key newvpn/server.key
dh newvpn/dh2048.pem

mode server
tls-server
# Topologie des Netzwerkes
topology subnet
# mit push wird die Topologie dem Clienten mitgeteilt
push "topology subnet"
# IP des Servers und Netzmaske, ergibt zugleich das Netzwerk
ifconfig 10.8.100.10 255.255.255.0
# Range der frei vergebbaren IPs, vergleichbar mit Range aus DHCP 
ifconfig-pool 10.8.0.11 10.8.0.199 255.255.255.0

# Hier werden die IPs der Clienten hinterlegt, vergleichbar mit 
# host win01 { hardware ethernet 00:00:00:00:00:00;  fixed-address 192.168.0.5; }
# Zuweisung erfolgt über den Dateinamen, der der selbe sein muss wie Common Name im Schlüssel des Clienten
#Pfade sind relativ zum Configfile
client-config-dir newvpn/ccd-dir

ifconfig-pool-persist ipp.txt

# Dadurch können sich Clienten untereinander verbinden  
client-to-client

keepalive 10 120
# Kommpression der Verbindung
comp-lzo

# openvpns user-ID
user nobody
# openvpns group-ID
group nobody

# Schlüssel wird bei Erhalt von SIGUSR1 nicht neu geladen
persist-key
# Tun-Device wird bei Erhalt von SIGUSR1 nicht neu geladen
persist-tun
# Pfad ist relativ zum Configfile
status openvpn-status.log
# Verbosity Level
verb 3

# Achtung: funktionier so nicht. Vielleicht ist der Eintrag eines Gateways notwendig!
# Route for all Clients to this network
push "route 10.8.88.0 255.255.255.0"
route 10.8.88.0 255.255.255.0

Workaround. Wird auf allen Maschinen ausgeführt, die das Netzwerk erreichen sollen.

route add -net 10.8.88.0/24 gw 10.8.100.200 newvpn
IP Zuweisung an Client

Im Verzeichniss newvpn/ccd-dir liegen die Dateien, die den Clienten feste IPs zuweisen können.
Die Datei hat den selben Namen wie der Common Name im Key des Clienten

Ist der Client-PC der Router eines Netzerkes, auf dass durch andere Client-PCs zugegriffen werden soll, ist der iroute Eintrag notwendig. Dadurch weiß der VPN Server, über welche Maschine er ein Netzwerk erreichen kann.

vim <Common Name> 

Inhalt der Datei

ifconfig-push 10.8.100.201 255.255.255.0
iroute 10.8.88.0 255.255.255.0 
Files in newvpn
ca.crt
dh2048.pem
server.crt
server.key
Service starten

Startet automatisch bei Systemstart.
String zwischen @ und .service ergibt sich aus dem Confignamen

systemctl enable openvpn@server.service 

Händischer Start

systemctl start openvpn@server.service

Client Config

#
# /etc/openvpn/newvpn.conf
# Files liegen in /etc/openvpn/newvpn

tls-client

remote <IP oder FQDN des VPN-Servers> <Port des VPN-Servers>
proto udp

dev-type tun
dev newvpn

ca      newvpn/ca.crt
cert    newvpn/client1.crt
key     newvpn/client1.key

# Holt Config vom Server, z.B. IP-Adresse
pull

keepalive 10 120

comp-lzo

persist-key
persist-tun

verb 3
Files in newvpn
ca.crt
client1.crt
client1.key

Remote Network

Ein Client-PC soll Zugriff auf das Netzwerk eines anderen Clienten bekommen.

  • <Service-PC>: Der PC, der auf das Remote Network zugreifen soll.
  • <Remote Network Router>: Der Router des Remote Networks.

Zusätzlicher Eintrag in das CCD-File des zugreifenden Clienten

Damit der Client-PC, über den der Fernzugriff auf das Remote Network erfolgen soll, weiß, wie er das Remote Network erreichen kann, enötigt er eine zusätzliche Route.
Dies geschieht per push "route <Network> <Netmask> <Gateway>"
Der Eintrag sollte im CCD-File gemacht werde und nicht im globalen Config-File, damit nicht unerwünschte Routen zwischen den Netzwerken entstehen.
Ein push Eintrag in der globalen Config gilt für alle Clienten. Eine erweiterte Firewall-Regel kann nicht schaden, am besten whitelisting.

vim <Service-PC> 

Inhalt der Datei

ifconfig-push 10.8.100.231 255.255.255.0
push "route 10.8.88.0 255.255.255.0 10.8.100.200"


Zusätzlicher Eintrag in das CCD-File des Routers des zu erreichenden Netzwerkes

Der Client-PC ist der Router eines Netzerkes, auf dass durch andere Client-PCs zugegriffen werden soll Dazu ist der iroute Eintrag notwendig. Dadurch weiß der VPN Server, über welche Maschine er das Netzwerk erreichen kann.

vim <Remote Network Router> 

Inhalt der Datei

ifconfig-push 10.8.100.200 255.255.255.0
iroute 10.8.88.0 255.255.255.0

Links