======= bytecluster0002 =======
bytecluster0002 ist ein Virtualisierungsserver, der Kommunikationsdienste für den Verein bereitstellt.
Er löst [[bytecluster0001]] ab.
====== Virtuelle Hardware ======
* 4 Kerne
* 16 GB RAM
* Volumes
* 160 GB / //(inkludiert)//
* 100 GB /mnt/data //(zusätzlich)//
====== Migration ======
* mehr zur Migration unter [[dienste:bytecluster0002: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 ======
* siehe [[dienste:bytecluster0002:host-netzwerke|host-netzwerke]]
====== Administratoren ======
* [[user:mape2k]]
* [[user:hipposen:|maddi]]
* [[user:suicider]]
* [[user:chaos]]
====== IPs /DNS ======
===== extern =====
* bytecluster0002.bytespeicher.org
* 138.201.246.25
* 2a01:4f8:c17:cf64::1
===== intern =====
* Vergabe siehe [[dienste:bytecluster0002:host-netzwerke]]
* Netzwerk für Internetzugang und Traefik
* 10.2.0.254/24
* fd00:10:2:0::0/64
* Netzwerk für Datenbankserver und -clients
* 10.3.0.0/24
* fd00:10:3:0::0/64
* IPs liegen am Host nicht an
====== Betrieb ======
===== Benutzer anlegen =====
- Benutzer anlegen
- Normaler Benutzer ohne sudo-Rechte
* **useradd --create-home --shell /bin/bash --comment "Max Mustermann" mustermann**
- Benutzer mit sudo-Rechten
* **useradd --create-home --shell /bin/bash --comment "Max Mustermann" --groups sudo mustermann**
- SSH-Key hinterlegen
- SSH-Verzeichnis anlegen
* **mkdir /home/mustermann/.ssh**
- SSH-Schlüssel in Datei authorized_keys hinterlegen
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
* Das Passwort ist für den Nutzung von sudo und für die Proxmox-Weboberfläche gültig und sollte vom Benutzer dann geändert werden!
* **passwd mustermann**
===== Benutzer-Zugang zu Proxmox als Admin gewähren =====
- Benutzer als Admin hinzufügen zuweisen
* **pveum user add mustermann@pam -groups admin -enable 1 -firstname "Max" -lastname "Mustermann"**
- Login des Benutzers
* **passwd** - Passwort ändern
* **pve_generate_oath**
* QR-Code mit geeignetem 2FA-Client scannenund nach Enter Ausführung mit eigenem Passwort (für sudo) bestätigen
====== Installation ======
===== Betriebssystem =====
* Debian 12 minimal (vorinstalliert)
==== Vorkonfiguration =====
- Vorgeschlagene Pakete nicht mit installieren (bereits im Standard vom Provider vorhanden)
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
...
# 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)
* **systemctl disable --now rpcbind.service rpcbind.socket**
- sudo installieren und konfigurieren
* **apt-get install sudo**
* Konfiguration prüfen, so dass sudo von Nutzern der Gruppe sudo genutzt werden kann
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
- SSH - Login als root und mit Passwort deaktivieren
* Vorher mindestens einen Benutzer einrichten, der einen SSH-Schlüssel hinterlegt hat!
- Konfiguration anpassen
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
- SSH-Daemon neustarten
* **systemctl restart sshd**
===== 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
...
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
* **ifup vmbr0**
* **ifup vmbr1**
==== 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
* **apt-get install iptables-persistent**
* Aktuelle Regeln nicht speichern
- NAT (portbasiert) für IPv4
* **iptables -t nat -A POSTROUTING -o eth0 -s 10.2.0.0/24 -j MASQUERADE**
- 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)
* **ip6tables -t nat -A POSTROUTING -o vmbr0 -s fd00:10:2::/64 -j SNAT --to-source 2a01:4f8:c17:cf64::1**
- Regeln speichern
* **netfilter-persistent save**
==== Forwarding aktivieren ====
- sysctl-Konfiguration erstellen
# Forwarding aktivieren
net.ipv4.conf.eth0.forwarding = 1
net.ipv4.conf.vmbr0.forwarding = 1
net.ipv6.conf.all.forwarding = 1
- sysctl-Konfiguration übernehmen
* **sysctl --system -a**
==== Eingerichtete Forwards ====
* Port 80/443 für Container [[dienste:bytecluster0002:traefik|traefik]]
* **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 =====
* nach Anleitung: [[https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_Buster]]
==== Vorbereitung ====
- Hosts-Datei anpassen
* IP-Adresse des internen Netzes nutzen, so dass später ein Proxmox-Cluster möglich ist
* Konfiguration
...
# 127.0.1.1 bytecluster0002 bytecluster0002
127.0.0.1 localhost
10.10.0.2 bytecluster0002.bytespeicher.org bytecluster0002 pvelocalhost
...
==== Installation ====
- Installation nach Anleitung: [[https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_Buster#Install_Proxmox_VE]]
* 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
* Modify smb.conf to use WINS settings from DHCP? **No**
* Postfix
* Postfix Configuration: **Local only**
* System Name: **bytecluster0002**
==== 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
* **sed -i -e 's/^/# /' /etc/apt/sources.list.d/pve-enterprise.list**
==== 2FA Grundeinrichtung =====
- Skript anlegen
#!/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
* **chown root:root /usr/local/bin/pve_generate_oath**
* **chmod 755 /usr/local/bin/pve_generate_oath**
- 2FA für PAM-Anmeldungen verpflichtend machen
* **pveum realm modify pam -tfa type=oath,digits=6 -default 1**
==== Admin-Gruppe und ersten Benutzer anlegen ====
- Admin-Gruppe anlegen
* **pveum group add admin -comment "Administrators"**
* **pveum aclmod / -group admin -role Administrator**
- ersten Benutzer zuweisen und root sperren
* **pveum user add mustermann@pam -groups admin -enable 1 -firstname "Max" -lastname "Mustermann"**
* **pveum user modify root@pam -enable 0**
- 2FA für ersten Benutzer aktivieren
* **ALS BENUTZER AUSFÜHREN** - vorher also **su mustermann** (falls als root eingeloggt)
* **pve_generate_oath**
* QR-Code scannen und nach Enter ggf. Ausführung mit eigenem Passwort für sudo bestätigen
==== 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.org**
Directory 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
* **pvenode config set --acme domains=$(hostname --fqdn)**
- Erstes Zertifikat intitialisieren
* **pvenode acme cert order**...
Task OK
==== SSH-Forward-Hook einrichten ====
- Skript hinterlegen
#!/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
* **chmod +x /var/lib/vz/snippets/ssh_forward.sh**
==== Zusätzliches Volume einrichten ====
- Volume vorbereiten als /mnt/data
- Volume in Proxmox einbinden
* **pvesm add dir data -content rootdir,images,backup -path /mnt/data/**
==== Anpassung des Standard-Templates auf Debian-Basis ====
- Systemd-Container installieren
* **apt-get install systemd-container**
- Liste der verfügbaren Template aktualisieren
* **pveam update**
- Verfügbare Images anzeigen
* **pveam available --section system | grep debian**system debian-11-standard_11.7-1_amd64.tar.zst
system debian-12-standard_12.2-1_amd64.tar.zst
- Debian 12 Image herunterladen
* **pveam download local debian-12-standard_12.2-1_amd64.tar.zst**
- Template in neuen Ordner entpacken
* **mkdir /tmp/template**
* **cd /tmp/template**
* **tar --numeric-owner --extract --verbose --file=/var/lib/vz/template/cache/debian-12-standard_12.2-1_amd64.tar.zst --directory=/tmp/template**
- In das Template-System wechseln
* **systemd-nspawn -D /tmp/template**
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
* Ausnahmen: NFS deaktivieren und SSH neustarten
- Template bereinigen
* **apt-get clean**
* **history -c**
- Aus Template ausloggen
* **logout**
- Template packen und temporären Ordner entfernen
* **tar --numeric-owner --create --zstd --verbose --file=/var/lib/vz/template/cache/debian-12-$(hostname).tar.zst .**
* **cd**
* **rm --recursive /tmp/template**
==== 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
- https://bytecluster0002.bytespeicher.org:8006 aufrufen
* Username + Passwort wie im Linux
* 2FA-Token aus der Smartphone-App
=== 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
* **sudo pct set -hookscript local:snippets/ssh_forward.sh**
- Container ist nach dem (Neu)Start per SSH auf Port 22000 + (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
* Es empfiehlt sich, SSH Agent forwarding zu nutzen, statt seinen private key auf den Host zu kopieren
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 **
* Ü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 ** das Benutzer-Passwort ändern
* Alle bekannten Nutzer sind sudo-fähig