====== OpenVPN ======
Mit OpenVPN von Überall aus ins eigene/heimische Netz. Hier als Beispiel mit [[https://www.fi4l.de|FLI4L]] als Router.
===== Quellen: =====
* [[https://community.openvpn.net/openvpn/wiki/EasyRSA3-OpenVPN-Howto|EasyRSA3-OpenVPN-Howto]]
* [[https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-an-openvpn-server-on-ubuntu-20-04|How To Set Up and Configure an OpenVPN Server on Ubuntu 20.04]]
===== Grundlagen =====
==== Dateien des Server ====
für den OpenVPN Server werden folgende Dateien unterhalb von '/etc/openvpn/' benötigt:
* ''ca.crt'' - das sog. Wurzel-Zertifikat aka. Root CA certificate (**C**ertificate **A**uthority)
* ''dh2048.pem'' - Diffie Hellman Parameter
* ''server.crt'' - Server Zertifikat
* ''server.key'' - Server Schlüssel
* ''server.conf'' - enthält die (Basis-) Konfiguration zum Betrieb des OpenVPN Servers
* ''tls-auth.key'' - TLS Schlüssel
=== ''server.conf'' ===
Die Datei 'server.conf' enthält alle notwendigen Konfigurationsparameter zum Betrieb des Servers. Wesentlich sind hier z.B. die Pfandangaben und Dateinamen der o.a. Dateien.
port 9711
proto udp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh2048.pem
server 192.168.200.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.200.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DOMAIN wg"
push "dhcp-option DNS 192.168.100.1"
client-to-client
keepalive 10 120
tls-auth /etc/openvpn/tls-auth.key 0
cipher AES-256-CBC
#comp-lzo
max-clients 5
persist-key
persist-tun
status openvpn-status.log
verb 2
ping-timer-rem
verb 2
resolv-retry infinite
writepid /var/run/openvpn/server/pid
persist-local-ip
mlock
reneg-sec 3600
status /var/run/openvpn/server/status 15
status-version 1
management 127.0.0.1 0
management-log-cache 100
management-writeport /var/run/openvpn/server/mport
script-security 2
setenv ovpn_ipv6 no
fast-io
down-pre
float
mssfix 1450
tun-mtu 1450
mtu-disc yes
==== Dateien des Client ====
* ''client.ovpn'' - Konfigurationsdatei je Client, enthält alle notwendigen Parameter
Die Konfigurationsdatei ''client.ovpn'' besteht, als reine Textdatei, aus folgenden Blöcken:
* OpenVPN Client Konfigurationsparameter
* ''ca.crt'' - Root CA Zertifikat
* ''client1.crt'' - Client1 Zertifikat
* ''client1.key'' - Client1 Schlüssel
* ''tls-auth.key'' - TLS Schlüssel
client
;dev tap
dev tun
;dev-node MyTap
;proto tcp
proto udp
remote 9711 udp4
;remote-random
resolv-retry infinite
nobind
;user nobody
;group nogroup
persist-key
persist-tun
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]
;mute-replay-warnings
#ca ca.crt --> see below
#cert client.crt --> see below
#key client.key --> see below
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
data-ciphers AES-256-CBC
#comp-lzo
verb 3
;mute 20
mssfix 1450
tun-mtu 1450
ifconfig 192.168.200.3 192.168.200.1
route 192.168.200.0 255.255.255.0
# INSERT "ca.crt" HERE
# INSERT "client.crt" HERE
# INSERT "client.key" HERE
key-direction 1
# INSERT "tls-auth.key" HERE
===== Erstellung der Konfiguration =====
==== Server ====
Zertifikate und Schlüssel für den **Server** erzeugen:\\
Vorbereitung:
sudo apt-get install easy-rsa
Arbeitsverzeichnis für die Erstellung der Schlüssel und Zertifikate erstellen:
make-cadir My_Certificate_Authority && cd My_Certificate_Authority
Der Befehl ''make-cadir'' erzeugt einen Sym-Link auf ''/usr/share/easy-rsa/easyrsa'' im Verzeichnis ''My_Certificate_Authority''
Parameter des Zertifikatsausstellers bearbeiten:
mcedit vars
...
set_var EASYRSA_REQ_COUNTRY "DE"
set_var EASYRSA_REQ_PROVINCE "NIEDERSACHSEN"
set_var EASYRSA_REQ_CITY "Hildesheim"
set_var EASYRSA_REQ_ORG "Familie von Thuelen"
set_var EASYRSA_REQ_EMAIL "Christoph@von-Thuelen.de"
set_var EASYRSA_REQ_OU "Familie"
...
set_var EASYRSA_CA_EXPIRE 7300
...
set_var EASYRSA_CERT_EXPIRE 5400
...
#EOF
[[https://de.wikipedia.org/wiki/Public-Key-Infrastruktur|PKI]] Initialisieren (Unterverzeichnisse werden erstellt):
./easyrsa init-pki
".rnd"-File generieren:
openssl rand -writerand ./pki/.rnd
[[https://de.wikipedia.org/wiki/Zertifizierungsstelle|CA]] Zertifikat erstellen:
./easyrsa build-ca nopass
# ohne "nopass" --> Password: ZFxhJYWCGj2QUhMQ
# mit "nopass" --> keine weitere Passwortabfrage
# ... Common Name (eg: your user, host, or server name) [Easy-RSA CA]:
# --> pki/private/ca.key
# --> pki/ca.crt wird generiert
Server Schlüssel erstellen:
./easyrsa gen-req server nopass
# --> pki/reqs/server.req
# --> pki/private/server.key
Server Zertifikat erstellen:
./easyrsa sign-req server server
# --> pki/issued/server.crt
Diffie-Hellman Parameter erstellen:
./easyrsa gen-dh
# --> pki/dh.pem
cp pki/dh.pem pki/dh2048.pem
TLS-Auth Schlüssel erstellen:
openvpn --genkey --secret tls-auth.key
# --> tls-auth.key
==== Client ====
Zertifikate und Schlüssel für den **Client** erzeugen:
sudo su
make-cadir OpenVPN_Clients && cd OpenVPN_Clients
./easyrsa init-pki
Privaten Client Schlüssel (**.key**) und Anforderung (**.req**) erstellen:
./easyrsa gen-req client1 nopass
# --> pki/reqs/client1.req
# --> pki/private/client1.key
Client Zertifikat (.crt**) aus der Anforderung (**.req**) **auf dem "Server"** erstellen:
# Wechseln in die "Server"-CA:
cd ../My_Certificate_Authority
./easyrsa import-req ../OpenVPN_Clients/pki/reqs/client1.req client1
./easyrsa sign-req client client1
# --> pki/issued/client1.crt
Anschließend das Client Zertifikat ''client1.crt'' auf den Client zurück kopieren!
OpenVPN Client Konfigurationsdatei "*.ovpn" erstellen:
cd ..
mkdir client1
cp client_template.ovpn client1/
cp My_Certificate_Authority/pki/ca.crt client1/
cp My_Certificate_Authority/tls-auth.key client1/
cp My_Certificate_Authority/pki/issued/client1.crt client1/
cp OpenVPN_Clients/pki/private/client1.key client1/
./make_openvpn_client_config.sh client1
#!/bin/bash
# First argument: Client identifier, e.g. Smartphone_ User_1
OUTPUTDIR="$1"
CONFIGNAME=$OUTPUTDIR
BASE_CONFIG="client_template.ovpn"
OUTPUT=$CONFIG_NAME.ovpn
#function() check_dir
## Parameter: $CONFIG_NAME
#{
#if [ ! -d $OUTPUTDIR ]; then
# mkdir $OUTPUTDIR
#else
# echo "Directory \"$OUTPUTDIR\" already exsists!"
# #read -p "Continue? (Y/N): " confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1
#fi
#}
check_tools()
# Check, if necessary tooles are available:
{
if [ -e /usr/share/easy-rsa/easyrsa ]
then
:
else
echo "Tool: \"easyrsa\" not installed! --> EXIT"
exit 1
fi
}
# MAIN
check_tools
if [ -z "${CONFIGNAME}" ]; then
echo "\"${CONFIGNAME}\" is empty!"
echo "Please specify client config name. --> EXIT!"
exit 1
else
if [ ! -d $OUTPUTDIR ]; then
echo "ERROR: Folder for $CONFIG_NAME not found --> exit!"
exit 1
else
echo -n "Generating ${CONFIGNAME} ... "
cat ${BASE_CONFIG} \
<(echo -e '') \
$CONFIGNAME/ca.crt \
<(echo -e '\n') \
$CONFIGNAME/$CONFIGNAME.crt \
<(echo -e '\n') \
$CONFIGNAME/$CONFIGNAME.key \
<(echo -e '\n') \
$CONFIGNAME/tls-auth.key \
<(echo -e '') \
> ${CONFIGNAME}/${CONFIGNAME}.ovpn
echo "done!"
fi
fi