Öffentliche IPv6-Adressen an deine lxc/lxd-Container weiterleiten
Die enorme Anzahl an IPv6-Adressen, die den meisten kommerziell gehosteten VPS-/Root-Servern mit einem öffentlichen IPv6-Präfix zur Verfügung stehen, ermöglicht es dir, jedem Container, der auf deinem Server läuft, eine öffentliche IPv6-Adresse zuzuweisen. Dieses Tutorial zeigt dir, wie das funktioniert, auch wenn du keine Vorkenntnisse im Routing hast.
Schritt 0: Erstelle deinen LXC-Container
Wir nehmen an, dass du dies bereits getan hast — nur als Referenz, hier ist wie du einen Container erstellen kannst:
lxc launch ubuntu:18.04 my-containerSchritt 1: Welche IP-Adresse möchtest du deinem Container zuweisen?
Zuerst musst du herausfinden, welches Präfix an deinen Host weitergeleitet wird. Normalerweise kannst du das im Control Panel deines Anbieters prüfen. Du suchst nach etwas wie 2a01:4f9:c010:278::1/64. Eine andere Möglichkeit wäre, sudo ifconfig auszuführen
und nach einer inet6-Zeile im Abschnitt deiner primären Netzwerkschnittstelle zu suchen (dies funktioniert nur, wenn du deinen Server so konfiguriert hast, dass er eine IPv6-Adresse hat). Beachte, dass Adressen, die mit fe80:: beginnen, und Adressen, die mit fd beginnen, unter anderem keine öffentlichen IPv6-Adressen sind.
Dann kannst du eine neue IPv6-Adresse für deinen Container definieren. Welche du wählst — solange sie innerhalb des Präfixes liegt — ist ganz allein deine Entscheidung.
Oft wird <prefix>::1 für den Host selbst verwendet, daher könntest du beispielsweise <prefix>::2 wählen. Beachte, dass einige Anbieter einige IP-Adressen für andere Zwecke verwenden. Prüfe die Dokumentation deines Anbieters für Details.
Wenn du es nicht einfach machen möchtest, die öffentliche IPv6 deines Containers zu finden, wähle nicht <prefix>::1, <prefix>::2, <prefix>::3 usw., sondern etwas zufälligeres wie <prefix>:af15:99b1:0b05:1, zum Beispiel 2a01:4f9:c010:278:af15:99b1:0b05:0001. Stelle sicher, dass deine IPv6-Adresse 8 Gruppen von je 4 Hex-Ziffern hat!
Für dieses Beispiel wählen wir die IPv6-Adresse 2a01:4f9:c010:278::8.
Schritt 2: ULA deines Containers ermitteln
Wir müssen die ULA (unique local address — ähnlich einer privaten IPv4-Adresse, die nicht im Internet geroutet wird) des Containers finden. Mit lxc ist das recht einfach:
uli@myserver:~$ lxc list
+--------------+---------+-----------------------+-----------------------------------------------+
| NAME | STATE | IPV4 | IPV6 |
+--------------+---------+-----------------------+-----------------------------------------------+
| my-container | RUNNING | 10.144.118.232 (eth0) | fd42:830b:36dc:3691:216:3eff:fed1:9058 (eth0) |
+--------------+---------+-----------------------+-----------------------------------------------+Du musst in der IPv6-Spalte nachsehen und die dort aufgelistete Adresse kopieren. In diesem Beispiel ist die Adresse fd42:830b:36dc:3691:216:3eff:fed1:9058.
Schritt 3: IPv6-Routing einrichten
Nun können wir den Host-Linux anweisen, deine gewählte öffentliche IPv6 an die private IPv6 des Containers weiterzuleiten. Das ist recht einfach:
sudo ip6tables -t nat -A PREROUTING -d <public IPv6> -j DNAT --to-destination <container private IPv6>In unserem Beispiel wäre das
sudo ip6tables -t nat -A PREROUTING -d 2a01:4f9:c010:278::8 -j DNAT --to-destination fd42:830b:36dc:3691:216:3eff:fed1:9058Teste den Befehl zuerst, indem du ihn in einer Shell ausführst. Wenn er funktioniert (d.h. wenn er keine Fehlermeldung ausgibt), kannst du ihn dauerhaft speichern, z.B. indem du ihn zu /etc/rc.local hinzufügst (nach #!/bin/bash, vor exit 0). Fortgeschrittene Benutzer sollten ihn bevorzugt zu /etc/network/interfaces hinzufügen.
Schritt 4: Mit deinem Container über SSH auf deiner öffentlichen IPv6 verbinden (optional)
Hinweis: Dieser Schritt erfordert, dass du eine funktionierende IPv6-Konnektivität an deinem lokalen Computer hast. Wenn du unsicher bist, prüfe auf ipv6-test.com
Öffne zuerst eine Shell auf deinem Container:
lxc exec my-container bashNach der Ausführung solltest du eine Root-Shell-Eingabeaufforderung innerhalb deines Containers sehen:
root@my-container:~#Die folgenden Befehle sollten in der Container-Shell eingegeben werden, nicht auf dem Host!
Nun können wir einen Benutzer zum Anmelden erstellen (in diesem Beispiel erstellen wir den Benutzer uli):
root@my-container:~# adduser uli
Adding user `uli' ...
Adding new group `uli' (1001) ...
Adding new user `uli' (1001) with group `uli' ...
Creating home directory `/home/uli' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for uli
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]Du musst nur ein Passwort eingeben (du wirst bei der Eingabe nichts auf dem Bildschirm sehen) und zwar zweimal, für alle anderen Zeilen kannst du einfach Enter drücken.
Das in diesem Beispiel verwendete ubuntu:18.04 lxc-Image erlaubt in seiner Standardkonfiguration keine SSH-Passwort-Authentifizierung. Um dies zu beheben, ändere PasswordAuthentication no zu PasswordAuthentication yes in /etc/ssh/sshd_config und starte den SSH-Server neu mit service sshd restart. Stelle sicher, dass du die Sicherheitsauswirkungen verstehst, bevor du das tust!
Melde dich nun von deiner Container-Shell ab, indem du Ctrl+D drückst. Die folgenden Befehle können auf deinem Desktop oder einem anderen Server mit IPv6-Konnektivität eingegeben werden.
Jetzt melde dich auf deinem Server an:
ssh <username>@<public IPv6 address>in diesem Beispiel:
ssh uli@2a01:4f9:c010:278::8Wenn du alles korrekt konfiguriert hast, siehst du die Shell-Eingabeaufforderung für deinen Container:
uli@my-container:~$Hinweis: Vergiss nicht, eine Firewall für deinen Container zu konfigurieren, z.B. ufw! Die IPv6 deines Containers ist dem Internet ausgesetzt und einfach anzunehmen, dass niemand sie errät, ist keine gute Sicherheitspraxis.