Lesezeit: ~30 Minuten
Wir werden heute gemeinsam eine Webseite ins Leben rufen. 🙂
Ich werde 3 verschiedene Möglichkeiten im Thema „Webseite erstellen“ aufzeigen.
- Privat in einer virtuellen Umgebung für die neuen die nur schauen wollen.
- Public in einer virtuellen Umgebung.
- Public auf eigener Hardware.
Bei der Frage „Was brauche ich nun alles?“ kommt es nun darauf an wie ihr eure Webseite erstellen wollt.
Diese Anleitung beinhält lediglich eine Zusammenfassung der Schritte die mindestens nötig sind, um den Traum einer Webseite zu verwirklichen. Es wird, wie bei jedem Projekt in der Welt der Informatik, zu Problemen kommen. (Falls nicht, habt ihr ziemlich Glück oder Ich schreibe gute Anleitungen.)
Teil 0
Bevor wir beginnen, schauen wir nach was ihr für eure Webseite braucht.
Dafür habe ich diesen Beitrag geschrieben, welcher sich nur um die Dinge dreht die man alles theoretisch braucht.
Private Webseite nur für mich zum rumspielen.
– Eine Software für virtuelle Maschinen oder einen eigenen Server wie ein Raspberry Pi.
– Eine Linuxinstallationsdatei.
Public Webseite auf einem virtuellen Public Server.
– Einen gemieteten Webserver.
– Eine Domain.
Public Webseite auf meiner eigenen Hardware.
– Einen eigenen Server. Ein Raspi zum Beispiel.
Dinge die ich ebenfalls besprechen werde.
– Server hardening.
– VPN Service einrichten.
– SSL einrichten. Für HTTPS.
– Cloudflare einrichten. Für Country und Botblock.
– Erweitertes einrichten von Cloudflare Zerotrust Tunnel. Um Public auf eigener Hardware zu hosten.
– Installieren und Konfigurieren von WordPress.
Ich werde in dieser Anleitung einen virtuellen Public Server bei einem Hosting Dienst manuell mit WordPress aufsetzen und konfigurieren. Ich werde jedoch für alle 3 Möglichkeiten dies alles zu hosten die jeweiligen Schritte erklären.
Diese Anleitung erfordert ein ganz klein wenig Vorerfahrung in Sachen Computing und Servermanagement, jedoch ist dieser Beitrag für Anfänger gedacht. 🙂
Diese Anleitung ist in 2 Teile aufgeteilt:
– Der Webserver.
– Die Webseite.

Teil 1 Der Webserver
Schritt 1
Installation
Nun zu aller erst müssen wir die Maschine, egal ob virtuell bei einem Anbieter oder Daheim auf dem Server installieren. Ich verwende für mein Beispiel eine Ubuntu 23.10 Nanode mit 1GB RAM und 1 CPU Core bei Linode.
Bei einem Raspberry Pi wird das OS Raspian sein und in einer virtuellen Software Umgebung kann eine Ubuntu Img Datei installiert werden.
Meine Anleitung erstelle ich in einer Umgebung, wo ich nur Konsolenzugang habe. Daher sollte jeder jeden Schritt umsetzen können.
Verbinde dich per SSH mit dem Server oder öffne die Konsole wenn du einen Bildschirm angeschlossen hast.
ssh root@dein_server_ip
Oder verwende Tools wie Putty oder SSH Extension in Visual Studio Code <– Hilfreich
Mehr dazu im unteren Schritt.
Schritt 1
Benutzer und SSH
Benutzer einrichten
Ich gehe nun davon aus, dass ihr nun vor dem Konsolenfenster einer frisch installierten Ubuntu Maschine sitzt. Die folgenden Schritte sollten bei allen 3 Möglichkeiten umgesetzt werden.
Tipp: Mit clear löscht löscht ihr alles was in der Konsole angezeigt wird.
Der Befehl welcher bei jeder frischen Linux Maschine als erstes ausgeführt werden sollte ist:
sudo apt update && sudo apt upgrade -y
Schritt 1 Neuen Sudo User einrichten. <– Muss als Root ausgeführt werden.>
sudo adduser <neuer_benutzer> sudo usermod -aG sudo <neuer_benutzer>

Stellen wir nun ein, dass das Userpasswort beim verwenden des sudo Befehles alle X Minuten abgefragt wird. Öffnen wir die config für die Rooteinstellungen und fügen eine Regel für den neuen Benutzer hinzu.
sudo visudo
Finde die Zeile:
root ALL=(ALL:ALL) ALL
und füge folgendes darunter ein: ohne die <
<neuer_benutzer> ALL=(ALL:ALL) ALL Defaults:<neuer_benutzer> timestamp_timeout=X

CRTL+X und dann Y drücken um das Dokument zu speichern und zu verlassen mit ENTER.
Nun testen wir den neuen User, indem wir 2x fragen wer wir sind (Who Am I). Beim ersten Mal sollte das Passwort des Users abgefragt werden beim zweiten mal nicht mehr für X Minuten.
su <neuer_benutzer> sudo whoami sudo su
Wenn die Antwort root ist, können wir weiter machen. 🙂
sudo su
Um wieder zum Root Account zu wechseln.
SSH konfigurieren.
Achtung: Dieser Vorgang ist für jegliche Art Server wichtig. Egal ob private Hardware unter dem eigenen Tisch oder gemietet bei einem Rechenzentrum.
SSH ist bei Servern eine der Wichtigsten Schnittstellen und somit auch die eine die am meisten angegriffen wird.
Wenn ihr einen gemieteten Server bei einem Hostinganbieter habt, könnt ihr ja wenn ihr Neugierig seid mal in den Logs nachschauen ob bereits jemand fremdes in der kurzen zeit bei euch anklopft.
sudo cat /var/log/auth.log | grep "invalid user"
Wir sollten zuerst den Login auf den Root Account per SSH deaktivieren. Wird nach reboot übernommen, also stellt sicher dass ihr das Passwort des neuen Benutzers kennt.
sudo nano /etc/ssh/sshd_config
In der Konfigurationsdatei suche nach der Zeile, die PermitRootLogin enthält. Ändere sie zu:
PermitRootLogin no
Ihr könnt dort ebenso den Port für SSH von 22 auf etwas anderes legen, dies gewährleistet etwas mehr Sicherheit, kann aber zu Problemen führen. Dafür die Zeile:
#Port: 22
Auskommentieren und verändern. Macht euch davor schlau wo ihr den hinsetzt.
Dann erneut CRTL+X und Y dann ENTER.
Es gibt verschiedene Arten sich über SSH anzumelden.
– Standardmäßig mit Befehl und Passwort in der Konsole.
– Mit einer Keyfile in der Konsole.
– Mit einer Software wie PuTTY.
– Oder was ich persönlich am besten finde und empfehle ist die SSH Extension in Visual Studio Code mit einer Keyfile.
Bei SSH kann man sich wie folgt anmelden:
ssh <Benutzer>@<Server_IP>
Mit Keyfile
ssh -i „Pfad/zur/keyfile.pem“ <Benutzer>@<Server_IP>
Ich zeige euch nun wie ich persönlich meine SSH Verbindungen manage.
– Per .bat Skript und Keyfile zu einem Server aus einer Liste verbinden.
– Die SSH Extension in VSCode.
Keys generieren
Der nächste Schritt kann je nach Betriebssystems eures Computers variieren.
Ich verwende Windows.
Erstellt auf eurem eigenen PC auf dem Desktop oder wo auch immer den Ordner XCON.
Und in diesem die Datei login.txt und den Ordner keys.

Nun öffnen wir den Ordner keys und geben oben in der Suchleiste den Befehl cmd ein.
Nun wird ein Befehlsfenster geöffnet. Wir geben den Befehl
ssh-keygen
ein und folgen dem Prozess. Den Namen setzt ihr selbst. Es muss <key_name>.pem sein.
Ein passphrase muss nicht zwingend gesetzt werden.

Ihr findet nun 2 Dateien in dem Ordner keys. Öffnet die „<key_name>.public.pem“ im Texteditor und kopiert den Inhalt. Dieser sollte mit ssh-rsa beginnen.
Wechselt nun zurück zum Server
Stellt sicher dass ihr mit dem User angemeldet seid, welchen wir vorhin erstellt haben.
Tipp: su <neuer_benutzer>
Führt die folgenden Befehle aus.
mkdir ~/.ssh nano ~/.ssh/authorized_keys
Ihr erstellt einen versteckten Ordner .ssh im Homeverzeichnis des derzeit angemeldeten Benutzer ~/.
Dann wird die Datei authorized_keys erstellt und geöffnet.
Füge hier nun den gesamten Inhalt der Datei mit dem öffentlichen Schlüssel ein.
Tipp: CRTL+X dann Y dann ENTER.
Starten wir den SSH Dienst neu und verbinden uns neu zum Server um das konfigurieren des Keys zu bestätigen.
sudo systemctl restart ssh exit
Stelle sicher dass du die Verbindung zum Server per SSH trennst.
Nun solltest du dich mit:
ssh -i "/pfad/zur/key.pem" <Benutzer>@<IP>
Für dem Login verwenden wir nicht die <key>.public.pem sondern die <key>.pem Datei.
Das Skript für Windows.
Öffne nun die login.txt Datei die wir vorhin erstellt haben. Fügt den folgenden Code in die Datei.
Passt die Namen und Adressen in den <> an, diese dürfen nicht mitgeschrieben werden!
- <Server_Anzeige_Name> = Wie er in der Liste angezeigt wird.
- set keypath=keys/<key_name>.pem = Den Namen den ihr beim generieren des keys eingegeben habt. Oder falls ihr das Skript in den Ordner des Benutzers selbst legen wollt, damit ihr es schneller starten könnt, denn das normale öffnen von CMD startet in diesem Ordner, dann müsst ihr den kompletten Pfad zur Datei angeben.
- && set hostname=“SERVER_IP“ = Die IP eures Servers.
- && set user=“LOGIN_USERNAME“ = Den Benutzer, in dessen Homeverzeichnis ihr den Key bei authorized_keys abgespeichert habt.
@echo off
setlocal enabledelayedexpansion
:menu
cls
echo Select an option:
echo 1. Login to host
echo 2. Generate new Key
echo 3. Ping a Server.
echo 4. Exit
echo.
set /p choice="Enter your choice: "
if "%choice%"=="1" goto login
if "%choice%"=="2" goto config
if "%choice%"=="3" goto ping
if "%choice%"=="4" goto end
if "%choice%"=="exit" goto end
if "%choice%"=="x" goto end
goto menu
:login
cls
echo Select a host:
echo 1. <Server_Anzeige_Name>
echo.
set /p hostchoice="Enter your choice: "
if "%hostchoice%"=="1" set keypath=keys/<key_name>.pem && set hostname="SERVER_IP" && set user="LOGIN_USERNAME"
ssh -i !keypath! !user!@!hostname!
goto menu
:ping
cls
echo Select a host to ping:
echo 1. <Server_Anzeige_Name>
echo.
set /p hostchoice="Enter your choice or type an address: "
if "%hostchoice%"=="1" (
set hostname="<Server_Adresse>"
) else (
set hostname=%hostchoice%
)
ping %hostname%
set /p continue="Press Enter to continue"
goto menu
:config
cls
echo Configuring new host...
set /p newhost="Enter new host name: "
ssh-keygen -t rsa -b 2048 -f keys/%newhost%.pem
echo New SSH key generated for %newhost%
echo Bitte manuell in die login.bat als Option einfügen
echo .
pause
goto menu
:end
endlocal
Dann benenne die login.txt in login.bat um und führe diese aus. Es sollte sich ein Fenster öffnen bei welchem du dich bei dem nun konfigurierten Server mit dem Schlüssel anmelden kannst oder einen neuen key generieren kannst. Ebenso kannst du einen Server anpingen um zu sehen ob er Online ist.
Wähle den Server aus und prüfe ob er sich automatisch anmeldet.
Stellt sicher dass niemand an diese keydateien kommt!
SSH Extension VS-Code
Geht in Visual Studio Code auf der linken Seite auf Extensions und sucht nach Remote SSH.

Nun findet ihr in der linken Spalte einen weiteren Menüpunkt Remote Explorer.
Geht bei SSH auf das Zahnrad und wählt die */.ssh/config von eurem User aus.
Dort fügt ihr folgendes ein:
Host <Anzeige_Name> HostName <Server_IP> IdentityFile <Vollständiger Pfad zur *.pem Datei> User <Benutzername>
Drückt nun CRTL+S zum speichern und geht über den SSH in der linken Spalte bei Remotes (Tunnels/SSH) auf das Refresh Symbol.
Dann klickt auf den Pfeil neben eurem eingetragenen Server.
Ihr könnt nun, wenn es erfolgreich war, links oben im Reiter unter File und Open Folder einen Ordner auswählen in dem ihr arbeiten wollt, oder mit der Option Terminal die Konsole auf dem Server öffnen.
Solange ihr den Pfad zur Keyfile richtig angegeben habt, solltet ihr kein Passwort eingeben müssen.
Ende SSH Konfiguration
Schritt 2
Installation notwendiger Pakete
Bevor wir nun einen notwendigen Neustart des Servers vornehmen, werden wir alle notwendigen Pakete für dieses Projekt installieren.
Folgende Pakete werden installiert:
- Apache2 – der Webserver. Wird mit enable bei jedem Start automatisch gestartet.
- PHP – die Skriptsprache, die WordPress und viele andere Webseiten verwenden.
- Weitere PHP-Module, die für WordPress und andere Webseiten erforderlich sind:
- libapache2-mod-php um PHP mit Apache zu integrieren.
- php-mysql um PHP die Kommunikation mit der MySQL-Datenbank zu ermöglichen.
- php-curl, php-gd, php-xml, php-mbstring, php-xmlrpc, php-soap, php-intl, php-zip sind zusätzliche PHP-Module, die von WordPress für verschiedene Funktionen benötigt werden.
- MySQL-Server – das Datenbankmanagementsystem. Ebenso mit enable. Für Raspi maria-db.
- Htop – Monitoring Tool für Auslastung der Hardware und Tasks des Servers.
- Net-Tools – Für das Abrufen von Netzwerkdetails wie IP.
- Zip – Tool zum verwalten von komprimierten Dateien.
- curl: Um Dateien aus dem Internet herunterzuladen.
- OPTIONAL: UFW (Uncomlicated FireWall) Mit welcher ihr einfach Ports managen könnt, ist empfohlen bei Public Servern auf einem Hoster.
sudo apt install apache2 php libapache2-mod-php mysql-server php-mysql php-curl php-gd php-xml php-mbstring php-xmlrpc php-soap php-intl php-zip htop net-tools zip curl -y sudo systemctl start apache2 sudo systemctl enable apache2 sudo systemctl start mysql sudo systemctl enable mysql
sudo apt install ufw
Um zu prüfen ob alle Services laufen führen wir nun folgenden Befehl aus.
echo "--------------------"
if sudo systemctl status apache2 | grep -q "active (running)"; then
echo "Apache ist erfolgreich installiert und läuft."
else
echo "Es gab ein Problem beim Starten von Apache."
fi
if sudo systemctl status mysql | grep -q "active (running)"; then
echo "MySQL ist erfolgreich installiert und läuft."
else
echo "Es gab ein Problem beim Starten von MySQL."
fi
echo "--------------------"
Nun machen wir noch den MySQL-Server etwas sicherer.
sudo mysql_secure_installation
Einstellungen der secure installation:
- VALIDATE PASSWORD: No
- Anonymous Users: Yes
- Disallow root login remotely: No
- Remove test database: Yes
- Reload Privilege table: Yes
Und wir richten die Berechtigung für den WebUser ein. Der WebUser ist einer der System Accounts auf Linux und ist für den abgeschirmten Bereich der Webseiten zuständig.
Ebenso erteilen wir unserem neu erstellten User die Rechte in dem Ordner arbeiten zu dürfen.
Der Standart-Ordner für die Dateien einer Webseite (unter Apache2) ist /var/www/html.
sudo chown -R www-data:www-data /var/www/html sudo usermod -aG www-data <neuer_benutzer> sudo chgrp -R www-data /var/www/html sudo chmod -R g+w /var/www/html sudo systemctl restart apache2
Und dann ist es auch schon Zeit für das erste mal
sudo systemctl reboot
Schritt 3
VPN und Firewall
Nun, wie sich jeder denken kann, ist es ein Luxus und auch etwas sehr hilfreiches, wenn man theoretisch gesehen von überall wo man gerade ist, auf seinen Server komplett zugreifen kann, ohne dass das gleichzeitig auch jemand anderes kann. Dies brauchst du nur, wenn du die Webseite wirklich dauerhaft online haben willst.
Während das VPN für alle hilfreich sein kann, ist die Firewall für manche vielleicht von Nachteil.
Zum Beispiel wenn du planst deine Webseite auf eigener Hardware und einem Cloudflare Tunnel zu hosten. Dann solltest du vielleicht nur das VPN aufsetzen.
Falls du kein Interesse an einem VPN hast und keine Firewall brauchst, da deine Webseite nicht öffentlich sein soll, dann kannst du weiter zu Teil 2 Schritt 1 > WordPress installieren.
Zerotier-One VPN Einrichten
Zerotier-One ist ein super VPN welches ich bereits eine Weile nutze. Du kannst all deine Geräte, egal ob Linux, Windows, Mac, Android oder Apple, in ein privates Netzwerk stecken in das du dich jederzeit verbinden kannst und all die Geräte erreichen kannst, die in diesem Netzwerk sind.
Es ist einfach zu managen und macht selten Ärger. Alles macht mal Ärger…
Erstelle dir auf der Webseite einen Account und klicke auf Create A Network.
Danach wähle das neue Netzwerk in der Liste aus, speichere dir die Network ID und passe folgende Werte an.
- Name: Setze den Anzeigenamen.
- Access Control: Private.
- IPv4 Auto Assign: Wähle deine IP-Range. Beispiel: 192.168.191.* ist einfach zu merken.
Installiere dir Zerotier entweder auf deinem Smartphone oder auf deinem Hauptrechner und versuche der Network ID beizutreten. Ihr müsst nichts außer die Network ID eingeben oder ändern. Da das Network auf Privat gesetzt ist, muss jeder neu beigetretene Benutzer über dieses Dashboard von euch zugelassen werden. Das solltet ihr bei Members mit der Checkbox Auth machen können.
Ihr könnt dem Gerät dann auch eine neue interne IP im Netzwerk zuweisen.

Auf dem Webserver werden wir nun den folgenden Befehl ausführen, damit dieser ebenso dem Netzwerk beitreten kann. Wir laden das Paket herunter, führen es aus und enable den VPN Service für jeden Start automatisch. Ebenso wählt dieser Befehl automatisch das Betriebssystem aus, daher kann er auf jeder unterstützten Linux Distribution ausgeführt werden.
sudo curl -s https://install.zerotier.com | sudo bash sudo zerotier-cli join <Netword_ID>
Wenn ihr die Nachricht 200 join OK erhaltet, sollte nun ein weiteres Gerät in eurem Netzwerk auftauchen. Authentifiziert dieses, weist ihm eine neue IP zu und testet das Netzwerk.
Tipp: Stellt bei jedem Gerät, wenn ihr eine eigene IP verteilt, Do Not Auto Assign IP an.

Ich habe meinem Webserver die IP 192.168.191.15 gegeben und meinem anderen Gerät die IP 192.168.191.10.
Nun testen wir mal die Verbindung und versuchen vom Server mein anderes Gerät zu erreichen.
Zuvor jedoch müssen wir einen Reboot des Serversmachen!
Nach dem Reboot schreiben wir den Befehl
ifconfig
Du solltest nun ein mehrere Sachen sehen. Eines davon sollte in etwa so aussehen. der zt* name ist bei euch anders:
ztgask7ss: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 2800
inet 192.168.192.15 netmask 255.255.255.0 broadcast 192.168.192.2550x20<link>
ether ff:ff:fa:ff:fb:ff txqueuelen 1000 (Ethernet)
RX packets 12 bytes 1320 (1.3 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13 bytes 1006 (1.0 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Versuchen wir nun eines der anderen Gerät im VPN zu erreichen vom Server aus.
ping <IP des anderen Gerätes>

Nun da die Verbindung steht, könnt ihr bei all euren Einstellungen, Skripts oder Notizen die VPN IP des Gerätes hinzufügen. Solange ein Gerät Internet hat und in diesem VPN aktiv verbunden ist, kann man alle Geräte und deren Services erreichen. Ihr könnt euren Server / euer Gerät nun von überall aus erreichen.
Zum Beispiel: ssh <Benutzer>@<VPN_Server_IP>
Ende VPN Einrichtung
Einrichtung Firewall
Dieser Abschnitt ist an die gerichtet, die einen Public Server bei einem Hoster, nicht über Cloudflare Tunnel, haben. Leser die dieses Projekt nicht öffentlich machen sondern erstmal herumspielen, können diese Schritte ebenso umsetzen. Jedoch ist vorausgesetzt jegliche VPN Lösung auf den Server zu haben.
Wenn du deinen Webserver nur für dich zum rumspielen haben willst, oder planst diesen mit einem Cloudflare Tunnel zu hosten, dann ist dieser Teil nicht notwendig.
Wenn du einen Server über einen Cloudflare Tunnel in die Welt setzen willst, dann solltest du nach dem Teil 2 den Extras Teil lesen, dort erkläre ich wie ihr ohne eine eigene Public IP über CloudFlare eure Webseite sicher ins Netz stellen könnt. Die Firewall könnt ihr direkt über CloudFlare managen, eine zweite Firewall wie UFW kann hier Schwierigkeiten machen.
In diesem Punkt schauen wir an, wie wir die Ports des Servers managen. Auch genannt Server Hardening.
Stellt sicher dass ihr UFW (Uncomplicated FireWall) installiert habt.
sudo apt install ufw
Ports die zu managen sind:
- Port 80: HTTP Webanfragen. Bei einem Public Server sollte dieser an HTTPS also Port 443 weiterleiten, da dieser verschlüsselt ist. Lese hierfür den Beitrag.
- Port 443: HTTPS Webanfragen. Hierfür müssen Public Server ein SSL Zertifikat besitzen und dafür benötigt man eine Domain. mehr dazu im verlinkten Beitrag bei Port 80.
- Port 22 und 21: Der SSH Port (22), oder falls ihr diesen bei der SSH Konfiguration oben geändert habt dann dieser, sollte nur über das VPN erreichbar sein. Daher werden wir nun UFW konfigurieren.
Stellt sicher dass ihr dies installiert habt oben!
Ebenso wird der FTP (FileTransportProtokoll) service auf dem Port 21 für das VPN geöffnet. - Optional. Port 5900: Für das verbinden mit VNC, also einer Remote Desktop Verbindung für Linux.
UFW Konfiguration.
Nun setzen wir uns an die Firewall. Achtung! Bei diesem Teil besteht die Gefahr dass ihr euch aus dem Server ausschließt! Stellt sicher dass ihr, zB bei Public Hostern wie Linode noch Zugriff über die LISH Console oder einem anderen Weg wie einen angeschlossenen Bildschirm Zugriff habt.
Falls ihr das VPN nicht installiert habt, könnt ihr statt der IP des VPN hier, auch die interne IP des Servers in eurem eigenen Netzwerk verwenden.
- Öffnen der Ports 80 und 443 für die Welt.
- Port 22/ssh und 21/ftp werden für das VPN geöffnet.
- IP Range eures Netwzerkes, zB bei mir 192.168.191.0/24.
ufw enable ufw allow 80/tcp ufw allow 443/tcp sudo ufw allow from <eure IP Range>/24 to any port 22 sudo ufw allow from <eure IP Range>/24 to any port 21
Falls ihr IPv6 für euren Server deaktivieren wollt, müsst ihr die Regeln dafür löschen. Löscht nun alle (v6) Regeln.

Optional: Wenn ihr eine weitere Sicherheitsebene erschaffen und den Port 22 doppelt absichern wollt, dann könnt ihr in der Konfigurationsdatei von SSH die Adresse des Servers angeben wo der Service lauschen soll. Dies ist jedoch nicht notwendig und kann zu Problemen führen. <-<
sudo nano /etc/ssh/sshd_config

Nun werden wir dies mal prüfen. Wir werden nun ein Tool verwenden um die offenen Ports des Webservers zu scannen um sicher zu gehen dass wir alles korrekt eingestellt haben.
Wir gehen davon aus dass wir die Konfiguration mit dem Zerotiernetzwerk gemacht haben und einen Server mit Public IP nutzen. Für die die die Zerotier Lösung nutzen und nur ein bisschen in einer virtuellen Umgebung spielen wollen, wäre dies dann die IP des Servers in eurem privaten Netzwerk.
Hierfür benötigen wir:
- Die öffentliche IP des Webservers. Oder bei denen die nur herumspielen die interne IP in eurem WLAN oder anderem privaten Netzwerk. Nicht das VPN.
- Die IP für den Server im VPN.
- Einen Port Scanner.
Portscanner
Windows & Linux: Hier empfehle ich ZenMap.
Fangen wir an mit der VPN IP des Servers. Stelle sicher dass das Gerät mit welchem du scannst auch im VPN ist. Für sonstiges müsste dieses Gerät im selben WLAN / Netzwerk sein.
Wir wählen Regular Scan und befeuern den Scanner auf die IP.
Den Befehl / Command den ihr bei Linux in der Konsole eingeben müsst, wenn ihr keine Grafische Oberfläche habt steht ebenso im Screenshot.

Super, alle Ports die ich über das VPN offen haben will sind erreichbar und sonst sind alle zu.
Schauen wir doch mal die Public IP an.

Wundervoll, nun kann niemand mehr über die Public IP des Servers an den SSH oder andere mögliche Ports anklopfen.
Jedoch wollen wir erstmal während der Konfiguration von WordPress welche nun folgt, dass niemand an den Server anklopft. Daher stellen wir alle Ports auf das VPN um. Falls ihr einen Public Server habt.
Wenn ihr ein SSL Zertifikat aufsetzen wollt, dann führt erst den nachfolgenden Teil erst nach Schritt 4 aus und dann diese Befehle unten.
sudo ufw status numbered sudo ufw delete <Nummer Port 80> sudo ufw delete <Nummer Port 443>
sudo ufw allow from <eure IP Range>/24 to any port 80 sudo ufw allow from <eure IP Range>/24 to any port 443 ufw reload
Dies könnt ihr in umgekehrter Reihenfolge später wieder ändern, so dass die Ports 80 und 443 wieder in die Welt zeigen.
Ende Firewall
Schritt 4
Das SSL Zertifikat und Domain
Kümmern wir uns also nun darum dass wir HTTPS nutzen können. Wenn ihr keine Domain habt ist das nicht schlimm. Ihr werdet dann beim Aufrufen der Webseite immer diese Warnung sehen, da der Browser und der Webserver dann unverschlüsselt miteinander kommunizieren. Das bedeutet aber, das eure Webseite so gesehen nicht sicher für das World Wide Web ist!

Hinweis: Für die die planen ihre Webseite auf eigener Hardware, ohne ihre eigene Public IP zu nutzen, für die Öffentlichkeit zu hosten, sollten diesen Schritt überspringen und am Ende im Extras Teil den Schritt für CloudFlare Tunnel umsetzen!
Für das SSL Zertifikat verwenden wir das Tool CertBot von Let’s Encrypt.
Zuerst müsst ihr in euren DNS Einträgen auf die Public IP mithilfe von A Records zeigen.
Zum Beispiel könnten eure DNS Einträge so aussehen:
A-Record für deine-webseite.com: Typ: A Name: @ (oder deine-webseite.com) Wert/Adresse: x.x.x.x A-Record für www.deine-webseite.com: Typ: A Name: www Wert/Adresse: x.x.x.x

Nun solltet ihr auf www.eure-domain.com oder http://eure-server-IP zum Beispiel gehen können und es wird die Standartseite von Apache 2 angezeigt.

Noch verwenden wir HTTP, also ist der gesamte Datenaustausch zwischen Browser und Webserver unverschlüsselt. Dies seht ihr ebenso hier in der Adresszeile.

Für CertBot benötigen wir ein paar Dinge. Zuerst müssen wir den Snapd Store installieren und den CertBot.
sudo apt update sudo apt install snapd sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot
Ihr könnt mit CertBot das SSL Zertifikat vollständig automatisiert aufsetzen lassen
sudo ufw allow 'OpenSSH' sudo ufw reload sudo certbot --apache
Ablauf SSL Zertifikat:
- Email angeben. Ihr müsst eine Kontakt Emailadresse hinterlegen. Diese wird nicht im SSL Zertifikat für Besucher zu sehen sein.
- Terms of Service. Die üblichen AGB. Zustimmen, Seele verkaufen und weiter gehts.
- Email teilen. Willst du deine Email mit Let’s Encrypt und Partnern teilen. Also Datenweitergabe zustimmen?
- Domain Name eingeben. Beispiel deine-domain.com. Ohne ‚www‘ oder so.
Nun abwarten und darauf hoffen dass kein Fehler passiert.
Wenn alles gut geht, müsst ihr euren Serverkönnt ihr eure domain (deine-domain.com) aufrufen und solltet ein Schloss sehen.

Nun da unsere Domain und das SSL Zertifikat fertig eingerichtet sind, sollten wir die Firewall wieder für die Welt öffnen.
Dies ist wichtig da nun der Prozess zum einstellen oder erstellen der Webseite beginnt!
Also beide Ports für die Regel OpenSSH, die Regel für Port 80 und für 443 löschen und 80 sowie 443 auf das VPN stellen. Scroll dafür etwas weiter hoch.
Somit könnt ihr mit http://VPN-IP-des-Servers die Webseite aufrufen und ansehen, die Welt jedoch nicht.
Nun haben wir den ersten Teil abgeschlossen. Der Webserver ist eingerichtet und konfiguriert.
Wie ihr nun auf eurem Webserver die Webseite einrichtet, ist euch überlassen.
Ich werde nun, im folgenden Teil 2 den Webseiten-Baukasten WordPress nutzen.
Teil 2 WordPress

Schritt 1
WordPress installieren
Nun sind wir an dem Punkt wo wir das WordPress Umfeld installieren. Aber was is eigentlich WordPress?
WordPress ist ein beliebtes und benutzerfreundliches Content-Management-System (CMS), das ursprünglich für Blogs entwickelt wurde, aber jetzt für alle Arten von Websites genutzt wird. Es ist kostenlos, open-source und zeichnet sich durch eine einfache Bedienung aus. Mit einer Vielzahl an anpassbaren Designvorlagen (Themes) und funktionalen Erweiterungen (Plugins) ermöglicht WordPress individuelle Gestaltung und Funktionalität. Es ist SEO-optimiert und bietet eine starke Community und regelmäßige Updates für Sicherheit und neue Features.
Bevor wir jedoch mit dem installieren von WordPress selbst beginnen, müssen wir die MySQL-Datenbank für WordPress einrichten.
Bevor wir dies tun, nehmen wir nun einen Notizzettel oder eine Textdatei uns notieren und die folgenden Dinge:
DB_NAME: (Name der Datenbank für wordpress, am besten "wordpress".) DB_USER: (User welcher von WordPress verwendet wird.) DB_PASSWORD: (Das Passwort des Users für die Datenbank.) Wordpress-Benutzername: (Der Adminaccount bei WordPress selbst.) Wordpressuser-Passwort: (Das Passwort für den Adminaccount.) MySQL-Root-Passwort: (Optional)
Hinweis: Ich rate an dieser Stelle, da wir Befehle ausführen und Dateien auf den Server schieben müssen, entweder die SSH Extension in Visual Studio Code oder einen FTP (File Transfer Protokoll) Client wie FileZilla zu verwenden.
Dann führen wir die folgenden Befehle einzeln auf dem Webserver aus:
Nicht einfach Copy Paste, ihr müsst einiges ändern!
Tipp: Kopiert die Befehle in eine Textdatei, verändert die Werte und führt diese dann auf dem Server aus.
Optional: Passen wir nun den root Account von MySQL an:
- SET_PASSWD = Passwort für den Root Account.
sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '<MySQL-Root-Passwort>';" sudo mysql -e "FLUSH PRIVILEGES;"
Dann richten wir alles für WordPress ein:
Verwendet die Sachen die ihr oben notiert habt.
- SET_USER = WordPress User
- SET_PASSWD = WordPress User Passwort
- SET_DBNAME = Datenbankname
sudo mysql -e "CREATE USER '<DB_USER>'@'localhost' IDENTIFIED BY '<DB_PASSWORD>';" sudo mysql -e "GRANT ALL PRIVILEGES ON *.* TO '<DB_USER>'@'localhost' WITH GRANT OPTION;" sudo mysql -e "CREATE DATABASE <DB_NAME>;"
Diese Befehle werden direkt, ohne eine Verbindung mit mysql -u zu öffnen ausgeführt.
Ihr könnt das alles aber auch manuell in MySQL ausführen, nur dann ohne dem sudo mysql -e.

Nun laden wir uns den Ordner herunter, den wir für WordPress benötigen.
Klicke dafür hier.

Bevor wir jedoch WordPress auf den Server verschieben, entfernen wir die Standartindex Datei von Apache2.
sudo rm /var/www/html/index.html
Danach kopieren wir die heruntergeladene .zip Datei in den Ordner /var/www/html auf dem Server und entpacken diese. Dannach gehen wir in den entpackten Ordner wordpress und verschieben den Inhalt in den /var/www/html Ordner.
cd /var/www/html sudo unzip wordpress*.zip sudo rm wordpress*.zip cd wordpress mv * .. cd .. rm -r wordpress
Dannach haben wir folgende Struktur:

Nun machen wir der wp-config-sample.php namens wp-config.php. Öffnet diese und wir sehen den folgenden Inhalt:

Wir müssen nun folgende Dinge eintragen, damit diese von WordPress genutzt werden können:
- DB_NAME: Den Namen der Datenbank den wir in den Notizen festgelegt haben.
- DB_USER: Den User den wir notiert und erstellt haben.
- DB_PASSWORD: Das Passwort was wir festgelegt haben.
Wenn dies abgeschlossen ist, können wir mal die IP des Webservers auf dem Port 80 aufrufen.
Dann sollten wir dies sehen.

Hier könnt ihr nun von eurem Notizzettel den Benutzer und das Passwort eingeben, welchen ihr für WordPress benutzen wollt. Dies ist nicht der Benutzer den ihr in der Konfigurationsdatei eingegeben habt
Und dies ist auch schon das Ende des Teil 2. Wir haben nun erfolgreich einen WebServer konfiguriert und WordPress installiert.
Unter Appearance im AdminDashboard, unter Themes könnt ihr nun ein Theme für eure Webseite wählen oder etwas ganz eigenes mit einem Sitebuilder Plugin wie Elementor erstellen.
Im folgenden Extras Teil werde ich noch ein paar Extra Sachen besprechen wie:
- Cloudflare als Schutz vor die Domain setzen, zum Schutz gegen Angreifer, Countryblock und weiteres.
- Meine WordPress Plugins
- Webseite mit CloudFlare Tunnel hosten. Auf eigener Hardware ohne eigene Public IP zu nutzen.
Extras Teil
1. CloudFlare als Schutz vor Domain setzen.
Was ist Cloudflare?
Cloudflare ist ein globaler Service, der darauf abzielt, deine Website schneller und sicherer zu machen. Es funktioniert als eine Art Schutzschild zwischen deiner Website und den Besuchern, indem es den Datenverkehr über seine intelligenten globalen Netzwerke leitet. Die Hauptvorteile von Cloudflare sind:
- Erhöhte Geschwindigkeit: Durch das Caching von Inhalten an verschiedenen Orten weltweit (sogenannte Content Delivery Networks oder CDNs) können Seiten schneller geladen werden.
- Erhöhte Sicherheit: Cloudflare bietet Schutz vor DDoS-Angriffen, Datenlecks und anderen Arten von Cyberangriffen.
- SSL/TLS-Verschlüsselung: Dies sorgt für eine sichere Verbindung zwischen dem Besucher und Cloudflare und zwischen Cloudflare und deinem Server.
- Einfache DNS-Verwaltung: Cloudflare bietet eine benutzerfreundliche Oberfläche zur Verwaltung deiner DNS-Einstellungen.
Schritt 1: Anmeldung bei Cloudflare
- Besuche die Cloudflare-Website und erstelle ein Konto.
- Nach der Anmeldung wirst du aufgefordert, deine Website hinzuzufügen. Gib hier deine Domain ein.
Schritt 2: DNS-Einstellungen konfigurieren
- Cloudflare scannt automatisch deine DNS-Einstellungen. Dies kann einige Minuten dauern.
- Nach dem Scan zeigt Cloudflare alle DNS-Einträge deiner Website an. Überprüfe diese sorgfältig und stelle sicher, dass alle notwendigen Einträge vorhanden sind.
- Falls Änderungen erforderlich sind, kannst du sie direkt in der Cloudflare-Oberfläche vornehmen.
Schritt 3: Ändern der Nameserver
- Cloudflare wird dir zwei Nameserver zuweisen. Diese musst du bei deinem Domain-Registrar eintragen.
- Melde dich bei deinem Domain-Registrar an (z.B. GoDaddy, Namecheap, Hostpoint, etc.) und suche nach der Option, um die Nameserver zu ändern.
- Ersetze die vorhandenen Nameserver durch die von Cloudflare bereitgestellten. Dieser Schritt ist entscheidend, da er Cloudflare als deinen primären DNS-Manager etabliert.
Schritt 4: SSL/TLS-Konfiguration
- In deinem Cloudflare-Dashboard kannst du die SSL/TLS-Einstellungen anpassen.
- Wähle eine Verschlüsselungsstufe, die zu deiner Website passt. Für die meisten Websites ist die Option „Full“ angemessen.
Schritt 5: Abschluss und Überprüfung
- Nachdem du die Nameserver geändert hast, kann es einige Stunden dauern, bis die Änderungen weltweit wirksam werden.
- Überprüfe nach einigen Stunden, ob deine Website ordnungsgemäß über Cloudflare läuft. Du kannst dies tun, indem du das Cloudflare-Dashboard besuchst und nachsiehst, ob der Status deiner Website als „aktiv“ angezeigt wird.
Schritt 6: Konfiguration Countryblock
Wenn du zum Beispiel willst, dass nur Benutzer aus Deutschland, Österreich und der Schweiz auf deine Webseite können, kannst du folgendes tun:
- Unter Security bei WAF erstellst du nun die folgende Regel:

- Unter Security bei Bots schaltest du den Bot Fight Mode an.
Fertig, das war es schon 🙂 Nun sollten die meisten Angreifer die die deine Webseite scannen oder angreifen eine digitale Faust ins Gesicht bekommen.
2. WordPress Plugins die ich nutze.
Folgende Plugins verwende ich für meine Webseite:
- Backuply: Erlaubt es dir lokal und im GoogleDrive ein vollständiges Backup deiner ganzen Webseite, inklusive Datenbank zu machen.
- FileBird Lite: Erlaubt es dir deine Mediathek mit Bildern oder Dateien besser zu sortieren.
- Loginizer: Schutz des Loginfensters gegen verschiedene Attacken wie BruteForce.
- Restrict User Access: Um Bereiche deiner Webseite, wie bestimmte Kategorien oder Pages nur für bestimmte Benutzer zugänglich zu machen.
Achtung, dieses Plugin ist etwas kompliziert, aber Powerful! - Site Kit by Google: Um zu sehen von wo Benutzer deine Webseite aufrufen, wie lange sie wo lesen oder ob sie klicken und scrollen.
- Webhook for Discord: Um eine Benachrichtigung per Discord zu bekommen, wenn jemand einen Beitrag veröffentlicht. Dies ist nur sinnvoll, wenn noch andere Benutzer ausser du selbst Beiträge verfassen fürfen.
- WP Data Access: Um die Daten in der Datenbank von WordPress einfacher zu editieren, wie z.B User-Loginnamen oder Anzeigenamen.
- WP Mail SMTP: Um eine Benachrichtigung per Mail zu erhalten, wenn zb ein User sein Passwort ändert, ein neuer User erstellt wurde oder einem Benutzer einer Email zu schreiben um das Passwort zurück zu setzen. Achtung: Benötigt einen eigenen Mailserver!
- Popup Builder: Ja, für die kleinen nervigen Popups die es auf vielen Webseiten gibt. Ich benutze das aber nur für eine einzelne Page.
Das sind alle Plugins die ich verwende und sehr hilfreich finde.
3. Webseite mit Cloudflare ZeroTrust Tunnel.
Achtung, dieser Schritt kann weh tun und euch ein paar Haare und Nerven kosten. <-<
Wir gehen an diesem Schritt davon aus, dass ihr bereits euren Webserver, zum Beispiel ein Raspberry Pi bei euch daheim, als lokale/private Webseite eingerichtet ist.
Wichtig:
- Ihr dürft keine UFW Firewall aufgesetzt haben auf eurer lokalen Maschine, es kommt so oder so nix durch bei CloudFlare.
- Ihr müsst das Plugin Flexible SSL for CloudFlare in WordPress verwenden!
- Ihr dürft kein SSL Zertifikat über CertBot installiert haben! CloudFlare gibt euch automatisch ein SSL Zertifikat.
- Das VPN mit ZeroTier ist möglich.
Zuerst müssen wir bei unserer Domain, welche bereits über CloudFlare gemanaged wird, siehe Punkt 1 des Extras teil, aus dem DNS Register löschen, wo ihr die Domain gekauft habt löschen. Dies machen wir ab nun alles über CloudFlare.
- Geht im CloudFlare Dashboard auf Access und startet ZeroTrust.
- Geht auf Access und dann auf Tunnels.
- Erstellt einen neuen Tunnel. Gebt ihm einen Namen und dann seht ihr das folgende Fenster:

Wählt das Betriebssystem eures Servers aus und führt einen der Befehle aus welche angezeigt werden.
Als nächsten Schritt müssen wir die Route die Weiterleitung konfigurieren.
Hier ist das Beispiel meiner Webseite:
Bei euch steht nicht Public Hostname Page, da ich für das Bild meinen bereits bestehenden Tunnel verwende.

Bei URL gebt ihr die Interne/Private IP eures Servers in eurem eigenen Netzwerk ein.
Dies könnt ihr auf dem Server mit diesem Befehl herrausfinden:
ifconfig
Ihr könnt bedenkenlos HTTP angeben, da CloudFlare automatisch alles mit einem SSL-Zertifikat und somit als HTTPS in die Öffentlichkeit stellt.
Dannach könnt ihr auf den Tunnel gehen, dann auf Configure > Public Hostnames und dort Subdomains konfigurieren.
Wenn ihr die Einstellungen von meinem oben gezeigten Beispiel übernommen habt, ist eure Webseite derzeit nur über eure-domain.com erreichbar, nicht aber zum Beispiel über www.eure-domain.com.
Erstellt einen neuen Public-Hostnamen mit den gleichen Einstellungen, jedoch gebt Subdomain einfach www an. Dies sollte dann so aussehen:

Ihr könnt auf euren Server auch weitere Dienste wie zum Beispiel einen Emby oder Plex Mediaserver einrichten und zum Beispiel movie.deine-domain.com an diesen Port weiterleiten.
Ende Extras
Nun haben wir das Ende dieser Step-By-Step Anleitung erreicht. Dieser Beitrag war sehr viel Arbeit und ich hoffe ich konnte einigen von euch helfen, den Traum einer eigenen Webseite zu erfüllen.
Ich würde mich riesig um eine kleine Hilfe für mein ChatBot Projekt Ookami bedanken.
Eine kleine Paypal Spende würde meinem Projekt sehr helfen <3
Nun entlasse ich euch in die weite Welt des WWW und wünsche euch eine Menge Spaß.
Euer Wolf


