how to create a reverse proxy

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 și X-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. pentru httpchk.
  • 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