Ein nackter ASP.NET Core Kestrel-Server sollte niemals direkt Anfragen aus dem Internet annehmen. In diesem Artikel erkläre ich mein praxiserprobtes Setup auf einem Ubuntu 26.04 Server (Resolute Raccoon) inklusive Apache2 Reverse Proxy, UFW Firewall und SSL/TLS Zertifikaten.
Warum ein Reverse Proxy?
Kestrel ist rasend schnell und ideal für die Ausführung von C#-Code. Aber er ist nicht dafür gebaut, komplexe Angriffe auf Netzwerkebene abzuwehren oder als robuster Edge-Server zu dienen. Ein Reverse Proxy wie Apache2 oder Nginx übernimmt das SSL-Offloading, blockt fehlerhafte Requests ab und leitet nur sauberen Traffic an Kestrel (meist auf Port 5000) weiter.
Die Firewall: UFW richtig konfigurieren
Der allererste Schritt auf einem neuen Server ist das Abdichten aller Ports. Mit UFW (Uncomplicated Firewall) geht das unter Ubuntu kinderleicht:
# Standardmäßig alles blockieren
sudo ufw default deny incoming
sudo ufw default allow outgoing
# SSH erlauben (sonst sperren wir uns aus!)
sudo ufw allow ssh
# Web-Traffic für Apache erlauben (Port 80 und 443)
sudo ufw allow 'Apache Full'
# Firewall aktivieren
sudo ufw enable
sudo ufw enable ausführst, vergewissere dich unbedingt, dass SSH (Port 22 oder dein Custom-Port) erlaubt ist!
Apache2 Reverse Proxy Setup
Nachdem Apache installiert ist (sudo apt install apache2), müssen wir die Proxy-Module aktivieren
und einen VirtualHost für unsere Domain anlegen.
<VirtualHost *:80>
ServerName www.devaluator.de
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
ErrorLog ${APACHE_LOG_DIR}/homepage-error.log
CustomLog ${APACHE_LOG_DIR}/homepage-access.log common
</VirtualHost>
ASP.NET Core für den Proxy anpassen
Damit unsere C#-Anwendung weiß, dass sie hinter einem Proxy läuft (und z.B. die echte IP-Adresse des Nutzers erkennt),
müssen wir in der Program.cs die Forwarded Headers Middleware aktivieren:
using Microsoft.AspNetCore.HttpOverrides;
var builder = WebApplication.CreateBuilder(args);
// ... andere Services ...
var app = builder.Build();
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
// ... Middleware-Pipeline ...
Let's Encrypt (Certbot)
Zu guter Letzt sichern wir die Verbindung mit einem kostenlosen SSL-Zertifikat. Mit Certbot ist das ein Einzeiler:
sudo certbot --apache -d www.devaluator.de
Certbot ändert die Apache-Konfiguration automatisch so ab, dass jeglicher HTTP-Traffic auf HTTPS (Port 443) umgeleitet wird. Zudem richtet es einen Cronjob ein, der das Zertifikat alle 90 Tage von selbst erneuert. Fertig ist das kugelsichere Setup!