bytecluster0002
bytecluster0002 ist ein Virtualisierungsserver, der Kommunikationsdienste für den Verein bereitstellt.
Er löst bytecluster0001 ab.
Virtuelle Hardware
4 Kerne
-
Volumes
-
100
GB /mnt/data
(zusätzlich)
Migration
Festlegungen (Diskussionsgrundlage)
Kein produktiver Container ohne Dokumentation.
Der erste Schritt beim Installieren und Testen ist immer einer leere Dokumentation.
Container ohne Dokumentation werden ohne Rückfrage heruntergefahren und bei Kapazitätsengpässen entfernt.
Spiel- und Testcontainer sind eindeutig im Namen gekennzeichnet.
Mit Resourcen (Disk/RAM) wird verantwortungsvoll umgegangen - Upscaling geht später immer.
Container
Administratoren
IPs /DNS
extern
intern
Betrieb
Benutzer anlegen
Benutzer anlegen
Normaler Benutzer ohne sudo-Rechte
Benutzer mit sudo-Rechten
SSH-Key hinterlegen
SSH-Verzeichnis anlegen
SSH-Schlüssel in Datei authorized_keys hinterlegen
/home/mustermann/.ssh/authorized_keys
ssh-rsa AAAA... KOMMENTAR
Berechtigungen und Rechte anpassen
chown --recursive mustermann:mustermann /home/mustermann/.ssh
chmod 700 /home/mustermann/.ssh
chmod 644 /home/mustermann/.ssh/authorized_keys
Passwort setzen
Benutzer-Zugang zu Proxmox als Admin gewähren
Benutzer als Admin hinzufügen zuweisen
Login des Benutzers
passwd - Passwort ändern
pve_generate_oath
Installation
Betriebssystem
Vorkonfiguration
Vorgeschlagene Pakete nicht mit installieren (bereits im Standard vom Provider vorhanden)
/etc/apt/apt.conf.d/00InstallRecommends
APT::Install-Recommends "false";
Grundeinrichtung
Migration
System aktualisieren
apt-get update
apt-get dist-upgrade
Notwendige Standardsoftware installieren
vim (Editor)
mc (Dateimanager)
debian-goodies (Debian-Systemtools)
needrestart (Prüfung von Diensteneustarts nach Update)
net-tools (Netzwerktools)
apt-get install vim mc debian-goodies needrestart net-tools
Suche in der Konsole mit Bild-ab/Bild-auf aktivieren
/etc/inputrc
...
# alternate mappings for "page up" and "page down" to search the history
"\e[5~": history-search-backward
"\e[6~": history-search-forward
...
Absicherung
NFS / rpcbind deaktivieren und beenden (wird nicht benötigt, offene Ports schließen)
sudo installieren und konfigurieren
apt-get install sudo
Konfiguration prüfen, so dass sudo von Nutzern der Gruppe sudo genutzt werden kann
/etc/sudoers
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
SSH - Login als root und mit Passwort deaktivieren
Konfiguration anpassen
/etc/ssh/sshd_config.d/01_custom.conf
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
SSH-Daemon neustarten
Netzwerk
Bridges für Netzwerk(e) einrichten
Die Einrichtung von Bridges sollte nicht über die Web-GUI erfolgen, da dabei u.U. bestehende Konfigurationen aus dem Ordner /etc/network/interfaces.d nicht mehr funktionieren. Die Bridges werden in /etc/network/interfaces angelegt, damit sie in der Proxmox-GUI sichtbar sind.
Bridge für Internetzugang in Containern und Datenbanknetzwerk anlegen
/etc/network/interfaces
...
auto vmbr0
iface vmbr0 inet static
address 10.2.0.254
netmask 255.255.255.0
bridge_ports none
bridge_stp off
bridge_fd 0
#Frontend-Netzwerk (Traefik) mit Internetzugang
iface vmbr0 inet6 static
address fd00:10:2:0::0
netmask 64
auto vmbr1
iface vmbr1 inet manual
bridge_ports none
bridge_stp off
bridge_fd 0
#Datenbanken
Bridges starten
Paketfilter einrichten
Hinweis: Es wurde iptables statt nftables (Standard bei Debian Buster) verwendet, weil nftables noch kein NETMAP unterstützt.
iptables-persistent installieren, um iptables-Regeln für Neustarts zu speichern
NAT (portbasiert) für IPv4
NAT-Reflection für IPv4 (Zugriff von intern auf externe IP-Adresse für Ports 80/443)
iptables -t nat -A PREROUTING -i vmbr0 -s 10.2.0.0/24 -d 138.201.246.25/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.2.0.1:80
iptables -t nat -A PREROUTING -i vmbr0 -s 10.2.0.0/24 -d 138.201.246.25/32 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.2.0.1:443
iptables -t nat -A POSTROUTING -o vmbr0 -s 10.2.0.0/24 -j SNAT --to-source 138.201.246.25
NAT (prefixbasiert) für IPv6
ip6tables -t nat -A POSTROUTING -o eth0 --to 2a01:4f8:c17:cf64:ffff::/80 -s fd00:10:2:0::/64 -j NETMAP
ip6tables -t nat -A PREROUTING -i eth0 -d 2a01:4f8:c17:cf64:ffff::/80 --to fd00:10:2:0::/64 -j NETMAP
NAT-Reflection für IPv6 (Zugriff von intern auf externe IP-Adresse)
Regeln speichern
Forwarding aktivieren
sysctl-Konfiguration erstellen
/etc/sysctl.d/99-forward.conf
# Forwarding aktivieren
net.ipv4.conf.eth0.forwarding = 1
net.ipv4.conf.vmbr0.forwarding = 1
net.ipv6.conf.all.forwarding = 1
sysctl-Konfiguration übernehmen
Eingerichtete Forwards
-
iptables -t nat -A PREROUTING -d 138.201.246.25/32 -p tcp -m tcp –dport 80 -j DNAT –to-destination 10.2.0.1:80
iptables -t nat -A PREROUTING -d 138.201.246.25/32 -p tcp -m tcp –dport 443 -j DNAT –to-destination 10.2.0.1:443
NGINX default im web-container
iptables -t nat -A PREROUTING -d 138.201.246.25/32 -p tcp --dport 8089 -j DNAT --to 10.2.0.10:8089
Dokuwiki im web-container
iptables -t nat -A PREROUTING -d 138.201.246.25/32 -p tcp --dport 8088 -j DNAT --to 10.2.0.10:8088
Nextcloud im nextcloud.test container
iptables -t nat -A PREROUTING -d 138.201.246.25/32 -p tcp --dport 8087 -j DNAT --to 10.2.0.20:8087
Wordpress im wordpress.test container
iptables -t nat -A PREROUTING -d 138.201.246.25/32 -p tcp --dport 8086 -j DNAT --to 10.2.0.30:8086
Proxmox
Vorbereitung
Installation
-
bei apt full-upgrade mit „install the package maintainer's version“ die Konfiguration für grub-efi-amd64 übernehmen
für den Punkt „Install Proxmox VE packages“ nur apt install proxmox-ve postfix ausführen, da open-iscsi nicht benötigt wird
Anpassung der Update-Repository
Proxmox richtet das Repository für die Enterprise-Version mit ein. Ohne Subskription schlägt das Update der Quelle aber fehl und sie muss daher deaktiviert werden.
Enterprise-Repository deaktivieren
2FA Grundeinrichtung
Skript anlegen
/usr/local/bin/pve_generate_oath
#!/bin/bash
clear
USERNAME=$USER
HOSTNAME=$(hostname --fqdn)
OATHKEY=$(oathkeygen)
qrencode -t ANSIUTF8 -o - "$(echo otpauth://totp/Proxmox $HOSTNAME?secret=$OATHKEY)"
read -p "Scan QR code in your application and press enter to activate. Otherwise press Ctrl+C" -n1 -s
sudo pveum user modify $USER@pam -keys $OATHKEY
Berechtigungen anpassen und ausführbar machen
2FA für PAM-Anmeldungen verpflichtend machen
Admin-Gruppe und ersten Benutzer anlegen
Admin-Gruppe anlegen
ersten Benutzer zuweisen und root sperren
2FA für ersten Benutzer aktivieren
SSL mit Let's Encrypt
Quelle: https://pve.proxmox.com/wiki/Certificate_Management
Mail-Account für Let's Encrypt registrieren
pvenode acme account register default xxxxxxxxxx@bytespeicher.orgDirectory endpoints:
0) Let's Encrypt V2 (https://acme-v02.api.letsencrypt.org/directory)
1) Let's Encrypt V2 Staging (https://acme-staging-v02.api.letsencrypt.org/directory)
2) Custom
Enter selection: 0
Attempting to fetch Terms of Service from 'https://acme-v02.api.letsencrypt.org/directory'..
Terms of Service: https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
Do you agree to the above terms? [y|N]: y
Attempting to register account with 'https://acme-v02.api.letsencrypt.org/directory'..
Generating ACME account key..
Registering ACME account..
Registration successful, account URL: 'https://acme-v02.api.letsencrypt.org/acme/acct/XXXXXXXX'
Task OK
Domain hinterlegen
Erstes Zertifikat intitialisieren
pvenode acme cert order...
Task OK
SSH-Forward-Hook einrichten
Skript hinterlegen
/var/lib/vz/snippets/ssh_forward.sh
#!/usr/bin/sh
# Hook script to automatically forward SSH-Port to Container
VMID=$1
PHASE=$2
NETWORK_INTERFACE_EXTERNAL=eth0
NETWORK_INTERFACE_INTERNAL=vmbr0
SSH_DESTINATION_PORT=22
SSH_FORWARD_BASE_PORT=22000
# Determine container details
IP_ADDRESS_INTERNAL=$(pct config $VMID | grep "bridge=$NETWORK_INTERFACE_INTERNAL" | sed --regexp-extended 's/.*ip=([0-9\.]*)\/.*/\1/')
# IP_LAST_OCTET=$(pct config $VMID | grep "bridge=$NETWORK_INTERFACE_INTERNAL" | sed --regexp-extended 's/.*ip=[0-9]+\.[0-9]+\.[0-9]+\.([0-9]+)\/.*/\1/')
SSH_FORWARD_PORT=$(expr $SSH_FORWARD_BASE_PORT + $VMID)
echo "GUEST HOOK on VMID $VMID for phase $PHASE"
echo "Internal IP address: $IP_ADDRESS_INTERNAL"
echo "SSH-Port on host: $SSH_FORWARD_PORT"
case "$PHASE" in
# First phase 'pre-start' will be executed before the guest
# ist started. Exiting with a code != 0 will abort the start
pre-start) echo "$VMID is starting, doing preparations.\n"
iptables -t nat -A PREROUTING -i $NETWORK_INTERFACE_EXTERNAL -p tcp --dport $SSH_FORWARD_PORT -j DNAT --to $IP_ADDRESS_INTERNAL:$SSH_DESTINATION_PORT
;;
# Second phase 'post-start' will be executed after the guest
# successfully started.
post-start) echo "$VMID started successfully.\n"
;;
# Third phase 'pre-stop' will be executed before stopping the guest
# via the API. Will not be executed if the guest is stopped from
# within e.g., with a 'poweroff'
pre-stop) echo "$VMID will be stopped.\n"
;;
# Last phase 'post-stop' will be executed after the guest stopped.
# This should even be executed in case the guest crashes or stopped
# unexpectedly.
post-stop) echo "$VMID stopped. Doing cleanup.\n"
iptables -t nat -D PREROUTING -i $NETWORK_INTERFACE_EXTERNAL -p tcp --dport $SSH_FORWARD_PORT -j DNAT --to $IP_ADDRESS_INTERNAL:$SSH_DESTINATION_PORT
;;
*) echo "Got unknown phase '$PHASE'\n"
exit 1
;;
esac
Skript ausführbar machen
Zusätzliches Volume einrichten
Volume vorbereiten als /mnt/data
Volume in Proxmox einbinden
Anpassung des Standard-Templates auf Debian-Basis
Systemd-Container installieren
Liste der verfügbaren Template aktualisieren
Verfügbare Images anzeigen
pveam available --section system | grep debiansystem debian-11-standard_11.7-1_amd64.tar.zst
system debian-12-standard_12.2-1_amd64.tar.zst
Debian 12 Image herunterladen
Template in neuen Ordner entpacken
In das Template-System wechseln
systemd-nspawn -D /tmp/templateAusgabe
Spawning container template on /tmp/template.
Press ^] three times within 1s to kill container.
root@template:~#
Template: Konfiguration und Software anpassen
APT-Quellen auf Hetzner festlegen
echo "deb http://mirror.hetzner.de/debian/security bookworm-security main contrib" > /etc/apt/sources.list.d/hetzner-security-updates.list
echo "deb http://mirror.hetzner.de/debian/packages bookworm main contrib" > /etc/apt/sources.list.d/hetzner-mirror.list
echo "deb http://mirror.hetzner.de/debian/packages bookworm-updates main contrib" >> /etc/apt/sources.list.d/hetzner-mirror.list
echo "deb http://mirror.hetzner.de/debian/packages bookworm-backports main contrib" >> /etc/apt/sources.list.d/hetzner-mirror.list
Alle Änderungen aus Betriebssystem von bytecluster0002 vornehmen
Template bereinigen
Aus Template ausloggen
Template packen und temporären Ordner entfernen
Neuen Container anlegen
Anmelden bei Proxmox Web-Gui
Vorbedingung: 2FA aktivieren
Auf Console einloggen (via hinterlegtem Public Key)
pve_generate_oath ausführen (als normaler Nutzer)
Angezeigten QR-Code mit Smartphone scannen und an beliebiges 2FA tool (z.B. Google Auhenticator) weiterleiten
Wichtig: QR-Code-Anzeige in der Konsole mit Enter schliessen
-
Container anlegen und konfigurieren
Create CT Button oben rechts
hostname frei wählen (z.B. 'web'), CT ID zählt automatisch hoch, SSH public key vom eigenen Rechner hochladen (derselbe, der für den Login zum host-server benutzt wird), Next klicken
template debian-10-bytecluster0002-with-users wählen, Next klicken
Plattengröße, Cores und RAM wählen
Unter network statische IPs vergeben: IPv4: 10.2.0.x/24 Gateway 10.2.0.0 IPv6: fd00:10:2:0::x/64 Gateway fd00:10:2:0::0 mit freiem x (0 = host, 10 = web, …);
Im letzten Tab bestätigen und ggfs. Container sofort starten.
Automatischen SSH-Forward für Container konfigurieren
Per SSH auf dem Host einloggen
Hook-Skript an Container binden
Container ist nach dem (Neu)Start per SSH auf Port 22000 + <CT ID> (z.B. 22149 für Container mit ID 149) direkt erreichbar
In Container einloggen
Vor weiteren Konfigurationen ist der Container nicht von aussen erreichbar, sondern nur über den Host
Die Benutzer-Accounts des Hosts sind auch im Container angelegt, das Passwort liegt in einer passwort.txt im Home des Benutzers im Container
Ein Login ist über mittels SSH-Key möglich, die Keys sind in den Containern vorab hinterlegt
Disclaimer
Wird SSH Agent Forwarding genutzt, kann potentiell jeder mit root/sudo-Rechten solange ihr eingeloggt seid euren Key benutzen, um sich in eurem Namen lokal oder auf weiteren (auch externen) Servern einzuloggen, auf denen der selbe Key benutzt wird!
Dazu am eigenen Rechner einmal ssh-add (je nach system einmalig oder nach jedem Login), dann ssh -A bytecluster0002.bytespeicher.org; von dort dann ssh 10.2.0.x zum Container
Zum Passwort ändern kann man sich zur Konsole des Containers verbinden
Von der Konsole des Hosts aus mit sudo pct console <CT ID>
Über das Web-Frontend kann man die „Console“ nutzen
In der Konsole kann man sich als root mit dem festgelegten Passwort einloggen und mit passwd <nutzername> das Benutzer-Passwort ändern
Alle bekannten Nutzer sind sudo-fähig