One place for hosting & domains

      Einrichten

      Einrichten eines IKEv2-VPN-Servers mit StrongSwan unter Ubuntu 20.04


      Eine frühere Version dieses Tutorials wurde von Justin Ellingwood und Namo verfasst

      Einführung

      Ein virtuelles privates Netzwerk oder VPN ermöglicht Ihnen die sichere Verschlüsselung des Datenverkehrs auf dem Weg durch nicht vertrauenswürdige Netzwerke, wie z. B. im Café, bei einer Konferenz oder auf einem Flughafen.

      Internet Key Exchange v2 oder IKEv2 ist ein Protokoll, das ein direktes IPSec-Tunneling zwischen Server und Client ermöglicht. In IKEv2-VPN-Implementierungen bietet IPSec eine Verschlüsselung für den Netzwerkverkehr. IKEv2 wird auf einigen Plattformen (OS X 10.11+, iOS 9.1+ und Windows 10) nativ unterstützt, ohne dass zusätzliche Anwendungen erforderlich sind und Client-Hickups werden reibungslos verwaltet.

      In diesem Tutorial richten Sie einen IKEv2-VPN-Server mit StrongSwan auf einem Ubuntu-20.04-Server ein. Anschließend lernen Sie, wie mit Windows-, macOS-, Ubuntu-, iOS- und Android-Clients eine Verbindung zu diesem Server herstellen können.

      Voraussetzungen

      Um diesem Tutorial zu folgen, benötigen Sie:

      Schritt 1 — Installieren von StrongSwan

      Zuerst installieren wir StrongSwan, einen Open-Source-IPSec-Daemon, den wir als unseren VPN-Server konfigurieren werden. Außerdem installieren wir die Komponente „Public Key Infrastructure“ (PKI), sodass wir eine Zertifizierungsstelle (Certificate Authority, CA) erstellen können, die die Anmeldedaten für unsere Infrastruktur bereitstellt.

      Beginnen Sie mit der Aktualisierung des lokalen Paket-Caches:

      Installieren Sie dann die Software durch folgende Eingabe:

      • sudo apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins

      Das zusätzliche Paket libcharon-extauth-plugins wird verwendet, um sicherzustellen, dass verschiedene Clients sich bei Ihrem Server mit einem gemeinsamen Benutzernamen und einer gemeinsamen Passphrase authentifizieren können.

      Nachdem nun alles installiert ist, fahren wir mit der Erstellung unserer Zertifikate fort.

      Schritt 2 — Erstellen einer Zertifizierungsstelle

      Ein IKEv2-Server erfordert ein Zertifikat, um sich gegenüber Clients zu identifizieren. Um bei der Erstellung des erforderlichen Zertifikats zu helfen, enthält das Paket strongswan-pki ein Dienstprogramm namens pki zur Generierung einer Zertifizierungsstelle und von Serverzertifikaten.

      Zu Beginn erstellen wir einige Verzeichnisse zum Speichern aller Assets, an denen wir arbeiten möchten. Die Verzeichnisstruktur entspricht einigen der Verzeichnisse in /etc/ipsec.d, wohin wir schließlich alle von uns erstellten Objekte verschieben werden:

      • mkdir -p ~/pki/{cacerts,certs,private}

      Dann sperren wir die Berechtigungen, sodass unsere privaten Dateien von anderen Benutzern nicht gesehen werden können:

      Nachdem wir nun über eine Verzeichnisstruktur verfügen, um alles zu speichern, können wir einen Stammschlüssel generieren. Dies wird ein 4096-Bit-RSA-Schlüssel sein, der zum Signieren unserer Stammzertifizierungsstelle verwendet wird.

      Führen Sie diese Befehle zur Generierung des Schlüssels aus:

      • pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem

      Danach können wir zur Erstellung unserer Stammzertifizierungsstelle übergehen und den gerade generierten Schlüssel zum Signieren des Stammzertifikats verwenden:

      • pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem
      • --type rsa --dn "CN=VPN root CA" --outform pem > ~/pki/cacerts/ca-cert.pem

      Das Flag --lifetime 3650 wird verwendet, um sicherzustellen, dass das Stammzertifikat der Zertifizierungsstelle für 10 Jahre gültig ist. Das Stammzertifikat einer Stelle ändert sich in der Regel nicht, da es an alle Server und Clients, die darauf angewiesen sind, neu verteilt werden müsste. 10 Jahre ist als ein sicherer Standardwert für die Gültigkeitsdauer.

      Sie können den Wert für den unterscheidenden Namen (Distinguished name, DN) in etwas anderes ändern, wenn Sie möchten. Der gewöhnliche Name (Common Name) (CN-Feld) ist hier nur der Indikator, sodass er mit nichts in Ihrer Infrastruktur übereinstimmen muss.

      Nachdem wir nun unsere Stammzertifizierungsstelle eingerichtet haben, können wir ein Zertifikat erstellen, das der VPN-Server verwenden wird.

      Schritt 3 — Erstellen eines Zertifikats für den VPN-Server

      Wir erstellen nun ein Zertifikat und einen Schlüssel für den VPN-Server. Dieses Zertifikat ermöglicht es dem Client, die Authentifizierung des Servers mit dem gerade generierten CA-Zertifikat zu überprüfen.

      Erstellen Sie zunächst einen privaten Schlüssel für den VPN-Server mit dem folgenden Befehl:

      • pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem

      Erstellen und signieren Sie nun das VPN-Serverzertifikat mit dem Schlüssel der Zertifizierungsstelle, den Sie im vorherigen Schritt erstellt haben. Führen Sie den folgenden Befehl aus, ändern Sie jedoch den Common Name (CN) und das Feld Subject Alternate Name (SAN) in den DNS-Namen oder die IP-Adresse Ihres VPN-Servers:

      • pki --pub --in ~/pki/private/server-key.pem --type rsa
      • | pki --issue --lifetime 1825
      • --cacert ~/pki/cacerts/ca-cert.pem
      • --cakey ~/pki/private/ca-key.pem
      • --dn "CN=server_domain_or_IP" --san server_domain_or_IP
      • --flag serverAuth --flag ikeIntermediate --outform pem
      • > ~/pki/certs/server-cert.pem

      Anmerkung: Wenn Sie anstelle eines DNS-Namens eine IP-Adresse verwenden, müssen mehrere --san Einträge angegeben werden. Die Zeile im vorherigen Befehlsblock, in dem Sie den Distinguished Name (--dn ...) angeben, muss mit dem zusätzlichen Eintrag wie die folgende Auszugszeile modifiziert werden:

      --dn "CN=IP address --san @IP_address --san IP_address 
      

      Der Grund für diesen zusätzlichen Eintrag --san @IP_address ist, dass einige Clients prüfen, ob das TLS-Zertifikat sowohl über einen DNS-Eintrag als auch einen IP-Adressen-Eintrag für einen Server verfügt, wenn sie seine Identität überprüfen.

      Die Option –--flag serverAuth wird verwendet, um anzugeben, dass das Zertifikat explizit für die Serverauthentifizierung verwendet wird, bevor der verschlüsselte Tunnel hergestellt wird. Die Option --flag ikeIntermediate wird zur Unterstützung älterere MacOS-Clients verwendet.

      Nachdem wir nun alle TLS/SSL-Dateien erzeugt haben, die StrongSwan benötigt, können wir die Dateien in das Verzeichnis /etc/ipsec.d verschieben, indem wir Folgendes eingeben:

      • sudo cp -r ~/pki/* /etc/ipsec.d/

      In diesem Schritt haben wir ein Zertifikatpaar erstellt, das zur Sicherung der Kommunikation zwischen dem Client und dem Server verwendet wird. Wir haben die Zertifikate auch mit dem CA-Schlüssel signiert, sodass der Client die Authentifizierung des VPN-Servers mit dem CA-Zertifikat überprüfen kann. Nachdem nun alle diese Zertifikate fertig sind, gehen wir zur Konfiguration der Software über.

      Schritt 4 — Konfigurieren von StrongSwan

      StrongSwan hat eine Standardkonfigurationsdatei mit einigen Beispielen, aber wir werden die Konfiguration größtenteils selbst vornehmen müssen. Lassen Sie uns die Datei als Referenz sichern, bevor wir von Grund auf starten:

      • sudo mv /etc/ipsec.conf{,.original}

      Erstellen und öffnen Sie eine neue leere Konfigurationsdatei mit Ihrem bevorzugten Texteditor. Wir verwenden hier nano:

      • sudo nano /etc/ipsec.conf

      Anmerkung: Während Sie diesen Abschnitt zur Konfiguration des Serverteils Ihres VPNs durcharbeiten, werden Sie auf Einstellungen stoßen, die sich auf die linke und die rechte Seite einer Verbindung beziehen. Bei der Arbeit mit IPSec bezieht sich die linke Seite per Konvention auf das lokale System, das Sie konfigurieren, in diesem Fall den Server. Die Anweisungen der rechten Seite in diesen Einstellungen beziehen sich auf entfernte Clients wie Telefone und andere Computer.

      Wenn Sie später in diesem Tutorial mit der Konfiguration von Clients fortfahren, beziehen sich die Client-Konfigurationsdateien mit verschiedenen linken Anweisungen auf sich selbst, und der Server wird mit der Terminologie der rechten Seite bezeichnet.

      Zuerst weisen wir StrongSwan an, den Daemon-Status zur Fehlersuche zu protokollieren und doppelte Verbindungen zulassen. Fügen Sie der Datei diese Zeilen hinzu:

      /etc/ipsec.conf

      config setup
          charondebug="ike 1, knl 1, cfg 0"
          uniqueids=no
      

      Dann erstellen wir einen Konfigurationsabschnitt für unser VPN. Außerdem weisen wir StrongSwan an, IKEv2 VPN-Tunnel zu erstellen und diesen Konfigurationsabschnitt automatisch beim Starten zu laden. Fügen Sie der Datei folgende Zeilen an:

      /etc/ipsec.conf

      . . .
      conn ikev2-vpn
          auto=add
          compress=no
          type=tunnel
          keyexchange=ikev2
          fragmentation=yes
          forceencaps=yes
      

      Wir konfigurieren ebenfalls die Dead-Peer-Erkennung, um alle „unreferenzierten“ Verbindungen zu löschen, falls der Client die Verbindung unerwartet trennt. Fügen Sie diese Zeilen hinzu:

      /etc/ipsec.conf

      . . .
      conn ikev2-vpn
          . . .
          dpdaction=clear
          dpddelay=300s
          rekey=no
      

      Als Nächstes konfigurieren wir die IPSec-Parameter der „linken“ Seite des Servers. Jede der folgenden Parameter stellt sicher, dass der Server für die Annahme von Verbindungen von Clients und für seine korrekte Identifizierung konfiguriert ist. Sie fügen jede dieser Einstellungen der Datei /etc/ipsec.conf hinzu, sobald Sie sich damit vertraut gemacht haben, was sie sind und warum sie verwendet werden:

      • left =%any Der Wert %any stellt sicher, dass der Server die Netzwerkschnittstelle, an der er eingehende Verbindungen empfängt, für die nachfolgende Kommunikation mit Clients verwendet. Wenn Sie beispielsweise einen Client über ein privates Netzwerk verbinden, verwendet der Server für den Rest der Verbindung die private IP-Adresse, an der er den Datenverkehr empfängt.
      • leftid=@server_domain_or_IP Diese Option steuert den Namen, den der Server den Clients präsentiert. In Kombination mit der nächsten Option leftcert, stellt die Option leftid sicher, dass der konfigurierte Name des Servers und der im öffentlichen Zertifikat enthaltene Dinstinguished Name (DN) übereinstimmen.
      • leftcert=server-cert.pem Diese Option ist der Pfad zum öffentlichen Zertifikat für den Server, den Sie in Schritt 3 konfiguriert haben. Ohne ihn kann sich der Server nicht bei Clients authentifizieren und die Aushandlung der IKEv2-Einrichtung nicht beenden.
      • leftsendcert=always Der Wert always stellt sicher, dass jeder Client, der sich mit dem Server verbindet, als Teil des anfänglichen Verbindungsaufbaus immer eine Kopie des öffentlichen Zertifikats des Servers erhält.
      • leftsubnet=0.0.0.0/0 Die letzte Option der „linken“ Seite, die Sie hinzufügen werden, informiert Clients über die Subnetze, die hinter dem Server erreichbar sind. In diesem Fall wird 0.0.0.0/0 verwendet, um den gesamten Satz der IPv4-Adressen zu repräsentieren, was bedeutet, dass der Server Clients standardmäßig anweist, ihren gesamten Datenverkehr über das VPN zu senden.

      Nachdem Sie nun mit jeder der entsprechenden Optionen der „linken“ Seite vertraut sind, fügen Sie sie alle wie folgt zur Datei hinzu:

      /etc/ipsec.conf

      . . .
      conn ikev2-vpn
          . . .
          left=%any
          leftid=@server_domain_or_IP
          leftcert=server-cert.pem
          leftsendcert=always
          leftsubnet=0.0.0.0/0
      

      Anmerkung: Geben Sie bei der Konfiguration der Server-ID (leftid) das @-Zeichen nur dann an, wenn Ihr VPN-Server durch einen Domänennamen identifiziert werden soll:

      /etc/ipsec.conf

          . . .    leftid=@vpn.example.com
          . . .
      

      Wenn der Server durch seine IP-Adresse identifiziert werden soll, geben Sie einfach die IP-Adresse ein:

      /etc/ipsec.conf

          . . .
          leftid=your_server_ip
          . . .
      

      Als Nächstes können wir die IPSec-Parameter der „rechten“ Seite des Clients konfigurieren. Jede der folgenden Parameter teilt dem Server mit, wie Verbindungen von Clients akzeptiert werden sollen, wie sich Clients beim Server authentifizieren sollen und welche privaten IP-Adressbereiche und DNS-Server diese Clients verwenden werden. Fügen Sie jede dieser Einstellungen der Datei /etc/ipsec.conf hinzu, sobald Sie sich damit vertraut gemacht haben, was sie sind und warum sie verwendet werden:

      • right=%any Die Option %any für die rechte Seite der Verbindung weist den Server an, eingehende Verbindungen von jedem Remote-Client anzunehmen.
      • rightid=%any Diese Option stellt sicher, dass der Server keine Verbindungen von Clients ablehnt, die eine Identität angeben, bevor der verschlüsselte Tunnel hergestellt ist.
      • rightauth=eap-mschapv2 Diese Option konfiguriert die Authentifizierungsmethode, die Clients zur Authentifizierung gegenüber dem Server verwenden werden. eap-mschapv2 wird hier für eine breite Kompatibilität verwendet, um Clients wie Windows-, MacOS- und Android-Geräte zu unterstützen.
      • rightsourceip=10.10.10.0/24 Diese Option weist den Server an, Clients private IP-Adressen aus dem angegebenen IP-Pool 10.10.10.0/24 zuzuweisen.
      • rightdns=8.8.8.8,8.8.4.4 Diese IP-Adressen sind die öffentlichen DNS-Auflöser von Google. Sie können geändert werden, um andere öffentliche Auflöser, die Auflösung des VPN-Servers oder einen anderen Auflöser zu verwenden, den die Clients erreichen können.
      • rightsendcert=never Diese Option weist den Server an, dass Clients kein Zertifikat senden müssen, um sich selbst zu authentifizieren.

      Nachdem Sie nun mit den erforderlichen Optionen der „rechten“ Seite vertraut sind, fügen Sie die folgenden Zeilen in /etc/ipsec.conf ein:

      /etc/ipsec.conf

      . . .
      conn ikev2-vpn
          . . .
          right=%any
          rightid=%any
          rightauth=eap-mschapv2
          rightsourceip=10.10.10.0/24
          rightdns=8.8.8.8,8.8.4.4
          rightsendcert=never
      

      Nun werden wir StrongSwan anweisen, den Client beim Verbindungsaufbau nach den Anmeldedaten der Benutzer zu fragen:

      /etc/ipsec.conf

      . . .
      conn ikev2-vpn
          . . .
          eap_identity=%identity
      

      Zum Schluss fügen Sie die folgenden Zeilen hinzu, um Linux-, Windows-, macOS-, iOS- und Android-Clients zu unterstützen. Diese Zeilen spezifizieren die verschiedenen Schlüsselaustausch-, Hashing-, Authentifizierungs- und Verschlüsselungsalgorithmen (allgemein als Cipher Suites bezeichnet), die StrongSwan den verschiedenen Clients zur Verfügung stellt:

      /etc/ipsec.conf

      . . .
      conn ikev2-vpn
          . . .
          ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
          esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
      

      Jede unterstützte Cipher Suite wird durch ein Komma von den anderen abgegrenzt. Beispielsweise ist chacha20poly1305-sha512-curve25519-prfsha512 eine Suite, und aes256gcm16-sha384-prfsha384-ecp384 ist eine andere. Die hier aufgelisteten Cipher Suits sind so ausgewählt, dass sie die größtmögliche Kompatibilität zwischen Windows-, macOS-, iOS-, Android- und Linux-Clients gewährleisten.

      Die vollständige Konfigurationsdatei sollte wie folgt aussehen:

      /etc/ipsec.conf

      config setup
          charondebug="ike 1, knl 1, cfg 0"
          uniqueids=no
      
      conn ikev2-vpn
          auto=add
          compress=no
          type=tunnel
          keyexchange=ikev2
          fragmentation=yes
          forceencaps=yes
          dpdaction=clear
          dpddelay=300s
          rekey=no
          left=%any
          leftid=@server_domain_or_IP
          leftcert=server-cert.pem
          leftsendcert=always
          leftsubnet=0.0.0.0/0
          right=%any
          rightid=%any
          rightauth=eap-mschapv2
          rightsourceip=10.10.10.0/24
          rightdns=8.8.8.8,8.8.4.4
          rightsendcert=never
          eap_identity=%identity
          ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
          esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
      

      Speichern und schließen Sie die Datei, nachdem Sie überprüft haben, dass Sie jede Zeile korrekt hinzugefügt haben. Wenn Sie nano verwendet haben, drücken Sie STRG+X, Y, dann die EINGABETASTE.

      Nachdem wir nun die VPN-Parameter konfiguriert haben, gehen wir zur Erstellung eines Kontos über, damit unsere Benutzer eine Verbindung zum Server herstellen können.

      Schritt 5 — Konfigurieren der VPN-Authentifizierung

      Unser VPN-Server ist nun so konfiguriert, dass er Client-Verbindungen akzeptiert, aber wir haben noch keine Anmeldedaten konfiguriert. Wir müssen einige Dinge in einer speziellen Konfigurationsdatei namens ipsec.secrets konfigurieren:

      • Wir müssen StrongSwan mitteilen, wo der private Schlüssel für unser Serverzertifikat zu finden ist, damit sich der Server gegenüber den Clients authentifizieren kann.
      • Außerdem müssen wir eine Liste von Benutzern erstellen, die eine Verbindung mit dem VPN herstellen dürfen.

      Öffnen wie die Datei „Secrets“ zum Bearbeiten:

      • sudo nano /etc/ipsec.secrets

      Zuerst teilen wir StrongSwan mit, wo unser privater Schlüssel zu finden ist:

      /etc/ipsec.secrets

      : RSA "server-key.pem"
      

      Dann definieren wir die Anmeldedaten des Benutzers. Sie können jede beliebige Kombination von Benutzername und Passwort zusammenstellen, die Ihnen gefällt:

      /etc/ipsec.secrets

      your_username : EAP "your_password"
      

      Speichern und schließen Sie die Datei. Nachdem wir die Arbeit mit den VPN-Parametern beendet haben, starten wir den VPN-Dienst neu, damit unsere Konfiguration übernommen wird:

      • sudo systemctl restart strongswan-starter

      Nachdem der VPN-Server nun sowohl mit den Serveroptionen als auch mit den Anmeldedaten der Benutzer vollständig konfiguriert ist, ist es an der Zeit, mit der Konfiguration des wichtigsten Teils fortzufahren: der Firewall.

      Schritt 6 — Konfigurieren der Firewall & Kernel-IP-Weiterleitung

      Nachdem die Konfiguration von StrongSwan abgeschlossen ist, müssen wir die Firewall so konfigurieren, dass sie VPN-Verkehr durchlässt und weiterleitet.

      Wenn Sie dem Tutorial zur Ersteinrichtung des Servers gefolgt sind, sollten Sie eine UFW-Firewall aktiviert haben. Wenn Sie UFW noch nicht konfiguriert haben, sollten Sie zunächst mit dem Hinzufügen einer Regel beginnen, um SSH-Verbindungen durch die Firewall zuzulassen, damit Ihre aktuelle nicht geschlossen wird, wenn Sie UFW aktivieren:

      Aktivieren Sie dann die Firewall durch folgende Eingabe:

      Fügen Sie dann eine Regel hinzu, um den UDP-Verkehr zu den IPSec-Standardports 500 und 4500 zulassen:

      • sudo ufw allow 500,4500/udp

      Als Nächstes öffnen wir eine der Konfigurationsdateien von UFW, um einige niedrigstufige Richtlinien für das Routing und die Weiterleitung von IPSec-Paketen hinzuzufügen. Zuvor müssen wir jedoch herausfinden, welche Netzwerkschnittstelle auf unserem Server für den Internetzugang verwendet wird. Finden Sie diese Schnittstelle, indem Sie das mit der Standardroute verknüpfte Gerät abfragen:

      Ihre öffentliche Schnittstelle sollte dem Wort „dev“ folgen. Dieses Ergebnis zeigt beispielsweise die im folgenden Beispiel hervorgehobene Schnittstelle eth0 an:

      Output

      default via your_server_ip dev eth0 proto static

      Wenn Sie Ihre öffentliche Netzwerkschnittstelle haben, öffnen Sie die Datei /etc/ufw/before.rules in Ihrem Texteditor. Die Regeln in dieser Datei werden der Firewall vor den übrigen üblichen Eingabe- und Ausgaberegeln hinzugefügt. Sie werden verwendet, um die Netzwerkadressübersetzung (Network Address Translation, NAT) zu konfigurieren, damit der Server Verbindungen zu und von Clients und dem Internet korrekt weiterleiten kann.

      • sudo nano /etc/ufw/before.rules

      Fügen Sie am Anfang der Datei (vor der Zeile *filter) den folgenden Konfigurationsblock hinzu. Ändern Sie jede Instanz von eth0 in der obigen Konfiguration so, dass sie mit dem Schnittstellennamen übereinstimmt, den Sie mit ip route gefunden haben. Die Zeilen *nat erstellen Regeln, damit die Firewall den Datenverkehr zwischen den VPN-Clients und dem Internet korrekt weiterleiten und manipulieren kann. Die Zeile *mangle passt die maximale Paketsegmentgröße an, um potenzielle Probleme mit bestimmten VPN-Clients zu verhindern:

      /etc/ufw/before.rules

      *nat
      -A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
      -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
      COMMIT
      
      *mangle
      -A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.0/24 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
      COMMIT
      
      *filter
      :ufw-before-input - [0:0]
      :ufw-before-output - [0:0]
      :ufw-before-forward - [0:0]
      :ufw-not-local - [0:0]
      . . .
      

      Fügen Sie als Nächstes nach den Zeilen *filter und Kettendefinitionen einen weiteren Konfigurationsblock hinzu:

      /etc/ufw/before.rules

      . . .
      *filter
      :ufw-before-input - [0:0]
      :ufw-before-output - [0:0]
      :ufw-before-forward - [0:0]
      :ufw-not-local - [0:0]
      
      -A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT
      -A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT
      

      Diese Zeilen weisen die Firewall an, den ESP-Datenverkehr (Encapsulating Security Payload-Datenverkehr) weiterzuleiten, sodass die VPN-Clients eine Verbindung herstellen können. ESP bietet für unsere VPN-Pakete zusätzliche Sicherheit, da sie nicht vertrauenswürdige Netzwerke durchqueren.

      Wenn Sie fertig sind, speichern und schließen Sie die Datei, nachdem Sie überprüft haben, dass Sie jede Zeile korrekt hinzugefügt haben. Wenn Sie nano verwendet haben, drücken Sie STRG+X, Y, dann die EINGABETASTE.

      Vor dem Neustart der Firewall werden wir einige Netzwerk-Kernel-Parameter ändern, um die Weiterleitung von einer Schnittstelle zu einer anderen zu ermöglichen. Die Datei, die diese Einstellungen steuert, heißt /etc/ufw/sysctl.conf. In dieser Datei müssen wir einige Dinge konfigurieren.

      Zuerst muss die IPv4-Paketweiterleitung eingeschaltet werden, damit der Datenverkehr zwischen dem VPN und den öffentlich zugänglichen Netzwerkschnittstellen auf dem Server ausgetauscht werden kann. Als Nächstes deaktivieren wir die Path-MTU-Erkennung, um Probleme mit der Paketfragmentierung zu verhindern. Abschließend werden wir weder ICMP-Weiterleitungen akzeptieren noch ICMP-Weierleitungen senden, um Man-in-the-Middle-Angriffe zu verhindern.

      Öffnen Sie die Konfigurationsdatei der UFW-Kernel-Parameter in nano oder Ihrem bevorzugten Texteditor:

      • sudo nano /etc/ufw/sysctl.conf

      Fügen Sie nun am Ende der Datei die folgende Einstellung net/ipv4/ip_forward=1 hinzu, um die Weiterleitung von Paketen zwischen Schnittstellen zu ermöglichen:

      /etc/ufw/sysctl.conf

      . . .
      net/ipv4/ip_forward=1
      

      Blockieren Sie als Nächstes das Senden und Empfangen von ICMP-Umleitungspaketen, indem Sie die folgenden Zeilen am Ende der Datei hinzufügen:

      /etc/ufw/sysctl.conf

      . . .
      net/ipv4/conf/all/accept_redirects=0
      net/ipv4/conf/all/send_redirects=0
      

      Deaktivieren Sie abschließend die Path-MTU-Erkennung, indem Sie diese Zeile am Ende der Datei hinzufügen:

      /etc/ufw/sysctl.conf

      . . .
      net/ipv4/ip_no_pmtu_disc=1
      

      Speichern Sie die Datei, wenn Sie fertig sind. Jetzt können wir alle unsere Änderungen durch Deaktivieren und erneutes Aktivieren der Firewall aktivieren, da UFW diese Einstellungen bei jedem Neustart anwendet:

      • sudo ufw disable
      • sudo ufw enable

      Sie werden dazu aufgefordert, den Vorgang zu bestätigen. Geben Sie Y ein, um UFW mit den neuen Einstellungen erneut zu aktivieren.

      Schritt 7 — Testen der VPN-Verbindung unter Windows, macOS, Ubuntu, iOS und Android

      Nachdem nun alles eingerichtet ist, ist es Zeit, es auszuprobieren. Zuerst müssen Sie das von Ihnen erstellte CA-Zertifikat kopieren und auf Ihrem/Ihren Client-Gerät(en) installieren, das/die sich mit Ihrem Server verbindet/verbinden. Am einfachsten geht das, indem Sie sich bei Ihrem Server anmelden und den Inhalt der Zertifikatsdatei ausgeben:

      • cat /etc/ipsec.d/cacerts/ca-cert.pem

      Sie sehen eine Ausgabe, die dieser ähnelt:

      Output

      -----BEGIN CERTIFICATE----- MIIFNDCCAxygAwIBAgIIHCsidG5mXzgwDQYJKoZIhvcNAQEMBQAwODELMAkGA1UE . . . H2YUdz8XNHrJHvMQKWFpi0rlEcMs+MSXPFWE3Q7UbaZJ/h8wpSldSUbQRUlphExJ dJ4PX+MUJO/vjG1/ie6Kh25xbBAc3qNq8siiJZDwrg6vjEK7eiZ1rA== -----END CERTIFICATE-----

      Kopieren Sie diese Ausgabe auf Ihren Computer, einschließlich der Zeilen --BEGIN CERTIFICATE---- und --END CERTIFICATE--, und speichern Sie sie in einer Datei mit einem erkennbaren Namen wie ca-cert.pem. Stellen Sie sicher, dass die von Ihnen erstellte Datei die Erweiterung .pem hat.

      Alternativ können Sie SFTP verwenden, um die Datei auf Ihren Computer zu übertragen.

      Sobald die Datei ca-cert.pem auf Ihren Computer heruntergeladen haben, können Sie die Verbindung zum VPN einrichten.

      Herstellen der Verbindung von Windows

      Es gibt mehrere Möglichkeiten, das Stammzertifikat zu importieren und Windows für die Verbindung mit einem VPN zu konfigurieren. Die erste Methode verwendet grafische Tools für jeden Schritt. Die zweite Methode verwendet PowerShell-Befehle, die in Skripts geschrieben und an Ihre VPN-Konfiguration angepasst werden können.

      Anmerkung: Diese Anweisungen wurden in Windows 10-Installationen getestet, die die Versionen 1903 und 1909 ausführen.

      Konfigurieren von Windows mit grafischen Tools

      Importieren Sie zunächst das Stammzertifikat, indem Sie die folgenden Schritte ausführen:

      1. Drücken Sie WINDOWS+R, um das Dialogfeld Ausführen aufzurufen, und geben Sie mmc.exe zum Starten der Windows Managementkonsole ein.
      2. Navigieren Sie im Menü Datei zu Snap-In hinzufügen oder entfernen, wählen Sie aus der Liste der verfügbaren Snap-Ins Zertifikate aus und klicken Sie auf Hinzufügen.
      3. Wir wollen, dass das VPN mit jedem Benutzer funktioniert, daher wählen wir Computerkonto und klicken auf Weiter.
      4. Wir konfigurieren Dinge auf dem lokalen Computer, daher wählen wir Lokaler Computer und klicken auf Fertigstellen.
      5. Erweitern Sie unter dem Knoten Konsolenstamm den Eintrag Zertifikate (Lokaler Computer), erweitern Sie Vertrauenswürdige Stammzertifizierungsstellen und wählen Sie dann den Eintrag** Zertifikate**: Zertifikatsansicht.

      6. Wählen Sie im Menü Aktion Alle Aufgaben aus und klicken Sie auf Improtieren, um den Assistenten für den Zertifikatimport anzuzeigen. Klicken Sie auf Weiter, um die Einführung zu überspringen.

      7. Klicken Sie auf dem Bildschirm Zu importierende Datei die Schaltfläche Durchsuchen, stellen Sie sicher, dass Sie den Dateityp von „X.509-Zertifikat (.cer;.crt)“ in „Alle Dateien (.)“ ändern und wählen Sie die Datei ca-cert.pem, die Sie gespeichert haben. Klicken Sie dann auf Weiter.

      8. Stellen Sie sicher, dass der Zertifikatspeicher auf Vertrauenswürdige Stammzertifizierungsstellen eingestellt ist und klicken Sie auf Weiter.

      9. Klicken Sie auf Fertigstellen, um das Zertifikat zu importieren.

      Konfigurieren Sie das VPN dann mit diesen Schritten:

      1. Starten Sie die Systemsteuerung, navigieren Sie dann zum Netzwerk- und Freigabecenter.
      2. Klicken Sie auf Einrichten einer neuen Verbindung oder eines neuen Netzwerks und wählen Sie Mit einem Arbeitsplatz verbinden.
      3. Wählen Sie Meine Internetverbindung (VPN) verwenden.
      4. Geben Sie die Details des VPN-Servers ein. Geben Sie den Domänennamen oder die IP-Adresse des Servers in das Feld Internetadresse ein und geben Sie dann den Zielnamen mit einer Beschreibung Ihrer VPN-Verbindung ein. Klicken Sie dann auf Fertig.

      Konfigurieren von Windows mit PowerShell

      Um das Stamm-CA-Zertifikat mit PowerShell zu importieren, öffnen Sie zunächst eine PowerShell-Eingabeaufforderung mit Administratorberechtigungen. Klicken Sie dazu mit der rechten Maustaste auf das Symbol im Startmenü und wählen Sie Windows PowerShell (Admin). Sie können auch eine Eingabeaufforderung als Administrator öffnen und powershell eingeben.

      Als Nächstes importieren wir das Zertifikat mit dem Powershell cmdlet Import-Certificate. Im folgenden Befehl wird mit dem ersten Argument -CertStoreLocation sichergestellt, dass das Zertifikat in dem Speicher der Vertrauenswürdigen Stammzertifizierungsstelle des Computers importiert wird, damit alle Programme und Benutzer das Zertifikat des VPN-Servers überprüfen können. Das Argument -FilePath sollte auf den Speicherort verweisen, in den Sie das Zertifikat kopiert haben. Im folgenden Beispiel lautet der Pfad C:UserssammyDocumentsca-cert.pem. Stellen Sie sicher, dass Sie den Befehl so bearbeiten, dass er mit dem von Ihnen verwendeten Speicherort übereinstimmt.

      • Import-Certificate `
      • -CertStoreLocation cert:LocalMachineRoot `
      • -FilePath C:userssammyDocumentsca-cert.pem

      Der Befehl gibt etwas wie das Folgende aus:

      Output

      PSParentPath: Microsoft.PowerShell.SecurityCertificate::LocalMachineRoot Thumbprint Subject ---------- ------- DB00813B4087E9367861E8463A60CEA0ADC5F002 CN=VPN root CA

      Um nun das VPN mit PowerShell zu konfigurieren, führen Sie den folgenden Befehl aus. Ersetzen Sie den DNS-Namen oder die IP-Adresse Ihres Servers in der Zeile -Serveraddress. Die verschiedenen Flags stellen sicher, dass Windows korrekt mit den entsprechenden Sicherheitsparametern konfiguriert wird, die den Optionen entsprechen, die Sie in /etc/ipsec.conf festgelegt haben.

      • Add-VpnConnection -Name "VPN Connection" `
      • -ServerAddress "server_domain_or_IP" `
      • -TunnelType "IKEv2" `
      • -AuthenticationMethod "EAP" `
      • -EncryptionLevel "Maximum" `
      • -RememberCredential `

      Wenn der Befehl erfolgreich ist, gibt es keine Ausgabe. Um zu bestätigen, dass das VPN richtig konfiguriert ist, verwenden Sie das cmdlet Get-VPNConnection:

      • Get-VpnConnection -Name "VPN Connection"

      Sie erhalten eine Ausgabe wie die folgende:

      Output

      Name : VPN Connection ServerAddress : your_server_ip AllUserConnection : False Guid : {B055A1AB-175C-4028-B4A8-D34309A2B20E} TunnelType : Ikev2 AuthenticationMethod : {Eap} EncryptionLevel : Maximum L2tpIPsecAuth : UseWinlogonCredential : False EapConfigXmlStream : #document ConnectionStatus : Disconnected RememberCredential : True SplitTunneling : False DnsSuffix : IdleDisconnectSeconds : 0

      Standardmäßig wählt Windows ältere und langsamere Algorithmen. Führen Sie das cmdlet Set-VpnConnectionIPsecConfiguration aus, um die Verschlüsselungsparameter zu aktualisieren, die Windows für den IKEv2-Schlüsselaustausch verwendet und um Pakete zu verschlüsseln:

      • Set-VpnConnectionIPsecConfiguration -Name "VPN Connection" `
      • -AuthenticationTransformConstants GCMAES256 `
      • -CipherTransformConstants GCMAES256 `
      • -DHGroup ECP384 `
      • -IntegrityCheckMethod SHA384 `
      • -PfsGroup ECP384 `
      • -EncryptionMethod GCMAES256

      Anmerkung: Wenn Sie die VPN-Verbindung löschen und mit verschiedenen Optionen neu konfigurieren möchten, können Sie das cmdlet Remove-VpnConnection ausführen.

      • Remove-VpnConnection -Name "VPN Connection" -Force

      Das Flag -Force wird übersprungen und Sie werden aufgefordert, das Entfernen zu bestätigen. Wenn Sie versuchen, die VPN-Verbindung mit diesem Befehl zu entfernen, müssen Sie vom VPN getrennt sein.

      Herstellen einer Verbindung mit dem VPN

      Sobald Sie das Zertifikat importiert und das VPN mit einer der beiden Methoden konfiguriert haben, wird Ihre neue VPN-Verbindung unter der Liste der Netzwerke sichtbar. Wählen Sie das VPN und klicken Sie auf Verbinden. Sie werden zur Eingabe Ihres Benutzernamens und Ihres Passworts aufgefordert. Geben Sie sie ein, klicken Sie auf OK, und Sie werden verbunden.

      Herstellen einer Verbindung von macOS

      Folgen Sie diesen Schritten, um das Zertifikat zu importieren:

      1. Doppelklicken Sie auf die Zertifikatsdatei. Keychain Access wird mit einem Dialogfeld eingeblendet, in dem es heißt „Keychain Access is trying to modify the system keychain. Enter your password to allow this.“ (Keychain Access versucht die System-Keychain zu ändern. Geben Sie Ihr Passwort ein, um dies zuzulassen).
      2. Geben Sie Ihr Passwort ein, klicken Sie dann auf Modify Keychain (Keychain ändern)
      3. Doppelklicken Sie auf das neu importierte VPN-Zertifikat. Dadurch wird ein kleines Eigenschaftenfenster eingeblendet, in dem Sie die Vertrauensstufen angeben können. Setzen Sie IP Security (IPSec) auf Always Trust (Immer vertrauen) und Sie werden erneut zur Eingabe Ihres Passworts aufgefordert. Diese Einstellung wird nach der Eingabe des Passworts automatisch gespeichert.

      Nachdem das Zertifikat importiert und vertrauenswürdig ist, konfigurieren Sie die VPN-Verbindung nun mit diesen Schritten:

      1. Gehen Sie zu Systemeinstellungen und wählen Sie Netzwerk.
      2. Klicken Sie auf die kleine „Plus“-Schaltfläche unten links in der Liste der Netzwerke.
      3. Stellen Sie in dem angezeigten Popup-Fenster Schnittstelle auf VPN, setzen Sie den VPN-Typ auf IKEv2 und geben Sie der Verbindung einen Namen.
      4. Geben Sie im Feld Server und Remote ID den Domänennamen oder die IP-Adresse des Servers ein. Lassen Sie Lokale ID leer.
      5. Klicken Sie auf Authentifizierungseinstellungen, wählen Sie Bentuzername und geben Sie Ihren Benutzernamen und Ihr Passwort ein, das Sie für Ihren VPN-Benutzer konfiguriert haben. Klicken Sie dann auf OK.

      Klicken Sie abschließend auf Verbinden, um sich mit dem VPN zu verbinden. Sie sollten nun mit dem VPN verbunden sein.

      Herstellen einer Verbindung von Ubuntu

      Um eine Verbindung von einem Ubuntu-Rechner herzustellen, können Sie StrongSwan als Dienst einrichten und verwalten oder bei jeder gewünschten Verbindung einen einmaligen Befehl verwenden. Für beides stehen Anweisungen zur Verfügung.

      Verwalten von StrongSwan als Dienst

      Um StrongSwan als Dienst zu verwalten, müssen Sie die folgenden Konfigurationsschritte durchführen.

      Aktualisieren Sie zunächst Ihren lokalen Paket-Cache mit apt

      Installieren Sie als Nächstes StrongSwan und die erforderlichen Plugins für die Authentifizierung:

      • sudo apt install strongswan libcharon-extra-plugins

      Jetzt benötigen Sie im Verzeichnis /etc/ipsec.d/cacerts eine Kopie des CA-Zertifikats, damit Ihr Client die Identität des Servers überprüfen kann. Führen Sie den folgenden Befehl aus, um die Datei ca-cert.pem in den richtigen Speicherort zu kopieren:

      • sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts

      Um sicherzustellen, dass das VPN nur bei Bedarf ausgeführt wird, deaktivieren Sie mit systemctl die automatische Ausführung von StrongSwan:

      • sudo systemctl disable --now strongswan-starter

      Konfigurieren Sie als Nächstes den Benutzernamen und das Passwort, das Sie zur Authentifizierung auf dem VPN-Server verwenden werden. Bearbeiten Sie /etc/ipsec.secrets mit nano oder Ihrem bevorzugten Editor:

      • sudo nano /etc/ipsec.conf

      Fügen Sie die folgende Zeile hinzu und bearbeiten Sie die hervorgehobenen Werte für Benutzername und Passwort, damit sie mit denen übereinstimmen, die Sie auf dem Server konfiguriert haben:

      /etc/ipsec.conf

      your_username : EAP "your_password"
      

      Bearbeiten Sie abschließend die Datei /etc/ipsec.conf, um Ihren Client so zu konfigurieren, dass er mit der Konfiguration des Servers übereinstimmt:

      /etc/ipsec.conf

      config setup
      
      conn ikev2-rw
          right=server_domain_or_IP
          # This should match the `leftid` value on your server's configuration
          rightid=server_domain_or_IP
          rightsubnet=0.0.0.0/0
          rightauth=pubkey
          leftsourceip=%config
          leftid=username
          leftauth=eap-mschapv2
          eap_identity=%identity
          auto=start
      

      Um sich mit dem VPN zu verbinden, geben Sie Folgendes ein:

      • sudo systemctl start strongswan-starter

      Um sich wieder zu trennen, geben Sie Folgendes ein:

      • sudo systemctl stop strongswan-starter

      Verwenden des Clients charon-cmd für einmalige Verbindungen

      Um StrongSwan als Dienst zu verwalten, müssen Sie die folgenden Konfigurationsschritte durchführen.

      Aktualisieren Sie zunächst Ihren lokalen Paket-Cache mit apt

      Installieren Sie als Nächstes StrongSwan und die erforderlichen Plugins für die Authentifizierung:

      • sudo apt install strongswan libcharon-extra-plugins

      Jetzt benötigen Sie im Verzeichnis /etc/ipsec.d/cacerts eine Kopie des CA-Zertifikats, damit Ihr Client die Identität des Servers überprüfen kann. Führen Sie den folgenden Befehl aus, um die Datei ca-cert.pem in den richtigen Speicherort zu kopieren:

      • sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts

      Zu diesem Zeitpunkt können Sie sich mit charon-cmd unter Verwendung des CA-Zertifikats des Servers, der IP-Adresse des VPN-Servers und des von Ihnen konfigurierten Benutzernamens mit dem VPN-Server verbinden.

      Führen Sie den folgenden Befehl aus, wann immer Sie eine Verbindung mit dem VPN herstellen möchten:

      • sudo charon-cmd --cert ca-cert.pem --host vpn_domain_or_IP --identity your_username

      Geben Sie, wenn Sie dazu aufgefordert werden, das Passwort des VPN-Benutzers ein und Sie werden mit dem VPN verbunden. Um die Verbindung zu trennen, drücken Sie im Terminal Strg+C und warten Sie, bis die Verbindung geschlossen wird.

      Herstellen einer Verbindung von iOS

      Führen Sie die folgenden Schritte aus, um die VPN-Verbindung auf einem iOS-Gerät zu konfigurieren:

      1. Senden Sie sich selbst eine E-Mail mit dem Stammzertifikat im Anhang.
      2. Öffnen Sie die E-Mail auf Ihrem iOS-Gerät und tippen Sie auf die angehängte Zertifikatdatei, tippen Sie dann auf Installieren und geben Sie Ihren Passcode ein. Sobald diese installiert ist, tippen Sie auf Fertig.
      3. Gehen Sie zu Einstellungen, Allgemein, VPN und tippen Sie auf VPN-Konfiguration hinzufügen. Daraufhin wird der Bildschirm zur Konfiguration der VPN-Verbindung angezeigt.
      4. Tippen Sie auf Typ und wählen Sie IKEv2.
      5. Geben Sie im Feld Beschreibung einen kurzen Namen für die VPN-Verbindung ein. Dieser Name kann beliebig sein.
      6. Geben Sie im Feld Server und Remote ID den Domänennamen oder die IP-Adresse des Servers ein. Das Feld Lokale ID kann leer gelassen werden.
      7. Geben Sie Ihren Benutzernamen und Ihr Passwort in den Abschnitt Authentifizierung ein, und tippen Sie dann auf Fertig.
      8. Wählen Sie die gerade erstellte VPN-Verbindung, tippen Sie auf die Schaltfläche oben auf der Seite und schon sind Sie verbunden.

      Herstellen einer Verbindung von Android

      Folgen Sie diesen Schritten, um das Zertifikat zu importieren:

      1. Senden Sie sich selbst eine E-Mail mit dem CA-Zertifikat im Anhang. Speichern Sie das CA-Zertifikat in Ihrem Download-Ordner.
      2. Laden Sie den StrongSwan VPN-Client aus dem Play-Store herunter.
      3. Öffnen Sie die App. Tippen Sie auf das Symbol “Mehr” () in der rechten oberen Ecke und wählen Sie CA-Zertifikate.
      4. Tippen Sie erneut auf das Symbol “Mehr” () in der rechten oberen Ecke. Wählen Sie Zertifikat importieren.
      5. Navigieren Sie zu der CA-Zertifikatsdatei in Ihrem Donwload-Ordner und wählen Sie sie aus, um sie in die Anwendung zu importieren.

      Nachdem das Zertifikat nun in die StrongSwan-Anwendung importiert wurde, können Sie die VPN-Verbindung mit diesen Schritten konfigurieren:

      1. Tippen Sie oben in der App auf VPN-PROFIL HINZUFÜGEN.
      2. Geben Sie bei Server den Domänennamen oder die öffentliche IP-Adresse Ihres VPN-Servers ein.
      3. Stellen Sie sicher, dass IKEv2 EAP (Benutzername/Passwort) als VPN-Typ ausgewählt ist.
      4. Geben Sie bei Benutzername und Passwort die Anmeldedaten ein, die Sie auf dem Server definiert haben.
      5. Deaktivieren Sie Automatisch auswählen im Abschnitt CA-Zertifikat und klicken Sie auf CA-Zertifikat auswählen.
      6. Tippen Sie auf die Registerkarte IMPORTIERT oben auf dem Bildschirm und wählen Sie die von Ihnen importierte CA (sie heißt „VPN root CA“ wenn Sie den „DN“ nicht zuvor geändert haben).
      7. Wenn Sie möchten, können Sie den Profilnamen (optional) mit einem aussagekräftigeren Namen ausfüllen.

      Wenn Sie eine Verbindung mit dem VPN herstellen möchten, klicken Sie auf das Profil, das Sie gerade in der Anwendung StrongSwan erstellt haben.

      Fehlerbehebung bei Verbindungen

      Wenn Sie das Zertifikat nicht importieren können, stellen Sie sicher, dass die Datei die Erweiterung .pem und nicht .pem.txt hat.

      Wenn Sie keine Verbindung mit dem VPN herstellen können, überprüfen Sie den von Ihnen verwendeten Servernamen oder die IP-Adresse. Der Domänenname oder die IP-Adresse des Servers muss mit dem übereinstimmen, was Sie bei der Erstellung des Zertifikats als Common Name (CN) konfiguriert haben. Wenn sie nicht übereinstimmen, funktioniert die VPN-Verbindung nicht. Wenn Sie beispielsweise ein Zertifikat mit dem CN von vpn.example.com einrichten, müssen Sie vpn.example.com verwenden, wenn Sie die VPN-Serverdetails eingeben. Überprüfen Sie den Befehl, den Sie zum Generieren des Zertifikats verwendet haben, und die Werte, die Sie bei der Erstellung Ihrer VPN-Verbindung verwendet haben.

      Abschließend überprüfen Sie die VPN-Konfiguration, um sicherzustellen, dass der Wert leftid mit dem Symbol @ konfiguriert ist, wenn Sie einen Domänennamen verwenden:

      /etc/ipsec.conf

          leftid=@vpn.example.com
      

      Wenn Sie eine IP-Adresse verwenden, stellen Sie sicher, dass das Symbol @ ausgelassen ist. Stellen Sie außerdem sicher, dass Sie beim Generieren der Datei server-cert.pem die beiden Flags --san @IP_address und --san IP_address eingefügt haben.

      Zusammenfassung

      In diesem Tutorial haben Sie einen VPN-Server erstellt, der das IKEv2-Protokoll verwendet. Sie haben sich mit den Anweisungen vertraut gemacht, die die linke und die rechte Seite einer Verbindung sowohl auf dem Server als auch auf den Clients steuern. Außerdem haben Sie einen Windows-, macOS-, iOS-, Android- oder Linux-Client für die Verbindung mit dem VPN konfiguriert.

      Um Benutzer hinzuzufügen oder zu entfernen, führen Sie erneut Schritt 5 aus. Jede Zeile in /etc/ipsec.secrets ist für einen Benutzer, sodass das Hinzufügen oder Entfernen von Benutzern oder das Ändern von Passwörtern nur die Bearbeitung der Datei erfordert.

      Jetzt können Sie sicher sein, dass Ihre Online-Aktivitäten überall und mit jedem Gerät, das Sie für den Zugang zum Internet benutzen, geschützt bleiben.



      Source link

      Einrichten eines Remotedesktops mit X2Go unter Ubuntu 20.04


      Der Autor hat Software in the Public Interest (SPI) dazu ausgewählt, im Rahmen des Programms Write for DOnations eine Spende zu erhalten.

      Einführung

      In der Regel verfügen Linux-basierte Server nicht über eine vorinstallierte grafische Benutzeroberfläche (GUI). Wann immer Sie GUI-Anwendungen in Ihrer Instanz ausführen möchten, besteht die typische Lösung aus der Verwendung von Virtual Network Computing (VNC). Leider können VNC-Lösungen jedoch langsam und unsicher sein; viele von ihnen sind außerdem mit einem hohen manuellen Konfigurationsaufwand verbunden. Im Gegensatz dazu bietet X2Go einen funktionierenden „Cloud-Desktop“ mit allen Vorteilen eines stets verfügbaren, aus der Ferne zugänglichen und leicht skalierbaren Rechensystems, das zudem über ein schnelles Netzwerk verfügt. Es reagiert schneller und ist sicherer als viele VNC-Lösungen.

      In diesem Tutorial verwenden Sie X2Go zum Erstellen einer XFCE-Desktopumgebung unter Ubuntu 20.04, auf die Sie remote zugreifen können. Dieser Cloud-Desktop umfasst dieselben Dienstprogramme, die Sie erhalten würden, wenn Sie Ubuntu 20.04 und die XFCE-Umgebung auf Ihrem persönlichen Computer installieren (fast identisch mit einer Xubuntu-Einrichtung).

      Die in diesem Tutorial beschriebene Einrichtung ist in folgenden Fällen nützlich:

      • Sie benötigen Zugriff auf ein Linux-basiertes Betriebssystem, das mit einer Desktopumgebung ausgestattet ist, können es aber nicht auf Ihrem persönlichen Computer installieren.
      • Sie verwenden mehrere Geräte an verschiedenen Orten und wünschen sich eine konsistente Arbeitsumgebung mit den gleichen Werkzeugen, Erscheinungsbildern, Dateien und Leistungswerten.
      • Ihr Internetdienstleister bietet Ihnen nur wenig Bandbreite, Sie benötigen aber Zugriff auf Dutzende oder Hunderte Gigabyte von Daten.
      • Lang laufende Aufträge führen dafür dazu, dass Ihr lokaler Computer Stunden oder Tage lang nicht verfügbar ist. Stellen Sie sich vor, dass Sie ein großes Projekt erstellen müssen, das auf Ihrem Laptop 8 Stunden dauert. Sie können währenddessen keine Filme anschauen oder andere ressourcenintensive Anwendungen nutzen. Wenn Sie diesen Auftrag jedoch auf Ihrem Server ausführen, kann Ihr Computer andere Aufgaben erledigen.
      • Sie arbeiten mit einem Team, für das es vorteilhaft wäre, wenn es einen gemeinsamen Computer hätte, auf den es zur Zusammenarbeit an einem Projekt zugreifen kann.

      Voraussetzungen

      Bevor Sie mit diesem Tutorial beginnen, benötigen Sie Folgendes:

      • Eine Ubuntu 20.04 x64-Instanz mit 2 GB RAM oder mehr. 2 GB ist das Minimum; ein Server mit 4 GB oder mehr ist jedoch ideal, wenn Sie arbeitsspeicherintensive Anwendungen ausführen möchten. Sie können ein DigitalOcean-Droplet verwenden, wenn Sie wollen.

      • Einen Benutzer mit sudo-Berechtigungen und einen SSH-Schlüssel. Folgen Sie diesem Leitfaden, um zu beginnen: Ersteinrichtung des Servers unter Ubuntu 20.04. Stellen Sie sicher, dass Sie Schritt 4 abschließen und Ihre Firewall so konfigurieren, dass alle Verbindungen außer OpenSSH eingeschränkt werden.

      Schritt 1 — Installieren der Desktopumgebung auf Ihrem Server

      Nachdem Ihr Server ausgeführt wird und Ihre Firewall konfiguriert ist, können Sie nun die grafische Umgebung für den X2Go-Server installieren.

      Aktualisieren Sie zunächst die Informationen des Paketmanagers zur neuesten verfügbaren Software:

      In diesem Tutorial installieren Sie XFCE als Desktopumgebung. XFCE verwendet keine grafischen Effekte wie Compositing, sodass es mit X2Go und der Optimierung von Bildschirmaktualisierungen besser kompatibel ist. Hinweis: Die LXDE– und die MATE-Desktopumgebung (mit deaktiviertem Compositing) funktionieren ebenfalls; Sie müssen jedoch den Befehl in diesem Tutorial ändern, mit dem die Desktopumgebung installiert wird. Statt sudo apt-get install xubuntu-desktop geben Sie zum Beispiel sudo apt-get install lubuntu-desktop ein, um LXDE zu installieren.

      Es gibt zwei Möglichkeiten zum Installieren von XFCE: die minimale Desktopumgebung oder die vollständige Desktopumgebung. Die optimale Option hängt von Ihren Bedürfnissen ab; auf diese gehen wir als Nächstes ein. Wählen Sie eine von beiden aus.

      Die vollständige Desktopumgebung

      Für die meisten Anwendungsfälle empfohlen. Wenn Sie nicht jede Komponente, die Sie benötigen, manuell auswählen und stattdessen einen Standardsatz von Paketen wie Textverarbeitungsprogramm, Webbrowser, E-Mail-Client und anderem zuvor installierten Zubehör nutzen möchten, können Sie xubuntu-desktop wählen.

      Installieren und konfigurieren Sie die vollständige Desktopumgebung. Die vollständige Desktopumgebung ähnelt dem, was Sie erhalten würden, wenn Sie Xubuntu von einer DVD/einem bootfähigen USB-Stick auf Ihrem lokalen PC installieren:

      • sudo apt-get install xubuntu-desktop

      Wenn Sie zur Auswahl eines Displaymanagers aufgefordert werden, wählen Sie lightdm aus.

      Wählen von lightdm als Displaymanager

      Die minimale Desktopumgebung

      Wenn Sie alternativ einen kleinen Kernsatz an Paketen installieren und dann darauf aufbauen möchten, indem Sie das manuell hinzufügen, was Sie benötigen, können Sie das Meta-Paket xubuntu-core verwenden.

      Ein Meta-Paket enthält keine einzelnen Pakete; vielmehr enthält ein Meta-Paket eine ganze Paketsammlung. Durch die Installation eines Meta-Pakets erspart sich der Benutzer die manuelle Installation zahlreicher Komponenten.

      Installieren Sie xfce4 und alle zusätzlichen Abhängigkeiten, die zur Unterstützung erforderlich sind:

      • sudo apt-get install xubuntu-core

      Sie haben eine grafische Umgebung installiert. Jetzt schaffen Sie eine Möglichkeit, sie remote anzuzeigen.

      Schritt 2 — Installieren von X2Go auf dem Server

      X2Go verfügt über zwei Hauptkomponenten: den Server, der die grafische Sitzung auf dem Remotecomputer startet und verwaltet, und den Client, den Sie auf Ihrem lokalen Computer installieren, um den Remotedesktop oder die Remoteanwendung anzuzeigen und zu steuern.

      In früheren Versionen von Ubuntu (vor 18.04) war x2goserver nicht in den Standard-Repositorys enthalten; in diesem Fall müssten Sie Schritte wie diese befolgen, um sich das Softwarepaket zu beschaffen. Wir hinterlassen hier den Link zu Referenzzwecken, sollte das Paket in zukünftigen Versionen von Ubuntu weggelassen werden. Zum Glück enthält Ubuntu 20.04, Codename Focal Fossa, das benötigte Paket in seinen Standard-Repositorys, sodass die Installation schneller verläuft.

      Geben Sie zum Installieren von X2Go auf Ihrem Server folgenden Befehl ein:

      • sudo apt-get install x2goserver x2goserver-xsession

      Aktuell erfordert Ihr Server keine weitere Einrichtung. Denken Sie jedoch daran, dass Sie Ihren SSH-Schlüssel auf jedem lokalen Rechner verfügbar haben müssen, den Sie verwenden möchten, wenn Sie der Empfehlung zur Einrichtung von SSH-Schlüsseln im Leitfaden zur Ersteinrichtung des Servers unter Ubuntu 20.04 gefolgt sind. Wenn Sie keinen privaten SSH-Schlüssel eingerichtet haben, stellen Sie sicher, dass Sie ein starkes Passwort wählen.

      Anmerkung: Denken Sie daran, dass der Linux-Kernel bei ausgelastetem RAM bestimmte Anwendungen abrupt beenden kann, was zu verlorener Arbeit führt. Wenn Sie ein DigitalOcean-Droplet verwenden und feststellen, dass Ihre Programme mehr RAM benötigen, können Sie Ihr Droplet vorübergehend deaktivieren und ein Upgrade auf eines mit mehr Arbeitsspeicher vornehmen (resize).

      Sie haben Ihren Server konfiguriert. Geben Sie exit ein oder schließen Sie Ihr Terminalfenster. In den restlichen Schritten geht es um die Konfiguration des Clients auf Ihrem lokalen Rechner.

      Schritt 3 — Lokales Installieren des X2Go-Clients

      X2Go ist sofort einsatzbereit. Wenn Sie auf Ihrem lokalen Computer Windows oder Mac OS X verwenden, können Sie hier die X2Go-Clientsoftware herunterladen. Wenn Sie Debian oder Ubuntu nutzen, können Sie den X2Go-Client mit diesem Befehl auf Ihrem lokalen Rechner installieren:

      • sudo apt-get install x2goclient

      Nach dem Herunterladen der Software können Sie sie installieren. Öffnen Sie dazu das Installationsprogramm und wählen Sie Ihre bevorzugte Sprache aus. Stimmen Sie der Lizenz zu und lassen Sie sich vom Assistenten durch die verbleibenden Schritte führen. Normalerweise sollte es keinen Grund geben, die in diesen Schritten vorausgefüllten Standardwerte zu ändern.

      X2Go funktioniert gut mit den Standardeinstellungen, ist aber genau anpassbar. Wenn Sie weitere Informationen wünschen, besuchen Sie die offizielle Dokumentation von X2Go.

      Nachdem Sie den Desktop-Client installiert haben, können Sie nun dessen Einstellungen konfigurieren und sich mit dem X2Go-Server verbinden, um Ihren Remote-XFCE-Desktop zu verwenden.

      Schritt 4 — Herstellen einer Verbindung zum Remotedesktop

      Wenn Sie den X2Go-Client zum ersten Mal öffnen, erscheint ein Fenster. Wenn nicht, klicken Sie im linken oberen Menü auf Session (Sitzung) und wählen Sie dann New session … (Neue Sitzung …).

      X2Go-Client-Screenshot - Erstellen einer neuen Sitzung

      Geben Sie im Feld Session name (Sitzungsname) etwas ein, das Ihnen dabei hilft, zwischen Servern zu unterscheiden. Die Verwendung eines Sitzungsnamens ist besonders nützlich, wenn Sie Verbindungen zu verschiedenen Computern planen.

      Geben Sie die IP-Adresse Ihres Servers oder einen vollständig qualifizierten Domänennamen (FQDN) in das Feld Host ein, das sich unter** Server** befindet.

      Geben Sie den Benutzernamen, den Sie für Ihre SSH-Verbindung verwendet haben, in das Feld Login (Anmelden) ein.

      Da Sie in Schritt 2 XFCE installiert haben, wählen Sie XFCE als Ihren** Session Type** (Sitzungstyp).

      Nachdem Sie die Verbindung zum Server mit SSH-Schlüsseln hergestellt haben, klicken Sie schließlich auf das Ordnersymbol neben Use RSA/DSA key for ssh connection (RSA/DSA-Schlüssel für SSH-Verbindung verwenden) und suchen Sie nach Ihrem privaten Schlüssel. Wenn Sie sich nicht dazu entschieden haben, die sichereren SSH-Schlüssel zu verwenden, lassen Sie dieses Feld leer; der X2Go-Client fragt bei der Anmeldung jedes Mal nach einem Passwort.

      Die restlichen Standardeinstellungen reichen vorerst aus; wenn Sie sich jedoch weiter mit der Software vertraut machen, können Sie den Client anhand Ihrer individuellen Präferenzen optimieren.

      Nach dem Drücken der OK-Schaltfläche können Sie Ihre grafische Sitzung starten, indem Sie auf das weiße Feld klicken, das den Namen Ihrer Sitzung auf der rechten oberen Seite des Felds enthält.

      X2Go-Hauptfenster - Sitzungsliste

      Wenn Sie OS X auf Ihrem lokalen Rechner ausführen, kann OS X Sie dazu auffordern, XQuartz zu installieren, was zum Ausführen von X11 erforderlich ist. Befolgen Sie in diesem Fall nun die Anweisungen zum Installieren des Servers.

      In wenigen Sekunden wird Ihr Remotedesktop angezeigt und Sie können mit ihm interagieren.

      Es gibt einige nützliche Tastenkombinationen, die Sie in Windows- und Linux-basierten Betriebssystemen für ein besseres Erlebnis verwenden können.

      Anmerkung: Diese beiden ersten Optionen können in modernen Windows-Editionen zu fehlerhaftem Verhalten führen. Sie können sie jetzt dennoch für den Fall testen, dass spätere Versionen von X2Go die Probleme beheben. Wenn sie fehlschlagen, vermeiden Sie in Zukunft einfach die Verwendung derselben Tastenkombination.

      Strg+Alt+F schaltet den Vollbildmodus ein und aus. Die Arbeit im Vollbildmodus kann sich mehr wie eine lokale Desktop-Erfahrung anfühlen. Der Vollbildmodus hilft außerdem dem Remoterechner beim Erfassen von Tastenkombinationen anstelle Ihres lokalen Computers.

      Strg+Alt+M minimiert die Remoteansicht, selbst wenn Sie sich im Vollbildmodus befinden.

      Strg+Alt+T trennt die Sitzung, lässt die GUI auf dem Server aber weiter laufen. Es handelt sich um eine schnelle Methode zur Trennung der Verbindung ohne Abmelden oder Schließen von Anwendungen auf dem Server. Das Gleiche geschieht, wenn Sie auf die Schaltfläche zum Schließen des Fensters klicken.

      Schließlich gibt es zwei Möglichkeiten, um die Remotesitzung zu beenden und alle darin laufenden grafischen Programme zu schließen. Sie können sich remote aus dem Startmenü von XFCE abmelden; oder Sie können auf die mit einem Kreis und einem kleinen Strich (wie ein Ein/Aus-/Standby-Symbol) markierte Schaltfläche klicken, die sich im Hauptbereich des X2Go-Bildschirms unten rechts befindet.

      Die erste Methode ist sauberer, kann aber dazu führen, dass Programme wie Software zur Sitzungsverwaltung weiter ausgeführt werden. Die zweite Methode schließt alles und erzwingt dies auch, wenn ein Prozess nicht sauber beendet werden kann. In jedem Fall sollten Sie Ihre Arbeit vor dem Fortfahren speichern.

      X2Go-Hauptfenster - Schaltfläche „Terminate Session“ (Sitzung beenden)

      Sie haben Ihren Remotedesktop nun erfolgreich aufgerufen und konfiguriert.

      Zusammenfassung

      In diesem Tutorial haben Sie X2Go verwendet, um für das Ubuntu-Betriebssystem eine robuste und Remote-basierte GUI-Umgebung einzurichten. Da der Desktop nun ausgeführt wird, hier einige Ideen zu seiner Verwendung:

      Wenn Sie mehr erfahren möchten, besuchen Sie die offizielle Dokumentations-Website von X2Go.



      Source link

      Einrichten von Django mit Postgres, Nginx und Gunicorn unter Ubuntu 20.04


      Einführung

      Django ist ein leistungsfähiges Web-Framework, das Ihnen dabei helfen kann, Ihre Python-Anwendung oder Website bereitzustellen. Django umfasst einen vereinfachten Entwicklungsserver zum lokalen Testen Ihres Codes; für alles, was auch nur ansatzweise mit der Produktion zu tun hat, wird ein sicherer und leistungsfähiger Webserver benötigt.

      In diesem Leitfaden zeigen wir, wie sich bestimmte Komponenten zum Unterstützen und Bereitstellen von Django-Anwendungen in Ubuntu 20.04 installieren und konfigurieren lassen. Wir werden anstelle der standardmäßigen SQLite-Datenbank eine PostgreSQL-Datenbank einrichten. Wir werden den Gunicorn-Anwendungsserver als Schnittstelle zu unseren Anwendungen konfigurieren. Dann werden wir Nginx als Reverseproxy für Gunicorn einrichten, damit wir beim Bereitstellen unserer Anwendungen auf dessen Sicherheits- und Leistungsmerkmale zugreifen können.

      Voraussetzungen und Ziele

      Um diesen Leitfaden erfolgreich zu absolvieren, sollten Sie eine neue Ubuntu 20.04-Serverinstanz mit einer einfachen Firewall und einem Nicht-root-Benutzer mit sudo-Berechtigungen konfiguriert haben. In unserem Leitfaden zur Ersteinrichtung des Servers erfahren Sie, wie Sie die Einrichtung vornehmen.

      Wir werden Django in einer virtuellen Umgebung installieren. Wenn Sie Django in einer für Ihr Projekt spezifischen Umgebung installieren, können Sie Ihre Projekte und deren Anforderungen separat verwalten.

      Sobald wir über unsere Datenbank verfügen und die Anwendung ausgeführt wird, installieren und konfigurieren wir den Gunicorn-Anwendungsserver. Dieser wird als Schnittstelle zu unserer Anwendung dienen und Clientanfragen aus HTTP in Python-Aufrufe übersetzen, die unsere Anwendung verarbeiten kann. Dann richten wir Nginx vor Gunicorn ein, um dessen leistungsfähige Verbindungsverwaltungsmechanismen und einfach zu implementierenden Sicherheitsfunktionen nutzen zu können.

      Fangen wir an.

      Installieren der Pakete aus den Ubuntu-Repositorys

      Zu Beginn laden wir alle Elemente, die wir benötigen, aus den Ubuntu-Repositorys herunter und installieren sie. Ein wenig später werden wir mit dem Python-Paketmanager pip zusätzliche Komponenten installieren.

      Wir müssen zuerst den lokalen Paketindex apt aktualisieren und dann die Pakete herunterladen und installieren: Die installierten Pakete hängen davon ab, welche Version von Python Sie für Ihr Projekt verwenden werden.

      Wenn Sie Django mit Python 3 nutzen, geben Sie Folgendes ein:

      • sudo apt update
      • sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl

      Django 1.11 ist die letzte Version von Django, die Python 2 unterstützt. Wenn Sie neue Projekte starten, wird dringend empfohlen, Python 3 zu wählen. Wenn Sie Python 2 weiter verwenden müssen, geben Sie Folgendes ein:

      • sudo apt update
      • sudo apt install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx curl

      Dadurch werden pip, die Python-Entwicklungsdateien, die zum späteren Erstellen von Gunicorn benötigt werden, das Postgres-Datenbankysystem, die zum Interagieren damit erforderlichen Bibliotheken sowie der Nginx-Webserver installiert.

      Erstellen der PostgreSQL-Datenbank und des Benutzers

      Wir legen sofort los und erstellen für unsere Django-Anwendung eine Datenbank und einen Datenbankbenutzer.

      Standardmäßig nutzt Postgres ein Authentifizierungschema namens „Peer Authentication“ für lokale Verbindungen. Im Grunde bedeutet dies, dass sich der Benutzer ohne weitere Authentifizierung anmelden kann, wenn der Benutzername des Benutzers im Betriebssystem mit einem gültigen Postgres-Benutzernamen übereinstimmt.

      Während der Postgres-Installation wurde ein Betriebssystembenutzer namens postgres erstellt, der dem administrativen PostgreSQL-Benutzer postgres entspricht. Wir benötigen diesen Benutzer zur Erledigung administrativer Aufgaben. Wir können sudo verwenden und den Benutzernamen mit der Option -u übergeben.

      Melden Sie sich in einer interaktiven Postgres-Sitzung an, indem Sie Folgendes eingeben:

      Ihnen wird eine PostgreSQL-Eingabeaufforderung angezeigt, in der Sie Ihre Anforderungen einrichten können.

      Erstellen Sie zunächst eine Datenbank für Ihr Projekt:

      • CREATE DATABASE myproject;

      Anmerkung: Jede Postgres-Anweisung muss mit einem Semikolon enden; stellen Sie sicher, dass Ihr Befehl auf ein Semikolon endet, falls Probleme auftreten.

      Erstellen Sie als Nächstes einen Datenbankbenutzer für das Projekt. Wählen Sie unbedingt ein sicheres Passwort:

      • CREATE USER myprojectuser WITH PASSWORD 'password';

      Anschließend ändern wir einige der Verbindungsparameter für den gerade erstellten Benutzer. Dadurch werden Datenbankoperationen beschleunigt, sodass die richtigen Werte nicht jedes Mal abgefragt und festgelegt werden müssen, wenn eine Verbindung hergestellt wird.

      Wir legen die Standardkodierung auf UTF-8 fest, was Django erwartet. Außerdem legen wir das standardmäßige Transaktionsisolierungsschema auf „read committed“ fest, um das Lesen von Blöcken aus Transaktionen ohne Commit zu blockieren. Schließlich legen wir die Zeitzone fest. Standardmäßig werden unsere Django-Projekte die Zeitzone UTC verwenden. Dies sind alles Empfehlungen aus dem Django-Projekt selbst:

      • ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
      • ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
      • ALTER ROLE myprojectuser SET timezone TO 'UTC';

      Jetzt können wir unserem neuen Benutzer Zugriff zum Verwalten unserer neuen Datenbank gewähren:

      • GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

      Wenn Sie damit fertig sind, beenden Sie die PostgreSQL-Eingabeaufforderung durch folgende Eingabe:

      Postgres ist nun so eingerichtet, dass Django eine Verbindung herstellen und dessen Datenbankinformationen verwalten kann.

      Erstellen einer virtuellen Python-Umgebung für Ihr Projekt

      Nachdem wir unsere Datenbank erstellt haben, können wir nun damit beginnen, die restlichen Projektanforderungen zu erfüllen. Wir werden unsere Python-Anforderungen zur einfacheren Verwaltung in einer virtuellen Umgebung installieren.

      Dazu benötigen wir zunächst Zugriff auf den Befehl virtualenv. Wir können ihn mit pip installieren.

      Wenn Sie Python 3 verwenden, aktualisieren Sie pip und installieren Sie das Paket durch folgende Eingabe:

      • sudo -H pip3 install --upgrade pip
      • sudo -H pip3 install virtualenv

      Wenn Sie Python 2 verwenden, aktualisieren Sie pip und installieren Sie das Paket durch folgende Eingabe:

      • sudo -H pip install --upgrade pip
      • sudo -H pip install virtualenv

      Nach der Installation von virtualenv können wir mit der Gestaltung unseres Projekts beginnen. Erstellen und wechseln Sie in ein Verzeichnis, in dem wir unsere Projektdateien speichern können.

      • mkdir ~/myprojectdir
      • cd ~/myprojectdir

      Erstellen Sie im Projektverzeichnis durch folgende Eingabe eine virtuelle Python-Umgebung:

      Auf diese Weise wird ein Verzeichnis mit dem Namen myprojectenv in Ihrem Verzeichnis myprojectdir erstellt. Darin wird eine lokale Version von Python und eine lokale Version von pip installiert. Mit ihrer Hilfe können wir für unser Projekt eine isolierte Python-Umgebung installieren und konfigurieren.

      Bevor wir die Python-Anforderungen unseres Projekts installieren, müssen wir die virtuelle Umgebung aktivieren. Geben Sie hierzu Folgendes ein:

      • source myprojectenv/bin/activate

      Ihre Eingabeaufforderung ändert sich und zeigt an, dass Sie jetzt innerhalb einer virtuellen Python-Umgebung arbeiten. Sie sieht etwa wie folgt aus: (myprojectenv)user@host:~/myprojectdir$.

      Bei aktivierter virtueller Umgebung installieren Sie Django, Gunicorn und den PostgreSQL-Adapter psycopg2 mit der lokalen Instanz von pip:

      Anmerkung: Wenn die virtuelle Umgebung aktiviert ist (wenn Ihrer Eingabeaufforderung (myprojectenv) voransteht), verwenden Sie pip anstelle von pip3, selbst wenn Sie Python 3 verwenden. Die Kopie des Tools der virtuellen Umgebung heißt immer pip – unabhängig von der Python-Version.

      • pip install django gunicorn psycopg2-binary

      Sie sollten nun die gesamte für den Start eines Django-Projekts erforderliche Software haben.

      Erstellen und Konfigurieren eines neuen Django-Projekts

      Nach der Installation unserer Python-Komponenten können wir die eigentlichen Django-Projektdateien erstellen.

      Erstellen des Django-Projekts

      Da wir bereits über ein Projektverzeichnis verfügen, werden wir Django anweisen, die Dateien dort zu installieren. Es wird ein Verzeichnis der zweiten Ebene mit dem tatsächlichen Code erstellt, was normal ist, und ein Managementskript in diesem Verzeichnis platziert. Der Schlüssel dazu besteht darin, dass wir das Verzeichnis explizit definieren, anstatt Django Entscheidungen in Bezug auf unser aktuelles Verzeichnis zu ermöglichen:

      • django-admin.py startproject myproject ~/myprojectdir

      An diesem Punkt sollte Ihr Projektverzeichnis (in unserem Fall ~/myprojectdir) folgenden Inhalt haben:

      • ~/myprojectdir/manage.py: Ein Django-Projektmanagement-Skript.
      • ~/myprojectdir/myproject/: Das Django-Projektpaket. Dieses sollte die Dateien __init__.py, settings.py, urls.py, asgi.py und wsgi.py enthalten.
      • ~/myprojectdir/myprojectenv/: Das Verzeichnis der virtuellen Umgebung, die wir zuvor erstellt haben.

      Anpassen der Projekteinstellungen

      Das Erste, was wir mit unseren neu erstellten Projektdateien tun sollten, ist das Anpassen der Einstellungen. Öffnen Sie die Einstellungsdatei in Ihrem Texteditor:

      • nano ~/myprojectdir/myproject/settings.py

      Suchen Sie zunächst nach der Direktive ALLOWED_HOSTS. Dadurch wird eine Liste der Adressen oder Domänennamen des Servers definiert, die zum Herstellen einer Verbindung mit der Django-Instanz genutzt werden können. Alle eingehenden Anfragen mit einem Host, der sich nicht in dieser Liste befindet, werden eine Ausnahme auslösen. Django verlangt, dass Sie dies so festlegen, um eine bestimmte Art von Sicherheitslücke zu verhindern.

      In den quadratischen Klammern listen Sie die IP-Adressen oder Domänennamen auf, die mit Ihrem Django-Projekt verknüpft sind. Jedes Element sollte in Anführungszeichen aufgelistet werden, wobei Einträge durch ein Komma getrennt werden. Wenn Sie Anfragen für eine ganze Domäne und Subdomänen wünschen, stellen Sie dem Anfang des Eintrags einen Punkt voran. Im folgenden Snippet befinden sich einige auskommentierte Beispiele:

      Anmerkung: Stellen Sie sicher, dass localhost als eine der Optionen eingeschlossen ist, da wir Verbindungen über eine lokale Nginx-Instanz vermitteln werden.

      ~/myprojectdir/myproject/settings.py

      . . .
      # The simplest case: just add the domain name(s) and IP addresses of your Django server
      # ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
      # To respond to 'example.com' and any subdomains, start the domain with a dot
      # ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
      ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . ., 'localhost']
      

      Als Nächstes suchen Sie nach dem Bereich, der Datenbankzugriff konfiguriert. Er beginnt mit DATABASES. Die Konfiguration in der Datei dient für eine SQLite-Datenbank. Wir haben für unser Projekt bereits eine PostgreSQL-Datenbank erstellt; daher müssen wir die Einstellungen anpassen.

      Ändern Sie die Einstellungen mit Ihren PostgreSQL-Datenbankinformationen. Wir weisen Django an, den mit pip installierten psycopg2-Adapter zu verwenden. Wir müssen den Datenbanknamen, den Namen des Datenbankbenutzers und das Passwort des Datenbankbenutzers angeben. Dann geben wir an, dass sich die Datenbank auf dem lokalen Computer befindet. Sie können die PORT-Einstellung als leere Zeichenfolge belassen:

      ~/myprojectdir/myproject/settings.py

      . . .
      
      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.postgresql_psycopg2',
              'NAME': 'myproject',
              'USER': 'myprojectuser',
              'PASSWORD': 'password',
              'HOST': 'localhost',
              'PORT': '',
          }
      }
      
      . . .
      

      Als Nächstes bewegen Sie sich nach unten zum Ende der Datei und fügen eine Einstellung hinzu, die angibt, wo die statischen Dateien platziert werden sollen. Das ist notwendig, damit Nginx Anfragen für diese Elemente verwalten kann. In der folgenden Zeile wird Django angewiesen, sie im grundlegenden Projektverzeichnis in einem Verzeichnis mit dem Namen static zu platzieren:

      ~/myprojectdir/myproject/settings.py

      . . .
      
      STATIC_URL = '/static/'
      STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
      

      Wenn Sie dies abgeschlossen haben, speichern und schließen Sie die Datei.

      Abschließen der anfänglichen Projekteinrichtung

      Jetzt können wir das erste Datenbankschema mit dem Managementskript in unsere PostgreSQL-Datenbank migrieren:

      • ~/myprojectdir/manage.py makemigrations
      • ~/myprojectdir/manage.py migrate

      Erstellen Sie durch folgende Eingabe einen administrativen Benutzer für das Projekt:

      • ~/myprojectdir/manage.py createsuperuser

      Sie müssen einen Benutzernamen auswählen, eine E-Mail-Adresse angeben und ein Passwort bestätigen.

      Wir können alle statischen Inhalte am von uns konfigurierten Verzeichnisort sammeln, indem wir Folgendes eingeben:

      • ~/myprojectdir/manage.py collectstatic

      Sie müssen die Operation bestätigen. Die statischen Dateien werden dann in Ihrem Projektverzeichnis in einem Verzeichnis mit dem Namen static platziert.

      Wenn Sie den Leitfaden zur Ersteinrichtung des Servers befolgt haben, sollte Ihre UFW-Firewall Ihren Server schützen. Um den Entwicklungsserver zu testen, müssen wir Zugriff auf den Port gewähren, den wir dazu verwenden möchten.

      Erstellen Sie durch folgende Eingabe eine Ausnahme für Port 8000:

      Schließlich können Sie Ihr Projekt durch Starten des Django-Entwicklungsservers mit diesem Befehl testen:

      • ~/myprojectdir/manage.py runserver 0.0.0.0:8000

      Rufen Sie in Ihrem Webbrowser den Domänennamen oder die IP-Adresse Ihres Servers auf, gefolgt von :8000:

      http://server_domain_or_IP:8000
      

      Sie sollten nun die Indexseite von Django erhalten:

      Django-Indexseite

      Wenn Sie am Ende der URL in der Adressleiste /admin anfügen, werden Sie zur Eingabe des administrativen Benutzernamens und Passworts aufgefordert, die Sie mit dem Befehl createsuperuser erstellt haben:

      Django-Admin-Anmeldung

      Nach der Authentifizierung können Sie auf die standardmäßige Admin-Schnittstelle von Django zugreifen:

      Django-Admin-Schnittstelle

      Wenn Sie mit der Erkundung fertig sind, klicken Sie im Terminalfenster auf Strg+C, um den Entwicklungsserver herunterzufahren.

      Testen der Fähigkeit von Gunicorn zum Bereitstellen des Projekts

      Das Letzte, was wir tun möchten, bevor wir unsere virtuelle Umgebung verlassen, ist Gunicorn zu testen. Dadurch wollen wir sicherstellen, dass die Anwendung bereitgestellt werden kann. Wir geben dazu unser Projektverzeichnis ein und verwenden gunicorn zum Laden des WSGI-Moduls des Projekts:

      • cd ~/myprojectdir
      • gunicorn --bind 0.0.0.0:8000 myproject.wsgi

      Dadurch wird Gunicorn an der gleichen Schnittstelle gestartet, an der auch der Django-Server ausgeführt wurde. Sie können zurückgehen und die Anwendung erneut testen.

      Anmerkung: Die Admin-Schnittstelle wird keinen der verwendeten Stile verwenden, da Gunicorn nicht weiß, wo der dafür zuständige statische CSS-Inhalt zu finden ist.

      Wir haben Gunicorn einem Modul übergeben, indem wir mithilfe der Modulsyntax von Python den relativen Verzeichnispfad zur Datei wsgi.py von Django angegeben haben. Diese ist der Einstiegspunkt für unsere Anwendung. In dieser Datei ist eine Funktion namens application definiert, die zur Kommunikation mit der Anwendung dient. Um mehr über die WSGI-Spezifikation zu erfahren, klicken Sie hier.

      Wenn Sie mit dem Testen fertig sind, drücken Sie im Terminalfenster auf Strg+C, um Gunicorn anzuhalten.

      Wir sind nun fertig mit der Konfiguration unserer Django-Anwendung. Wir können unsere virtuelle Umgebung durch folgende Eingabe verlassen:

      Der Indikator für die virtuelle Umgebung in Ihrer Eingabeaufforderung wird entfernt.

      Erstellen von systemd-Socket- und Service-Dateien für Gunicorn

      Wir haben getestet, ob Gunicorn mit unserer Django-Anwendung interagieren kann. Wir sollten jedoch eine effektivere Methode zum Starten und Anhalten des Anwendungsservers implementieren. Dazu erstellen wir systemd-Service- und Socket-Dateien.

      Das Gunicorn-Socket wird beim Booten erstellt und nach Verbindungen lauschen. Wenn eine Verbindung hergestellt wird, startet systemd automatisch den Gunicorn-Prozess, um die Verbindung zu verwalten.

      Erstellen und öffnen Sie zunächst eine systemd-Socket-Datei für Gunicorn mit sudo-Berechtigungen:

      • sudo nano /etc/systemd/system/gunicorn.socket

      Darin erstellen wir einen Abschnitt [Unit], um das Socket zu beschreiben, einen Abschnitt [Socket], um den Ort des Sockets zu definieren, und einen Abschnitt [Install], um sicherzustellen, dass das Socket zum richtigen Zeitpunkt erstellt wird:

      /etc/systemd/system/gunicorn.socket

      [Unit]
      Description=gunicorn socket
      
      [Socket]
      ListenStream=/run/gunicorn.sock
      
      [Install]
      WantedBy=sockets.target
      

      Wenn Sie dies abgeschlossen haben, speichern und schließen Sie die Datei.

      Erstellen und öffnen Sie in Ihrem Texteditor als Nächstes eine systemd-Service-Datei für Gunicorn mit sudo-Berechtigungen. Der Name der Service-Datei sollte mit Ausnahme der Erweiterung mit dem Namen der Socket-Datei übereinstimmen:

      • sudo nano /etc/systemd/system/gunicorn.service

      Beginnen Sie mit dem Abschnitt [Unit], mit dem Metadaten und Abhängigkeiten angegeben werden. Wir werden hier eine Beschreibung unseres Diensts eingeben und das Init-System anweisen, ihn erst zu starten, nachdem das Netzwerkziel erreicht wurde. Da sich unser Dienst auf das Socket aus der Socket-Datei bezieht, müssen wir eine Requires-Direktive einschließen, um diese Beziehung anzugeben:

      /etc/systemd/system/gunicorn.service

      [Unit]
      Description=gunicorn daemon
      Requires=gunicorn.socket
      After=network.target
      

      Als Nächstes werden wir den Abschnitt [Service] öffnen. Wir werden den Benutzer und die Gruppe angeben, unter denen wir den Prozess ausführen möchten. Wir wollen unserem regulären Benutzerkonto die Prozessverantwortung übergeben, da es alle relevanten Dateien besitzt. Wir werden der Gruppe www-data die Gruppenverantwortung übergeben, damit Nginx einfach mit Gunicorn kommunizieren kann.

      Dann werden wir das Arbeitsverzeichnis zuordnen und den Befehl zum Starten des Diensts angeben. In diesem Fall müssen wir den vollständigen Pfad zur ausführbaren Gunicorn-Datei angeben, die in unserer virtuellen Umgebung installiert ist. Wir werden den Prozess mit dem im Verzeichnis /run erstellten Unix-Socket verknüpfen, damit der Prozess mit Nginx kommunizieren kann. Wir protokollieren alle Daten in der Standardausgabe, damit der journald-Prozess die Gunicorn-Protokolle erfassen kann. Außerdem können wir hier optionale Gunicorn-Optimierungen angeben. Beispielsweise haben wir in diesem Fall drei Workerprozesse angegeben:

      /etc/systemd/system/gunicorn.service

      [Unit]
      Description=gunicorn daemon
      Requires=gunicorn.socket
      After=network.target
      
      [Service]
      User=sammy
      Group=www-data
      WorkingDirectory=/home/sammy/myprojectdir
      ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn 
                --access-logfile - 
                --workers 3 
                --bind unix:/run/gunicorn.sock 
                myproject.wsgi:application
      

      Schließlich werden wir einen Abschnitt [Install] hinzufügen. Dies teilt systemd mit, womit dieser Dienst verknüpft werden soll, wenn wir festlegen, dass er während des Startvorgangs starten soll. Wir wollen, dass dieser Dienst startet, wenn das normale Mehrbenutzersystem arbeitet.

      /etc/systemd/system/gunicorn.service

      [Unit]
      Description=gunicorn daemon
      Requires=gunicorn.socket
      After=network.target
      
      [Service]
      User=sammy
      Group=www-data
      WorkingDirectory=/home/sammy/myprojectdir
      ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn 
                --access-logfile - 
                --workers 3 
                --bind unix:/run/gunicorn.sock 
                myproject.wsgi:application
      
      [Install]
      WantedBy=multi-user.target
      

      Damit ist unsere systemd-Dienstdatei fertiggestellt. Speichern und schließen Sie diese jetzt.

      Wir können nun starten und das Gunicorn-Socket aktivieren. Dadurch wird die Socket-Datei nun unter /run/gunicorn.sock und beim Booten erstellt. Wenn eine Verbindung zu diesem Socket hergestellt wird, startet systemd automatisch den gunicorn.service, um die Verbindung zu verwalten:

      • sudo systemctl start gunicorn.socket
      • sudo systemctl enable gunicorn.socket

      Wir können uns vergewissern, dass der Vorgang erfolgreich war, indem wir nach der Socket-Datei suchen.

      Suchen nach der Gunicorn-Socket-Datei

      Überprüfen Sie den Status des Prozesses, um herauszufinden, ob er gestartet werden konnte:

      • sudo systemctl status gunicorn.socket

      Sie sollten eine Ausgabe wie diese erhalten:

      Output

      ● gunicorn.socket - gunicorn socket Loaded: loaded (/etc/systemd/system/gunicorn.socket; enabled; vendor prese> Active: active (listening) since Fri 2020-06-26 17:53:10 UTC; 14s ago Triggers: ● gunicorn.service Listen: /run/gunicorn.sock (Stream) Tasks: 0 (limit: 1137) Memory: 0B CGroup: /system.slice/gunicorn.socket

      Überprüfen Sie als Nächstes, ob die Datei gunicorn.sock im Verzeichnis /run vorhanden ist:

      Output

      /run/gunicorn.sock: socket

      Wenn der Befehl systemctl status angegeben hat, dass ein Fehler aufgetreten ist, oder Sie die Datei gunicorn.sock im Verzeichnis nicht finden können, ist dies ein Hinweis darauf, dass das Gunicorn-Socket nicht richtig erstellt wurde. Überprüfen Sie die Protokolle des Gunicorn-Sockets durch folgende Eingabe:

      • sudo journalctl -u gunicorn.socket

      Werfen Sie einen erneuten Blick auf Ihre Datei /etc/systemd/system/gunicorn.socket, um alle vorhandenen Probleme zu beheben, bevor Sie fortfahren.

      Testen der Socket-Aktivierung

      Wenn Sie derzeit nur die Einheit gunicorn.socket gestartet haben, wird der gunicorn.service aktuell noch nicht aktiv sein, da das Socket noch keine Verbindungen erhalten hat. Geben Sie zum Überprüfen Folgendes ein:

      • sudo systemctl status gunicorn

      Output

      ● gunicorn.service - gunicorn daemon Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled) Active: inactive (dead)

      Zum Testen des Socket-Aktivierungsverfahrens können wir über curl eine Verbindung an das Socket senden, indem wir Folgendes eingeben:

      • curl --unix-socket /run/gunicorn.sock localhost

      Sie sollten die HTML-Ausgabe von Ihrer Anwendung im Terminal erhalten. Das bedeutet, dass Gunicorn gestartet wurde und Ihre Django-Anwendung bereitstellen konnte. Sie können überprüfen, ob der Gunicorn-Service ausgeführt wird, indem Sie Folgendes eingeben:

      • sudo systemctl status gunicorn

      Output

      ● gunicorn.service - gunicorn daemon Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled) Active: active (running) since Fri 2020-06-26 18:52:21 UTC; 2s ago TriggeredBy: ● gunicorn.socket Main PID: 22914 (gunicorn) Tasks: 4 (limit: 1137) Memory: 89.1M CGroup: /system.slice/gunicorn.service ├─22914 /home/sammy/myprojectdir/myprojectenv/bin/python /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunico> ├─22927 /home/sammy/myprojectdir/myprojectenv/bin/python /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunico> ├─22928 /home/sammy/myprojectdir/myprojectenv/bin/python /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunico> └─22929 /home/sammy/myprojectdir/myprojectenv/bin/python /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunico> Jun 26 18:52:21 django-tutorial systemd[1]: Started gunicorn daemon. Jun 26 18:52:21 django-tutorial gunicorn[22914]: [2020-06-26 18:52:21 +0000] [22914] [INFO] Starting gunicorn 20.0.4 Jun 26 18:52:21 django-tutorial gunicorn[22914]: [2020-06-26 18:52:21 +0000] [22914] [INFO] Listening at: unix:/run/gunicorn.sock (22914) Jun 26 18:52:21 django-tutorial gunicorn[22914]: [2020-06-26 18:52:21 +0000] [22914] [INFO] Using worker: sync Jun 26 18:52:21 django-tutorial gunicorn[22927]: [2020-06-26 18:52:21 +0000] [22927] [INFO] Booting worker with pid: 22927 Jun 26 18:52:21 django-tutorial gunicorn[22928]: [2020-06-26 18:52:21 +0000] [22928] [INFO] Booting worker with pid: 22928 Jun 26 18:52:21 django-tutorial gunicorn[22929]: [2020-06-26 18:52:21 +0000] [22929] [INFO] Booting worker with pid: 22929

      Wenn die Ausgabe von curl oder die Ausgabe von systemctl status anzeigt, dass ein Problem aufgetreten ist, prüfen Sie die Protokolle auf weitere Details:

      • sudo journalctl -u gunicorn

      Überprüfen Sie Ihre Datei /etc/systemd/system/gunicorn.service auf Probleme. Wenn Sie Änderungen an der Datei /etc/systemd/system/gunicorn.service vornehmen, laden Sie das Daemon neu, um die Dienstdefinition neu zu lesen, und starten Sie den Gunicorn-Prozess neu, indem Sie Folgendes eingeben:

      • sudo systemctl daemon-reload
      • sudo systemctl restart gunicorn

      Sorgen Sie dafür, dass die oben genannten Probleme behoben werden, bevor Sie fortfahren.

      Konfigurieren von Nginx zur Proxy-Übergabe an Gunicorn

      Nachdem Gunicorn eingerichtet ist, müssen wir nun Nginx so konfigurieren, dass Datenverkehr an den Prozess übergeben wird.

      Erstellen und öffnen Sie zunächst einen neuen Serverblock im Verzeichnis sites-available von Nginx:

      • sudo nano /etc/nginx/sites-available/myproject

      Öffnen Sie darin einen neuen Serverblock. Wir geben zunächst an, dass dieser Block am normalen Port 80 lauschen und auf den Domänennamen oder die IP-Adresse unseres Servers reagieren soll:

      /etc/nginx/sites-available/myproject

      server {
          listen 80;
          server_name server_domain_or_IP;
      }
      

      Als Nächstes weisen wir Nginx an, alle Probleme bei der Suche nach einem Favicon zu ignorieren. Außerdem teilen wir Nginx mit, wo die statischen Assets zu finden sind, die wir in unserem Verzeichnis ~/myprojectdir/static gesammelt haben. Alle diese Dateien verfügen über das Standard-URI-Präfix “/static”; daher können wir einen Ortsblock erstellen, um diese Anfragen abzugleichen:

      /etc/nginx/sites-available/myproject

      server {
          listen 80;
          server_name server_domain_or_IP;
      
          location = /favicon.ico { access_log off; log_not_found off; }
          location /static/ {
              root /home/sammy/myprojectdir;
          }
      }
      

      Schließlich erstellen wir einen location / {}-Block zum Abgleichen aller anderen Anforderungen. In diesen Block werden wir die standardmäßige Datei proxy_params einschließen, die in der Nginx-Installation enthalten ist, und dann den Datenverkehr direkt an das Gunicorn-Socket übergeben.

      /etc/nginx/sites-available/myproject

      server {
          listen 80;
          server_name server_domain_or_IP;
      
          location = /favicon.ico { access_log off; log_not_found off; }
          location /static/ {
              root /home/sammy/myprojectdir;
          }
      
          location / {
              include proxy_params;
              proxy_pass http://unix:/run/gunicorn.sock;
          }
      }
      

      Wenn Sie dies abgeschlossen haben, speichern und schließen Sie die Datei. Jetzt können wir die Datei aktivieren, indem wir sie mit dem Verzeichnis sites-enabled verknüpfen:

      • sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

      Prüfen Sie Ihre Nginx-Konfiguration durch folgende Eingabe auf Syntaxfehler:

      Wenn keine Fehler gemeldet werden, fahren Sie fort und starten Sie Nginx neu, indem Sie Folgendes eingeben:

      • sudo systemctl restart nginx

      Schließlich müssen wir unsere Firewall an Port 80 für normalen Datenverkehr öffnen. Da wir keinen Zugriff mehr auf den Entwicklungsserver benötigen, können wir außerdem die Regel zum Öffnen von Port 8000 entfernen:

      • sudo ufw delete allow 8000
      • sudo ufw allow 'Nginx Full'

      Sie sollten nun in der Lage sein, die Domäne oder IP-Adresse Ihres Servers aufzurufen, um Ihre Anwendung anzuzeigen.

      Anmerkung: Nach der Konfiguration von Nginx sollte der nächste Schritt aus dem Sichern des Datenverkehrs zum Server mit SSL/TLS bestehen. Das ist äußerst wichtig, da ohne SSL/TLS alle Informationen, einschließlich Passwörter, in Klartext über das Netzwerk gesendet werden.

      Wenn Sie einen Domänennamen haben, ist Let’s Encrypt der einfachste Weg, um sich ein SSL-Zertifikat zum Sichern Ihres Datenverkehrs zu verschaffen. Folgen Sie diesem Leitfaden zum Einrichten von Let’s Encrypt mit Nginx unter Ubuntu 20.04. Befolgen Sie das Verfahren mit dem Nginx-Serverblock, den wir in diesem Leitfaden erstellt haben.

      Fehlerbehebung bei Nginx und Gunicorn

      Wenn Ihre Anwendung in diesem letzten Schritt nicht angezeigt wird, müssen Sie Probleme mit Ihrer Installation beheben.

      Nginx zeigt anstelle der Django-Anwendung die Standardseite an

      Wenn Nginx die Standardseite und nicht einen Proxy zu Ihrer Anwendung anzeigt, bedeutet das in der Regel, dass Sie den server_name in der Datei /etc/nginx/sites-available/myproject so ändern müssen, dass er auf die IP-Adresse oder den Domänennamen Ihres Servers verweist.

      Nginx verwendet den server_name, um zu bestimmen, welcher Serverblock für Antworten auf Anfragen verwendet werden soll. Wenn Sie die Nginx-Standardseite erhalten, ist das ein Zeichen dafür, dass Nginx die Anfrage nicht explizit mit einem Serverblock abgleichen konnte. Darum greift Nginx auf den Standardblock zurück, der in /etc/nginx/sites-available/default definiert ist.

      Der server_name im Serverblock Ihres Projekts muss spezifischer sein als der im auszuwählenden standardmäßigen Serverblock.

      Nginx zeigt anstelle der Django-Anwendung einen 502-Fehler (Ungültiges Gateway) an

      Ein 502-Fehler zeigt, dass Nginx die Anfrage per Proxy nicht erfolgreich vermitteln kann. Eine Vielzahl von Konfigurationsproblemen äußern sich in einem 502-Fehler; für eine angemessene Fehlerbehebung sind also weitere Informationen erforderlich.

      Der primäre Ort zur Suche nach weiteren Informationen sind die Fehlerprotokolle von Nginx. Generell werden sie Ihnen mitteilen, welche Bedingungen während des Proxying-Ereignisses Probleme verursacht haben. Folgen Sie den Nginx-Fehlerprotokollen, indem Sie Folgendes eingeben:

      • sudo tail -F /var/log/nginx/error.log

      Erstellen Sie nun in Ihrem Browser eine weitere Anfrage zur Generierung eines neuen Fehlers (versuchen Sie, die Seite zu aktualisieren). Sie sollten eine neue Fehlermeldung erhalten, die in das Protokoll geschrieben wird. Wenn Sie sich die Nachricht ansehen, sollten Sie das Problem eingrenzen können.

      Sie erhalten möglicherweise die folgende Meldung:

      connect() to unix:/run/gunicorn.sock failed (2: No such file or directory)

      Das bedeutet, dass Nginx die Datei gunicorn.sock am angegebenen Ort nicht finden konnte. Sie sollten den proxy_pass-Ort, der in der Datei /etc/nginx/sites-available/myproject definiert ist, mit dem tatsächlichen Ort der Datei gunicorn.sock vergleichen, die von der Datei gunicorn.socket generiert wurde.

      Wenn Sie keine gunicorn.sock-Datei im Verzeichnis /run finden können, bedeutet das im Allgemeinen, dass die systemd-Socket-Datei sie nicht erstellen konnte. Kehren Sie zurück zum Abschnitt zum Suchen nach der Gunicorn-Socket-Datei, um die Schritte zur Fehlerbehebung für Gunicorn zu durchlaufen.

      connect() to unix:/run/gunicorn.sock failed (13: Permission denied)

      Das bedeutet, dass Nginx aufgrund von Berechtigungsproblemen keine Verbindung zum Gunicorn-Socket herstellen konnte. Dies kann geschehen, wenn das Verfahren mit dem root user anstelle eines sudo-Benutzers ausgeführt wird. Zwar kann systemd die Gunicorn-Socket-Datei erstellen, doch kann Nginx nicht darauf zugreifen.

      Dies kann geschehen, wenn es an einem beliebigen Punkt zwischen dem root-Verzeichnis (/) der Datei gunicorn.sock begrenzte Berechtigungen gibt. Wir können die Berechtigungen und Verantwortungswerte der Socket-Datei und jedes der übergeordneten Verzeichnisse überprüfen, indem wir den absoluten Pfad zu unserer Socket-Datei dem Befehl namei übergeben:

      • namei -l /run/gunicorn.sock

      Output

      f: /run/gunicorn.sock drwxr-xr-x root root / drwxr-xr-x root root run srw-rw-rw- root root gunicorn.sock

      Die Ausgabe zeigt die Berechtigungen der einzelnen Verzeichniskomponenten an. Indem wir uns die Berechtigungen (erste Spalte), den Besitzer (zweite Spalte) und den Gruppenbesitzer (dritte Spalte) ansehen, können wir ermitteln, welche Art des Zugriffs auf die Socket-Datei erlaubt ist.

      Im obigen Beispiel haben die Socket-Datei und die einzelnen Verzeichnisse, die zur Socket-Datei führen, globale Lese- und Ausführungsberechtigungen (die Berechtigungsspalte für die Verzeichnisse endet mit r-x anstelle von ---). Der Nginx-Prozess sollte erfolgreich auf das Socket zugreifen können.

      Wenn eines der Verzeichnisse, das zum Socket führt, keine globale Lese- und Ausführungsberechtigung aufweist, kann Nginx nicht auf das Socket zugreifen, ohne globale Lese- und Ausführungsberechtigungen zuzulassen oder sicherzustellen, dass die Gruppenverantwortung einer Gruppe erteilt wird, zu der Nginx gehört.

      Django zeigt an: “could not connect to server: Connection refused”

      Eine Meldung, die Sie bei dem Versuch, im Webbrowser auf Teile der Anwendung zuzugreifen, von Django erhalten können, lautet:

      OperationalError at /admin/login/
      could not connect to server: Connection refused
          Is the server running on host "localhost" (127.0.0.1) and accepting
          TCP/IP connections on port 5432?
      

      Das bedeutet, dass Django keine Verbindung zur Postgres-Datenbank herstellen kann. Vergewissern Sie sich durch folgende Eingabe, dass die Postgres-Instanz ausgeführt wird:

      • sudo systemctl status postgresql

      Wenn nicht, können Sie sie starten und so aktivieren, dass sie beim Booten automatisch gestartet wird (wenn sie nicht bereits entsprechend konfiguriert ist); geben Sie dazu Folgendes ein:

      • sudo systemctl start postgresql
      • sudo systemctl enable postgresql

      Wenn Sie weiter Probleme haben, stellen Sie sicher, dass die in der Datei ~/myprojectdir/myproject/settings.py definierten Datenbankeinstellungen korrekt sind.

      Weitere Fehlerbehebung

      Bei der weiteren Fehlerbehebung können die Protokolle dazu beitragen, mögliche Ursachen einzugrenzen. Prüfen Sie sie nacheinander und suchen Sie nach Meldungen, die auf Problembereiche hinweisen.

      Folgende Protokolle können hilfreich sein:

      • Prüfen Sie die Nginx-Prozessprotokolle, indem Sie Folgendes eingeben: sudo journalctl -u nginx
      • Prüfen Sie die Nginx-Zugangsprotokolle, indem Sie Folgendes eingeben: sudo less /var/log/nginx/access.log
      • Prüfen Sie die Nginx-Fehlerprotokolle, indem Sie Folgendes eingeben: sudo less /var/log/nginx/error.log
      • Prüfen Sie die Gunicorn-Anwendungsprotokolle, indem Sie Folgendes eingeben: sudo journalctl -u gunicorn
      • Prüfen Sie die Gunicorn-Socket-Protokolle, indem Sie Folgendes eingeben: sudo journalctl -u gunicorn.socket

      Wenn Sie Ihre Konfiguration oder Anwendung aktualisieren, müssen Sie die Prozesse wahrscheinlich neu starten, damit Ihre Änderungen aktiv werden.

      Wenn Sie Ihre Django-Anwendung aktualisieren, können Sie den Gunicorn-Prozess durch folgende Eingabe neu starten, um die Änderungen zu erfassen:

      • sudo systemctl restart gunicorn

      Wenn Sie Gunicorn-Socket- oder Service-Dateien ändern, laden Sie das Daemon neu und starten Sie den Prozess neu, indem Sie Folgendes eingeben:

      • sudo systemctl daemon-reload
      • sudo systemctl restart gunicorn.socket gunicorn.service

      Wenn Sie die Konfiguration des Nginx-Serverblocks ändern, testen Sie die Konfiguration und dann Nginx, indem Sie Folgendes eingeben:

      • sudo nginx -t && sudo systemctl restart nginx

      Diese Befehle sind hilfreich, um Änderungen zu erfassen, während Sie Ihre Konfiguration anpassen.

      Zusammenfassung

      In diesem Leitfaden haben wir ein Django-Projekt in seiner eigenen virtuellen Umgebung eingerichtet. Wir haben Gunicorn so konfiguriert, dass Clientanfragen übersetzt werden, damit Django sie verwalten kann. Anschließend haben wir Nginx als Reverseproxy eingerichtet, um Clientverbindungen zu verwalten und je nach Clientanfrage das richtige Projekt bereitzustellen.

      Django macht die Erstellung von Projekten und Anwendungen durch Bereitstellung vieler der gängigen Elemente besonders einfach; so können Sie sich ganz auf die individuellen Elemente konzentrieren. Durch Nutzung der in diesem Artikel beschriebenen allgemeinen Tool Chain können Sie die erstellten Anwendungen bequem über einen einzelnen Server bereitstellen.



      Source link