
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 bătaie liniștit care face ca totul să funcționeze fără probleme, în timp ce originea dvs. rămâne privată
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 terminată.
- Sunt adăugate anteturi precum
X-Forwarded-For
,X-Forwarded-Proto
șiX-Forwarded-Host
. - Traficul este direcționat către back-end-uri după nume de gazdă, cale sau reguli personalizate.
- Sunt disponibile verificări de sănătate, failover automat, limite de rată, 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 pentru 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 la reînnoiri
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 requests / 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
# 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
# Route your domain to the origin backend
acl host_example hdr(host) -i example.com
use_backend be_app if host_example
default_backend be_app
# Backend: your origin server
backend be_app
balance leastconn
option httpchk GET /health
http-check expect status 200
server app1 10.0.0.10:8080 check
# Backend to serve ACME challenges (certbot standalone hook)
backend be_acme
server local 127.0.0.1:8081
De ce funcționează acest lucru
- HAProxy termină TLS pe
:443
și redirecționează:80 → HTTPS
. - Traficul regulat se îndreaptă către originea dvs. la
10.0.0.10:8080
. - Doar
/.well-known/acme-challenge/*
este direcționat către un mic server web local pe care Certbot îl 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 – Înnoiri fără intervenții
Lăsați Certbot să se lege pentru scurt timp la :8081
în timp ce HAProxy menține deschis :80/:443
:
# Typically handled by systemd timer; safe to run manually for testing
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ă
# Add in frontend:
acl host_api hdr(host) -i api.example.com
use_backend be_api if host_api
# Define an 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)
Utilizează modul TCP cu rutare SNI. Aici nu se rescriu antetele sau caracteristicile L7.
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/testare – 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 should point to HAProxy
dig +short example.com
# HTTP should redirect to HTTPS (301)
curl -I http://example.com
# HTTPS should serve content
curl -I https://example.com
# See headers the app receives (in your app logs):
# 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 punct final
/health
în aplicația dvs. pentruhttpchk
. - Planificați pentru implementări fără timp de nefuncționare: goliți un server (
disabled
) în timpul implementărilor, apoi activați-l din nou.
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ă blocaje 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