212.5 OpenVPN Gewichtung 2
212.5 OpenVPN
Kandidaten sollen ein VPN (virtuelles privates Netzwerk) konfigurieren und sichere Punkt-zu-Punkt- oder Netz-zu-Netz-Verbindungen erstellen können.
Hauptwissensgebiete:
- OpenVPN
Dies ist eine auszugsweise Liste der verwendeten Dateien, Begriffe und Hilfsprogramme:
- /etc/openvpn/
- openvpn
Installation openvpn-Server
apt-get install openvpn
Verbindungstypen und Modes
In der Konfigurationsdatei von openvpn wählt man den Verbindungstyp und die Art der virtuellen Netzwerkgeräte. Zitat aus Wikipedia zu TUN/TAP:
TUN und TAP sind virtuelle Netzwerk-Kernel-Treiber, die Netzwerkgeräte über Software simulieren. TUN steht hierbei für Netzwerk-Tunnel und TAP für Netzwerk-Ausleitung (englisch: tap zu deutsch: Wasserhahn) aber auch für Terminal Access Point. Während sich normalerweise hinter einem Netzwerkgerät (wie zum Beispiel eth0) direkt eine entsprechende Hardware in Form einer Netzwerkkarte verbirgt, werden Pakete, die an ein TUN/TAP-Gerät gesendet werden, an ein Programm im Userspace weitergeleitet und andersherum. Damit ein Userspace-Programm auch auf TUN/TAP-Geräte zugreifen kann, haben diese im Gegensatz zu realen Ethernet-Karten eine Gerätedatei mit der Bezeichnung tunN bzw. tapN unterhalb von /dev.
TUN simuliert ein Ende-zu-Ende-Netzwerkgerät (OSI-Layer 3) und kommuniziert per IP-Paketen mit der Software, während TAP eine Punkt-zu-Punkt-Verbindung via Ethernet-Gerät simuliert (OSI-Layer 2) und über Ethernet-Frames mit der Software kommuniziert. Link zu einer OSI-Modell-Beschriebung.
Die wichtigsten Schalte für die Einstellungen sind mode und dev. Als mode
kann man zwischen server
und p2p
wählen, wobei p2p
der default ist. Mit dev
kann man tun
oder tap
auswählen. Üblich und weniger aufwändig ist tun
. tap
benötigt man zum Beispiel wenn man Broadcasts über den tunnel schicken möchte.
Es folgen nun zwei Beispiele.
Bespiel - Eine Peer-to-Peer über Openvpn aufbauen
modprobe tun
/etc/openvpn# openvpn --genkey --secret static.key
auf client und server die Datei static.key kopieren.
Server Konfiguration
Der Server ist das System das auf Verbingungen wartet.
root@debian:/etc/openvpn# cat server.conf
mode p2p
dev tun
proto udp
port 1194
ifconfig 10.51.0.41 10.51.0.42
secret static.key
ping 10
ping-restart 120
ping-timer-rem
verb 3
mute 3
Schalter | Erklärung |
---|---|
ifconfig | setzt die VPN-Endpunkte param1=lokal, param2=entfernt |
secret | Verschlüsselung über statischen Key (kein TLS) |
ping | nach den angegebenen Sekunden ohne gesendeter Pakete wird das remote peer angepingt (verhindert Firewall-Timeout) |
ping-restart | für dynamische IP-Adressen benötigt |
ping-timer-rem | spezielles timeouthandling |
verb | Loggingverhalten (3 == normal, 0 == mini, > 5 == debbug) ) |
mute | maximal n Einträge vom gleichen Typ |
Mehr dazu in der man-page von openvpn: openvpn.
Konfiguration übernehmen und Listen-Port prüfen:
root@debian:/etc/openvpn# systemctl restart openvpn
root@debian:/etc/openvpn# netstat -tulpn | grep 1194
udp 0 0 0.0.0.0:1194 0.0.0.0:* 1458/openvpn
Client-Konfiguration
Der Client baut die Verbindung zum Server auf und kontaktiert den entsprechenden Port auf dem Server.
root@ubuntu:/etc/openvpn# cat client.conf
mode p2p
dev tun
proto udp
remote 10.191.17.7 1194
ifconfig 10.51.0.42 10.51.0.41
secret static.key
ping 10
ping-restart 100
ping-timer-rem
verb 3
mute 3
Konfiguration übernehmen:
root@debian:/etc/openvpn# systemctl restart openvpn
Verbindung prüfen
root@ubuntu:/etc/openvpn# ip a s tun0
6: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
link/none
inet 10.51.0.42 peer 10.51.0.41/32 scope global tun0
valid_lft forever preferred_lft forever
root@ubuntu:/etc/openvpn# ping -c 1 10.51.0.41
PING 10.51.0.41 (10.51.0.41) 56(84) bytes of data.
64 bytes from 10.51.0.41: icmp_seq=1 ttl=64 time=0.763 ms
--- 10.51.0.41 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.763/0.763/0.763/0.000 ms
root@debian:/etc/openvpn# ip a s tun0
11: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet 10.51.0.41 peer 10.51.0.42/32 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::92cb:f70:cf04:5ac5/64 scope link flags 800
valid_lft forever preferred_lft forever
root@debian:/etc/openvpn# ping -c 1 10.51.0.41
PING 10.51.0.41 (10.51.0.41) 56(84) bytes of data.
64 bytes from 10.51.0.41: icmp_seq=1 ttl=64 time=0.015 ms
--- 10.51.0.41 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.015/0.015/0.015/0.000 ms
Bespiel - Multi-Client–Server Verbindungen über Openvpn aufbauen
Zertifikate erzeugen
der folgende Link hat mit auch geholfen hierbei: https://www.it-management-kirchberger.at/manuals-tutorials/netzwerk/openwrt/openvpn.html
Hierfür wird eine eigene PKI (Public-Key-Infrastruktur) benötigt. Dazu gibt es das Paket easy-rsa
, ein einfaches shell-basiertes CA-Hilfsprogramm.
auf dem openvpn-Server:
apt install easy-rsa
Ich verwende jedoch die neuste Version von easy-rsa und hole mir das von den entsprechenden github releases : https://github.com/OpenVPN/easy-rsa/releases.
Nach dem Entpacken finden wir folgende Dateien:
root@debian:~# ls -l easy-rsa-3.0.6/
total 116
-rw-rw-r-- 1 root root 3968 Feb 2 2019 ChangeLog
-rw-rw-r-- 1 root root 1305 Feb 2 2019 COPYING.md
drwxrwxr-x 2 root root 4096 Feb 2 2019 doc
-rwxrwxr-x 1 root root 48730 Feb 2 2019 easyrsa
-rw-rw-r-- 1 root root 18093 Feb 2 2019 gpl-2.0.txt
-rw-rw-r-- 1 root root 1036 Feb 2 2019 mktemp.txt
-rw-rw-r-- 1 root root 4651 Feb 2 2019 openssl-easyrsa.cnf
-rw-rw-r-- 1 root root 2039 Feb 2 2019 README.md
-rw-rw-r-- 1 root root 3335 Feb 2 2019 README.quickstart.md
-rw-rw-r-- 1 root root 8576 Feb 2 2019 vars.example
drwxrwxr-x 2 root root 4096 Dec 28 16:34 x509-types
Default-Einstellungen der Zertifikate anpassen:
root@debian:~# cd easy-rsa-3.0.6/
root@debian:~/easy-rsa-3.0.6# cp vars.example vars
Nun die die vars Datei nach den eigenen Bedürfnissen anpassen.
Auszugsweiser neuer Inhalt der vars
-Datei:
root@debian:~/easy-rsa-3.0.6# grep '^set' vars
set_var EASYRSA_REQ_COUNTRY "DE"
set_var EASYRSA_REQ_PROVINCE "Niedersachsen"
set_var EASYRSA_REQ_CITY "Duderstadt"
set_var EASYRSA_REQ_ORG "Test"
set_var EASYRSA_REQ_EMAIL "oliver.gaida@sycor.de"
set_var EASYRSA_REQ_OU "Test for LPIC2"
Hilfe zu easy-rsa
root@debian:~/easy-rsa-3.0.6# ./easyrsa --help
Note: using Easy-RSA configuration from: ./vars
Easy-RSA 3 usage and overview
USAGE: easyrsa [options] COMMAND [command-options]
A list of commands is shown below. To get detailed usage and help for a
command, run:
./easyrsa help COMMAND
For a listing of options that can be supplied before the command, use:
./easyrsa help options
Here is the list of commands available with a short syntax reminder. Use the
'help' command above to get full usage details.
init-pki
build-ca [ cmd-opts ]
gen-dh
gen-req <filename_base> [ cmd-opts ]
sign-req <type> <filename_base>
build-client-full <filename_base> [ cmd-opts ]
build-server-full <filename_base> [ cmd-opts ]
revoke <filename_base> [cmd-opts]
renew <filename_base> [cmd-opts]
build-serverClient-full <filename_base> [ cmd-opts ]
gen-crl
update-db
show-req <filename_base> [ cmd-opts ]
show-cert <filename_base> [ cmd-opts ]
show-ca [ cmd-opts ]
import-req <request_file_path> <short_basename>
export-p7 <filename_base> [ cmd-opts ]
export-p12 <filename_base> [ cmd-opts ]
set-rsa-pass <filename_base> [ cmd-opts ]
set-ec-pass <filename_base> [ cmd-opts ]
DIRECTORY STATUS (commands would take effect on these locations)
EASYRSA: .
PKI: /root/easy-rsa-3.0.6/pki
Hilfe zu Sub-Kommandos
Einfach help in dem sub-Kommando vorn anstellen:
root@debian:~/easy-rsa-3.0.6# ./easyrsa help build-ca
Note: using Easy-RSA configuration from: ./vars
build-ca [ cmd-opts ]
Creates a new CA
cmd-opts is an optional set of command options from this list:
nopass - do not encrypt the CA key (default is encrypted)
subca - create a sub-CA keypair and request (default is a root CA)
Nun erzeuge ich die PKI und die CA. Wobei ich keine Passwörter für die key-Files setze, produktiv kann man das gerne machen.
PKI:
root@debian:~/easy-rsa-3.0.6# ./easyrsa init-pki
Note: using Easy-RSA configuration from: ./vars
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /root/easy-rsa-3.0.6/pki
CA:
root@debian:~/easy-rsa-3.0.6# ./easyrsa build-ca nopass
Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.0l 10 Sep 2019
Generating RSA private key, 2048 bit long modulus
...........................+++++
.........+++++
e is 65537 (0x010001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:Oliver Gaida CA for LPIC2
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/root/easy-rsa-3.0.6/pki/ca.crt
Server-Zertifikate:
root@debian:~/easy-rsa-3.0.6# ./easyrsa build-server-full server nopass
Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.0l 10 Sep 2019
Generating a RSA private key
....+++++
....+++++
writing new private key to '/root/easy-rsa-3.0.6/pki/private/server.key.7QcSnhWjvD'
-----
Using configuration from /root/easy-rsa-3.0.6/pki/safessl-easyrsa.cnf
Can't open /root/easy-rsa-3.0.6/pki/index.txt.attr for reading, No such file or directory
139928618852416:error:02001002:system library:fopen:No such file or directory:../crypto/bio/bss_file.c:74:fopen('/root/easy-rsa-3.0.6/pki/index.txt.attr','r')
139928618852416:error:2006D080:BIO routines:BIO_new_file:no such file:../crypto/bio/bss_file.c:81:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'server'
Certificate is to be certified until Dec 12 16:57:14 2022 GMT (1080 days)
Write out database with 1 new entries
Data Base Updated
ein Client-Zertifikat (mehrere machen hier auch Sinn):
root@debian:~/easy-rsa-3.0.6# ./easyrsa build-client-full client-1 nopass
Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.0l 10 Sep 2019
Generating a RSA private key
....................................................................................+++++
...........................................+++++
writing new private key to '/root/easy-rsa-3.0.6/pki/private/client-1.key.iokzx8eIpA'
-----
Using configuration from /root/easy-rsa-3.0.6/pki/safessl-easyrsa.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'client-1'
Certificate is to be certified until Dec 12 16:57:58 2022 GMT (1080 days)
Write out database with 1 new entries
Data Base Updated
Schlüssel-Datei erzeugen:
root@debian:~/easy-rsa-3.0.6# ./easyrsa gen-dh
Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.0l 10 Sep 2019
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
...
DH parameters of size 2048 created at /root/easy-rsa-3.0.6/pki/dh.pem
Der Ablageort hier im Home von root ist nicht gut, /etc/easy-rsa/...
wäre besser. Aber für meine Testzwecke ist das hier ok.
Nun erzeuge ich symbolische Links zu den erstellten Zertifikaten unter dem openvpn-Verzeichnis:
cd /etc/openvpn
mkdir certs
root@debian:/etc/openvpn# cd certs
root@debian:/etc/openvpn/certs# ln -s /root/easy-rsa-3.0.6/pki/ca.crt ca.crt
root@debian:/etc/openvpn/certs# ln -s /root/easy-rsa-3.0.6/pki/private/server.key server.key
root@debian:/etc/openvpn/certs# ln -s /root/easy-rsa-3.0.6/pki/issued/server.crt server.crt
root@debian:/etc/openvpn/certs# ln -s /root/easy-rsa-3.0.6/pki/dh.pem dh.pem
Server-Konfiguration Erstellen
/etc/openvpn/server.conf
port 1194
proto udp
dev tun
ca certs/ca.crt
cert certs/server.crt
key certs/server.key
dh certs/dh.pem
server 10.129.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
#push "route 192.168.1.0 255.255.255.0"
push "dhcp-option DNS 192.168.1.1"
client-to-client
keepalive 15 180
comp-lzo
max-clients 10
status openvpn-status.log
verb 3
Dann den openvpn stoppen und erstmal per Kommandozeile starten, da sieht direkt was passiert:
root@debian:/etc/openvpn# systemctl stop openvpn
root@debian:/etc/openvpn# openvpn --config server.conf
Sat Dec 28 17:13:44 2019 OpenVPN 2.4.0 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Oct 14 2018
Sat Dec 28 17:13:44 2019 library versions: OpenSSL 1.0.2t 10 Sep 2019, LZO 2.08
Sat Dec 28 17:13:44 2019 Diffie-Hellman initialized with 2048 bit key
Sat Dec 28 17:13:44 2019 ROUTE_GATEWAY 10.0.2.2/255.255.255.0 IFACE=eth0 HWADDR=08:00:27:8d:c0:4d
Sat Dec 28 17:13:44 2019 TUN/TAP device tun0 opened
Sat Dec 28 17:13:44 2019 TUN/TAP TX queue length set to 100
Sat Dec 28 17:13:44 2019 do_ifconfig, tt->did_ifconfig_ipv6_setup=0
Sat Dec 28 17:13:44 2019 /sbin/ip link set dev tun0 up mtu 1500 Sat Dec 28 17:13:44 2019 /sbin/ip addr add dev tun0 local 10.129.0.1 peer 10.129.0.2
Sat Dec 28 17:13:44 2019 /sbin/ip route add 10.129.0.0/24 via 10.129.0.2
Sat Dec 28 17:13:44 2019 Could not determine IPv4/IPv6 protocol. Using AF_INET
Sat Dec 28 17:13:44 2019 Socket Buffers: R=[212992->212992] S=[212992->212992]
Sat Dec 28 17:13:44 2019 UDPv4 link local (bound): [AF_INET][undef]:1194
Sat Dec 28 17:13:44 2019 UDPv4 link remote: [AF_UNSPEC]
Sat Dec 28 17:13:44 2019 MULTI: multi_init called, r=256 v=256
Sat Dec 28 17:13:44 2019 IFCONFIG POOL: base=10.129.0.4 size=62, ipv6=0
Sat Dec 28 17:13:44 2019 IFCONFIG POOL LIST
Sat Dec 28 17:13:44 2019 Initialization Sequence Completed
Client-Konfiguration Erstellen
dafür kopieren wir uns die client-1.crt
und client-1.key
plus das ca.crt
und verlinken es ähnlich:
ln -s /root/pki/issued/client-1.crt client-1.crt
ln -s /root/pki/private/client-1.key client-1.key
ln -s /root/pki/ca.crt ca.crt
Die Client-Konfiguration sieht dann wie folgt aus:
/etc/openvpn/client.conf
:
client
dev tun
proto udp
remote 10.191.17.7 1194
ca certs/ca.crt
cert certs/client-1.crt
key certs/client-1.key
comp-lzo
verb 3
Und nun den Client starten, auch über die Kommandozeile, damit man mehr sieht:
root@ubuntu:/etc/openvpn# openvpn --config client.conf
Kontrolle
Client:
root@ubuntu:~# ip a s tun0
8: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
link/none
inet 10.129.0.6 peer 10.129.0.5/32 scope global tun0
valid_lft forever preferred_lft forever
Server:
root@debian:~# ip a s tun0
15: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet 10.129.0.1 peer 10.129.0.2/32 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::1e39:eed2:5da4:b2/64 scope link flags 800
valid_lft forever preferred_lft forever
root@debian:/etc/openvpn# cd /etc/openvpn/
root@debian:/etc/openvpn# cat openvpn-status.log
OpenVPN CLIENT LIST
Updated,Sat Dec 28 17:31:41 2019
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
client-1,10.191.17.9:1194,3520,3476,Sat Dec 28 17:28:53 2019
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.129.0.6,client-1,10.191.17.9:1194,Sat Dec 28 17:28:53 2019
GLOBAL STATS
Max bcast/mcast queue length,1
END