Aktionen

IONOS Mietserver Ubuntu 24.04 - Einrichtung ISPConfig: Unterschied zwischen den Versionen

Aus znilwiki

 
(21 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 46: Zeile 46:
----
----
==System umbennen==
==System umbennen==
<code>ionos-web02</code> soll der neue Name des Systems sein:<br>
<code>ionos-web02</code> soll der neue Name des Systems sein.<br>
  hostnamectl set-hostname ionos-web02
  hostnamectl set-hostname ionos-web02
und noch
und noch
Zeile 59: Zeile 59:
#    /etc/cloud/cloud.cfg or cloud-config from user-data
#    /etc/cloud/cloud.cfg or cloud-config from user-data
#
#
127.0.1.1 ionos-web02
127.0.1.1 ionos-web02 ionos-web02.znil.org
127.0.0.1 localhost
127.0.0.1 localhost


Zeile 66: Zeile 66:
ff02::1 ip6-allnodes
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::2 ip6-allrouters
</source>
Das ISPConfig-Installationsskript besteht auf einen FQDN-Namen für {{Key|127.0.1.1}}!<br>
Der Name muss nicht auflösbar sein.<br>
Nach einem reboot muss das in etwa so bei euch aussehen:<br>
<source>
root@ionos-web02:~# hostname
ionos-web02
root@ionos-web02:~# hostname -f
ionos-web02.znil.org
</source>
</source>
----
----
==Anmeldung des root per SSH verbieten==
==Anmeldung des root per SSH verbieten==
Per Default haben wir eine root-Anmeldung per SSH und Passwort.<br>
Per Default haben wir eine root-Anmeldung per SSH und Passwort.<br>
Zeile 78: Zeile 88:
und ganz nach unten scrollen, da wurde bei mir die Zeile
und ganz nach unten scrollen, da wurde bei mir die Zeile
  PermitRootLogin yes
  PermitRootLogin yes
angehängt die wir mit {{Key|F9}} einfach löschen (oder an jeder anderen Stelle wo diese stehen würde)
angehängt die wir mit {{Key|F9}} einfach löschen (oder an jeder anderen Stelle wo diese stehen würde)<br>
Damit gilt automatisch der Default Wert {{Key|PermitRootLogin prohibit-password}}<br>
Die Gegenprobe schadet natürlich nicht (also ob es wirklich nicht mehr per Passwort geht)<br>
----
 
==Zeitzone setzen / Zeitserver setzen==
Der Befehl
date
spuckt noch eine falsche Uhrzeit aus, die richtige Zeitzone setzen wir mit
timedatectl set-timezone Europe/Berlin
Als Zeitserver wird im Moment noch
ntp.ubuntu.com
genommen, das ändere ich wie folgt:<br>
nano /etc/systemd/timesyncd.conf
und folgende Zeile einfügen / ändern:<br>
<source lang="bash">
[Time]
NTP=de.pool.ntp.org
#FallbackNTP=ntp.ubuntu.com
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048
#ConnectionRetrySec=30
#SaveIntervalSec=60
</source>
----
----
==Updates einspielen / System aktualisieren==
==Updates einspielen / System aktualisieren==
Zeile 86: Zeile 120:
  reboot
  reboot
danach schadet nicht.<br>
danach schadet nicht.<br>
----
==Swap Datei aktivieren==
Jetzt lief meine Webseite schon einen Moment auf dem neuen Server - und dann geht nichts mehr. Grund war, das als ich das Backup gestartet habe dem System der Arbeitsspeicher ausgeht. Ok, mein Mietserver hat nur 2GB RAM, aber auf der identischen VM die ich zuvor hatte war das trotzdem kein Problem ...<br>
Bis ich gesehen habe, das IONOS die Swap-Datei deaktiviert hat ... ok, schalten wir das wieder an. Meine VM hat 2GB RAM, also bekommt die eine 4GB Swap-Datei:<br>
fallocate -l 4G /swap.img
chmod 600 /swap.img
mkswap /swap.img
swapon /swap.img
Damit die auch beim Reboot wieder benutzt wird:<br>
nano /etc/fstab
und folgende Zeile einfügen (geklaut aus einem "normalen" Ubuntu 24.04-System)
/swap.img      none    swap    sw      0      0
Am besten einmal rebooten und nach dem reboot mit
swapon --show
prüfen - wenn keine Ausgabe erfolgt, gibt es keine Swap-Datei!
NAME      TYPE SIZE USED PRIO
/swap.img file  4G  0B  -2
----
==Multipathing deaktivieren==
systemctl stop multipathd.service && systemctl disable multipathd.service
Der Dienst wird nicht benötigt, es gibt nur eine Festplatte mit einem Pfad.<br>
Und er belegt immer die oberen Plätze wenn ich mir htop ansehe.<br>
In meinen anderen Anleitungen deinstalliere ich den sogar, hier soll mir deaktivieren reichen.<br>
----
----
==ISPConfig Installieren==
==ISPConfig Installieren==
Zeile 96: Zeile 154:
Da ich einige Parameter anpassen möchte, starte ich es mit entsprechenden Parametern:<br>
Da ich einige Parameter anpassen möchte, starte ich es mit entsprechenden Parametern:<br>
Die Hilfe bekommen wir per
Die Hilfe bekommen wir per
  wget -O - https://get.ispconfig.org | sh -s -- --help
  <nowiki>wget -O - https://get.ispconfig.org | sh -s -- --help</nowiki>
Da werden - obwohl wir nur die Hilfe aufrufen - schon einige Pakete nachinstalliert.<br>
Da werden - obwohl wir nur die Hilfe aufrufen - schon einige Pakete nachinstalliert.<br>
Am Ende steht da die Hilfe:<br>
Am Ende steht da die Hilfe:<br>
Zeile 160: Zeile 218:
Ich installiere ISPConfig aif Englisch (ja, ich weis, wir haben doch gerade extra alles auf Deutsch umgestellt), empfinde ich als einfacher.<br>
Ich installiere ISPConfig aif Englisch (ja, ich weis, wir haben doch gerade extra alles auf Deutsch umgestellt), empfinde ich als einfacher.<br>
Ok, mein Aufruf sieht wie folgt aus:<br>
Ok, mein Aufruf sieht wie folgt aus:<br>
  wget -O - https://get.ispconfig.org | sh -s -- --lang=en --no-mail --no-dns --no-local-dns --no-firewall --no-roundcube --no-quota --no-ntp --no-ftp
  wget -O - <nowiki>https://get.ispconfig.org</nowiki> | sh -s -- --lang=en --no-mail --no-dns --no-local-dns --no-firewall --no-roundcube --no-quota --no-ntp --no-ftp
Erklärung
Erklärung
  --no-mail        : Installiert nur Postfix um Systemmeldungen zu versenden, aber keine zusätzlichen Pakete oder die Konfiguration über ISPConfig
  --no-mail        : Installiert nur Postfix um Systemmeldungen zu versenden, aber keine zusätzlichen Pakete oder die Konfiguration über ISPConfig
Zeile 170: Zeile 228:
  --no-ntp          : Zeitserver nicht konfigurieren
  --no-ntp          : Zeitserver nicht konfigurieren
  --no-ftp          : keinen FTP-Server installieren
  --no-ftp          : keinen FTP-Server installieren
Wenn wir den Befehl senden, fragt er noch mal nach ob wir loslegen sollen:<br>
WARNING! This script will reconfigure your entire server!
It should be run on a freshly installed server and all current configuration that you have done will most likely be lost!
Type 'yes' if you really want to continue: yes
was wir mit {{Key|yes}} bestätigen.<br>
Er prüft dann noch mal die Umgebung und würde auf Fehler hinweisen und abbrechen. Wenn alles ok ist, legt er los.<br>
<source>
[INFO] Starting perfect server setup for Ubuntu 24.04 LTS
[INFO] Checking hostname.
[INFO] Configuring apt repositories.
[INFO] Updating packages
[INFO] Updated packages
[INFO] Installing packages ssh, openssh-server, nano, vim-nox, lsb-release, apt-transport-https, ca-certificates, wget, git, gnupg, software-properties-common, curl, cron
[INFO] Installed packages ssh, openssh-server, nano, vim-nox, lsb-release, apt-transport-https, ca-certificates, wget, git, gnupg, software-properties-common, curl, cron
[INFO] Activating sury php repository.
W: https://ppa.launchpadcontent.net/ondrej/php/ubuntu/dists/noble/InRelease: Signature by key 14AA40EC0831756756D7F66C4F4EA0AAE5267A6C uses weak algorithm (rsa1024)
[INFO] Activating GoAccess repository.
[INFO] Updating packages (after enabling 3rd party repos).
[INFO] Updated packages
[INFO] Installing packages dbconfig-common, postfix, postfix-mysql, mariadb-client, mariadb-server, openssl, rkhunter, binutils, sudo, getmail6, rsyslog
[INFO] Installed packages dbconfig-common, postfix, postfix-mysql, mariadb-client, mariadb-server, openssl, rkhunter, binutils, sudo, getmail6, rsyslog
[INFO] Generating MySQL password.
[INFO] Writing MySQL config files.
[INFO] Restarting postfix
[INFO] Configuring rkhunter.
[INFO] Installing packages software-properties-common, update-inetd, dnsutils, resolvconf, clamav, clamav-daemon, zip, unzip, bzip2, xz-utils, lzip, rar, borgbackup, arj, nomarch, lzop, cabextract, apt-listchanges, libnet-ldap-perl, libauthen-sasl-perl, daemon, libio-string-perl, libio-socket-ssl-perl, libnet-ident-perl, libnet-dns-perl, libdbd-mysql-perl, p7zip, p7zip-full, unrar-free, lrzip
[INFO] Installed packages software-properties-common, update-inetd, dnsutils, resolvconf, clamav, clamav-daemon, zip, unzip, bzip2, xz-utils, lzip, rar, borgbackup, arj, nomarch, lzop, cabextract, apt-listchanges, libnet-ldap-perl, libauthen-sasl-perl, daemon, libio-string-perl, libio-socket-ssl-perl, libnet-ident-perl, libnet-dns-perl, libdbd-mysql-perl, p7zip, p7zip-full, unrar-free, lrzip
[INFO] (Re)starting Bind.
[INFO] Disabling spamassassin daemon.
WARNING: Clamd was NOT notified: Can't connect to clamd through /var/run/clamav/clamd.ctl: No such file or directory
[INFO] Installing packages apache2, apache2-utils, libapache2-mod-fcgid, apache2-suexec-pristine, libapache2-mod-python, libapache2-mod-passenger
[INFO] Installed packages apache2, apache2-utils, libapache2-mod-fcgid, apache2-suexec-pristine, libapache2-mod-python, libapache2-mod-passenger
[INFO] Installing packages php-pear, php-memcache, php-imagick, mcrypt, imagemagick, libruby, memcached, php-apcu, jailkit, php5.6, php5.6-common, php5.6-gd, php5.6-mysql, php5.6-imap, php5.6-cli, php5.6-mcrypt, php5.6-curl, php5.6-intl, php5.6-pspell, php5.6-recode, php5.6-sqlite3, php5.6-tidy, php5.6-xmlrpc, php5.6-xsl, php5.6-zip, php5.6-mbstring, php5.6-soap, php5.6-opcache, php5.6-cgi, php5.6-fpm, php7.0, php7.0-common, php7.0-gd, php7.0-mysql, php7.0-imap, php7.0-cli, php7.0-mcrypt, php7.0-curl, php7.0-intl, php7.0-pspell, php7.0-recode, php7.0-sqlite3, php7.0-tidy, php7.0-xmlrpc, php7.0-xsl, php7.0-zip, php7.0-mbstring, php7.0-soap, php7.0-opcache, php7.0-cgi, php7.0-fpm, php7.1, php7.1-common, php7.1-gd, php7.1-mysql, php7.1-imap, php7.1-cli, php7.1-mcrypt, php7.1-curl, php7.1-intl, php7.1-pspell, php7.1-recode, php7.1-sqlite3, php7.1-tidy, php7.1-xmlrpc, php7.1-xsl, php7.1-zip, php7.1-mbstring, php7.1-soap, php7.1-opcache, php7.1-cgi, php7.1-fpm, php7.2, php7.2-common, php7.2-gd, php7.2-mysql, php7.2-imap, php7.2-cli, php7.2-curl, php7.2-intl, php7.2-pspell, php7.2-recode, php7.2-sqlite3, php7.2-tidy, php7.2-xmlrpc, php7.2-xsl, php7.2-zip, php7.2-mbstring, php7.2-soap, php7.2-opcache, php7.2-cgi, php7.2-fpm, php7.3, php7.3-common, php7.3-gd, php7.3-mysql, php7.3-imap, php7.3-cli, php7.3-curl, php7.3-intl, php7.3-pspell, php7.3-recode, php7.3-sqlite3, php7.3-tidy, php7.3-xmlrpc, php7.3-xsl, php7.3-zip, php7.3-mbstring, php7.3-soap, php7.3-opcache, php7.3-cgi, php7.3-fpm, php7.4, php7.4-common, php7.4-gd, php7.4-mysql, php7.4-imap, php7.4-cli, php7.4-curl, php7.4-intl, php7.4-pspell, php7.4-sqlite3, php7.4-tidy, php7.4-xmlrpc, php7.4-xsl, php7.4-zip, php7.4-mbstring, php7.4-soap, php7.4-opcache, php7.4-cgi, php7.4-fpm, php8.0, php8.0-common, php8.0-gd, php8.0-mysql, php8.0-imap, php8.0-cli, php8.0-curl, php8.0-intl, php8.0-pspell, php8.0-sqlite3, php8.0-tidy, php8.0-xsl, php8.0-zip, php8.0-mbstring, php8.0-soap, php8.0-opcache, php8.0-cgi, php8.0-fpm, php8.1, php8.1-common, php8.1-gd, php8.1-mysql, php8.1-imap, php8.1-cli, php8.1-curl, php8.1-intl, php8.1-pspell, php8.1-sqlite3, php8.1-tidy, php8.1-xsl, php8.1-zip, php8.1-mbstring, php8.1-soap, php8.1-opcache, php8.1-cgi, php8.1-fpm, php8.2, php8.2-common, php8.2-gd, php8.2-mysql, php8.2-imap, php8.2-cli, php8.2-curl, php8.2-intl, php8.2-pspell, php8.2-sqlite3, php8.2-tidy, php8.2-xsl, php8.2-zip, php8.2-mbstring, php8.2-soap, php8.2-opcache, php8.2-cgi, php8.2-fpm, php8.3, php8.3-common, php8.3-gd, php8.3-mysql, php8.3-imap, php8.3-cli, php8.3-curl, php8.3-intl, php8.3-pspell, php8.3-sqlite3, php8.3-tidy, php8.3-xsl, php8.3-zip, php8.3-mbstring, php8.3-soap, php8.3-opcache, php8.3-cgi, php8.3-fpm
[INFO] Installed packages php-pear, php-memcache, php-imagick, mcrypt, imagemagick, libruby, memcached, php-apcu, jailkit, php5.6, php5.6-common, php5.6-gd, php5.6-mysql, php5.6-imap, php5.6-cli, php5.6-mcrypt, php5.6-curl, php5.6-intl, php5.6-pspell, php5.6-recode, php5.6-sqlite3, php5.6-tidy, php5.6-xmlrpc, php5.6-xsl, php5.6-zip, php5.6-mbstring, php5.6-soap, php5.6-opcache, php5.6-cgi, php5.6-fpm, php7.0, php7.0-common, php7.0-gd, php7.0-mysql, php7.0-imap, php7.0-cli, php7.0-mcrypt, php7.0-curl, php7.0-intl, php7.0-pspell, php7.0-recode, php7.0-sqlite3, php7.0-tidy, php7.0-xmlrpc, php7.0-xsl, php7.0-zip, php7.0-mbstring, php7.0-soap, php7.0-opcache, php7.0-cgi, php7.0-fpm, php7.1, php7.1-common, php7.1-gd, php7.1-mysql, php7.1-imap, php7.1-cli, php7.1-mcrypt, php7.1-curl, php7.1-intl, php7.1-pspell, php7.1-recode, php7.1-sqlite3, php7.1-tidy, php7.1-xmlrpc, php7.1-xsl, php7.1-zip, php7.1-mbstring, php7.1-soap, php7.1-opcache, php7.1-cgi, php7.1-fpm, php7.2, php7.2-common, php7.2-gd, php7.2-mysql, php7.2-imap, php7.2-cli, php7.2-curl, php7.2-intl, php7.2-pspell, php7.2-recode, php7.2-sqlite3, php7.2-tidy, php7.2-xmlrpc, php7.2-xsl, php7.2-zip, php7.2-mbstring, php7.2-soap, php7.2-opcache, php7.2-cgi, php7.2-fpm, php7.3, php7.3-common, php7.3-gd, php7.3-mysql, php7.3-imap, php7.3-cli, php7.3-curl, php7.3-intl, php7.3-pspell, php7.3-recode, php7.3-sqlite3, php7.3-tidy, php7.3-xmlrpc, php7.3-xsl, php7.3-zip, php7.3-mbstring, php7.3-soap, php7.3-opcache, php7.3-cgi, php7.3-fpm, php7.4, php7.4-common, php7.4-gd, php7.4-mysql, php7.4-imap, php7.4-cli, php7.4-curl, php7.4-intl, php7.4-pspell, php7.4-sqlite3, php7.4-tidy, php7.4-xmlrpc, php7.4-xsl, php7.4-zip, php7.4-mbstring, php7.4-soap, php7.4-opcache, php7.4-cgi, php7.4-fpm, php8.0, php8.0-common, php8.0-gd, php8.0-mysql, php8.0-imap, php8.0-cli, php8.0-curl, php8.0-intl, php8.0-pspell, php8.0-sqlite3, php8.0-tidy, php8.0-xsl, php8.0-zip, php8.0-mbstring, php8.0-soap, php8.0-opcache, php8.0-cgi, php8.0-fpm, php8.1, php8.1-common, php8.1-gd, php8.1-mysql, php8.1-imap, php8.1-cli, php8.1-curl, php8.1-intl, php8.1-pspell, php8.1-sqlite3, php8.1-tidy, php8.1-xsl, php8.1-zip, php8.1-mbstring, php8.1-soap, php8.1-opcache, php8.1-cgi, php8.1-fpm, php8.2, php8.2-common, php8.2-gd, php8.2-mysql, php8.2-imap, php8.2-cli, php8.2-curl, php8.2-intl, php8.2-pspell, php8.2-sqlite3, php8.2-tidy, php8.2-xsl, php8.2-zip, php8.2-mbstring, php8.2-soap, php8.2-opcache, php8.2-cgi, php8.2-fpm, php8.3, php8.3-common, php8.3-gd, php8.3-mysql, php8.3-imap, php8.3-cli, php8.3-curl, php8.3-intl, php8.3-pspell, php8.3-sqlite3, php8.3-tidy, php8.3-xsl, php8.3-zip, php8.3-mbstring, php8.3-soap, php8.3-opcache, php8.3-cgi, php8.3-fpm
[INFO] Disabling conflicting apache modules.
[INFO] Enabling apache modules.
[INFO] Enabling default PHP-FPM config.
[INFO] Setting default system PHP version.
[INFO] Installing phpMyAdmin
[INFO] HTTPoxy config.
[INFO] Installing acme.sh (Let's Encrypt).
[INFO] acme.sh (Let's Encrypt) installed.
[INFO] ISPConfig does not yet support mailman3 and mailman2 is no longer available since Ubuntu 22.04.
[INFO] Installing packages haveged, geoip-database, libclass-dbi-mysql-perl, libtimedate-perl, build-essential, autoconf, automake, libtool, flex, bison, debhelper, binutils
[INFO] Installed packages haveged, geoip-database, libclass-dbi-mysql-perl, libtimedate-perl, build-essential, autoconf, automake, libtool, flex, bison, debhelper, binutils
[INFO] Installing packages webalizer, awstats, goaccess
[INFO] Installed packages webalizer, awstats, goaccess
[INFO] Disabling awstats cron.
[INFO] Installing packages fail2ban
[INFO] Installed packages fail2ban
[INFO] Configuring SSHd
[INFO] Installing ISPConfig3.
[INFO] Adding PHP version(s) to ISPConfig.
[INFO] Checking all services are running.
[INFO] mysql: OK
[INFO] clamav-daemon: OK
[INFO] postfix: OK
[INFO] pureftpd: FAILED
[WARN] pureftpd seems not to be running! (/lib/os/class.ISPConfigDebianOS.inc.php:2255)
[INFO] apache2: OK
[INFO] Installation ready.
[INFO] Your ISPConfig admin password is: Pjb3MGw8F18wyZd
[INFO] Your MySQL root password is: 6J9XC5Z2QpZ3LWD6Zn43
[INFO] Warning: Please delete the log files in /tmp/ispconfig-ai/var/log/setup-* once you don't need them anymore because they contain your passwords!
</source>
Die Fehlermeldungen sind in diesem Fall richtig, der FTP-Dienst ist ja auch nicht installiert.<br>
In der vor-vorletzten Zeile steht nun das Passwort über welches wir uns nun per https:// anmelden können, in der vorletzten des MySQL-root-Benutzers (auch wenn MariaDB installiert wurde).<br>
Wir rufen die Webseite auf:<br>
https://213.165.83.96:8080
was vermutlich nicht klappen wird - die IONOS Firewall wird den Port sperren.<br>
Meldet euch in diesem Fall unter
https://cloudpanel.ionos.de/
an (oder geht den Weg über https://login.ionos.de/ und wählt im Menü '''''Server & Cloud'''''), wählt dann<br>
Netzwerk => Firewall-Richtlinien
Dann rechts die Richtlinie auswählen und dann könnte Ihr unten einen Eintrag hinzufügen.<br>
:[[Datei:ClipCapIt-240622-174355.PNG]]<br>
Rechts den grünen Haken und er speichert sofort. Quelle lasst Ihr frei oder tragt eure aktuelle externe IP ein. Ich habe eine feste IP-Adresse und es so eingestellt das ich nur von zu Hause aus auf das System komme.<br>
Und schon können wir uns anmelden:<br>
:[[Datei:ClipCapIt-240622-174657.PNG]]<br>
<br>
----
==Postfix für Verwendung eines SMTP-Relay konfigurieren==
nano /etc/postfix/main.cf
und unten die folgende Zeile ändern und euren(!!!) SMPT-Relais Host eintragen:<br>
relayhost = 5.196.125.45
Das ist bei mir mein ganz normaler Mailserver - auf dem ich eingestellt habe das er alles von der festen IP meines Webservers annehmen soll.<br>
----
==Emails des root an externe Adresse weiterleiten==
Nachfolgend leite ich die lokalen Emails (abrufbar über den Befehl {{Key|mail}}) an die externe Email-Adresse <code>root@linz.email</code> weiter:<br>
Der neue Webserver kann - warum auch immer, vermutlich durch IONOS gesperrt - keinen Kontakt auf Port 25 aufnehmen (also ausgehend).<br>
Also gehen wir über Port 465, das wäre SMTP SLL:<br>
dpkg-reconfigure postfix
Und wie folgt antworten:<br>
Satellitensystem
E-Mail-Name des Systems: ionos-web02.znil.org
SMTP-Relay-Host (leere Eingabe: keiner): 5.196.125.45:465
Empfänger von E-Mails an root und postmaster: root@linz.email
Weitere Ziele, für die E-Mails akzeptiert werden sollen (leere Eingabe: keine): ionos-web02.znil.org, ionos-web02, localhost.znil.org, localhost
Synchrone Aktualisierungen der E-Mail-Warteschlange erzwingen? Nein
Lokale Netzwerke: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
Maximale Postfach-Größe in Byte: 0
Zeichen für lokale Adresserweiterung: +
alle: sowohl IPv4- als auch IPv6-Addressen verwenden;
Im Anschluss:<br>
nano /etc/aliases
Inhalt ggf. ergänzen /falls es nicht schon drin steht:<br>
# See man 5 aliases for format
postmaster:    root
clamav: root
root: root@linz.email
Damit er das übernimmt einmal den folgenden Befehl senden<br>
newaliases
Und die nächste Datei bearbeiten:<br>
nano /etc/postfix/virtual-regexp
und für alle Emails die Zieladresse setzen:<br>
+@.+ root@linz.email
Diese Datei müssen wir in Postfix nun noch aktivieren:<br>
nano /etc/postfix/main.cf
und ganz unten folgende Zeile anhängen:
virtual_maps = regexp:/etc/postfix/virtual-regexp
In der gleichen Datei müssen wir noch das Senden per SSL/TLS aktivieren.<br>
Diese Zeile anhängen:<br>
smtp_tls_wrappermode = yes
Diese Zeile abändern:<br>
smtp_tls_security_level = encrypt
Nun dafür sorgen das {{Key|postfix}} das auch beachtet:<br>
postmap /etc/postfix/
newaliases
systemctl restart postfix
und dann könnt Ihr wie folgt eine Testmail versenden:<br>
mail -s "Testemail ionos-web02 Nr.3" root < /dev/null
Wenn diese nicht ankommt könnte ihr folgendes prüfen (neben dem Eingang am Ziel-Mailserver):
mailq
Zeigt euch die Warteschlange der ausgehenden Emails an
journalctl -u postfix@-.service
Die Logeinträge mit Fehlermeldungen (nach unten scrollen!)<br>
----
==Grundeinstellungen ISPConfig==
ISPConfig ist Mandantenfähig, man kann also eingeschränkte Zugänge für andere erstellen die dann z.B. nur Ihre eine Webseite verwalten können.<br>
Das brauche ich aber alles nicht. Insbesondere verwalte ich unter Sites in der Regel keine Domänen sondern nur Subdomänen.<br>
Es gibt also nur den einen Mandanten (Client0), dementsprechend muss auch vor Datenbanken etc. nicht jedes mal der Client als Präfix davor gesetzt werden.<br>
<br>
System => Server Config => Names des Servers anklicken => Web => SSL Settings => Skip Lets Encrypt Check: [Haken setzen]
<br>
System => Main Config => siehe Bilder
:[[Datei:ClipCapIt-240622-222839.PNG]]<br>
:[[Datei:ClipCapIt-240622-222839.PNG]]<br>
und noch die IPv6 hinzufügen (muss im Control Panel des vServers erst erstellt werden)
System => Server IP adresses => Add new IP Address:
:[[Datei:ClipCapIt-240622-223352.PNG]]<br>
----
==clamav deaktivieren und entfernen==
Nach einen der Reboots bzw. nachdem ich 4GB Swap Speicher hinzugefügt hatte, lief der clamav "Amok". Mein System ist zu schwach dafür.<br>
Aus und runter damit:<br>
systemctl disable clamav-daemon.service
systemctl disable clamav-freshclam.service
und deinstallieren:
apt purge clamav clamav-daemon clamav-freshclam clamav-base
----
==AWStats & Co per default abschalten==
Um die Webstatistiken einer neuen Webseite per default zu deaktivieren, rufen wir den phpMyAdmin auf Port 8081 auf:<br>
https://213.165.83.96:8081/phpmyadmin/
Benutzer ist root und das Passwort welches am Ende des Setups für MySQL ausgeworfen wurde.<br>
Klickt links die Datenbank '''''dbispconfig''''' an,<br>
scrollt rechts runter bis zu '''''web_domain''''' und dort auf '''''Struktur'''''<br>
Falls Ihr den Namen anklickt könnt ihr oben im Quertab auch auf Struktur wechseln.<br>
:[[Datei:ClipCapIt-240623-100423.PNG]]<br>
Scrollt bis zu <code>stats_type</code> und bei dem Eintrag auf bearbeiten:<br>
:[[Datei:ClipCapIt-240623-100630.PNG]]<br>
Bei '''Standard''' wählt Ihr bei "Wie definiert:" den Eintrag '''Keine(e)''' aus:<br>
:[[Datei:ClipCapIt-240623-100840.PNG]]<br>
:[[Datei:ClipCapIt-240623-103154.PNG]]<br>
Hinter darf der Haken bei '''Null''' nicht gesetzt sein!
Und {{Key|Speichern}} nicht vergessen!
Wenn wir jetzt einen neue Website erstellen sind die Statistiken deaktiviert:<br>
:[[Datei:ClipCapIt-240623-103236.PNG]]<br>
----
==UniversalBackup einrichten==
UniversalBackup habe ich mal mein Skript genannt ... deswegen heißt auch das Kapitel so.<br>
Es ist ein Skript was alle Datenbanken exportiert und alle Verzeichnisse unterhalb von /var/www in einzelne Archive packt.<br>
Das ganze wird in einem Ordner <code>/BACKUP/...</code> gespeichetr. Lokal. Kann man aber leicht wegkopieren (oder die Daten aus einem Backup kratzen).<br>
===Ordnerstruktur erstellen===
mkdir -p /BACKUP/scripts
mkdir /BACKUP/ionos-web02
Der zweite Ordner wird später die eigentlichen Backup-Dateien enthalten.<br>
----
===MySQL-Benutzer für die Sicherung anlegen===
mysql
eingeben und nacheinander die folgenden Befehle absetzen:<br>
CREATE USER 'Backup'@'localhost' IDENTIFIED BY 'meinPasswort';
GRANT ALL PRIVILEGES ON *.* TO 'Backup'@'localhost';
FLUSH PRIVILEGES;
exit
Erstellt den Benutzer {{Key|Backup}} und das dazu gehörige Passwort<br>
----
===Script erstellen===
nano /BACKUP/scripts/UniversalBackup.sh
und folgender Inhalt:<br>
<source lang="bash">
#!/bin/bash
username=Backup
password=meinPasswort
# CREATE USER 'Backup'@'localhost' IDENTIFIED BY 'meinPasswort';
# GRANT ALL PRIVILEGES ON *.* TO 'Backup'@'localhost';
# FLUSH PRIVILEGES;
# Sichert alle MySQL Datenbanken, Webverzeichnisse sowie die wichtigsten Systemeinstellungen in ein Verzeichniss
# /Backuppfad/scripte/diesesSkript.sh
# /Backuppfad/Name-des-Server/...
# Aktuellen Pfad des Scripts ermitteln
# Lösung stammt von https://stackoverflow.com/questions/59895/can-a-bash-script-tell-which-directory-it-is-stored-in
echo "Ermittle den Pfad für die Backup-Dateien ..."
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
    DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
    SOURCE="$(readlink "$SOURCE")"
    [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
# Der Backuppfad ist über unserem Scriptpfad:
BACKUPPATH="$( cd -P "$( dirname "$SOURCE" )" && cd .. && pwd )/$( hostname )"
echo "Pfad Datenbanken ist : ${BACKUPPATH}/databases"
echo "Pfad Webseiten ist ..: ${BACKUPPATH}/www"
echo "Pfad Sonstiges ist ..: ${BACKUPPATH}/other"
DATETIME=$(date '+%Y-%m-%d--%H-%M-%S')
echo "Erstelle ggf. die Verzeichnisse ..."
mkdir -p "${BACKUPPATH}/databases"
mkdir -p "${BACKUPPATH}/www"
mkdir -p "${BACKUPPATH}/other"
echo "Lösche Backupdateien älter als 7 Tage ..."
find "${BACKUPPATH}/databases" -type f -mtime +7 -delete
find "${BACKUPPATH}/www" -type f -mtime +7 -delete
find "${BACKUPPATH}/other" -type f -mtime +7 -delete
echo "Sichere alle Datenbanken ..."
for x in $(mysql -u$username -p$password -Bse 'show databases'); do
    case ${x} in
        information_schema|performance_schema|mysql)
            echo Skipping Database ${x} ...
            ;;
        *)
            echo Backup Database ${x} ...
            mysqldump -u$username -p$password $x | gzip > "${BACKUPPATH}/databases/${x}__${DATETIME}.sql.gz"
    esac
done
echo "Alle Datenbanken gesichert!"
echo "Sichere Webseiten ..."
for folder in $(ls /var/www); do
    case ${folder} in
        clients)
            echo Skipping Folder ${folders}
            ;;
        *)
            echo Backup Folder /var/www/${folder}
            /usr/bin/nice -n 19 tar -hczf "${BACKUPPATH}/www/${folder}_$DATETIME.tar.gz" /var/www/${folder} 1>/dev/null
            # tar Optionen:
            # c = create Archiv / neues Archiv erstellen
            # z = gzip = Mit gzip komprimieren
            # f = Filename = angegebene Arhcivdatei nutzen
            # h = Symbolischen Links folgen und die Dateien dahinter sichern
    esac
done
echo "Alle Webseiten gesichert!"
echo "Sichere Konfiguartionsdateien ..."
/usr/bin/nice -n 19 tar -czf "${BACKUPPATH}/other"/etc+more_$DATETIME.tar.gz /etc /root /usr/local/etc /usr/local/sbin 1>/dev/null
echo "Alle Konfigurationsdateien gesichert!"
echo "Fertig!"
</source>
Das Skript ausführbar machen:<br>
chmod +x /BACKUP/scripts/UniversalBackup.sh
und testen:<br>
/BACKUP/scripts/UniversalBackup.sh
Beispielausgabe:<br>
<source>
Ermittle den Pfad für die Backup-Dateien ...
Pfad Datenbanken ist : /BACKUP/ionos-web02/databases
Pfad Webseiten ist ..: /BACKUP/ionos-web02/www
Pfad Sonstiges ist ..: /BACKUP/ionos-web02/other
Erstelle ggf. die Verzeichnisse ...
Lösche Backupdateien älter als 7 Tage ...
Sichere alle Datenbanken ...
Backup Database dbispconfig ...
Skipping Database information_schema ...
Backup Database matomo ...
Skipping Database mysql ...
Skipping Database performance_schema ...
Backup Database phpmyadmin ...
Backup Database sys ...
Backup Database wikiznilnet ...
Alle Datenbanken gesichert!
Sichere Webseiten ...
Backup Folder /var/www/apps
tar: Entferne führende „/“ von Elementnamen
Backup Folder /var/www/bernhardlinz.de
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/checkip.znil.org
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/cisco.znil.net
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Skipping Folder
Backup Folder /var/www/conf
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/html
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/ionos-web02.znil.org
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/ispconfig
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/lasselinz.de
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/linz.email
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/php-fcgi-scripts
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/rps.znil.net
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/webalizer
tar: Entferne führende „/“ von Elementnamen
Backup Folder /var/www/yasminlinz.de
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/znil.net
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
tar: /var/www/znil.net/log/access.log: Datei hat sich beim Lesen geändert.
Alle Webseiten gesichert!
Sichere Konfiguartionsdateien ...
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Alle Konfigurationsdateien gesichert!
Fertig!
</source>
Der Zielordner sollte nun so aussehen:<br>
<source lang="bash">
root@ionos-web02:/BACKUP/scripts# ll /BACKUP/ionos-web02/
insgesamt 20K
drwxr-xr-x 5 root root 4,0K Jun 23 10:59 ./
drwxr-xr-x 4 root root 4,0K Jun 23 10:46 ../
drwxr-xr-x 2 root root 4,0K Jun 23 10:59 databases/
drwxr-xr-x 2 root root 4,0K Jun 23 11:00 other/
drwxr-xr-x 2 root root 4,0K Jun 23 10:59 www/
root@ionos-web02:/BACKUP/scripts# ll /BACKUP/ionos-web02/other/
insgesamt 2,3M
drwxr-xr-x 2 root root 4,0K Jun 23 11:00 ./
drwxr-xr-x 5 root root 4,0K Jun 23 10:59 ../
-rw-r--r-- 1 root root 2,3M Jun 23 11:00 etc+more_2024-06-23--10-59-07.tar.gz
root@ionos-web02:/BACKUP/scripts# ll /BACKUP/ionos-web02/www/
insgesamt 1,1G
drwxr-xr-x 2 root root 4,0K Jun 23 10:59 ./
drwxr-xr-x 5 root root 4,0K Jun 23 10:59 ../
-rw-r--r-- 1 root root  120 Jun 23 10:59 apps_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root  64K Jun 23 10:59 bernhardlinz.de_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 7,9K Jun 23 10:59 checkip.znil.org_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 329K Jun 23 10:59 cisco.znil.net_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root  24K Jun 23 10:59 conf_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 3,2K Jun 23 10:59 html_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root  94K Jun 23 10:59 ionos-web02.znil.org_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 3,0M Jun 23 10:59 ispconfig_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 2,6M Jun 23 10:59 lasselinz.de_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 1,7M Jun 23 10:59 linz.email_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 1,2K Jun 23 10:59 php-fcgi-scripts_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 1,4M Jun 23 10:59 rps.znil.net_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root  121 Jun 23 10:59 webalizer_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 1,7M Jun 23 10:59 yasminlinz.de_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 1,1G Jun 23 11:00 znil.net_2024-06-23--10-59-07.tar.gz
root@ionos-web02:/BACKUP/scripts# ll /BACKUP/ionos-web02/databases/
insgesamt 110M
drwxr-xr-x 2 root root 4,0K Jun 23 10:59 ./
drwxr-xr-x 5 root root 4,0K Jun 23 10:59 ../
-rw-r--r-- 1 root root  77K Jun 23 10:59 dbispconfig__2024-06-23--10-59-07.sql.gz
-rw-r--r-- 1 root root  81M Jun 23 10:59 matomo__2024-06-23--10-59-07.sql.gz
-rw-r--r-- 1 root root 2,7K Jun 23 10:59 phpmyadmin__2024-06-23--10-59-07.sql.gz
-rw-r--r-- 1 root root  21K Jun 23 10:59 sys__2024-06-23--10-59-07.sql.gz
-rw-r--r-- 1 root root  30M Jun 23 10:59 wikiznilnet__2024-06-23--10-59-07.sql.gz
</source>
Sehr schön. Nun bauen wir einen cronjob damit das auch automatisch passiert:<br>
crontab -e
Und folgendes anhängen:<br>
# Backup der Datenbanken etc
0 1 * * * /BACKUP/scripts/UniversalBackup.sh >/dev/null 2>&1
Führ den Job jeden Tag um 01:00 Uhr aus.<br>
Es werden die letzten 7 Backups behalten.<br>
----
==CronJob für Reverse-Proxy Seiten==
ISPConfig kümmert sich automatisch um die Erneuerung der Lets Encrypt Zertifikate.<br>
Allerdings sabotiere ich das manchmal wenn ich bei einer Webseite eigene Reverse-Proxy Einstellungen mache, dann werden die Challange-Dateien nicht gefunden.<br>
Ja, da müsste man entsprechende Ausnahmen einbauen, manchmal denke ich nicht dran.<br>
Sicherheitshalber lasse ich deshalb auch immer einen Extra-Job für diese Fälle laufen:<br>
crontab -e
und folgende Zeile anhängen:<br>
# Von Lösung für Apache Reverse Proxy Seiten
59 4 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh --standalone --pre-hook "systemctl stop apache2.service" --post-hook "systemctl start apache2.service" 2>&1 >/dev/null
verlängert alle Zertifikate die dran sind um 04:59 Uhr.<br>
Sollten Zertifikate dran sein, so wird der Apache kurz gestoppt, er macht selbst einen Webserver auf, verlängert die Zertifikate und startet den Apache wieder.<vr>
Um die Uhrzeit sollte es nicht stören.<br>
----
==Fail2Ban reparieren==
Es gibt einen Fehler in Ubuntu 24.04 LTS (Stand 23.06.2024) der verhindert das der Fail2Ban Dienst startet. Den hat ISPConfig mit installiert.<br>
Dem Dienst fehlt ein Pythen-Paket welches wir wie folgt zwangsweise auf unser System bekommen (Die einfache Variante ohne Enviroment):<br>
apt install python3-pip
pip3 install pyasynchat --break-system-packages
systemctl start fail2ban.service
systemctl status fail2ban.service
Gefunden habe ich die Lösung hier:<br>
* https://support.plesk.com/hc/en-us/articles/23560932208535-Fail2ban-does-not-start-on-a-Plesk-server-with-Ubuntu-24-No-module-named-asynchat
----
==Cockpit installieren und von außen Zugänglich machen==
Cockpit ist eine Weboberfläche die unabhängig vom Apache2 läuft und euch verschiedene Tools für das Management des Servers bereitstellen kann.<br>
Ich bin eigentlich nur scharf auf das Terminal, so kann man über die Weboberfläche ein paar SSH Befehle absetzten.<br>
:[[Datei:ClipCapIt-240623-124228.PNG]]<br>
apt install cockpit
systemctl enable --now cockpit.service
und schon lauscht der Server auch unter Port https://213.165.83.96:9090 mit einem selbst signierten Zertifikat (Nein, ist für euch nicht erreichbar, in Firewall gesperrt).<br>
Per Default darf sich der '''root''' natürlich nicht anmelden.<br>
Wer das erlauben möchte muss die Datei<br>
nano /etc/cockpit/disallowed-users
bearbeiten und den root dort löschen / auskommentieren und den Dienst neu starten.<br>
# List of users which are not allowed to login to Cockpit
#root
Wer Cockpit dann hinter einer Subdomain über ISPConfig erreichbar machen will,<br>
erstellen eine neue Webseite, PHP deaktiviert, und auf dem Reter {{Key|Options}} kopiert Ihr folgendes in der Feld {{Key|Apache Directives:}}:<br>
<source>
SSLProxyEngine On
RequestHeader set Front-End-Https "On"
ProxyPreserveHost On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
ProxyPass / https://127.0.0.1:9090/
ProxyPassReverse / https://127.0.0.1:9090/
ProxyPass /socket ws://127.0.0.1:9090/socket
ProxyPassReverse /socket ws://127.0.0.1:9090/socket
<Location "/cockpit/socket">
    ProxyPass "wss://127.0.0.1:9090/cockpit/socket"
</Location>
</source>
----
==Kommentare==
<comments />

Aktuelle Version vom 24. Juni 2024, 00:20 Uhr

Changelog:

  • 22.06.2024 erste Version

Vorwort

Meine Homepage läuft schon seit ein paar Jahren (2021) auf einem virtuellen Server bei IONOS.
Am 22.06.2024 habe ich einen neuen "VPS 2-2-80" Server bei IONOS angemietet. Aus verschiedenen Gründen:

  • Durch den Neuabschluss zahle ich nur 4€ statt 5€ im Monat
  • Bequeme Migration von Ubuntu 20.04 auf 24.04 da beides parallel läuft
  • Die Firewall-Richtlinien über das https://cloudpanel.ionos.de/ gefallen mir gut
  • Backup per VeeamAgent für Linux hat sich auch bei den neueren VMs auf "RedHat Virtualization (aka virtio)" als brauchbar herausgestellt.

Um die Einrichtung auch für das nächste man zu Beschleunigen, schreibe ich diesmal auch wirklich alles auf was ich mache :-)

Als Basis habe ich Ubuntu 24.04 LTS gewählt, nach ein paar Minuten war der Server fertig und ich konnte das erste mal per SSH auf das System.


Sprache Umstellen

Default ist das Ubuntu Englisch, inklusive Englischer Tastatur.
Das mit der Tastatur ist prinzipiell bei SSH Zugriff egal, aber es gibt auch eine KVM-Konsole bzw. beim Restore unter VMware ist auch erst einmal die Konsole.

dpkg-reconfigure keyboard-configuration

und dann

Generic 105-key PC => German => German => The default for the keyboard layout => No compose key

Und noch die Sprache

dpkg-reconfigure locales

und dann

de_DE.UTF-8 UTF-8 => de_DE.UTF-8

nano & Co auch auf deutsch

apt install -y language-pack-de

Prompt anpassen

nano .bashrc

und folgende Zeilen anpassen:

force_color_prompt=yes
alias ll='ls -alFh'

macht den Prompt farbig und alle Größenangaben sind "Human readable", also in Kilobyte, Megabyte etc. statt in Bytes.
Und ganz unten noch folgendes anhängen:

# Alle SSH Sitzungen teilen sich die Bash-History
# Keine Duplikate oder leeren Zeilen
HISTCONTROL=ignoredups:ignorespace:erasedups
# An die History Datei anhängen, nicht überschreiben
shopt -s histappend
# Maximale Anzahl Zeilen und/oder Dateigröße (je nachdem was zuerst eintrifft)
HISTSIZE=50000
HISTFILESIZE=50000
# Nach jeden abgesetzen Befehl diesen an die History anhängen und diese neu einlesen
export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'n'}history -a; history -c; history -r"

System umbennen

ionos-web02 soll der neue Name des Systems sein.

hostnamectl set-hostname ionos-web02

und noch

nano /etc/hosts

und dort die 127.0.1.1 Zeile anpassen:

# Your system has configured 'manage_etc_hosts' as True.
# As a result, if you wish for changes to this file to persist
# then you will need to either
# a.) make changes to the master file in /etc/cloud/templates/hosts.debian.tmpl
# b.) change or remove the value of 'manage_etc_hosts' in
#     /etc/cloud/cloud.cfg or cloud-config from user-data
#
127.0.1.1 ionos-web02 ionos-web02.znil.org
127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Das ISPConfig-Installationsskript besteht auf einen FQDN-Namen für 127.0.1.1!
Der Name muss nicht auflösbar sein.
Nach einem reboot muss das in etwa so bei euch aussehen:

root@ionos-web02:~# hostname
ionos-web02
root@ionos-web02:~# hostname -f
ionos-web02.znil.org

Anmeldung des root per SSH verbieten

Per Default haben wir eine root-Anmeldung per SSH und Passwort.
Ich melde mich per SSH aber immer per SSH-Key an.
Den SSH-Key fügen wir in folgende Datei ein:

nano ~/.ssh/authorized_keys2

Speichern und dann testen ob die Anmeldung per SSH-Key funktioniert.
Wenn ja:

nano /etc/ssh/sshd_config

und ganz nach unten scrollen, da wurde bei mir die Zeile

PermitRootLogin yes

angehängt die wir mit F9 einfach löschen (oder an jeder anderen Stelle wo diese stehen würde)
Damit gilt automatisch der Default Wert PermitRootLogin prohibit-password
Die Gegenprobe schadet natürlich nicht (also ob es wirklich nicht mehr per Passwort geht)


Zeitzone setzen / Zeitserver setzen

Der Befehl

date

spuckt noch eine falsche Uhrzeit aus, die richtige Zeitzone setzen wir mit

timedatectl set-timezone Europe/Berlin

Als Zeitserver wird im Moment noch

ntp.ubuntu.com

genommen, das ändere ich wie folgt:

nano /etc/systemd/timesyncd.conf

und folgende Zeile einfügen / ändern:

[Time]
NTP=de.pool.ntp.org
#FallbackNTP=ntp.ubuntu.com
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048
#ConnectionRetrySec=30
#SaveIntervalSec=60

Updates einspielen / System aktualisieren

Das mache ich immer (auch später) mit folgendem Einzeiler:

apt update && apt dist-upgrade -y && apt autoremove -y

und ein

reboot

danach schadet nicht.


Swap Datei aktivieren

Jetzt lief meine Webseite schon einen Moment auf dem neuen Server - und dann geht nichts mehr. Grund war, das als ich das Backup gestartet habe dem System der Arbeitsspeicher ausgeht. Ok, mein Mietserver hat nur 2GB RAM, aber auf der identischen VM die ich zuvor hatte war das trotzdem kein Problem ...
Bis ich gesehen habe, das IONOS die Swap-Datei deaktiviert hat ... ok, schalten wir das wieder an. Meine VM hat 2GB RAM, also bekommt die eine 4GB Swap-Datei:

fallocate -l 4G /swap.img
chmod 600 /swap.img
mkswap /swap.img
swapon /swap.img

Damit die auch beim Reboot wieder benutzt wird:

nano /etc/fstab

und folgende Zeile einfügen (geklaut aus einem "normalen" Ubuntu 24.04-System)

/swap.img       none    swap    sw      0       0

Am besten einmal rebooten und nach dem reboot mit

swapon --show

prüfen - wenn keine Ausgabe erfolgt, gibt es keine Swap-Datei!

NAME      TYPE SIZE USED PRIO
/swap.img file   4G   0B   -2

Multipathing deaktivieren

systemctl stop multipathd.service && systemctl disable multipathd.service

Der Dienst wird nicht benötigt, es gibt nur eine Festplatte mit einem Pfad.
Und er belegt immer die oberen Plätze wenn ich mir htop ansehe.
In meinen anderen Anleitungen deinstalliere ich den sogar, hier soll mir deaktivieren reichen.


ISPConfig Installieren

Jetzt sind wir schon soweit das wir ISPConfig installieren können.
Früher habe ich das immer nach einen der diversen "The Perfect Server" Anleitungen installiert:

https://www.ispconfig.org/documentation/

Inzwischen gibt es einen automatischen Installer der das für uns übernimmt:

https://www.howtoforge.com/ispconfig-autoinstall-debian-ubuntu/

Die Vorarbeiten die man machen soll, haben wir schon erledigt.
Da ich einige Parameter anpassen möchte, starte ich es mit entsprechenden Parametern:
Die Hilfe bekommen wir per

wget -O - https://get.ispconfig.org | sh -s -- --help

Da werden - obwohl wir nur die Hilfe aufrufen - schon einige Pakete nachinstalliert.
Am Ende steht da die Hilfe:

**********************************************************************************************************************************************************************************************ISPConfig 3 Autoinstaller
**********************************************************************************************************************************************************************************************

Usage: ispc3-ai.sh [<argument>] [...]

This script automatically installs all needed packages for an ISPConfig 3 setup using the guidelines from the "Perfect Server Setup" howtos on www.howtoforge.com.

Possible arguments are:
    --help          Show this help page.
    --debug         Enable verbose logging (logs each command with the exit code).
    --channel       Choose the channel to use for ISPConfig: --channel=<stable|dev>
                    "stable" is the latest ISPConfig release available on www.ispconfig.org
                    "dev" is the latest dev-branch from the ISPConfig git repository: https://git.ispconfig.org/ispconfig/ispconfig3/tree/develop
                    The dev channel might contain bugs and less-tested features and should only be used in production by very experienced users.
    --lang          Use language for ISPConfig installation. Specify with --lang=en|de (only en (English) and de (German) supported currently).
    --interactive   Don't install ISPConfig in non-interactive mode.
                    This is needed if you want to use expert mode, e.g. to install a slave server that shall be integrated into an existing multiserver setup.
    --use-nginx     Use NGINX webserver instead of Apache2.
    --use-amavis    Use Amavis instead of Rspamd for mail filtering.
    --use-unbound   Use unbound instead of bind9 for local resolving. Only allowed if --no-dns is set.
    --use-php       Use specific PHP versions, comma separated, instead of installing multiple PHP, e.g. --use-php=7.4,8.0 (5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.1, 8.2 and 8.3 available).
                    --use-php=system disables the sury repository and just installs the system's default PHP version.
                    --use-php while omitting the argument, uses all versions.
    --use-ftp-ports This option sets the passive port range for pure-ftpd. You have to specify the port range separated by hyphen, e.g. --use-ftp-ports=40110-40210.
                    If not provided the passive port range will not be configured.
    --use-certbot   Use Certbot instead of acme.sh for issuing Let's Encrypt certificates. Not advised unless you are migrating from an old server that uses Certbot.
    --no-web        Do not use ISPConfig on this server to manage webserver setting and don't install nginx/apache or pureftpd.
                    This will also prevent installing an ISPConfig UI and implies --no-roundcube as well as --no-pma.
    --no-mail       Do not use ISPConfig on this server to manage mailserver settings.
                    This will install Postfix for sending system mails, but not dovecot and not configure any settings for ISPConfig mail. It implies --no-mailman.
    --no-dns        Do not use ISPConfig on this server to manage DNS entries. Bind will be installed for local DNS caching / resolving only.
    --no-local-dns  Do not install local DNS caching / resolving via bind.
    --no-firewall   Do not install ufw and tell ISPConfig to not manage firewall settings on this server.
    --no-roundcube  Do not install roundcube webmail.
    --roundcube     Install Roundcube even when --no-mail is used. Manual configuration of Roundcube config is needed.
    --no-pma        Do not install phpMyAdmin on this server.
    --no-mailman    Do not install Mailman mailing list manager.
    --no-quota      Disable file system quota.
    --no-ntp        Disable NTP setup.
    --no-jailkit    Do not install jailkit.
    --no-ftp        Do not install Pure-FTPd server.
    --monit         Install Monit and set it up to monitor installed services. Supported services: Apache2, NGINX, MariaDB, pure-ftpd-mysql, php-fpm, ssh, named, Postfix, Dovecot, rspamd.
    --monit-alert-email
                    Set up alerts for Monit to be sent to given e-mail address. e.g. --monit-alert-email=me@example.com.
    --ssh-port      Configure the SSH server to listen on a non-default port. Port number must be between 1 and 65535 and can not be in use by other services. e.g. --ssh-port=64.
    --ssh-permit-root
                    Configure the SSH server whether or not to allow root login: --ssh-permit-root=<yes|without-password|no>, e.g. --ssh-permit-root=without-password.
    --ssh-password-authentication
                    Configure the SSH server whether or not to allow password authentication: --ssh-password-authentication=<yes|no>, e.g. -ssh-password-authentication=no.
    --ssh-harden    Configure the SSH server to have a stronger security config.
    --unattended-upgrades
                    Install UnattendedUpgrades. You can add extra arguments for automatic cleanup and automatic reboots when necessary: --unattended-upgrades=autoclean,reboot (or only one of
                    them).
    --i-know-what-i-am-doing
                    Prevent the autoinstaller to ask for confirmation before continuing to reconfigure the server.

Ich nutze ISPConfig nur für mich alleine. Aber warum dann? Weil es bequem ist, jede Webseite läuft dann unter ihrem eigenen, eingeschränkten Benutzer, ich kann pro Webseite die PHP-Version einstellen (oder abschalten), automatisch Let`s Encrypt Zertifikate anfordern lassen usw.
Aber ich brauche - Stand 22.06.2024 - keinen Mailserver / Webmail / FTP / DNS-Server / NTP-Setup.
Ich installiere ISPConfig aif Englisch (ja, ich weis, wir haben doch gerade extra alles auf Deutsch umgestellt), empfinde ich als einfacher.
Ok, mein Aufruf sieht wie folgt aus:

wget -O - https://get.ispconfig.org | sh -s -- --lang=en --no-mail --no-dns --no-local-dns --no-firewall --no-roundcube --no-quota --no-ntp --no-ftp

Erklärung

--no-mail         : Installiert nur Postfix um Systemmeldungen zu versenden, aber keine zusätzlichen Pakete oder die Konfiguration über ISPConfig
--no-dns          : Keine Verwaltung von DNS-Einträgen über ISPConfig
--no-local-dns    : und auch keinen Bind-DNS-Server installieren, wir fragen ganz norme externe DNS-Server ab
--no-firewall     : die Firewall nicht aktivieren (Ich nutze die IONOS Firewall davor) 
--no-roundcube    : Den Roundcube Webmailer nicht installieren
--no-quota        : Keine Speicherplatzbegrenzungen pro Benutzer verwenden
--no-ntp          : Zeitserver nicht konfigurieren
--no-ftp          : keinen FTP-Server installieren

Wenn wir den Befehl senden, fragt er noch mal nach ob wir loslegen sollen:

WARNING! This script will reconfigure your entire server!
It should be run on a freshly installed server and all current configuration that you have done will most likely be lost!
Type 'yes' if you really want to continue: yes

was wir mit yes bestätigen.
Er prüft dann noch mal die Umgebung und würde auf Fehler hinweisen und abbrechen. Wenn alles ok ist, legt er los.

[INFO] Starting perfect server setup for Ubuntu 24.04 LTS
[INFO] Checking hostname.
[INFO] Configuring apt repositories.
[INFO] Updating packages
[INFO] Updated packages
[INFO] Installing packages ssh, openssh-server, nano, vim-nox, lsb-release, apt-transport-https, ca-certificates, wget, git, gnupg, software-properties-common, curl, cron
[INFO] Installed packages ssh, openssh-server, nano, vim-nox, lsb-release, apt-transport-https, ca-certificates, wget, git, gnupg, software-properties-common, curl, cron
[INFO] Activating sury php repository.
W: https://ppa.launchpadcontent.net/ondrej/php/ubuntu/dists/noble/InRelease: Signature by key 14AA40EC0831756756D7F66C4F4EA0AAE5267A6C uses weak algorithm (rsa1024)
[INFO] Activating GoAccess repository.
[INFO] Updating packages (after enabling 3rd party repos).
[INFO] Updated packages
[INFO] Installing packages dbconfig-common, postfix, postfix-mysql, mariadb-client, mariadb-server, openssl, rkhunter, binutils, sudo, getmail6, rsyslog
[INFO] Installed packages dbconfig-common, postfix, postfix-mysql, mariadb-client, mariadb-server, openssl, rkhunter, binutils, sudo, getmail6, rsyslog
[INFO] Generating MySQL password.
[INFO] Writing MySQL config files.
[INFO] Restarting postfix
[INFO] Configuring rkhunter.
[INFO] Installing packages software-properties-common, update-inetd, dnsutils, resolvconf, clamav, clamav-daemon, zip, unzip, bzip2, xz-utils, lzip, rar, borgbackup, arj, nomarch, lzop, cabextract, apt-listchanges, libnet-ldap-perl, libauthen-sasl-perl, daemon, libio-string-perl, libio-socket-ssl-perl, libnet-ident-perl, libnet-dns-perl, libdbd-mysql-perl, p7zip, p7zip-full, unrar-free, lrzip
[INFO] Installed packages software-properties-common, update-inetd, dnsutils, resolvconf, clamav, clamav-daemon, zip, unzip, bzip2, xz-utils, lzip, rar, borgbackup, arj, nomarch, lzop, cabextract, apt-listchanges, libnet-ldap-perl, libauthen-sasl-perl, daemon, libio-string-perl, libio-socket-ssl-perl, libnet-ident-perl, libnet-dns-perl, libdbd-mysql-perl, p7zip, p7zip-full, unrar-free, lrzip
[INFO] (Re)starting Bind.
[INFO] Disabling spamassassin daemon.
WARNING: Clamd was NOT notified: Can't connect to clamd through /var/run/clamav/clamd.ctl: No such file or directory
[INFO] Installing packages apache2, apache2-utils, libapache2-mod-fcgid, apache2-suexec-pristine, libapache2-mod-python, libapache2-mod-passenger
[INFO] Installed packages apache2, apache2-utils, libapache2-mod-fcgid, apache2-suexec-pristine, libapache2-mod-python, libapache2-mod-passenger
[INFO] Installing packages php-pear, php-memcache, php-imagick, mcrypt, imagemagick, libruby, memcached, php-apcu, jailkit, php5.6, php5.6-common, php5.6-gd, php5.6-mysql, php5.6-imap, php5.6-cli, php5.6-mcrypt, php5.6-curl, php5.6-intl, php5.6-pspell, php5.6-recode, php5.6-sqlite3, php5.6-tidy, php5.6-xmlrpc, php5.6-xsl, php5.6-zip, php5.6-mbstring, php5.6-soap, php5.6-opcache, php5.6-cgi, php5.6-fpm, php7.0, php7.0-common, php7.0-gd, php7.0-mysql, php7.0-imap, php7.0-cli, php7.0-mcrypt, php7.0-curl, php7.0-intl, php7.0-pspell, php7.0-recode, php7.0-sqlite3, php7.0-tidy, php7.0-xmlrpc, php7.0-xsl, php7.0-zip, php7.0-mbstring, php7.0-soap, php7.0-opcache, php7.0-cgi, php7.0-fpm, php7.1, php7.1-common, php7.1-gd, php7.1-mysql, php7.1-imap, php7.1-cli, php7.1-mcrypt, php7.1-curl, php7.1-intl, php7.1-pspell, php7.1-recode, php7.1-sqlite3, php7.1-tidy, php7.1-xmlrpc, php7.1-xsl, php7.1-zip, php7.1-mbstring, php7.1-soap, php7.1-opcache, php7.1-cgi, php7.1-fpm, php7.2, php7.2-common, php7.2-gd, php7.2-mysql, php7.2-imap, php7.2-cli, php7.2-curl, php7.2-intl, php7.2-pspell, php7.2-recode, php7.2-sqlite3, php7.2-tidy, php7.2-xmlrpc, php7.2-xsl, php7.2-zip, php7.2-mbstring, php7.2-soap, php7.2-opcache, php7.2-cgi, php7.2-fpm, php7.3, php7.3-common, php7.3-gd, php7.3-mysql, php7.3-imap, php7.3-cli, php7.3-curl, php7.3-intl, php7.3-pspell, php7.3-recode, php7.3-sqlite3, php7.3-tidy, php7.3-xmlrpc, php7.3-xsl, php7.3-zip, php7.3-mbstring, php7.3-soap, php7.3-opcache, php7.3-cgi, php7.3-fpm, php7.4, php7.4-common, php7.4-gd, php7.4-mysql, php7.4-imap, php7.4-cli, php7.4-curl, php7.4-intl, php7.4-pspell, php7.4-sqlite3, php7.4-tidy, php7.4-xmlrpc, php7.4-xsl, php7.4-zip, php7.4-mbstring, php7.4-soap, php7.4-opcache, php7.4-cgi, php7.4-fpm, php8.0, php8.0-common, php8.0-gd, php8.0-mysql, php8.0-imap, php8.0-cli, php8.0-curl, php8.0-intl, php8.0-pspell, php8.0-sqlite3, php8.0-tidy, php8.0-xsl, php8.0-zip, php8.0-mbstring, php8.0-soap, php8.0-opcache, php8.0-cgi, php8.0-fpm, php8.1, php8.1-common, php8.1-gd, php8.1-mysql, php8.1-imap, php8.1-cli, php8.1-curl, php8.1-intl, php8.1-pspell, php8.1-sqlite3, php8.1-tidy, php8.1-xsl, php8.1-zip, php8.1-mbstring, php8.1-soap, php8.1-opcache, php8.1-cgi, php8.1-fpm, php8.2, php8.2-common, php8.2-gd, php8.2-mysql, php8.2-imap, php8.2-cli, php8.2-curl, php8.2-intl, php8.2-pspell, php8.2-sqlite3, php8.2-tidy, php8.2-xsl, php8.2-zip, php8.2-mbstring, php8.2-soap, php8.2-opcache, php8.2-cgi, php8.2-fpm, php8.3, php8.3-common, php8.3-gd, php8.3-mysql, php8.3-imap, php8.3-cli, php8.3-curl, php8.3-intl, php8.3-pspell, php8.3-sqlite3, php8.3-tidy, php8.3-xsl, php8.3-zip, php8.3-mbstring, php8.3-soap, php8.3-opcache, php8.3-cgi, php8.3-fpm
[INFO] Installed packages php-pear, php-memcache, php-imagick, mcrypt, imagemagick, libruby, memcached, php-apcu, jailkit, php5.6, php5.6-common, php5.6-gd, php5.6-mysql, php5.6-imap, php5.6-cli, php5.6-mcrypt, php5.6-curl, php5.6-intl, php5.6-pspell, php5.6-recode, php5.6-sqlite3, php5.6-tidy, php5.6-xmlrpc, php5.6-xsl, php5.6-zip, php5.6-mbstring, php5.6-soap, php5.6-opcache, php5.6-cgi, php5.6-fpm, php7.0, php7.0-common, php7.0-gd, php7.0-mysql, php7.0-imap, php7.0-cli, php7.0-mcrypt, php7.0-curl, php7.0-intl, php7.0-pspell, php7.0-recode, php7.0-sqlite3, php7.0-tidy, php7.0-xmlrpc, php7.0-xsl, php7.0-zip, php7.0-mbstring, php7.0-soap, php7.0-opcache, php7.0-cgi, php7.0-fpm, php7.1, php7.1-common, php7.1-gd, php7.1-mysql, php7.1-imap, php7.1-cli, php7.1-mcrypt, php7.1-curl, php7.1-intl, php7.1-pspell, php7.1-recode, php7.1-sqlite3, php7.1-tidy, php7.1-xmlrpc, php7.1-xsl, php7.1-zip, php7.1-mbstring, php7.1-soap, php7.1-opcache, php7.1-cgi, php7.1-fpm, php7.2, php7.2-common, php7.2-gd, php7.2-mysql, php7.2-imap, php7.2-cli, php7.2-curl, php7.2-intl, php7.2-pspell, php7.2-recode, php7.2-sqlite3, php7.2-tidy, php7.2-xmlrpc, php7.2-xsl, php7.2-zip, php7.2-mbstring, php7.2-soap, php7.2-opcache, php7.2-cgi, php7.2-fpm, php7.3, php7.3-common, php7.3-gd, php7.3-mysql, php7.3-imap, php7.3-cli, php7.3-curl, php7.3-intl, php7.3-pspell, php7.3-recode, php7.3-sqlite3, php7.3-tidy, php7.3-xmlrpc, php7.3-xsl, php7.3-zip, php7.3-mbstring, php7.3-soap, php7.3-opcache, php7.3-cgi, php7.3-fpm, php7.4, php7.4-common, php7.4-gd, php7.4-mysql, php7.4-imap, php7.4-cli, php7.4-curl, php7.4-intl, php7.4-pspell, php7.4-sqlite3, php7.4-tidy, php7.4-xmlrpc, php7.4-xsl, php7.4-zip, php7.4-mbstring, php7.4-soap, php7.4-opcache, php7.4-cgi, php7.4-fpm, php8.0, php8.0-common, php8.0-gd, php8.0-mysql, php8.0-imap, php8.0-cli, php8.0-curl, php8.0-intl, php8.0-pspell, php8.0-sqlite3, php8.0-tidy, php8.0-xsl, php8.0-zip, php8.0-mbstring, php8.0-soap, php8.0-opcache, php8.0-cgi, php8.0-fpm, php8.1, php8.1-common, php8.1-gd, php8.1-mysql, php8.1-imap, php8.1-cli, php8.1-curl, php8.1-intl, php8.1-pspell, php8.1-sqlite3, php8.1-tidy, php8.1-xsl, php8.1-zip, php8.1-mbstring, php8.1-soap, php8.1-opcache, php8.1-cgi, php8.1-fpm, php8.2, php8.2-common, php8.2-gd, php8.2-mysql, php8.2-imap, php8.2-cli, php8.2-curl, php8.2-intl, php8.2-pspell, php8.2-sqlite3, php8.2-tidy, php8.2-xsl, php8.2-zip, php8.2-mbstring, php8.2-soap, php8.2-opcache, php8.2-cgi, php8.2-fpm, php8.3, php8.3-common, php8.3-gd, php8.3-mysql, php8.3-imap, php8.3-cli, php8.3-curl, php8.3-intl, php8.3-pspell, php8.3-sqlite3, php8.3-tidy, php8.3-xsl, php8.3-zip, php8.3-mbstring, php8.3-soap, php8.3-opcache, php8.3-cgi, php8.3-fpm
[INFO] Disabling conflicting apache modules.
[INFO] Enabling apache modules.
[INFO] Enabling default PHP-FPM config.
[INFO] Setting default system PHP version.
[INFO] Installing phpMyAdmin
[INFO] HTTPoxy config.
[INFO] Installing acme.sh (Let's Encrypt).
[INFO] acme.sh (Let's Encrypt) installed.
[INFO] ISPConfig does not yet support mailman3 and mailman2 is no longer available since Ubuntu 22.04.
[INFO] Installing packages haveged, geoip-database, libclass-dbi-mysql-perl, libtimedate-perl, build-essential, autoconf, automake, libtool, flex, bison, debhelper, binutils
[INFO] Installed packages haveged, geoip-database, libclass-dbi-mysql-perl, libtimedate-perl, build-essential, autoconf, automake, libtool, flex, bison, debhelper, binutils
[INFO] Installing packages webalizer, awstats, goaccess
[INFO] Installed packages webalizer, awstats, goaccess
[INFO] Disabling awstats cron.
[INFO] Installing packages fail2ban
[INFO] Installed packages fail2ban
[INFO] Configuring SSHd
[INFO] Installing ISPConfig3.
[INFO] Adding PHP version(s) to ISPConfig.
[INFO] Checking all services are running.
[INFO] mysql: OK
[INFO] clamav-daemon: OK
[INFO] postfix: OK
[INFO] pureftpd: FAILED
[WARN] pureftpd seems not to be running! (/lib/os/class.ISPConfigDebianOS.inc.php:2255)
[INFO] apache2: OK
[INFO] Installation ready.
[INFO] Your ISPConfig admin password is: Pjb3MGw8F18wyZd
[INFO] Your MySQL root password is: 6J9XC5Z2QpZ3LWD6Zn43
[INFO] Warning: Please delete the log files in /tmp/ispconfig-ai/var/log/setup-* once you don't need them anymore because they contain your passwords!

Die Fehlermeldungen sind in diesem Fall richtig, der FTP-Dienst ist ja auch nicht installiert.
In der vor-vorletzten Zeile steht nun das Passwort über welches wir uns nun per https:// anmelden können, in der vorletzten des MySQL-root-Benutzers (auch wenn MariaDB installiert wurde).
Wir rufen die Webseite auf:

https://213.165.83.96:8080

was vermutlich nicht klappen wird - die IONOS Firewall wird den Port sperren.
Meldet euch in diesem Fall unter

https://cloudpanel.ionos.de/

an (oder geht den Weg über https://login.ionos.de/ und wählt im Menü Server & Cloud), wählt dann

Netzwerk => Firewall-Richtlinien

Dann rechts die Richtlinie auswählen und dann könnte Ihr unten einen Eintrag hinzufügen.

ClipCapIt-240622-174355.PNG

Rechts den grünen Haken und er speichert sofort. Quelle lasst Ihr frei oder tragt eure aktuelle externe IP ein. Ich habe eine feste IP-Adresse und es so eingestellt das ich nur von zu Hause aus auf das System komme.
Und schon können wir uns anmelden:

ClipCapIt-240622-174657.PNG



Postfix für Verwendung eines SMTP-Relay konfigurieren

nano /etc/postfix/main.cf

und unten die folgende Zeile ändern und euren(!!!) SMPT-Relais Host eintragen:

relayhost = 5.196.125.45

Das ist bei mir mein ganz normaler Mailserver - auf dem ich eingestellt habe das er alles von der festen IP meines Webservers annehmen soll.


Emails des root an externe Adresse weiterleiten

Nachfolgend leite ich die lokalen Emails (abrufbar über den Befehl mail) an die externe Email-Adresse root@linz.email weiter:
Der neue Webserver kann - warum auch immer, vermutlich durch IONOS gesperrt - keinen Kontakt auf Port 25 aufnehmen (also ausgehend).
Also gehen wir über Port 465, das wäre SMTP SLL:

dpkg-reconfigure postfix

Und wie folgt antworten:

Satellitensystem
E-Mail-Name des Systems: ionos-web02.znil.org
SMTP-Relay-Host (leere Eingabe: keiner): 5.196.125.45:465
Empfänger von E-Mails an root und postmaster: root@linz.email
Weitere Ziele, für die E-Mails akzeptiert werden sollen (leere Eingabe: keine): ionos-web02.znil.org, ionos-web02, localhost.znil.org, localhost
Synchrone Aktualisierungen der E-Mail-Warteschlange erzwingen? Nein
Lokale Netzwerke: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
Maximale Postfach-Größe in Byte: 0
Zeichen für lokale Adresserweiterung: +
alle: sowohl IPv4- als auch IPv6-Addressen verwenden;

Im Anschluss:

nano /etc/aliases

Inhalt ggf. ergänzen /falls es nicht schon drin steht:

# See man 5 aliases for format
postmaster:    root
clamav: root
root: root@linz.email

Damit er das übernimmt einmal den folgenden Befehl senden

newaliases

Und die nächste Datei bearbeiten:

nano /etc/postfix/virtual-regexp

und für alle Emails die Zieladresse setzen:

+@.+ root@linz.email

Diese Datei müssen wir in Postfix nun noch aktivieren:

nano /etc/postfix/main.cf

und ganz unten folgende Zeile anhängen:

virtual_maps = regexp:/etc/postfix/virtual-regexp

In der gleichen Datei müssen wir noch das Senden per SSL/TLS aktivieren.
Diese Zeile anhängen:

smtp_tls_wrappermode = yes

Diese Zeile abändern:

smtp_tls_security_level = encrypt

Nun dafür sorgen das postfix das auch beachtet:

postmap /etc/postfix/
newaliases
systemctl restart postfix

und dann könnt Ihr wie folgt eine Testmail versenden:

mail -s "Testemail ionos-web02 Nr.3" root < /dev/null

Wenn diese nicht ankommt könnte ihr folgendes prüfen (neben dem Eingang am Ziel-Mailserver):

mailq

Zeigt euch die Warteschlange der ausgehenden Emails an

journalctl -u postfix@-.service

Die Logeinträge mit Fehlermeldungen (nach unten scrollen!)


Grundeinstellungen ISPConfig

ISPConfig ist Mandantenfähig, man kann also eingeschränkte Zugänge für andere erstellen die dann z.B. nur Ihre eine Webseite verwalten können.
Das brauche ich aber alles nicht. Insbesondere verwalte ich unter Sites in der Regel keine Domänen sondern nur Subdomänen.
Es gibt also nur den einen Mandanten (Client0), dementsprechend muss auch vor Datenbanken etc. nicht jedes mal der Client als Präfix davor gesetzt werden.

System => Server Config => Names des Servers anklicken => Web => SSL Settings => Skip Lets Encrypt Check: [Haken setzen]


System => Main Config => siehe Bilder
ClipCapIt-240622-222839.PNG
ClipCapIt-240622-222839.PNG

und noch die IPv6 hinzufügen (muss im Control Panel des vServers erst erstellt werden)

System => Server IP adresses => Add new IP Address:
ClipCapIt-240622-223352.PNG

clamav deaktivieren und entfernen

Nach einen der Reboots bzw. nachdem ich 4GB Swap Speicher hinzugefügt hatte, lief der clamav "Amok". Mein System ist zu schwach dafür.
Aus und runter damit:

systemctl disable clamav-daemon.service
systemctl disable clamav-freshclam.service

und deinstallieren:

apt purge clamav clamav-daemon clamav-freshclam clamav-base

AWStats & Co per default abschalten

Um die Webstatistiken einer neuen Webseite per default zu deaktivieren, rufen wir den phpMyAdmin auf Port 8081 auf:

https://213.165.83.96:8081/phpmyadmin/

Benutzer ist root und das Passwort welches am Ende des Setups für MySQL ausgeworfen wurde.
Klickt links die Datenbank dbispconfig an,
scrollt rechts runter bis zu web_domain und dort auf Struktur
Falls Ihr den Namen anklickt könnt ihr oben im Quertab auch auf Struktur wechseln.

ClipCapIt-240623-100423.PNG

Scrollt bis zu stats_type und bei dem Eintrag auf bearbeiten:

ClipCapIt-240623-100630.PNG

Bei Standard wählt Ihr bei "Wie definiert:" den Eintrag Keine(e) aus:

ClipCapIt-240623-100840.PNG
ClipCapIt-240623-103154.PNG

Hinter darf der Haken bei Null nicht gesetzt sein! Und Speichern nicht vergessen! Wenn wir jetzt einen neue Website erstellen sind die Statistiken deaktiviert:

ClipCapIt-240623-103236.PNG

UniversalBackup einrichten

UniversalBackup habe ich mal mein Skript genannt ... deswegen heißt auch das Kapitel so.
Es ist ein Skript was alle Datenbanken exportiert und alle Verzeichnisse unterhalb von /var/www in einzelne Archive packt.
Das ganze wird in einem Ordner /BACKUP/... gespeichetr. Lokal. Kann man aber leicht wegkopieren (oder die Daten aus einem Backup kratzen).

Ordnerstruktur erstellen

mkdir -p /BACKUP/scripts
mkdir /BACKUP/ionos-web02

Der zweite Ordner wird später die eigentlichen Backup-Dateien enthalten.


MySQL-Benutzer für die Sicherung anlegen

mysql

eingeben und nacheinander die folgenden Befehle absetzen:

CREATE USER 'Backup'@'localhost' IDENTIFIED BY 'meinPasswort';
GRANT ALL PRIVILEGES ON *.* TO 'Backup'@'localhost';
FLUSH PRIVILEGES;
exit

Erstellt den Benutzer Backup und das dazu gehörige Passwort


Script erstellen

nano /BACKUP/scripts/UniversalBackup.sh

und folgender Inhalt:

#!/bin/bash
username=Backup
password=meinPasswort

# CREATE USER 'Backup'@'localhost' IDENTIFIED BY 'meinPasswort';
# GRANT ALL PRIVILEGES ON *.* TO 'Backup'@'localhost';
# FLUSH PRIVILEGES;

# Sichert alle MySQL Datenbanken, Webverzeichnisse sowie die wichtigsten Systemeinstellungen in ein Verzeichniss
# /Backuppfad/scripte/diesesSkript.sh
# /Backuppfad/Name-des-Server/...

# Aktuellen Pfad des Scripts ermitteln
# Lösung stammt von https://stackoverflow.com/questions/59895/can-a-bash-script-tell-which-directory-it-is-stored-in
echo "Ermittle den Pfad für die Backup-Dateien ..."
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
    DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
    SOURCE="$(readlink "$SOURCE")"
    [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

# Der Backuppfad ist über unserem Scriptpfad:
BACKUPPATH="$( cd -P "$( dirname "$SOURCE" )" && cd .. && pwd )/$( hostname )"
echo "Pfad Datenbanken ist : ${BACKUPPATH}/databases"
echo "Pfad Webseiten ist ..: ${BACKUPPATH}/www"
echo "Pfad Sonstiges ist ..: ${BACKUPPATH}/other"

DATETIME=$(date '+%Y-%m-%d--%H-%M-%S')

echo "Erstelle ggf. die Verzeichnisse ..."
mkdir -p "${BACKUPPATH}/databases"
mkdir -p "${BACKUPPATH}/www"
mkdir -p "${BACKUPPATH}/other"

echo "Lösche Backupdateien älter als 7 Tage ..."
find "${BACKUPPATH}/databases" -type f -mtime +7 -delete
find "${BACKUPPATH}/www" -type f -mtime +7 -delete
find "${BACKUPPATH}/other" -type f -mtime +7 -delete

echo "Sichere alle Datenbanken ..."
for x in $(mysql -u$username -p$password -Bse 'show databases'); do
    case ${x} in
        information_schema|performance_schema|mysql)
            echo Skipping Database ${x} ...
            ;;
        *)
            echo Backup Database ${x} ...
            mysqldump -u$username -p$password $x | gzip > "${BACKUPPATH}/databases/${x}__${DATETIME}.sql.gz"
    esac
done
echo "Alle Datenbanken gesichert!"
echo "Sichere Webseiten ..."
for folder in $(ls /var/www); do
    case ${folder} in
        clients)
            echo Skipping Folder ${folders}
            ;;
        *)
            echo Backup Folder /var/www/${folder}
            /usr/bin/nice -n 19 tar -hczf "${BACKUPPATH}/www/${folder}_$DATETIME.tar.gz" /var/www/${folder} 1>/dev/null
            # tar Optionen:
            # c = create Archiv / neues Archiv erstellen
            # z = gzip = Mit gzip komprimieren
            # f = Filename = angegebene Arhcivdatei nutzen
            # h = Symbolischen Links folgen und die Dateien dahinter sichern
    esac
done
echo "Alle Webseiten gesichert!"

echo "Sichere Konfiguartionsdateien ..."
/usr/bin/nice -n 19 tar -czf "${BACKUPPATH}/other"/etc+more_$DATETIME.tar.gz /etc /root /usr/local/etc /usr/local/sbin 1>/dev/null
echo "Alle Konfigurationsdateien gesichert!"
echo "Fertig!"

Das Skript ausführbar machen:

chmod +x /BACKUP/scripts/UniversalBackup.sh

und testen:

/BACKUP/scripts/UniversalBackup.sh

Beispielausgabe:

Ermittle den Pfad für die Backup-Dateien ...
Pfad Datenbanken ist : /BACKUP/ionos-web02/databases
Pfad Webseiten ist ..: /BACKUP/ionos-web02/www
Pfad Sonstiges ist ..: /BACKUP/ionos-web02/other
Erstelle ggf. die Verzeichnisse ...
Lösche Backupdateien älter als 7 Tage ...
Sichere alle Datenbanken ...
Backup Database dbispconfig ...
Skipping Database information_schema ...
Backup Database matomo ...
Skipping Database mysql ...
Skipping Database performance_schema ...
Backup Database phpmyadmin ...
Backup Database sys ...
Backup Database wikiznilnet ...
Alle Datenbanken gesichert!
Sichere Webseiten ...
Backup Folder /var/www/apps
tar: Entferne führende „/“ von Elementnamen
Backup Folder /var/www/bernhardlinz.de
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/checkip.znil.org
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/cisco.znil.net
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Skipping Folder
Backup Folder /var/www/conf
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/html
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/ionos-web02.znil.org
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/ispconfig
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/lasselinz.de
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/linz.email
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/php-fcgi-scripts
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/rps.znil.net
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/webalizer
tar: Entferne führende „/“ von Elementnamen
Backup Folder /var/www/yasminlinz.de
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Backup Folder /var/www/znil.net
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
tar: /var/www/znil.net/log/access.log: Datei hat sich beim Lesen geändert.
Alle Webseiten gesichert!
Sichere Konfiguartionsdateien ...
tar: Entferne führende „/“ von Elementnamen
tar: Entferne führende „/“ von Zielen harter Verknüpfungen
Alle Konfigurationsdateien gesichert!
Fertig!

Der Zielordner sollte nun so aussehen:

root@ionos-web02:/BACKUP/scripts# ll /BACKUP/ionos-web02/
insgesamt 20K
drwxr-xr-x 5 root root 4,0K Jun 23 10:59 ./
drwxr-xr-x 4 root root 4,0K Jun 23 10:46 ../
drwxr-xr-x 2 root root 4,0K Jun 23 10:59 databases/
drwxr-xr-x 2 root root 4,0K Jun 23 11:00 other/
drwxr-xr-x 2 root root 4,0K Jun 23 10:59 www/
root@ionos-web02:/BACKUP/scripts# ll /BACKUP/ionos-web02/other/
insgesamt 2,3M
drwxr-xr-x 2 root root 4,0K Jun 23 11:00 ./
drwxr-xr-x 5 root root 4,0K Jun 23 10:59 ../
-rw-r--r-- 1 root root 2,3M Jun 23 11:00 etc+more_2024-06-23--10-59-07.tar.gz
root@ionos-web02:/BACKUP/scripts# ll /BACKUP/ionos-web02/www/
insgesamt 1,1G
drwxr-xr-x 2 root root 4,0K Jun 23 10:59 ./
drwxr-xr-x 5 root root 4,0K Jun 23 10:59 ../
-rw-r--r-- 1 root root  120 Jun 23 10:59 apps_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root  64K Jun 23 10:59 bernhardlinz.de_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 7,9K Jun 23 10:59 checkip.znil.org_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 329K Jun 23 10:59 cisco.znil.net_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root  24K Jun 23 10:59 conf_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 3,2K Jun 23 10:59 html_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root  94K Jun 23 10:59 ionos-web02.znil.org_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 3,0M Jun 23 10:59 ispconfig_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 2,6M Jun 23 10:59 lasselinz.de_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 1,7M Jun 23 10:59 linz.email_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 1,2K Jun 23 10:59 php-fcgi-scripts_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 1,4M Jun 23 10:59 rps.znil.net_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root  121 Jun 23 10:59 webalizer_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 1,7M Jun 23 10:59 yasminlinz.de_2024-06-23--10-59-07.tar.gz
-rw-r--r-- 1 root root 1,1G Jun 23 11:00 znil.net_2024-06-23--10-59-07.tar.gz
root@ionos-web02:/BACKUP/scripts# ll /BACKUP/ionos-web02/databases/
insgesamt 110M
drwxr-xr-x 2 root root 4,0K Jun 23 10:59 ./
drwxr-xr-x 5 root root 4,0K Jun 23 10:59 ../
-rw-r--r-- 1 root root  77K Jun 23 10:59 dbispconfig__2024-06-23--10-59-07.sql.gz
-rw-r--r-- 1 root root  81M Jun 23 10:59 matomo__2024-06-23--10-59-07.sql.gz
-rw-r--r-- 1 root root 2,7K Jun 23 10:59 phpmyadmin__2024-06-23--10-59-07.sql.gz
-rw-r--r-- 1 root root  21K Jun 23 10:59 sys__2024-06-23--10-59-07.sql.gz
-rw-r--r-- 1 root root  30M Jun 23 10:59 wikiznilnet__2024-06-23--10-59-07.sql.gz

Sehr schön. Nun bauen wir einen cronjob damit das auch automatisch passiert:

crontab -e

Und folgendes anhängen:

# Backup der Datenbanken etc
0 1 * * * /BACKUP/scripts/UniversalBackup.sh >/dev/null 2>&1

Führ den Job jeden Tag um 01:00 Uhr aus.
Es werden die letzten 7 Backups behalten.


CronJob für Reverse-Proxy Seiten

ISPConfig kümmert sich automatisch um die Erneuerung der Lets Encrypt Zertifikate.
Allerdings sabotiere ich das manchmal wenn ich bei einer Webseite eigene Reverse-Proxy Einstellungen mache, dann werden die Challange-Dateien nicht gefunden.
Ja, da müsste man entsprechende Ausnahmen einbauen, manchmal denke ich nicht dran.
Sicherheitshalber lasse ich deshalb auch immer einen Extra-Job für diese Fälle laufen:

crontab -e

und folgende Zeile anhängen:

# Von Lösung für Apache Reverse Proxy Seiten
59 4 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh --standalone --pre-hook "systemctl stop apache2.service" --post-hook "systemctl start apache2.service" 2>&1 >/dev/null

verlängert alle Zertifikate die dran sind um 04:59 Uhr.
Sollten Zertifikate dran sein, so wird der Apache kurz gestoppt, er macht selbst einen Webserver auf, verlängert die Zertifikate und startet den Apache wieder.<vr> Um die Uhrzeit sollte es nicht stören.


Fail2Ban reparieren

Es gibt einen Fehler in Ubuntu 24.04 LTS (Stand 23.06.2024) der verhindert das der Fail2Ban Dienst startet. Den hat ISPConfig mit installiert.
Dem Dienst fehlt ein Pythen-Paket welches wir wie folgt zwangsweise auf unser System bekommen (Die einfache Variante ohne Enviroment):

apt install python3-pip
pip3 install pyasynchat --break-system-packages
systemctl start fail2ban.service
systemctl status fail2ban.service

Gefunden habe ich die Lösung hier:


Cockpit installieren und von außen Zugänglich machen

Cockpit ist eine Weboberfläche die unabhängig vom Apache2 läuft und euch verschiedene Tools für das Management des Servers bereitstellen kann.
Ich bin eigentlich nur scharf auf das Terminal, so kann man über die Weboberfläche ein paar SSH Befehle absetzten.

ClipCapIt-240623-124228.PNG
apt install cockpit
systemctl enable --now cockpit.service

und schon lauscht der Server auch unter Port https://213.165.83.96:9090 mit einem selbst signierten Zertifikat (Nein, ist für euch nicht erreichbar, in Firewall gesperrt).
Per Default darf sich der root natürlich nicht anmelden.
Wer das erlauben möchte muss die Datei

nano /etc/cockpit/disallowed-users

bearbeiten und den root dort löschen / auskommentieren und den Dienst neu starten.

# List of users which are not allowed to login to Cockpit
#root

Wer Cockpit dann hinter einer Subdomain über ISPConfig erreichbar machen will,
erstellen eine neue Webseite, PHP deaktiviert, und auf dem Reter Options kopiert Ihr folgendes in der Feld Apache Directives::

SSLProxyEngine On
RequestHeader set Front-End-Https "On"
ProxyPreserveHost On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
ProxyPass / https://127.0.0.1:9090/
ProxyPassReverse / https://127.0.0.1:9090/
ProxyPass /socket ws://127.0.0.1:9090/socket
ProxyPassReverse /socket ws://127.0.0.1:9090/socket

<Location "/cockpit/socket">
    ProxyPass "wss://127.0.0.1:9090/cockpit/socket"
</Location>

Kommentare

<comments />