Wie man eine sinnvolle Standardkonfiguration in nginx anlegt
Einleitung
Der Standard in der default des nginx-Webservers gibt eine Seite aus, wenn keine explizite Konfiguration existert. Dies kann ein Tor für Angreifer sein, welches man durch Anpassung der default-Domain wie folgt verhindern kann
Voraussetzungen
Sie verfügen über einen hosting.de Cloud Server, welcher einen gültigen DNS-Eintrag, z.B.
demo.mustermann-domain.debesitzt.Eine privilegierte Shell auf dem System.
nginx ist auf dem Cloudserver bereits installiert
nginx default anpassen
Die Datei default (im Regelfall unter /etc/nginx/sites-enabled zu finden)
Folgende Inhalte werden dort nun eingetragen:
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_reject_handshake on;
server_name _;
return 444;
}
Danach die Nginx Konfiguration mit nginx-t auf Korrektheit prüfen und den Websever neustarten (systemctl restart nginx.service).
Hinweis
Mit dieser Konfiguration wird keine Webseite mehr ausgegeben, wenn der Server direkt mit der IP angesprochen wird. Vorher sollten entsprechende vHosts für Domains eingerichtet worden sein! Dennoch direkt über die IP aufgebaute Verbindungen werden mit Statuscode 444 beantwortet und direkt beendet. Durch die Direktive ssl_reject_handshake on; ist es nicht notwendig ein Zertifikat einzubinden.
Was ist eigentlich der „Standard-Server" von Nginx?
In Nginx ist der „Standard-Server" der Serverblock, der Anfragen bekommt, wenn kein anderer Serverblock zur Anfrage passt. Ob es passt, hängt normalerweise vom angeforderten Hostnamen (Host-Header) und der Listener-Konfiguration (Listen-Adresse/Port) ab. Wenn ein Client über die IP-Adresse verbindet, einen unbekannten Hostnamen nutzt oder die Anfrage zu keinem konfigurierten server_name passt, leitet Nginx sie an den Standard-Server für diese IP:Port-Kombi weiter.
Der Standard-Server ist keine spezielle „Funktionsseite", sondern einfach eine Regel, die festlegt, welcher Serverblock als Fallback dient. Dies ist im realen Betrieb wichtig, da nicht übereinstimmender Datenverkehr häufig vorkommt: Benutzer geben möglicherweise die Server-IP in einen Browser ein, Bots scannen öffentliche IPs oder eine Domain verweist möglicherweise noch auf Ihren Server, bevor Sie die DNS- oder Zertifikatsrichtung abgeschlossen haben. Durch die Definition eines kontrollierten Standard-Servers kannst Du vermeiden, versehentlich die falsche Website bereitzustellen, und erhalten ein vorhersehbares Verhalten für nicht übereinstimmende Anfragen.
Häufige Anwendungsfälle für die Konfiguration eines Standardservers
Ein benutzerdefinierter Standardserver ist nützlich, wenn Sie möchten, dass nicht übereinstimmende Anfragen sicher und vorhersehbar behandelt werden. Ohne einen bewusst festgelegten Standardwert greift Nginx möglicherweise auf den ersten Serverblock zurück, den es für einen bestimmten Port lädt, und zeigt unbeabsichtigt falsche Inhalte an.
Häufige, praktische Anwendungsfälle sind:
- Catch-All-Antwort für unbekannte Hosts: Gib eine klare Meldung „nicht konfiguriert" zurück, anstatt eine zufällige Website anzuzeigen.
- Wartungs- oder Parking-Seite: Zeige eine kontrollierte Seite an, während Domains migriert oder die Produktionskonfiguration vorbereitet werden.
- Sicherheitserhöhung: Gib eine minimale Antwort oder einen nicht erfolgreichen Statuscode (z. B. 444 oder 404) zurück, um die Gefährdung durch Scanner und Bots zu verringern.
- IP-basierte Zugriffskontrolle: Blockiere absichtlich den Zugriff über die IP-Adresse, während nur bekannte Domainnamen ihre konfigurierten virtuellen Hosts erreichen können.
- TLS-Hygiene: Verhindere Probleme mit nicht übereinstimmenden Zertifikaten, indem Du sicherstellst, dass der Standard-HTTPS-Listener kein falsches Zertifikat bereitstellt.
Dadurch wird der Standard-Server zu einem praktischen Tool für klare Abläufe und Sicherheit.
Bewährte Methoden für die Strukturierung von Nginx-Serverblöcken
Wenn Sie mehrere Websites auf einem einzigen Server betreiben, verringert eine klare Struktur das Risiko einer versehentlichen Weiterleitung an den falschen Serverblock. Der häufigste Fehler ist, dass ein „Catch-All"-Serverblock unbeabsichtigt Datenverkehr erfasst, der für einen anderen Hostnamen bestimmt ist.
Empfohlene bewährte Verfahren:
- Definieren Sie genau einen Standard-Server pro IP:Port-Kombination mit
listen ... default_server. - Machen Sie den Zweck des Standard-Servers deutlich:
- Verwenden Sie einen eindeutigen Dateinamen (z. B. 00-default.conf), damit er vorhersehbar geladen wird.
- Fügen Sie einen Kommentar hinzu, der angibt, dass es sich um den Fallback für nicht übereinstimmende Hosts handelt.
- Behalten Sie server_name im Standard-Server generic (z. B.
_), damit er nicht mit echten Domains konkurriert. - Stellen Sie sicher, dass echte Websites explizite server_name-Werte haben (z. B. example.com www.example.com) und sich nicht auf implizite Übereinstimmungen verlassen.
- Wenn Sie sowohl HTTP (80) als auch HTTPS (443) ausführen, entscheiden Sie, ob Sie für beide einen Standard-Server brauchen.
- HTTP-Standard: eine minimale Meldung oder Umleitungsstrategie zurückgeben
- HTTPS-Standard: vermeiden, dass ein nicht übereinstimmendes Zertifikat bereitgestellt wird
Diese Vorgehensweisen verringern die Wahrscheinlichkeit, dass „die falsche Website für Ihren Domain geladen wird", und erleichtert die Beurteilung des Routings.
Fehlerbehebung bei häufigen Problemen mit dem Standard-Server
Wenn der Standard-Server den Datenverkehr zu „übernehmen" scheint, bedeutet das in der Regel, dass die Hostnamenübereinstimmung oder die Listener-Konfiguration nicht Ihren Erwartungen entspricht. Verwenden Sie die folgenden Überprüfungen, um die Ursache schnell zu finden.
Meine Domain zeigt den Standard-Server anstelle der beabsichtigten Website an
- Stelle Sie sicher, dass der beabsichtigte Serverblock die richtigen server_name-Einträge für diese Domain enthält.
- Überprüfen Sie, ob die DNS der Domain tatsächlich auf diese Server-IP verweisen (sonst testen Sie möglicherweise einen anderen Host).
- Überprüfen Sie, ob es doppelte oder widersprüchliche server_name-Einträge in den Serverblöcken gibt.
HTTPS zeigt Zertifikatswarnungen an
- Dies passiert oft, wenn eine Anfrage den Standard-HTTPS-Server erreicht und dieser ein Zertifikat bereitstellt, das nicht mit dem angeforderten Hostnamen übereinstimmt.
- Stellen Sie sicher, dass die richtige Website über einen eigenen
listen 443 ssl;-Block und die richtige Zertifikatskonfiguration verfügt. - Erwägen Sie, den Standard-HTTPS-Server minimal zu halten und kein irreführendes Zertifikat zu liefern.
Unerwartetes Verhalten nach Änderungen
- Überprüfen Sie Ihre Konfiguration vor dem Neuladen.
- Lade Nginx neu und führe dann einen erneuten Test von einem sauberen Client aus (anderes Netzwerk oder gelöschter Cache, beispielsweise Handy), um irreführende Cache-Ergebnisse zu vermeiden.
Ich weiß nicht, welcher Serverblock verwendet wird
- Überprüfen Sie die Nginx-Konfiguration für den entsprechenden Port und finden Sie heraus, welcher Serverblock als default_server markiert ist.
- Überprüfen Sie die Zugriffsprotokolle auf den Host-Header und das Anforderungsziel, um zu bestätigen, ob die Anforderungen mit dem erwarteten Hostnamen ankommen.
Dieser Ablauf zur Fehlerbehebung hilft Ihnen, Routing- und Zertifikatsprobleme ohne Trial-and-Error-Bearbeitungen zu beheben.