
Übersicht
Erfahren Sie, wie Sie einen Reverse-Proxy mit HAProxy auf einem VPS einrichten, um Ihre echte Herkunfts-IP zu verbergen, die Leistung zu verbessern und Ihre Anwendungen vor Dritten zu schützen. Wie man einen Reverse-Proxy mit HAProxy einrichtet, um die IP des Real Origin Servers zu verbergen?
Was ist ein Reverse-Proxy?
Ein Reverse-Proxy befindet sich zwischen den Clients und Ihren Servern. Er empfängt eingehende Anfragen, entscheidet, wohin er sie sendet, und gibt Antworten zurück – und hält dabei Ihre Ursprungsserver vor dem öffentlichen Internet verborgen. Er kann auch die Last aufmehrere Backends verteilen, Sicherheits-Header hinzufügen, die Rate missbräuchlicher Clients begrenzen und die TLS (HTTPS)-Terminierung zentralisieren. Betrachten Sie ihn als intelligenten Türsteher: Er leitet die Leute in die richtigen Räume, hält aber die Hinterbühne privat.
Kurz gesagt, ein Reverse-Proxy ist das stille Arbeitstier, das dafür sorgt, dass alles reibungslos läuft, während Ihr Ursprung privat bleibt
Reverse-Proxy mit HAProxy: Wie es funktioniert
HAProxy ist ein leistungsfähiger L4/L7-Proxy und Lastausgleicher. Client-Anfragen treffen zuerst auf HAProxy, wo
- TLS (HTTPS) kann beendet werden.
- Header wie
X-Forwarded-For
,X-Forwarded-Proto
undX-Forwarded-Host
werden hinzugefügt. - Der Datenverkehr wird anhand von Hostnamen, Pfaden oder benutzerdefinierten Regeln an Backends weitergeleitet.
- Gesundheitsprüfungen, automatisches Failover, Ratenbegrenzungen, Komprimierung, leichtes Caching, WebSockets und gRPC-Pass-Through sind verfügbar.
- Detaillierte Protokolle und eine Live-Statistikseite ermöglichen die Überwachung.
Unterm Strich: HAProxy vereinfacht Ihre Architektur, erhöht die Sicherheit und Leistung und ermöglicht eine unkomplizierte Skalierung
Vor- und Nachteile von HAProxy
Vorteile (warum HAProxy glänzt)
- Hohe Leistung und geringer Overhead (ereignisgesteuert, multi-threaded).
- L4 + L7 Intelligenz (TCP/SNI Passthrough oder vollständiges HTTP-Routing/Rewrites).
- Robuste Lastverteilung und Zustandsprüfungen (Round-Robin, Least-Conn, Hashing; aktive Prüfungen, Failover).
- Sicherheitsfunktionen (TLS-Terminierung, HSTS, ACLs, Ratenbegrenzung über Stick-Tabellen, IP allow/deny).
- Beobachtbarkeit (umfangreiche Protokolle, Live-Statistiken Socket/Seite; Prometheus-Exporter verfügbar).
- Zuverlässigkeit (zuverlässige, nahezu ausfallfreie Reloads; kampferprobt).
- Geringer Platzbedarf (läuft praktisch überall: Linux/BSD/Container).
Nachteile (Abstriche)
- Lernkurve (leistungsstarke, aber ausführliche Konfiguration).
- Cert-Automatisierung nicht eingebaut (Paar mit Certbot/lego oder Data Plane API).
- Standardmäßig manuelle Service-Erkennung (dynamische Backends benötigen Vorlagen/API).
- Begrenztes integriertes Caching/statisches Serving (bei Bedarf CDN/Varnish/Nginx verwenden).
- Keine native Community WAF (verwenden Sie eine separate WAF oder HAProxy Enterprise).
- Komplexe Rewrites können langwierig werden.
- Eingeschränkte Windows-Unterstützung (am besten auf Linux/BSD).
Was Sie benötigen
- Einen VPS/öffentlichen Server für HAProxy (den Reverse-Proxy).
- Ihren Ursprungsserver (z. B.
10.0.0.10:8080
). - Eine Domain (z. B.
example.com
) mit DNS A/AAAA, die auf die öffentliche IP des HAProxy-Servers zeigt.
Datenschutz-Tipp: Um Ihre Herkunfts-IP wirklich zu verbergen, stellen Sie sicher, dass die Herkunfts-IP nicht öffentlich erreichbar ist, stellen Sie eine Firewall auf, die nur Datenverkehr vom HAProxy-Server akzeptiert, und vermeiden Sie DNS-Einträge, die die Herkunft verraten
Schritt 1 – HAProxy installieren
Ubuntu/Debian
sudo apt update sudo apt install -y haproxy
RHEL/Alma/Rocky
sudo dnf install -y haproxy
Schritt 2 – Besorgen Sie sich ein TLS-Zertifikat (Let’s Encrypt)
Wir lassen Certbot ein Zertifikat besorgen und bündeln es für HAProxy
Installieren Sie Certbot und holen Sie das Zertifikat (einmalig)
#
Ubuntu/Debian sudo apt install -y certbot sudo certbot certonly --standalone -d example.com --agree-tos -m you@example.com --non-interactive
Erstellen Sie das PEM-Bündel von HAProxy (fullchain + privkey)
sudo mkdir -p /etc/haproxy/certs sudo bash -c 'cat /etc/letsencrypt/live/example.com/fullchain.pem /etc/letsencrypt/live/example.com/privkey.pem > /etc/haproxy/certs/example.com.pem' sudo chmod 600 /etc/haproxy/certs/example.com.pem
Automatisches Entbündeln und Neuladen von HAProxy bei Verlängerungen
sudo bash -c 'cat >/etc/letsencrypt/renewal-hooks/deploy/haproxy.sh' <<'EOF' #!/usr/bin/env bash cat /etc/letsencrypt/live/example.com/fullchain.pem /etc/letsencrypt/live/example.com/privkey.pem > /etc/haproxy/certs/example.com.pem systemctl reload haproxy EOF sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/haproxy.sh
Schritt 3 – Minimale, produktionsreife HAProxy-Konfiguration (HTTPS + Weiterleitung)
Ersetzen Sie example.com
und Ihre Backend-IP/Port wo angegeben #
/etc/haproxy/haproxy.cfg global log /dev/log local0 maxconn 50000 daemon defaults log global mode http option httplog timeout connect 5s timeout client 60s timeout server 60s http-reuse safe # Frontend: listen on 80/443, redirect to HTTPS, route ACME and app traffic frontend fe_https bind :80 bind :443 ssl crt /etc/haproxy/certs/example.com.pem alpn h2,http/1.1 # HTTPS erzwingen http-request redirect scheme https unless { ssl_fc } # Grundlegende Sicherheits-Header http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" if { ssl_fc } # Client-Informationen für Ihre App erhalten option forwardfor header X-Forwarded-For http-request set-header X-Forwarded-Proto https if { ssl_fc } http-request set-header X-Forwarded-Host %[req.hdr(host)] # Einfache Ratenbegrenzung: 100 Anfragen / 10s pro IP stick-table type ip size 100k expire 10m store http_req_rate(10s) http-request track-sc0 src acl too_fast sc0_http_req_rate gt 100 http-request deny status 429 if too_fast # Route ACME HTTP-01 challenges to local certbot (used during renewals) acl acme path_beg /.well-known/acme-challenge/ use_backend be_acme if acme # Leiten Sie Ihre Domain an das Ursprungs-Backend acl host_example hdr(host) -i example.com use_backend be_app if host_example default_backend be_app # Backend: Ihr Ursprungsserver backend be_app balance leastconn option httpchk GET /health http-check expect status 200 server app1 10.0.0.10:8080 check # Backend für ACME-Herausforderungen (certbot standalone hook) backend be_acme server local 127.0.0.1:8081
Warum das funktioniert
- HAProxy terminiert TLS auf
:443
und leitet:80 → HTTPS
um. - Der reguläre Verkehr geht zu Ihrem Ursprung auf
10.0.0.10:8080
. - Nur
/.well-known/acme-challenge/*
wird an einen winzigen lokalen Webserver weitergeleitet, den Certbot während der Erneuerung betreibt.
Schritt 4 – Starten, neu laden und validieren
#
Konfiguration validieren sudo haproxy -c -f /etc/haproxy/haproxy.cfg # Aktivieren und starten sudo systemctl enable --now haproxy # Nach Änderungen/Erneuerungen neu laden sudo systemctl reload haproxy
Schritt 5 – Hands-off Erneuerungen
Lassen Sie Certbot sich kurz an :8081
binden, während HAProxy :80/:443
offen hält:
# Normalerweise von systemd timer gehandhabt; zum Testen kann man es auch manuell ausführen sudo certbot renew --deploy-hook "/etc/letsencrypt/renewal-hooks/deploy/haproxy.sh" --http-01-port 8081 --pre-hook "systemctl start haproxy" --post-hook "systemctl start haproxy"
Während der Erneuerung beantwortet Certbot die Anfrage auf Port 8081
; HAProxy leitet diesen Pfad bereits an 127.0.0.1:8081
weiter
Variationen (wählen Sie, was Sie brauchen)
A) Mehrere Ursprünge nach Hostnamen
#
Fügen Sie ein Frontend hinzu: acl host_api hdr(host) -i api.example.com use_backend be_api if host_api # Definieren Sie ein API-Backend: backend be_api balance roundrobin option httpchk GET /healthz server api1 10.0.0.21:9000 check server api2 10.0.0.22:9000 check
B) TLS-Passthrough (Ursprung behandelt TLS/mTLS)
Verwenden Sie den TCP-Modus mit SNI-Routing. Keine Header-Rewrites oder L7-Features hier.
frontend fe_tcp mode tcp bind :443 tcp-request inspect-delay 5s tcp-request content accept if { req_ssl_hello_type 1 } use_backend be_tls_app if { req_ssl_sni -i example.com } backend be_tls_app mode tcp server app_tls 10.0.0.10:443 check
C) Minimaler reiner HTTP-Reverse-Proxy (kein TLS)
Nur für interne Zwecke/Tests – verwenden Sie HTTPS für die Produktion.
global log /dev/log local0 defaults mode http log global option httplog timeout connect 5s timeout client 60s timeout server 60s frontend public_http bind :80 option forwardfor default_backend app backend app server app1 10.0.0.10:8080 check
Schnelle Überprüfung und Fehlerbehebung
#
DNS sollte auf HAProxy dig +short example.com zeigen # HTTP sollte auf HTTPS umleiten (301) curl -I http://example.com # HTTPS sollte Inhalte liefern curl -I https://example.com # Sehen Sie sich die Header an, die die App empfängt (in Ihren App-Logs): # X-Forwarded-For, X-Forwarded-Proto, X-Forwarded-Host
Firewall-Tipps
- Sperren Sie Ihren Ursprung so ab, dass er nur Verkehr vom HAProxy-Server akzeptiert (z. B. mit
ufw
,firewalld
oder Cloud-Sicherheitsgruppen). - Blockieren Sie optional den direkten öffentlichen Zugriff auf die Ursprungs-IP auf der Ebene Ihres Providers.
Abschließende Hinweise
- Halten Sie die Zeitüberschreitungen für Ihre Arbeitslasten angemessen (WebSockets/gRPC benötigen möglicherweise höhere Werte).
- Bieten Sie einen
/health-Endpunkt
in Ihrer Anwendung fürhttpchk
an. - Planen Sie Zero-Downtime-Deployments: Leeren Sie einen
(deaktivierten
) Server während der Deployments und aktivieren Sie ihn dann wieder.
Wichtiger Hinweis:Falls Sie sich nicht sicher sind, wie Sie den Server richtig konfigurieren, empfehlen wir dringend, einen Fachmann mit der Konfiguration zu beauftragen. Es ist wichtig sicherzustellen, dass alle Einstellungen korrekt vorgenommen werden, einschließlich der Überprüfung der Firewall-Ports, um sicherzustellen, dass keine Ports blockiert sind. Es ist wichtig, dass Sie zumindest ein grundlegendes Verständnis von Firewalls und Linux-Befehlen haben, um den Konfigurationsprozess effektiv durchführen zu können. Bitte beachten Sie, dass wir nicht für Schäden oder Probleme verantwortlich sind, die aus dem Konfigurationsprozess entstehen können. Alle hier bereitgestellten Informationen dienen ausschließlich der Vermittlung von technischem Wissen und Lernzwecken. Wir danken Ihnen für Ihr Verständnis