Wireguard ist ein modernes und sehr einfach einzurichtendes VPN, das auf mehreren Betriebssystemen verfügbar ist. Die Anwendung ist in den offiziellen Repositories von Ubuntu 20.04 verfügbar, sodass sie auch sehr einfach zu installieren ist. Im Gegensatz zu anderer Software wie OpenVPN, die auf der Verwendung von SSL-Zertifikaten basiert, basiert Wireguard auf der Verwendung von Schlüsselpaaren. In diesem Tutorial werden wir sehen, wie man in wenigen einfachen Schritten einen VPN-Server und einen Client-Peer auf der neuesten stabilen Version von Ubuntu konfiguriert.
In diesem Tutorial lernen Sie:
- So installieren Sie Wireguard auf Ubuntu 20.04 Focal Fossa
- So erstellen Sie ein Paar aus öffentlichem und privatem Schlüssel
- So konfigurieren Sie den Server und einen Client-Peer
- So leiten Sie den gesamten eingehenden Datenverkehr zum VPN um
Softwareanforderungen und verwendete Konventionen
Kategorie | Anforderungen, Konventionen oder verwendete Softwareversion |
---|---|
System | Ubuntu 20.04 Focal Fossa |
Software | Drahtschutz |
Andere | Root-Rechte |
Konventionen | # – erfordert, dass bestimmte Linux-Befehle mit Root-Rechten ausgeführt werden, entweder direkt als Root-Benutzer oder durch Verwendung von sudo Befehl$ – erfordert, dass bestimmte Linux-Befehle als normaler, nicht privilegierter Benutzer ausgeführt werden |
Installation
Wireguard ist offiziell im „Universum“-Repository von Ubuntu 20.04 verfügbar, daher können wir es über apt
installieren . Die verfügbare Version ist zum Zeitpunkt des Schreibens 1.0.20200319-1ubuntu1
:
$ sudo apt install wireguard
Das System fordert uns auf, zu bestätigen, dass wir das Programm und seine Abhängigkeiten installieren möchten, und schließt den Vorgang innerhalb von Sekunden ab.
Schlüssel generieren
Wir müssen für jede Maschine, die wir in unserem VPN verwenden möchten, einen öffentlichen und einen privaten Schlüssel generieren. Der private Schlüssel sollte auf der Maschine geheim gehalten werden, der öffentliche wird verwendet, um von den anderen Peers auf die Maschine zuzugreifen.
Um die Schlüssel zu generieren, können wir den wg
verwenden Nützlichkeit. In der Wireguard-Konfigurationsdatei müssen wir auf den privaten Schlüssel der Maschine verweisen, während der öffentliche Schlüssel auf den anderen Peers verwendet wird. Beachten Sie, dass wir die Schlüssel direkt referenzieren, sodass wir sie theoretisch nicht in Dateien speichern müssen. Wir werden es jedoch trotzdem tun, nur der Einfachheit halber.
Um den privaten Schlüssel für unseren Server zu generieren, müssen wir den genkey
verwenden Unterbefehl von wg
. Der Befehl gibt den erstellten Schlüssel an stdout
aus; Um den Schlüssel in eine Datei zu schreiben, können wir die Leistungsfähigkeit von Shell-Umleitungen nutzen:
$ wg genkey > server_private_key
Der Befehl generiert den Schlüssel und speichert ihn im server_private_key
Datei, wird aber die folgende Warnung auslösen:
Warning: writing to world accessible file. Consider setting the umask to 077 and trying again.
Dies liegt daran, dass mit dem Standardbenutzer umask (002
) werden die Dateien im Modus 664
erstellt , sind also weltweit lesbar, was nicht zu empfehlen ist. Um dieses Problem zu lösen, können wir entweder die in der aktuellen Shell-Sitzung verwendete umask ändern, bevor wir die Dateien erstellen:
$ umask 077
Oder ändern Sie die Dateiberechtigungen auf 600
nach der Erstellung. Hier entscheiden wir uns für die letztere Lösung.
Sobald unser privater Schlüssel fertig ist, können wir den öffentlichen generieren eine, die darauf basiert. Um die Aufgabe zu erfüllen, verwenden wir den pubkey
Unterbefehl von wg
. Genau wie zuvor verwenden wir Shell-Umleitungen:zuerst, um den Inhalt des server_private_key
zu übergeben Datei in die stdin
des Befehls und dann und um den generierten Schlüssel an den server_public_key
umzuleiten Datei:
$ wg pubkey < server_private_key > server_public_key
Um etwas Tipparbeit zu sparen, können wir beide Schlüssel mit nur einem Befehl generieren, was die Verwendung der Shell |
beinhaltet (Pipe)-Operator und das tee
Befehl:
$ wg genkey | tee server_private_key | wg pubkey > server_public_key
Die Ausgabe des Befehls auf der linken Seite des Pipe-Operators (|
) wird auf der rechten Seite an die Standardeingabe des Programms übergeben. Das tee
Erlauben Sie uns stattdessen, die Ausgabe eines Befehls sowohl in eine Datei als auch in die Standardausgabe umzuleiten (mehr über Shell-Umleitungen hier).
Sobald unsere Schlüssel fertig sind, können wir die Serverkonfigurationsdatei erstellen.
Serverkonfigurationsdatei
Um unsere Wireguard-Installation zu konfigurieren, können wir eine Konfigurationsdatei namens wg0.conf
erstellen mit folgendem Inhalt:
[Interface] PrivateKey = <private key of the server (the content of the server_private_key file)> Address = 10.0.0.1/24 ListenPort = 51820
Beachten Sie, dass der Name der Datei willkürlich ist, aber auf dem Namen basieren sollte, den wir für unsere Schnittstelle verwenden werden, wg0
in diesem Fall. Auf diesen Namen wird beim Starten des Dienstes verwiesen, wie wir weiter unten sehen werden.
In unserem Beispiel. die [interface]
Abschnitt der Konfigurationsdatei enthält die folgenden Felder:
- Privater Schlüssel
- Adresse
- ListenPort
Der PrivateKey Feldwert ist nichts anderes als der private Schlüssel des Servers, den wir zuvor generiert haben.
In der Adresse Feld haben wir die Adresse angegeben, die der Schnittstelle im VPN zusammen mit der Subnetzmaske mithilfe des CIDR zugewiesen werden soll Notation. In diesem Fall haben wir 10.0.0.1/24
verwendet , also lautet unsere Wireguard-„Server“-Adresse im VPN 10.0.0.1
, die sich im verfügbaren Adressbereich befindet, der von 10.0.0.1
geht bis 10.0.0.254
.
Schließlich im ListenPort Feld haben wir angegeben, auf welchem Port Wireguard auf eingehenden Datenverkehr horcht. Außerdem muss unserer Firewall eine Regel hinzugefügt werden, um diesen Datenverkehr zuzulassen. Wir werden dies im nächsten Abschnitt tun.
Wir können jetzt die Berechtigungen der Dateien ändern und sie nach /etc/wireguard
verschieben Verzeichnis:
$ chmod 600 server_public_key server_private_key wg0.conf $ sudo mv server_private_key server_public_key wg0.conf /etc/wireguard
Nun können wir wg-quick
starten service, der den Namen der Wireguard-Schnittstelle nach @
angibt im Einheitennamen. Was ist diese Notation? Es ist eine Funktion von systemd:Damit können wir mehrere Unit-Dateien auf der Basis einer „Vorlage“ erstellen, indem wir den Wert, der in der Vorlage ersetzt wird, nach dem @
übergeben Symbol im Namen der Einheit. Dies ist der Inhalt des [email protected]
Einheit:
[Unit] Description=WireGuard via wg-quick(8) for %I After=network-online.target nss-lookup.target Wants=network-online.target nss-lookup.target Documentation=man:wg-quick(8) Documentation=man:wg(8) Documentation=https://www.wireguard.com/ Documentation=https://www.wireguard.com/quickstart/ Documentation=https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8 Documentation=https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8 [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/wg-quick up %i ExecStop=/usr/bin/wg-quick down %i Environment=WG_ENDPOINT_RESOLUTION_RETRIES=infinity [Install] WantedBy=multi-user.target
Den Wert geben wir nach dem @
an im Unit-Namen beim Starten oder Stoppen ersetzt %i
im ExecStart
und ExecStop
Linien. In diesem Fall verwenden wir wg0
:
$ sudo systemctl enable --now wg-quick@wg0
Mit obigem Befehl haben wir den Dienst gestartet und auch make damit beim Booten automatisch gestartet. Um zu überprüfen, ob unsere Konfiguration angewendet wurde, können wir wg
ausführen Befehl. Die erzeugte Ausgabe sollte Informationen über wg0
anzeigen Schnittstelle:
$ sudo wg interface: wg0 public key: nNx3Zpcv9D2dtgHDsoYGBNr64zG5jTJ4Z4T2sE759V4= private key: (hidden) listening port: 51820
Lassen Sie uns nun fortfahren und unsere Firewall und Paketweiterleitung konfigurieren.
Firewall- und Netzwerkeinrichtung
In diesem Tutorial gehe ich von der Verwendung von ufw
aus . Wie wir bereits gesagt haben, müssen wir eine Regel hinzufügen, um eingehenden Datenverkehr über den Port zuzulassen, den wir in der Konfigurationsdatei angegeben haben, 51820
. Wir tun dies, indem wir einen sehr einfachen Befehl ausführen:
$ sudo ufw allow 51820/udp
Wir müssen auch die Paketweiterleitung auf unserem System zulassen. Um die Aufgabe zu erfüllen, entfernen wir den Kommentar aus Zeile 28
der /etc/sysctl.conf
Datei, sodass es so aussieht:
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1
Um die Änderungen wirksam zu machen, ohne das System neu zu starten, müssen wir den folgenden Befehl ausführen:
$ sudo sysctl -p
Im nächsten Schritt konfigurieren wir den Client.
Client-Schlüsselgenerierung
Kommen wir nun zu dem System, das wir als Client verwenden möchten. Wir müssen Wireguard darauf installieren; Sobald dies erledigt ist, können wir ein Schlüsselpaar generieren, genau wie wir es auf dem Server getan haben:
$ wg genkey | tee client_private_key | wg pubkey > client_public_key
Genau wie wir es serverseitig gemacht haben, erstellen wir die wg0.conf
Konfigurationsdatei. Diesmal mit diesem Inhalt:
[Interface] PrivateKey = <client_private_key> Address = 10.0.0.2/24 [Peer] PublicKey = <server_public_key> EndPoint = <server_public_ip>:51820 AllowedIPs = 0.0.0.0/0
Die Bedeutung der im Interface
enthaltenen Felder haben wir bereits gesehen Abschnitt, als wir die Serverkonfiguration erstellt haben. Hier haben wir nur die Werte an unseren Client angepasst (er wird den 10.0.0.2
haben Adresse im VPN).
In dieser Konfiguration haben wir einen neuen Abschnitt verwendet, [Peer]
. Darin können wir die Informationen zu einem Peer angeben, in diesem Fall dem, den wir als „Server“ verwenden. Die von uns verwendeten Felder sind:
- PublicKey
- Endpunkt
- ZugelasseneIPs
Im PublicKey Im Feld öffentlich geben wir an Schlüssel des Peers, also in diesem Fall der öffentliche Schlüssel, den wir auf dem Server generiert haben.
Der EndPoint ist die öffentliche IP-Adresse oder der Hostname des Peers, gefolgt von einem Doppelpunkt und der Portnummer, auf der der Peer lauscht (in unserem Fall 51820
).
Schließlich wird der Wert an die AllowedIPs übergeben ist eine durch Kommas getrennte Liste von IP-Adressen und Subnetzmasken mit CIDR-Notation. Es wird nur an den Peer gerichteter Datenverkehr zugelassen, der von den angegebenen Adressen stammt. In diesem Fall haben wir 0.0.0.0/0
verwendet als Wert:Er fungiert als „Catch-All“-Wert, sodass der gesamte Datenverkehr an den VPN-Peer (den Server) gesendet wird.
Genau wie wir es serverseitig getan haben, setzen wir die entsprechenden Berechtigungen und verschieben die Schlüssel und die Konfigurationsdatei nach /etc/wireguard
Verzeichnis:
$ chmod 600 client_public_key client_private_key wg0.conf $ sudo mv client_public_key client_private_key wg0.conf /etc/wireguard
Mit der vorhandenen Konfigurationsdatei können wir den Dienst starten:
$ sudo systemctl enable --now wg-quick@wg0
Schließlich der [Peer]
Abschnitt relativ zu unserem Client, muss der Konfigurationsdatei hinzugefügt werden, die wir zuvor auf dem Server erstellt haben . Wir hängen an folgenden Inhalt dazu:
[Peer] PublicKey = <public key of the client> AllowedIPs = 10.0.0.2/32
An dieser Stelle starten wir den Dienst neu:
$ sudo systemctl restart wg-quick@wg0
In der Ausgabe der wg
sollten nun die Informationen über den zugehörigen Peer gemeldet werden Befehl:
$ sudo wg interface: wg0 public key: nNx3Zpcv9D2dtgHDsoYGBNr64zG5jTJ4Z4T2sE759V4= private key: (hidden) listening port: 51820 peer: t5pKKg5/9fJKiU0lrNTahv6gvABcmCjQq5gF3BxwiDQ= allowed ips: 10.0.0.2/32
An diesem Punkt sollten wir vom „Client“-System aus den Server unter 10.0.0.1
anpingen können Adresse:
$ ping -c 3 10.0.0.1 PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. 64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=2.82 ms 64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=38.0 ms 64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=3.02 ms --- 10.0.0.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 2.819/14.613/37.999/16.536 ms
Schlussfolgerungen
In diesem Tutorial haben wir gesehen, wie man ein VPN mit Wireguard auf der neuesten stabilen Version von Ubuntu erstellt:20.04 Focal Fossa. Die Software ist wirklich einfach zu installieren und zu konfigurieren, besonders im Vergleich zu anderen Lösungen, wie zum Beispiel OpenVpn.
Wir haben gesehen, wie die für unser Setup verwendeten öffentlichen und privaten Schlüssel generiert werden und wie sowohl der Server als auch ein Client so konfiguriert werden, dass der gesamte Datenverkehr an das VPN umgeleitet wird. Wenn Sie die gegebenen Anweisungen befolgen, haben Sie ein funktionierendes Setup. Weitere Informationen finden Sie auf der Projektseite.