Das Problem bei Netcup (Debian 12/13)

Netcup nutzt für das Routing eine Link-Local-Adresse des Gateways (fe80::1). Da Debian 13 standardmäßig systemd-networkd oder die klassische /etc/network/interfaces nutzt, verweigert das System oft die Übernahme, wenn die IP nicht explizit konfiguriert ist.

Wir weisen deinem Server die erste echte IP aus deinem Netz zu (...::1).

Konfiguration anpassen

Öffne deine Netzwerkkonfiguration (Netcup nutzt meist die klassische Datei: /etc/network/interfaces.d# cat 50-cloud-init.cfg

BASH
micro /etc/network/interfaces.d/60-custom-ipv6.cfg

Ergänze den IPv6-Block (ersetze das bestehende falls nötig, lass IPv4 unangetastet):

TXT
iface eth0 inet6 static
    address 2a03:4000:23:b22::1
    netmask 64

Hinweis: Falls dein Interface nicht eth0 heißt (prüfbar mit ip a), passe den Namen an.

Aktivieren ohne Reboot:

BASH
systemctl restart networking

Rebooten und erneut testen:

BASH
systemctl reboot
BASH
ip a

2. Das Automatisierungs-Skript (setup.sh)

Dieses Skript erledigt alles in einem Rutsch: Es validiert den Hostnamen, installiert deine Tools (inklusive vollautomatischer OhMyZsh & Plugin-Installation ohne interaktive Blockaden) und startet am Ende die ISPConfig-Installation mit deinem exakten Minimal-Webstack.

  1. Micro öffnen
TXT
micro setup.sh
  1. füge den Code:
BASH
#!/usr/bin/env bash

# Target FQDN required by Netcup
TARGET_HOSTNAME="server.EXAMPLE.TLD"

echo "===================================================="
echo " Starting System Validation & Tool-Installation"
echo "===================================================="

# 1. Verify hostname
CURRENT_HOSTNAME=$(hostname -f 2>/dev/null)
if [ "$CURRENT_HOSTNAME" != "$TARGET_HOSTNAME" ]; then
    echo "[-] ERROR: Hostname mismatch!"
    echo "    Current FQDN: $CURRENT_HOSTNAME"
    echo "    Expected:     $TARGET_HOSTNAME"
    echo "    Please run: 'hostnamectl set-hostname $TARGET_HOSTNAME'"
    exit 1
fi
echo "[+] Hostname verification successful: $CURRENT_HOSTNAME"

# 2. System updates
echo "[*] Updating package repositories..."
export DEBIAN_FRONTEND=noninteractive
apt-get update && apt-get upgrade -y

# 3. Install core utilities
echo "[*] Installing standard tools..."
apt-get install -y sudo curl wget git zsh tmux htop btop fastfetch micro python3

# 4. Install OhMyZsh (Non-Interactive)
if [ ! -d "$HOME/.oh-my-zsh" ]; then
    echo "[*] Installing OhMyZsh..."
    RUNZSH=no CHSH=no sh -c "$(wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)" "" --keep-zsh-rc
fi

# 5. Clone Zsh plugins
ZSH_CUSTOM_PLUGINS="$HOME/.oh-my-zsh/custom/plugins"
mkdir -p "$ZSH_CUSTOM_PLUGINS"

echo "[*] Cloning Zsh plugins..."
declare -A plugins=(
    ["zsh-autosuggestions"]="https://github.com/zsh-users/zsh-autosuggestions"
    ["zsh-syntax-highlighting"]="https://github.com/zsh-users/zsh-syntax-highlighting.git"
    ["zsh-autocomplete"]="https://github.com/marlonrichert/zsh-autocomplete.git"
)

for plugin in "${!plugins[@]}"; do
    if [ ! -d "$ZSH_CUSTOM_PLUGINS/$plugin" ]; then
        git clone "${plugins[$plugin]}" "$ZSH_CUSTOM_PLUGINS/$plugin"
    fi
done

# 6. Write .zshrc configuration
echo "[*] Writing configuration to ~/.zshrc..."
cat << 'EOF' > ~/.zshrc
export ZSH="$HOME/.oh-my-zsh"  
ZSH_THEME="agnoster"  
zstyle ':omz:update' mode auto  
HIST_STAMPS="yyyy-mm-dd"  

plugins=(  
 alias-finder  
 aliases  
 colored-man-pages  
 colorize  
 dirhistory  
 debian  
 git  
 history  
 ssh-agent  
 sudo  
 systemd  
 tailscale  
 zsh-autosuggestions  
 zsh-autocomplete  
 zsh-syntax-highlighting  
)  

source $ZSH/oh-my-zsh.sh  

fastfetch  

# --- CUSTOM ALIASES ---  
alias hst='/usr/local/hestia/bin/'  
alias v-list-users='/usr/local/hestia/bin/v-list-users'  
alias ..='cd ..'  
alias ll='ls -lah'  
alias update='sudo apt update && sudo apt upgrade -y && needrestart'  
alias cls='clear'  
alias f2b='uv run ~/scripts/f2b_stats.py'  
alias banstatus="sudo fail2ban-client status | awk -F':\t' '/Jail list/ {print \$2}' | sed 's/,//g' | xargs -n1 sudo fail2ban-client status"  
alias ports='sudo ss -tulpn | grep LISTEN'  
alias myip='curl -4 icanhazip.com'  
alias h-logs='sudo tail -f /var/log/hestia/system.log'  
alias h-restart='sudo systemctl restart hestia'  
alias ta='tmux attach || tmux new-session'  
alias tls='tmux ls'  
alias del-mail='echo "d 1-1000" | mail -N > /dev/null'  
alias logs='sudo ~/scripts/check_logs.sh'  
alias mqtt='sudo tail -f /var/log/mosquitto/mosquitto.log'  
alias mqtt_logger='sudo journalctl -u mqtt-logger.service -f'  
alias venv='source .venv/bin/activate'  
alias health='sudo ~/scripts/health-check.sh'  
alias sudo='sudo env PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin'  

# Exports  
export EDITOR=micro  
export VISUAL=micro
EOF

# 7. Set default shell to Zsh
if [ "$SHELL" != "/bin/zsh" ]; then
    echo "[*] Changing default shell to Zsh..."
    chsh -s $(which zsh) root
fi

# 8. Launch ISPConfig Auto-Installer
echo "===================================================="
echo " Launching ISPConfig Auto-Installer"
echo "===================================================="

wget -O - https://get.ispconfig.org | sh -s -- \
  --use-nginx \
  --no-mail \
  --no-dns \
  --no-local-dns \
  --no-pma \
  --no-ftp \
  --no-mailman \
  --no-roundcube \
  --use-php=8.2,8.3,8.4,8.5 \
  --ssh-permit-root=without-password \
  --unattended-upgrades \
  --i-know-what-i-am-doing

echo "===================================================="
echo " Installation complete!"
echo "===================================================="

# 9. Seamlessly transition to the new Zsh environment
echo "[+] Spawning interactive Zsh login shell..."
exec zsh -l
  1. Ausführbar machen
    BASH
    chmod +x setup.sh
    
  2. Starte setup.sh
    BASH
    
    ./setup.sh
    
TXT

## 3. ClamAV Services deaktivieren

```bash
# 1. Dienste sofort stoppen
sudo systemctl stop clamav-daemon
sudo systemctl stop clamav-freshclam

# 2. Autostart beim Booten deaktivieren
sudo systemctl disable clamav-daemon
sudo systemctl disable clamav-freshclam

# 3. Dienste maskieren (verhindert das Starten durch andere Abhängigkeiten)
sudo systemctl mask clamav-daemon
sudo systemctl mask clamav-freshclam

RAM-Verbrauch überprüfen

Du wirst sofort merken, wie dein System aufatmet. Du kannst den gewonnenen Speicher direkt auf der Konsole kontrollieren:

BASH
free -h

Oder wirf einen Blick in dein neu installiertes btop oder htop, um zu sehen, wie flüssig der VPS jetzt mit dem schlanken Nginx-Stack läuft!

4. Post-Installation: IPv6 in ISPConfig aktivieren

Sobald das Skript durchgelaufen ist, zieht sich ISPConfig automatisch deine konfigurierte IPv6 (2a03:4000:23:b22::1). Du musst sie nur noch im Interface freigeben, damit du sie für Webseiten zuteilen kannst:

  1. Logge dich im ISPConfig Panel ein (https://server.EXAMPLE.TLD:8080).

  2. Navigiere zu System -> Server IP addresses.

  3. Klicke auf deine IP (oder "Add new IP address", falls sie wider Erwarten nicht gelistet ist).

  4. Trage bei IPv6 Address ein: 2a03:4000:23:b22::1.

  5. Setze den Haken bei HTTP Server (Nginx), damit sie für vHosts generiert wird.

5. Postfix (System-Mail-Relay zu mailbox.org)

Da kein eigener Mailserver betrieben wird, leiten wir alle System-Mails (Cron, Fail2ban) verschlüsselt an mail@EXAMPLE.TLD weiter.

BASH
# 1. Postfix als Satelliten-System konfigurieren
sudo dpkg-reconfigure postfix

Einstellungen im interaktiven Menü:

  • General type of mail configuration: Satellite system

  • System mail name: server.EXAMPLE.TLD

  • SMTP relay host: [smtp.mailbox.org]:587 (Die eckigen Klammern verhindern fehlerhafte MX-Lookups)

  • E-Mails für postmaster, root und andere Systemkonten müssen zu dem eigentlichen Benutzerkonto des Systemadministrators umgeleitet werden. mail@domain.com

  •  Listen Sie bitte durch Kommas getrennt die Domainnamen auf, für die sich dieser Rechner als Ziel betrachten soll. Ist er für eine gesamte E-Mail-Domain zuständig (»gateway«), sollte wahrscheinlich die Top-Level-Domain (TLD)   dabei sein. server.EXAMPLE.TLD, localhost.EXAMPLE.TLD, localhost

  • Bitte geben Sie an, für welche Netzwerkblöcke dieser Rechner E-Mails weiterleiten soll. Standardmäßig ist dies nur der lokale Host, was für einige E-Mail-Programme erforderlich ist. Er ist standardmäßig sowohl für IPv4 als auch für IPv6 enthalten. Falls die Verbindung nur über eine IP-Version hergestellt wird, können einer oder mehrere unbenutzte Werte entfernt werden. 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

  • Bitte geben eine maximale Größe für Postfach-Dateien an: 0

  • Bitte geben Sie ein Zeichen an, das in Empfängeradressen eine lokale Adress-Erweiterung auslösen soll. +

  • Standardmäßig werden alle Internet-Protokolle verwendet, die bei der Installation auf dem System aktiviert sind. Sie können dies mit einer der folgenden Einstellungen außer Kraft setzen: alle

    Authentifizierung für mailbox.org hinterlegen

Da der Mailbox.org-Server Anmeldungen erzwingt, erstellen wir eine Password-Datenbank für Postfix:

BASH
# 2. Authentifizierungs-Datei erstellen
sudo micro /etc/postfix/sasl_passwd

Füge dort deine genauen Mailbox-Zugangsdaten ein:

TXT
[smtp.mailbox.org]:587 mail@EXAMPLE.TLD:DEIN_MAILBOX_ORG_PASSWORT
BASH
# 3. Rechte einschränken und Postfix-Datenbank generieren
sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd

# 4. Verschlüsselung (TLS) und Authentifizierung in Postfix erzwingen
sudo postconf -e "smtp_sasl_auth_enable = yes"
sudo postconf -e "smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd"
sudo postconf -e "smtp_sasl_security_options = noanonymous"
sudo postconf -e "smtp_tls_security_level = encrypt"
sudo postconf -e "smtp_tls_loglevel = 1"

Root-Mails direkt an dein Postfach weiterleiten

Damit Mails, die an root adressiert sind, automatisch an dein Mailbox-Postfach gesendet werden, passen wir die Aliase an:

BASH
sudo micro /etc/aliases

Stelle sicher, dass die Zeile für root wie folgt aussieht:

TXT
root: mail@EXAMPLE.TLD

Aktivieren und Postfix neu starten:

BASH
sudo newaliases
sudo systemctl restart postfix

Generic-Mapping-Datei erstellen

Erstelle eine neue Tabelle für die Adress-Umschreibung:

BASH
micro /etc/postfix/generic

Füge dort folgende Zeilen ein, um alle lokalen Mails (von root oder dem Server-Host) mit deiner gültigen Absenderadresse zu maskieren:

PLAINTEXT
# Joomla/System-Mails von diesen Domains auf einen gültigen Alias umschreiben
@blog.EXAMPLE.TLD   mail@EXAMPLE.TLD
@server.EXAMPLE.TLD mail@EXAMPLE.TLD
@EXAMPLE.TLD        mail@EXAMPLE.TLD
root@localhost        mail@EXAMPLE.TLD

# Lokale Systembenutzer auf spezifische Aliasse mappen
root@server.EXAMPLE.TLD     mail@EXAMPLE.TLD
www-data@server.EXAMPLE.TLD webmaster@EXAMPLE.TLD
root@EXAMPLE.TLD           mail@EXAMPLE.TLD
root@EXAMPLE.TLD            mail@EXAMPLE.TLD

Postmap ausführen und Postfix konfigurieren

Generiere die Postfix-Datenbank aus der Datei und trage die Map in deine main.cf ein:

BASH
postmap /etc/postfix/generic
postconf -e "smtp_generic_maps = hash:/etc/postfix/generic"

Postfix neu starten

Lade die Konfiguration neu, damit die Änderungen greifen:

BASH
systemctl restart postfix

Test-Mail senden

Du kannst sofort überprüfen, ob die Weiterleitung klappt:

BASH
echo "Test-Inhalt vom Netcup VPS" | mail -s "Test-Betreff vom Server" root