
Prezentare generală
Aflați cum să configurați un proxy invers cu HAProxy pe un VPS pentru a vă ascunde IP-ul de origine reală, a vă îmbunătăți performanța și a vă proteja aplicațiile de terți. Cum să creați un proxy invers cu HAProxy pentru a vă ascunde IP-ul serverului de origine reală?
Ce este un proxy invers?
Un proxy invers se află între clienți și serverele dumneavoastră. Acesta primește solicitările primite, decide unde să le trimită și returnează răspunsurile – păstrând serverele dvs. de origine ascunse de internetul public. Acesta poate, de asemenea, să echilibreze sarcinaîntre mai multe back-end-uri, să adauge antete de securitate, să limiteze rata clienților abuzivi și să centralizeze terminarea TLS (HTTPS). Gândiți-vă la el ca la un bodyguard inteligent: direcționează oamenii către camerele potrivite, dar păstrează culisele private.
Pe scurt, un proxy invers este calul de povară liniștit care face ca totul să funcționeze fără probleme, în timp ce originile dvs. rămân private
Reverse Proxy cu HAProxy: Cum funcționează
HAProxy este un proxy L4/L7 puternic și un distribuitor de sarcină. Solicitările clienților ajung mai întâi la HAProxy, unde
- TLS (HTTPS) poate fi finalizat.
- Sunt adăugate anteturi precum
X-Forwarded-For
,X-Forwarded-Proto
șiX-Forwarded-Host
. - Traficul este direcționat către back-end-uri prin nume de gazdă, cale sau reguli personalizate.
- Sunt disponibile verificări de sănătate, failover automat, limite de viteză, compresie, caching ușor, WebSockets și gRPC pass-through.
- Jurnalele detaliate și o pagină de statistici live oferă observabilitate.
Concluzie: HAProxy vă simplifică arhitectura, sporește securitatea și performanța și facilitează scalarea
Avantaje și dezavantaje ale HAProxy
Pro (de ce HAProxy strălucește)
- Performanță ridicată și costuri generale reduse (condus de evenimente, multithreaded).
- Inteligență L4 + L7 (TCP/SNI passthrough sau rutare/rescriere HTTP completă).
- Echilibrare robustă a sarcinii și verificări ale sănătății (round-robin, leastconn, hashing; verificări active, failover).
- Caracteristici de securitate (terminare TLS, HSTS, ACL-uri, limitarea vitezei prin tabele stick, IP allow/deny).
- Observabilitate (jurnale bogate, statistici live socket/page; exportatori Prometheus disponibili).
- Fiabilitate (reîncărcări grațioase, cu timp de reactivare aproape zero; testat în luptă).
- Amprenta redusă (rulează practic oriunde: Linux/BSD/containere).
Contra (compromisuri)
- Curbă de învățare (configurare puternică, dar complicată).
- Automatizarea Cert nu este încorporată (cuplată cu Certbot/lego sau Data Plane API).
- Descoperirea manuală a serviciilor în mod implicit (backend-urile dinamice au nevoie de șabloane/API).
- Caching/servire statică încorporată limitată (utilizați CDN/Varnish/Nginx dacă este necesar).
- Nu există WAF comunitar nativ (utilizați un WAF separat sau HAProxy Enterprise).
- Rescrierile complexe pot deveni complicate.
- Suport Windows limitat (cel mai bine pe Linux/BSD).
Ce veți avea nevoie
- Un server VPS/public pentru HAProxy (proxyul invers).
- Serverul dvs. de origine (de exemplu,
10.0.0.10:8080
). - Un domeniu (de exemplu,
example.com
) cu DNS A/AAAA îndreptat către IP-ul public al serverului HAProxy.
Sfat privind confidențialitatea: Pentru a vă ascunde cu adevărat IP-ul de origine, asigurați-vă că originea nu este accesibilă publicului, firewall-ul pentru a accepta trafic numai de la serverul HAProxy și evitați înregistrările DNS care dezvăluie originea
Pasul 1 – Instalarea HAProxy
Ubuntu/Debian
sudo apt update sudo apt install -y haproxy
RHEL/Alma/Rocky
sudo dnf install -y haproxy
Pasul 2 – Obțineți un certificat TLS (Let’s Encrypt)
Vom lăsa Certbot să obțină un certificat și îl vom împacheta pentru HAProxy
Instalați certbot și obțineți certificatul (o singură dată)
# Ubuntu/Debian sudo apt install -y certbot sudo certbot certonly --standalone -d example.com --agree-tos -m you@example.com --non-interactive
Creați pachetul PEM al 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
Auto-rebundle & reload HAProxy on renewals
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
Pasul 3 – Configurație HAProxy minimală, gata de producție (HTTPS + redirecționare)
Înlocuiți example.com
și IP/portul backend-ului dvs. acolo unde este menționat.
# /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 # Force HTTPS http-request redirect scheme https unless { ssl_fc } # Basic security header http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" if { ssl_fc } # Preserve client info for your app 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)] # Simple rate cap: 100 cereri / 10s per 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 # Rutează provocările ACME HTTP-01 către certbotul local (utilizate în timpul reînnoirilor) acl acme path_beg /.well-known/acme-challenge/ use_backend be_acme if acme # Direcționați domeniul dvs. către backend-ul de origine acl host_example hdr(host) -i example.com use_backend be_app if host_example default_backend be_app # Backend: serverul dvs. de origine backend be_app balance leastconn option httpchk GET /health http-check expect status 200 server app1 10.0.0.10:8080 check # Backend pentru a servi provocări ACME (certbot standalone hook) backend be_acme server local 127.0.0.1:8081
De ce funcționează
- HAProxy termină TLS pe
:443
și redirecționează:80 → HTTPS
. - Traficul obișnuit merge către originea dvs. la
10.0.0.10:8080
. - Numai
/.well-known/acme-challenge/*
este direcționat către un mic server web local Certbot va rula în timpul reînnoirilor.
Pasul 4 – Porniți, reîncărcați și validați
# Validate config sudo haproxy -c -f /etc/haproxy/haproxy.cfg # Enable and start sudo systemctl enable --now haproxy # Reload after edits/renewals sudo systemctl reload haproxy
Pasul 5 – Reînnoiri fără mâini
Lăsați Certbot să se lege pentru scurt timp la :8081
în timp ce HAProxy păstrează :80/:443
deschis:
# De obicei gestionat de timerul systemd; sigur de executat manual pentru testare 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"
În timpul reînnoirii, Certbot răspunde la provocare pe portul 8081
; HAProxy direcționează deja această cale către 127.0.0.1:8081
Variații (alegeți ceea ce aveți nevoie)
A) Origini multiple după numele de gazdă
# Adăugați în frontend: acl host_api hdr(host) -i api.example.com use_backend be_api if host_api # Definiți un 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 (originea gestionează TLS/mTLS)
Utilizați modul TCP cu rutare SNI. Nu există rescrieri ale antetului sau caracteristici L7 aici.
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) Proxy invers minim doar HTTP (fără TLS)
Doar pentru uz intern/testing – utilizați HTTPS pentru producție.
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
Verificări rapide și depanare
# DNS ar trebui să indice HAProxy dig +short example.com # HTTP ar trebui redirecționat către HTTPS (301) curl -I http://example.com # HTTPS ar trebui să servească conținut curl -I https://example.com # Vezi anteturile pe care le primește aplicația (în jurnalele aplicației): # X-Forwarded-For, X-Forwarded-Proto, X-Forwarded-Host
Sfaturi pentru firewall
- Blocați originea astfel încât să accepte numai traficul de la serverul HAProxy (de exemplu, cu
ufw
,firewalld
sau grupuri de securitate cloud). - Opțional, blocați accesul public direct la IP-ul de origine la nivelul furnizorului dvs.
Note finale
- Păstrați timpi de așteptare rezonabili pentru volumele dvs. de lucru (WebSockets/gRPC pot necesita timpi mai mari).
- Expuneți un endpoint
/health
în aplicația dvs. pentruhttpchk
. - Planificați pentru implementări cu timp de inactivitate zero: goliți un server
(dezactivat
) în timpul implementărilor, apoi reactivați.
Notificare importantă:În cazul în care nu sunteți sigur cum să configurați corect serverul, vă recomandăm insistent să angajați un profesionist pentru a finaliza configurarea. Este esențial să vă asigurați că toate setările sunt efectuate cu exactitate, inclusiv verificarea porturilor firewall pentru a confirma că nu există blocări ale porturilor. Este important să aveți cel puțin o înțelegere de bază a firewall-urilor și a comenzilor Linux pentru a naviga eficient în procesul de configurare. Vă rugăm să rețineți că nu suntem responsabili pentru eventualele daune sau probleme care pot apărea în urma procesului de configurare. Toate informațiile furnizate aici sunt doar pentru cunoștințe tehnice și scopuri de învățare. Vă mulțumim pentru înțelegere