So installierst und konfigurierst du den OpenVPN-Server auf Rocky Linux 9
Ein virtuelles privates Netzwerk (VPN) ermöglicht dir den Zugang zum Internet, indem es deinen Standort verschleiert. Das gibt dir die Freiheit, sicher in nicht vertrauenswürdigen Netzwerken auf das Internet zuzugreifen und geografische Einschränkungen und Zensur zu umgehen. OpenVPN ist eine Open-Source Transport Layer Security (TLS) VPN-Lösung, um dieses Ziel zu erreichen.
In unserem Lernprogramm werden wir OpenVPN auf einem Rocky Linux 9 Server installieren und ihn so konfigurieren, dass er von einem Client-Rechner aus erreichbar ist. Außerdem werden wir eine VPN-Verbindung zwischen den beiden herstellen, um den gesamten Datenverkehr des Clients über den OpenVPN-Server umzuleiten.
Voraussetzungen
- Ein Server mit Rocky Linux 9, der sowohl IPv4- als auch IPv6-Verbindungen unterstützt. Wir bezeichnen diesen Server als OpenVPN-Server. Die Firewalld Firewall ist aktiviert und läuft auf dem Server.
- Ein Server mit Rocky Linux 9, der sowohl IPv4- als auch IPv6-Verbindungen unterstützt. Wir werden ihn als private Zertifizierungsstelle (CA) einrichten, die wir als CA-Server bezeichnen.
- Ein Nicht-Root-Benutzer mit sudo-Rechten sowohl auf OpenVPN als auch auf dem CA-Server.
- Ein Client-Rechner, der sich mit dem OpenVPN-Server verbindet. Du kannst dein lokales Gerät als Client-Rechner verwenden. OpenVPN hat Clients für Windows, Linux, macOS, Android und iOS. Du kannst jeden von ihnen für die Verbindung verwenden. Für das Tutorial werden wir einen Rocky Linux 9 Client-PC verwenden.
- Alles wird auf dem OpenVPN- und dem CA-Server aktualisiert.
$ sudo dnf update
Schritt 1 – Einrichten des CA-Servers
Eine Zertifizierungsstelle (CA) ist eine Einrichtung, die digitale Zertifikate ausstellt, um Identitäten im Internet zu überprüfen. In diesem Lernprogramm verwenden wir einen eigenständigen Server als privaten CA-Server, der die OpenVPN-Server- und Client-Zertifikate validiert. Dein CA-Server sollte außer dem Importieren, Signieren und Validieren von Zertifikaten keine weiteren Dienste ausführen.
Schritt 1.1 – Easy-RSA installieren
Der erste Schritt ist die Installation der Skripte von easy-rsa
. easy-rsa
ist ein Tool zur Verwaltung von Zertifizierungsstellen, mit dem ein privater Schlüssel und ein öffentliches Stammzertifikat erstellt werden können.
Aber zuerst müssen wir das EPEL-Repository aktivieren, das das Paket easy-rsa
enthält.
$ sudo dnf install epel-release
Installiere Easy-RSA.
$ sudo dnf install easy-rsa
Schritt 1.2 – Erstellen eines Verzeichnisses der Public Key Infrastructure
Der nächste Schritt besteht darin, eine Public Key Infrastructure (PKI) auf dem CA-Server zu erstellen.
$ mkdir ~/easy-rsa
Erstelle symbolische Links, die auf die installierten easy-rsa
Paketdateien zeigen.
$ ln -s /usr/share/easy-rsa/3/* ~/easy-rsa/
Schränke den Zugriff auf das PKI-Verzeichnis ein.
$ chmod 700 /home/<username>/easy-rsa
Initialisiere die PKI.
$ cd ~/easy-rsa $ ./easyrsa init-pki
Du wirst die folgende Ausgabe erhalten.
init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /home/<username>/easy-rsa/pki
Schritt 1.3 – Erstellen einer Zertifizierungsstelle
Bevor du den privaten Schlüssel und das Zertifikat deiner Zertifizierungsstelle erstellen kannst, musst du die Organisationsinformationen für sie konfigurieren. Erstelle die Datei vars
, um die Informationen im Verzeichnis easy-rsa
zu speichern, und öffne sie zur Bearbeitung.
$ cd ~/easy-rsa $ nano vars
Füge den folgenden Code in die Datei ein.
set_var EASYRSA_REQ_COUNTRY "US" set_var EASYRSA_REQ_PROVINCE "NewYork" set_var EASYRSA_REQ_CITY "New York City" set_var EASYRSA_REQ_ORG "Howtoforge" set_var EASYRSA_REQ_EMAIL "admin@example.com" set_var EASYRSA_REQ_OU "Community" set_var EASYRSA_ALGO "ec" set_var EASYRSA_DIGEST "sha512"
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Führe den folgenden Befehl aus, um das Paar aus öffentlichem und privatem Stammschlüssel für deine Zertifizierungsstelle zu erstellen.
$ ./easyrsa build-ca
Du wirst aufgefordert, eine Passphrase für dein Schlüsselpaar einzugeben. Du wirst auch nach einer PEM-Passphrase gefragt. Wähle für beide eine starke Passphrase und notiere sie für später. Du wirst auch nach dem Common Name (CN) für deine CA gefragt. Du kannst eine beliebige Zeichenfolge eingeben, aber der Einfachheit halber drückst du ENTER, um den Standardnamen zu akzeptieren.
Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021) Enter New CA Key Passphrase: Re-Enter New CA Key Passphrase: Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- 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]: CA creation complete and you may now import and sign cert requests. Your new CA certificate file for publishing is at: /home/<username>/easy-rsa/pki/ca.crt
Wenn du nicht jedes Mal nach einem Passwort gefragt werden möchtest, wenn du mit deiner CA interagierst, kannst du stattdessen den folgenden Befehl verwenden.
$ ./easyrsa build-ca nopass
Dadurch werden zwei Dateien erstellt:
~/easy-rsa/pki/ca.crt
ist die öffentliche Zertifikatsdatei der CA. Jeder Benutzer und der OpenVPN-Server benötigen eine Kopie dieser Datei.~/easy-rsa/pki/ca.key
ist der private Schlüssel, den die CA verwendet, um Zertifikate für den OpenVPN-Server und den Client zu signieren. Wenn ein Angreifer Zugang zu deiner CA und damit auch zu deinerca.key
Datei erhält, musst du deine CA zerstören. Aus diesem Grund sollte sich deineca.key
Datei nur auf deinem CA-Rechner befinden und dein CA-Rechner als zusätzliche Sicherheitsmaßnahme idealerweise offline bleiben, wenn er keine Zertifikatsanfragen signiert.
Schritt 2 – Installation von OpenVPN und Easy-RSA auf dem OpenVPN-Server
Melde dich bei deinem OpenVPN-Server an und installiere die Pakete OpenVPN und Easy-RSA. Installiere auch das EPEL-Repository vor ihnen.
$ sudo dnf install epel-release $ sudo dnf install openvpn easy-rsa
Erstelle das Verzeichnis ~/easy-rsa
.
$ mkdir ~/easy-rsa
Erstelle einen symbolischen Link von dem easy-rsa
Skript, das wir genau wie auf dem CA-Server installiert haben.
$ ln -s /usr/share/easy-rsa/3/* ~/easy-rsa/
Schränke den Zugriff auf das Verzeichnis ein.
$ chmod 700 ~/easy-rsa
Schritt 3 – Erstellen einer PKI für OpenVPN Server
Erstelle im Verzeichnis ~/easy-rsa
eine Datei vars
, in der die erforderlichen Informationen zur Erstellung der PKI gespeichert werden, und öffne sie zur Bearbeitung.
$ cd ~/easy-rsa $ nano vars
Füge die folgenden Zeilen in die Datei ein.
set_var EASYRSA_ALGO "ec" set_var EASYRSA_DIGEST "sha512"
Da wir diesen Server nicht als CA verwenden, sind dies die einzigen Werte, die wir brauchen. Damit werden deine OpenVPN- und CA-Server so konfiguriert, dass sie ECC verwenden. Das bedeutet, wenn ein Client und ein Server versuchen, einen gemeinsamen symmetrischen Schlüssel zu erstellen, verwenden sie Elliptische Kurven-Algorithmen für den Austausch. Das ist deutlich schneller als die Verwendung des klassischen RSA-Algorithmus mit Diffie-Hellman, da die Zahlen viel kleiner und die Berechnungen schneller sind.
Der nächste Schritt ist die Erstellung des PKI-Verzeichnisses mit der Option init-pki
. Obwohl du diesen Befehl bereits auf dem CA-Server als Teil der Voraussetzungen ausgeführt hast, ist es notwendig, ihn hier auszuführen, weil dein OpenVPN-Server und der CA-Server getrennte PKI-Verzeichnisse haben.
$ ./easyrsa init-pki
Die PKI auf dem OpenVPN-Server wird als zentraler Ort zum Speichern von Zertifikatsanträgen und öffentlichen Zertifikaten verwendet.
Schritt 4 – OpenVPN Server Zertifikatsanforderung und privaten Schlüssel erstellen
Wechsle zum Verzeichnis ~/easy-rsa
auf dem OpenVPN-Server.
$ cd ~/easy-rsa
Der nächste Schritt besteht darin, einen privaten Schlüssel und einen Certificate Signing Request (CSR) auf deinem OpenVPN-Server zu erzeugen. Führe den Befehl easy-rsa
mit der Option gen-req
gefolgt von einem Common Name (CN) für den Server aus. In unserem Tutorial werden wir server
als CN für den OpenVPN-Server verwenden. Außerdem verwenden wir die Option nopass
, um Probleme mit den Berechtigungen zu vermeiden.
$ ./easyrsa gen-req server nopass
Du erhältst die folgende Ausgabe.
Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021) .....+.................+.+.....+....+........+...+.+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*........+.+...+..+......+...+....+.....+...+.........+......+.......+...+.....+.......+.....+.....................+.+...+...+...............+........+..........+......+.....+...+.......+........+.+...........+...+.+.....+......+.+...+.........+...+........+.+...........+...+....+..+...+............+.............+.....+...+.......+...+...+...........+.+..+.......+.....+...................+..+...+......+....+..+.......+......+......+......+..+......+....+............+...............+.....+..........+...+..+....+..+.........+....+...............+..............+.......+...+..+...+......+.+....................................+........+....+...+...+.........+.....+.+..+...+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ................+...+....+............+...+...+.....+...+....+...............+......+.....+....+.....+.+.........+...+.................+......+.........+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*........+...+..+.......+..+...+.+.....+.........+.+..+....+...+.....+......+.......+.........+........+......+.+.....+.+............+..+..........+........+.+..+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.........+...+..+.+........+....+..+......+....+.........+..+............+...+...+.........+.............+..+...+...+.+......+.....+....+.....+.+...+..............................+......+........+..........+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ----- 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) [server]: Keypair and certificate request completed. Your files are: req: /home/<username>/easy-rsa/pki/reqs/server.req key: /home/<username>/easy-rsa/pki/private/server.key
Dadurch werden ein privater Schlüssel für den Server und eine Zertifikatsanforderungsdatei namens server.req
erstellt. Kopiere den Serverschlüssel in das Verzeichnis /etc/openvpn/server
.
$ sudo cp /home/<username>/easy-rsa/pki/private/server.key /etc/openvpn/server/
Die Zertifikatsanforderung (Certificate Signing Request, CSR) kann nun von der Zertifizierungsstelle signiert werden.
Schritt 5 – Signieren der CSR des OpenVPN-Servers
Im nächsten Schritt musst du die CSR-Datei zum Signieren auf den CA-Server kopieren. Wenn auf deinen Servern die Passwortauthentifizierung aktiviert ist, kannst du die Datei einfach mit dem folgenden Befehl kopieren.
$ scp /home/<username>/easy-rsa/pki/reqs/server.req username@your_ca_server_ip:/tmp
Wenn du die Passwortauthentifizierung nicht nutzen willst, musst du für jeden Server ein SSH-Schlüsselpaar erzeugen und dann den öffentlichen SSH-Schlüssel des OpenVPN-Servers in die Datei authorized_keys
des CA-Rechners einfügen und umgekehrt.
Wenn du dir das ersparen willst, kannst du die Dateien auch einfach kopieren. Öffne die Datei auf dem OpenVPN-Server, kopiere ihren Inhalt und erstelle dann die Datei auf dem CA-Server und füge den Inhalt ein.
Melde dich wieder auf dem CA-Server an, wechsle in das Verzeichnis ~/easy-rsa
und importiere die CSR-Datei.
$ cd ~/easy-rsa $ ./easyrsa import-req /tmp/server.req server
Du erhältst die folgende Ausgabe.
Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021) The request has been successfully imported with a short name of: server You may now use this name to perform signing operations on this request.
Signiere die Anfrage mit folgendem Befehl. Da wir die CSR des OpenVPN-Servers signieren, verwenden wir seinen Common Name (CN).
$ ./easyrsa sign-req server server
Du wirst aufgefordert, zu überprüfen, ob die Anfrage aus einer vertrauenswürdigen Quelle stammt. Gib yes
ein und drücke zur Bestätigung die Taste ENTER
.
Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021) You are about to sign the following certificate. Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender. Request subject, to be signed as a server certificate for 825 days: subject= commonName = server Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes
Als Nächstes wirst du aufgefordert, die Passphrase für den privaten CA-Schlüssel einzugeben, die du zuvor eingerichtet hast.
Using configuration from /home/<username>/easy-rsa/pki/easy-rsa-5673.9KntVf/tmp.P5JqSD Enter pass phrase for /home/<username>/easy-rsa/pki/private/ca.key: 802BB2829D7F0000:error:0700006C:configuration file routines:NCONF_get_string:no value:crypto/conf/conf_lib.c:315:group=<NULL> name=unique_subject 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 May 12 01:34:35 2025 GMT (825 days) Write out database with 1 new entries Data Base Updated Certificate created at: /home/<username>/easy-rsa/pki/issued/server.crt
Das daraus resultierende Zertifikat enthält den öffentlichen Verschlüsselungsschlüssel des OpenVPN-Servers sowie die Signatur des CA-Servers. Kopiere die Zertifikate zurück auf den OpenVPN-Server.
$ scp pki/issued/server.crt username@your_vpn_server_ip:/tmp $ scp pki/ca.crt username@your_vpn_server_ip:/tmp
Auf deinem OpenVPN-Server kopierst du die Dateien in das Verzeichnis /etc/openvpn/server
.
$ sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server
Schritt 6 – OpenVPN-Kryptomaterial konfigurieren
Wir fügen einen zusätzlichen gemeinsamen geheimen Schlüssel hinzu, den der Server und alle Clients mit der OpenVPN-Direktive tls-crypt
verwenden werden. Damit wird sichergestellt, dass der OpenVPN-Server in der Lage ist, unauthentifizierten Datenverkehr, Port-Scans und Denial-of-Service-Angriffe zu bewältigen. Außerdem wird es dadurch schwieriger, OpenVPN-Netzwerkverkehr zu identifizieren.
Wechsle in das Verzeichnis ~/easy-rsa
.
$ cd ~/easy-rsa
Erzeuge den tls-crypt
Pre-Shared Key. Dadurch wird eine Datei namens ta.key
$ openvpn --genkey secret ta.key
Kopiere die Datei ta.key
in das Verzeichnis /etc/openvpn/server
.
$ sudo cp ta.key /etc/openvpn/server
Schritt 7 – Client-Zertifikat und Schlüsselpaar generieren
Erstelle ein Verzeichnis, in dem das Client-Zertifikat und die Schlüsseldateien gespeichert werden.
$ mkdir -p ~/client-configs/keys
Schränke die Berechtigungen für das Verzeichnis ein, um es zu schützen.
$ chmod -R 700 ~/client-configs
Wechsle dann in das Verzeichnis ~/easy-rsa
.
$ cd ~/easy-rsa
Erstelle einen Client-Schlüssel mit client1
als Common Name für den Client. Du kannst einen beliebigen CN für den Client verwenden.
$ ./easyrsa gen-req client1 nopass
Drücke ENTER
, um den Common Name zu bestätigen. Du erhältst die folgende Ausgabe.
Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021) ........+.+.........+.........+...+...+..+.........+......+...+.......+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+..+...+....+........+.......+........+............+...+......+.......+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+...+...............+..........+......+......+.....+....+...........+.+..+......+.+.....................+.........+.........+..+.........+..+...+.+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +.....+.+..................+...........+...+.+............+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+.....+.+.........+...+..+.........+....+..+..................+.+......+...+...+.....+...+......+..........+........+...+...+......+...+...+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+...+.....+.......+........+.......+........+.+.........+...........+.......+...............+.....+....+.........+.....+.+...+........+...+.+...+..+.+........+............+.........+.+.........+.....+.++.......+.....+.......+.....+....+......+.....+.............+...........+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ----- 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) [client1]: Keypair and certificate request completed. Your files are: req: /home/<username>/easy-rsa/pki/reqs/client1.req key: /home/<username>/easy-rsa/pki/private/client1.key
Kopiere anschließend die Datei client1.key
in das Verzeichnis ~/client-configs/keys
.
$ cp pki/private/client1.key ~/client-configs/keys/
Übertrage die Datei client1.req
auf den CA-Server.
$ scp pki/reqs/client1.req username@your_ca_server_ip:/tmp
Logge dich wieder auf dem CA-Server ein und importiere die Serveranfrage.
$ cd ~/easy-rsa $ ./easyrsa import-req /tmp/client1.req client1
Du erhältst die folgende Ausgabe.
Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021) The request has been successfully imported with a short name of: client1 You may now use this name to perform signing operations on this request.
Signiere die Anfrage mit folgendem Befehl. Wir verwenden client
als Anfragetyp.
$ ./easyrsa sign-req client client1
Wenn du dazu aufgefordert wirst, gib yes
ein, um zu bestätigen, dass du die Anfrage signierst und dass sie aus einer vertrauenswürdigen Quelle stammt.
Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021) You are about to sign the following certificate. Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender. Request subject, to be signed as a client certificate for 825 days: subject= commonName = client1 Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes
Du wirst aufgefordert, die Passphrase der Zertifizierungsstelle einzugeben.
Using configuration from /home/<username>/easy-rsa/pki/easy-rsa-5908.XM2MNt/tmp.SGLqAt Enter pass phrase for /home/<username>/easy-rsa/pki/private/ca.key: Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'client1' Certificate is to be certified until May 12 01:41:45 2025 GMT (825 days) Write out database with 1 new entries Data Base Updated Certificate created at: /home/<username>/easy-rsa/pki/issued/client1.crt
Übertrage das erstellte Zertifikat zurück auf den OpenVPN-Server.
$ scp pki/issued/client1.crt username@your_server_ip:/tmp
Auf dem OpenVPN-Server kopierst du das Client-Zertifikat in das Verzeichnis ~/client-configs/keys
.
$ cp /tmp/client1.crt ~/client-configs/keys/
Kopiere die Dateien ca.crt
und ta.key
in das Verzeichnis ~/client-configs/keys
und setze die entsprechenden Berechtigungen für deinen aktuell eingeloggten Server.
$ cp ~/easy-rsa/ta.key ~/client-configs/keys/ $ sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/ $ sudo chown username.username ~/client-configs/keys/*
Schritt 8 – OpenVPN konfigurieren
Kopiere die Beispieldatei server.conf
als Ausgangspunkt für die Konfiguration von OpenVPN.
$ sudo cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/server/
Öffne die Datei zum Bearbeiten.
$ sudo nano /etc/openvpn/server/server.conf
Finde den Abschnitt HMAC
in der Datei, indem du nach der Direktive tls-auth
suchst. Kommentiere die Zeile aus, indem du ein Semikolon (;) an den Anfang der Zeile setzt. Füge wie gezeigt eine neue Zeile darunter ein.
;tls-auth ta.key 0 # This file is secret tls-crypt ta.key
Als Nächstes änderst du den Wert der kryptografischen Verschlüsselung, indem du nach der Zeile cipher
suchst. Der Standardwert ist auf AES-256-CBC
eingestellt. Kommentiere den Standardwert aus und füge eine weitere Zeile mit der Verschlüsselung AES-256-GCM
hinzu, die einen besseren Verschlüsselungsgrad und eine bessere Leistung bietet (siehe Abbildung).
;cipher AES-256-CBC cipher AES-256-GCM
Direkt darunter fügst du die Direktive auth
hinzu, um den HMAC Message Digest Algorithmus auszuwählen.
auth SHA256
Da wir die Elliptic Curve Cryptography verwenden, müssen wir die Diffie-Hellman-Verschlüsselung deaktivieren. Kommentiere die Zeile dh dh2048.pem
aus und füge dh none
darunter ein.
;dh dh2048.pem dh none
Sobald OpenVPN gestartet ist, sollte es ohne Berechtigungen laufen. Um dies zu aktivieren, entkommentiere die Zeilen user nobody
und group nobody
und ändere sie wie gezeigt.
user nobody group nobody
Den gesamten Datenverkehr durch das VPN umleiten
Die obigen Einstellungen stellen die VPN-Verbindung zwischen dem Client und dem Server her, zwingen aber keine Verbindungen, den Tunnel zu benutzen. Dazu musst du zunächst die Zeile push "redirect-gateway def1 bypass-dhcp"
finden. Diese Zeile weist den Client an, seinen gesamten Datenverkehr über den OpenVPN-Server umzuleiten. Dekommentiere die Zeile, um die Funktion zu aktivieren.
push "redirect-gateway def1 bypass-dhcp"
Suche den Abschnitt dhcp-option
unterhalb dieser Zeile. Entferne das Semikolon am Anfang der beiden Zeilen. Dadurch wird der Client angewiesen, die OpenDNS-Auflöser zu verwenden.
push "dhcp-option DNS 208.67.222.222" push "dhcp-option DNS 208.67.220.220"
Port und Protokoll ändern
OpenVPN verwendet standardmäßig Port 1194 und das UDP-Protokoll, um Client-Verbindungen zu akzeptieren. Du kannst den Port je nach deinen Bedürfnissen ändern. Wenn du keine Webinhalte auf deinem OpenVPN-Server hostest, kannst du Port 443 verwenden.
Finde die Zeile ;port 1194
, entkommentiere sie, indem du das Semikolon entfernst, und ändere ihren Wert.
port 443
Finde die Zeile proto udp
und kommentiere sie aus, indem du ein Semikolon davor setzt. Kommentiere die Zeile proto tcp
aus, indem du das Semikolon entfernst, wie gezeigt.
proto tcp ;proto udp
Da wir das TCP-Protokoll verwenden, müssen wir den Wert der Direktive explicit-exit-notify
von 1
in 0
ändern, da diese Direktive nur von UDP verwendet wird.
explicit-exit-notify 0
Auf nicht standardmäßige Anmeldeinformationen verweisen
Wenn du beim Befehl ./easy-rsa gen-req server
einen anderen Namen gewählt hast, musst du die Zeilen cert
und key
so ändern, dass sie auf die entsprechenden Dateien .crt
und .key
verweisen. Da wir den Standardnamen server
verwenden, ist der Standardwert korrekt.
cert server.crt key server.key # This file should be kept secret
Ändern des Speicherorts der Logdatei für SELinux
Finde die Zeile status openvpn-status.log
und ändere sie wie folgt.
status /var/log/openvpn-status.log
Standardmäßig erstellt und speichert der OpenVPN-Server das Protokoll im Verzeichnis /run/openvpn/openvpn-status.log
, was zu Problemen führt, wenn SELinux aktiviert ist. Die einfache Lösung ist, den Speicherort in das Systemprotokollverzeichnis zu ändern.
Wenn du fertig bist, speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Schritt 9 – Anpassen der Netzwerkkonfiguration des OpenVPN-Servers
Der nächste Schritt besteht darin, die Netzwerkkonfiguration des Servers so zu konfigurieren, dass OpenVPN den Datenverkehr korrekt weiterleiten kann. Das erste, was wir konfigurieren müssen, ist die Portweiterleitung.
Öffne die Datei /etc/sysctl.conf
, um sie zu bearbeiten.
$ sudo nano /etc/sysctl.conf
Füge die folgende Zeile am Ende der Datei ein.
net.ipv4.ip_forward = 1
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Um die Datei zu lesen und die neuen Werte für die aktuelle Sitzung zu laden, verwende den folgenden Befehl.
$ sudo sysctl -p net.ipv4.ip_forward = 1
Mit dieser Konfiguration wird der gesamte Webverkehr von deinem Client über die IP-Adresse deines Servers geleitet und die öffentliche IP-Adresse deines Clients wird effektiv verborgen.
Schritt 10 – Firewall konfigurieren
Wir haben OpenVPN installiert und konfiguriert, aber noch nicht für den eingehenden Client-Datenverkehr eingerichtet. Hierfür müssen wir die Firewall konfigurieren.
Überprüfe zunächst die aktiven Zonen in deiner firewalld
Firewall.
$ sudo firewall-cmd --get-active-zones
Du wirst eine ähnliche Ausgabe erhalten.
public interfaces: eth0 eth1
Wenn du die Schnittstelle tun0
nicht als Zone trusted
siehst, führe die folgenden Befehle aus, um den Server zu dieser Zone hinzuzufügen.
$ sudo firewall-cmd --zone=trusted --add-interface=tun0 $ sudo firewall-cmd --permanent --zone=trusted --add-interface=tun0
Als nächstes fügst du den OpenVPN-Dienst zur Liste der erlaubten Dienste in der aktiven Zone hinzu. Und dann mache die Einstellungen dauerhaft.
$ sudo firewall-cmd --permanent --add-service openvpn $ sudo firewall-cmd --permanent --zone=trusted --add-service openvpn
Lade die Firewall neu, um die Änderungen zu übernehmen.
$ sudo firewall-cmd --reload
Bestätige, dass der OpenVPN-Dienst hinzugefügt wurde.
$ sudo firewall-cmd --list-services --zone=trusted openvpn
Als Nächstes müssen wir eine Masquerade-Regel zur Firewall hinzufügen. Diese ermöglicht es dem OpenVPN-Server, die Adressen der Clients in die öffentliche Adresse des Servers zu übersetzen und dann den Datenverkehr umgekehrt an die Clients zurückzusenden. Dieser Vorgang wird auch Network Address Translation (NAT) genannt.
Füge Masquerade-Regeln mit den folgenden Befehlen hinzu.
$ sudo firewall-cmd --add-masquerade $ sudo firewall-cmd --add-masquerade --permanent
Überprüfe, ob die Maskerade korrekt hinzugefügt wurde.
$ sudo firewall-cmd --query-masquerade yes
Zum Schluss erstellst du die spezielle Masquerade-Regel für das OpenVPN-Subnetz. Dazu erstellst du eine Shell-Variable (in unserem TutorialDEVICE
), die die vom Server verwendete primäre Netzwerkschnittstelle darstellt, und fügst die Routing-Regel mithilfe dieser Variable dauerhaft hinzu.
$ DEVICE=$(ip route | awk '/^default via/ {print $5}') $ sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $DEVICE -j MASQUERADE
Zum Schluss öffnest du den Port, der oben für OpenVPN festgelegt wurde.
$ sudo firewall-cmd --permanent --add-port=443/tcp
Lade die Firewall neu, um die Änderung zu übernehmen.
$ sudo firewall-cmd --reload
Schritt 11 – OpenVPN starten
Aktiviere den OpenVPN-Dienst, damit er beim Booten startet.
$ sudo systemctl -f enable openvpn-server@server.service
Starte den OpenVPN-Dienst.
$ sudo systemctl start openvpn-server@server.service
Überprüfe den Status des Dienstes.
$ sudo systemctl status openvpn-server@server.service
Du wirst eine ähnliche Ausgabe erhalten.
? openvpn-server@server.service - OpenVPN service for server Loaded: loaded (/usr/lib/systemd/system/openvpn-server@.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2023-02-07 02:09:36 UTC; 13s ago Docs: man:openvpn(8) https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage https://community.openvpn.net/openvpn/wiki/HOWTO Main PID: 4789 (openvpn) Status: "Initialization Sequence Completed" Tasks: 1 (limit: 4443) Memory: 1.7M CPU: 21ms CGroup: /system.slice/system-openvpn\x2dserver.slice/openvpn-server@server.service ??4789 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --cipher AES-256-GCM --data-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC:AES-128-CBC:BF-CBC --config server.conf Feb 07 02:09:36 openvpn-server openvpn[4789]: Listening for incoming TCP connection on [AF_INET][undef]:443 Feb 07 02:09:36 openvpn-server openvpn[4789]: TCPv4_SERVER link local (bound): [AF_INET][undef]:443 Feb 07 02:09:36 openvpn-server openvpn[4789]: TCPv4_SERVER link remote: [AF_UNSPEC] Feb 07 02:09:36 openvpn-server openvpn[4789]: GID set to nobody Feb 07 02:09:36 openvpn-server openvpn[4789]: UID set to nobody Feb 07 02:09:36 openvpn-server openvpn[4789]: MULTI: multi_init called, r=256 v=256 Feb 07 02:09:36 openvpn-server openvpn[4789]: IFCONFIG POOL IPv4: base=10.8.0.4 size=62 Feb 07 02:09:36 openvpn-server openvpn[4789]: IFCONFIG POOL LIST Feb 07 02:09:36 openvpn-server openvpn[4789]: MULTI: TCP INIT maxclients=1024 maxevents=1028 Feb 07 02:09:36 openvpn-server openvpn[4789]: Initialization Sequence Completed
Schritt 12 – Client-Konfiguration erstellen
Bevor wir einen Client testen, müssen wir Konfigurationsdateien für den Client erstellen, den wir verwenden werden. Erstelle ein Verzeichnis zum Speichern der Client-Konfigurationsdateien.
$ mkdir -p ~/client-configs/files
Kopiere die Beispiel-Client-Konfigurationsdatei in dieses Verzeichnis.
$ cp /usr/share/doc/openvpn/sample/sample-config-files/client.conf ~/client-configs/base.conf
Öffne die Konfigurationsdatei, um sie zu bearbeiten.
$ nano ~/client-configs/base.conf
Suche die Direktive remote
und setze sie so, dass sie auf die öffentliche IP-Adresse deines OpenVPN-Servers zeigt. Ändere auch den Port so, dass er mit dem zuvor gewählten Port übereinstimmt.
. . . # The hostname/IP and port of the server. # You can have multiple remote entries # to load balance between the servers. remote your_server_ip 443 . . .
Lege das Protokoll fest, das du zuvor ausgewählt hast.
proto tcp
Hebe die Kommentare zu den Direktiven user
und group
auf, indem du das Semikolon vor ihnen entfernst.
# Downgrade privileges after initialization (non-Windows only) user nobody group nobody
Suche die Direktiven ca
, cert
und key
und kommentiere sie aus, indem du ein Semikolon davor setzt. Das liegt daran, dass wir die Zertifikate und Schlüssel in der Client-Konfigurationsdatei hinzufügen werden.
# SSL/TLS parms. # See the server config file for more # description. It's best to use # a separate .crt/.key file pair # for each client. A single ca # file can be used for all clients. ;ca ca.crt ;cert client.crt ;key client.key
Kommentiere die Direktive tls-auth
aus, da wir die ta.key
direkt in die Client-Konfigurationsdatei einfügen werden.
# If a tls-auth key is used on the server # then every client must also have the key. ;tls-auth ta.key 1
Übernimm die Einstellungen von cipher
und auth
, die du in der Datei `/etc/openvpn/server/server.conf
vorgenommen hast.
cipher AES-256-GCM auth SHA256
Füge die Direktive key-direction
hinzu und setze sie auf 1
, damit das VPN korrekt funktioniert.
key-direction 1
Erstelle ein Skript, um die Basiskonfiguration mit den entsprechenden Zertifikats-, Schlüssel- und Verschlüsselungsdateien zu kompilieren, und kopiere dann die erzeugte Konfigurationsdatei in das Verzeichnis ~/client-configs/files
.
Erstelle und öffne die Datei make_config.sh
im Verzeichnis ~/client-configs
.
$ nano ~/client-configs/make_config.sh
Füge den folgenden Code in die Datei ein.
#!/bin/bash # First argument: Client identifier KEY_DIR=~/client-configs/keys OUTPUT_DIR=~/client-configs/files BASE_CONFIG=~/client-configs/base.conf cat ${BASE_CONFIG} \ <(echo -e '<ca>') \ ${KEY_DIR}/ca.crt \ <(echo -e '</ca>\n<cert>') \ ${KEY_DIR}/${1}.crt \ <(echo -e '</cert>\n<key>') \ ${KEY_DIR}/${1}.key \ <(echo -e '</key>\n<tls-crypt>') \ ${KEY_DIR}/ta.key \ <(echo -e '</tls-crypt>') \ > ${OUTPUT_DIR}/${1}.ovpn
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Mache die Datei ausführbar und schränke die Berechtigungen ein.
$ chmod 700 ~/client-configs/make_config.sh
Dieses Skript erstellt eine Kopie der Datei base.conf
, sammelt alle Zertifikats- und Schlüsseldateien, extrahiert ihren Inhalt, hängt sie an die Basiskonfigurationsdatei an und exportiert alles, um eine neue Client-Konfigurationsdatei zu erstellen. Jedes Mal, wenn du einen neuen Client hinzufügst, musst du neue Schlüssel und Zertifikate für ihn erzeugen und dann dieses Skript ausführen, um eine Client-Konfigurationsdatei zu erstellen.
In Schritt 7 haben wir bereits die Client-Zertifikats- und Schlüsseldateien erstellt. Lass uns nun die Konfigurationsdatei dafür erstellen.
Wechsle in das Verzeichnis ~/client-configs
.
$ cd ~/client-configs
Führe das Skript aus, um die Client-Konfigurationsdatei zu erstellen.
$ ./make_config.sh client1
Dadurch wird eine Datei mit dem Namen client1.ovpn
erstellt. Ändere den Parameter, wenn du einen anderen Dateinamen möchtest. Überprüfe den Inhalt des Verzeichnisses.
$ ls ~/client-configs/files client1.ovpn
Dies ist die Konfigurationsdatei, die du auf den Client übertragen musst, der dann zur Verbindung mit dem OpenVPN-Server verwendet wird. Du kannst jedes SFTP-Protokoll/Programm verwenden, um die Datei auf den Client zu übertragen.
Schritt 13 – Client-Verbindung installieren und testen
Für unser Tutorial verwenden wir einen Rocky Linux 9 Client-Rechner. Installiere OpenVPN mit dem folgenden Befehl.
$ sudo dnf install openvpn
Führe den folgenden Befehl aus, um den Client mit dem VPN-Server zu verbinden.
$ sudo openvpn --config client1.ovpn
Du solltest eine ähnliche Ausgabe erhalten.
2023-02-07 11:42:05 OpenVPN 2.5.8 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Nov 1 2022 2023-02-07 11:42:05 library versions: OpenSSL 3.0.1 14 Dec 2021, LZO 2.10 2023-02-07 11:42:05 Outgoing Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key 2023-02-07 11:42:05 Outgoing Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication 2023-02-07 11:42:05 Incoming Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key 2023-02-07 11:42:05 Incoming Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication 2023-02-07 11:42:05 TCP/UDP: Preserving recently used remote address: [AF_INET]142.93.225.189:443 2023-02-07 11:42:05 Socket Buffers: R=[131072->131072] S=[16384->16384] 2023-02-07 11:42:05 Attempting to establish TCP connection with [AF_INET]142.93.225.189:443 [nonblock] 2023-02-07 11:42:05 TCP connection established with [AF_INET]142.93.225.189:443 2023-02-07 11:42:05 TCP_CLIENT link local: (not bound) 2023-02-07 11:42:05 TCP_CLIENT link remote: [AF_INET]142.93.225.189:443 2023-02-07 11:42:05 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay 2023-02-07 11:42:05 TLS: Initial packet from [AF_INET]142.93.225.189:443, sid=7c9feddd a75e1d1f 2023-02-07 11:42:06 VERIFY OK: depth=1, CN=Easy-RSA CA 2023-02-07 11:42:06 VERIFY KU OK 2023-02-07 11:42:06 Validating certificate extended key usage 2023-02-07 11:42:06 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication 2023-02-07 11:42:06 VERIFY EKU OK 2023-02-07 11:42:06 VERIFY OK: depth=0, CN=server 2023-02-07 11:42:06 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, peer certificate: 2048 bit RSA, signature: RSA-SHA256 2023-02-07 11:42:06 [server] Peer Connection Initiated with [AF_INET]142.93.225.189:443 2023-02-07 11:42:06 PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1 bypass-dhcp,dhcp-option DNS 208.67.222.222,dhcp-option DNS 208.67.220.220,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5,peer-id 0,cipher AES-256-GCM' 2023-02-07 11:42:06 OPTIONS IMPORT: timers and/or timeouts modified 2023-02-07 11:42:06 OPTIONS IMPORT: --ifconfig/up options modified 2023-02-07 11:42:06 OPTIONS IMPORT: route options modified 2023-02-07 11:42:06 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified 2023-02-07 11:42:06 OPTIONS IMPORT: peer-id set 2023-02-07 11:42:06 OPTIONS IMPORT: adjusting link_mtu to 1626 2023-02-07 11:42:06 OPTIONS IMPORT: data channel crypto options modified 2023-02-07 11:42:06 Outgoing Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key 2023-02-07 11:42:06 Incoming Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key 2023-02-07 11:42:06 net_route_v4_best_gw query: dst 0.0.0.0 2023-02-07 11:42:06 net_route_v4_best_gw result: via 10.0.2.2 dev enp0s3 2023-02-07 11:42:06 ROUTE_GATEWAY 10.0.2.2/255.255.255.0 IFACE=enp0s3 HWADDR=08:00:27:fd:d4:94 2023-02-07 11:42:06 TUN/TAP device tun0 opened 2023-02-07 11:42:06 net_iface_mtu_set: mtu 1500 for tun0 2023-02-07 11:42:06 net_iface_up: set tun0 up 2023-02-07 11:42:06 net_addr_ptp_v4_add: 10.8.0.6 peer 10.8.0.5 dev tun0 2023-02-07 11:42:06 net_route_v4_add: 142.93.225.189/32 via 10.0.2.2 dev [NULL] table 0 metric -1 2023-02-07 11:42:06 net_route_v4_add: 0.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1 2023-02-07 11:42:06 net_route_v4_add: 128.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1 2023-02-07 11:42:06 net_route_v4_add: 10.8.0.1/32 via 10.8.0.5 dev [NULL] table 0 metric -1 2023-02-07 11:42:06 GID set to nobody 2023-02-07 11:42:06 UID set to nobody 2023-02-07 11:42:06 Initialization Sequence Completed
Du kannst die Verbindung überprüfen, indem du die URL https://whatismyip.com
in deinem Browser aufrufst. Dort siehst du deine IP-Adresse und den Standort deines OpenVPN-Servers.
Du kannst die Verbindung auch weiter überprüfen, indem du einen Standardtest auf der Website https://www.dnsleaktest.com/
durchführst.
Du kannst die OpenDNS-Hostnamen sehen, die wir zuvor konfiguriert haben und der Standort des Servers stimmt mit dem Standort des OpenVPN-Servers überein.
Der obige Befehl führt OpenVPN im Vordergrund aus, was bedeutet, dass das Terminal blockiert wird. Um die Verbindung zu schließen, musst du Strg + C drücken. Du kannst OpenVPN aber auch im Hintergrund laufen lassen. Verwende dazu den folgenden Befehl.
sudo openvpn --config client1.ovpn --daemon
Um die Verbindung zu beenden, suche die Prozess-ID des Prozesses.
$ ps aux | grep openvpn
Du wirst eine ähnliche Ausgabe erhalten.
nobody 4357 0.3 0.0 13468 8432 ? Ss 15:35 0:00 openvpn --config client1.ovpn --daemon username 4406 0.0 0.0 17732 2432 pts/0 S+ 15:35 0:00 grep --color=auto openvpn
Wie du sehen kannst, lautet die Prozess-ID des OpenVPN-Prozesses 4357
. Beende die VPN-Verbindung mit dem folgenden Befehl, um den Prozess zu beenden.
$ sudo kill -9 4357
OpenVPN bietet GUI-Clients für Windows-, macOS-, Android- und iOS-Plattformen an, in die du die Client-Konfigurationsdatei importieren kannst, um dich zu verbinden.
Schritt 14 – Client-Zertifikate widerrufen
Wenn du das Zertifikat eines Clients widerrufen möchtest, um den Zugriff zu verhindern, kannst du dich beim CA-Server anmelden.
Wechsle in das Verzeichnis ~/easy-rsa
.
$ cd ~/easy-rsa
Führe das Skript mit der Option revoke
aus, gefolgt von dem Namen des Kunden.
$ ./easyrsa revoke client1
Du wirst gefragt, ob du das Zertifikat widerrufen willst.
Please confirm you wish to revoke the certificate with the following subject: subject= commonName = client1 Type the word 'yes' to continue, or any other input to abort. Continue with revocation: yes . . . Revoking Certificate 8348B3F146A765581946040D5C4D590A . . .
Dadurch wird das Zertifikat auf dem CA-Server widerrufen. Der OpenVPN-Server hat jedoch keine Möglichkeit, den Widerrufsstatus zu überprüfen. Deshalb müssen wir eine Certificate Revocation List (CRL) erstellen und sie an den OpenVPN-Server übertragen.
Erstelle die CRL.
$ ./easyrsa gen-crl
Du wirst aufgefordert, deine CA-Passphrase einzugeben. Der obige Befehl erzeugt eine Datei crl.pem
.
Kopiere diese Datei auf den OpenVPN-Server.
$ scp ~/easy-rsa/pki/crl.pem username@your_server_ip:/tmp
Melde dich wieder am OpenVPN-Server an und kopiere die CRL-Datei in das Verzeichnis /etc/openvpn/server
.
$ sudo cp /tmp/crl.pem /etc/openvpn/server/
Öffne die OpenVPN-Serverkonfigurationsdatei zur Bearbeitung.
$ sudo nano /etc/openvpn/server/server.conf
Füge die folgende Zeile am Ende der Datei hinzu. Sie weist den OpenVPN-Server an, die Sperrliste auf Clients zu überprüfen, die gesperrt wurden.
crl-verify crl.pem
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Starte den OpenVPN-Server neu, um die Änderungen zu übernehmen.
sudo systemctl restart openvpn-server@server.service
Der Client kann sich nicht mehr mit dem OpenVPN-Server verbinden.
Fazit
Damit ist unsere Anleitung zur Installation und Konfiguration des OpenVPN-Servers auf einem Rocky Linux 9 Server abgeschlossen. Wir haben auch den OpenVPN-Linux-Client mit dem Server verbunden. Wenn du Fragen hast, schreibe sie unten in die Kommentare.