how to create a reverse proxy

Panoramica

Scoprite come impostare un reverse proxy con HAProxy su un VPS per nascondere il vostro IP di origine reale, migliorare le prestazioni e proteggere le vostre applicazioni da terzi. Come creare un reverse proxy con HAProxy per nascondere l’IP del server di origine reale?


Che cos’è un reverse proxy?

Un reverse proxy si colloca tra i client e i vostri server. Riceve le richieste in arrivo, decide dove inviarle e restituisce le risposte, mantenendo i vostri server di origine nascosti dalla rete pubblica. Può anche bilanciare il caricosu più backend, aggiungere intestazioni di sicurezza, limitare la velocità dei client abusivi e centralizzare la terminazione TLS (HTTPS). Consideratelo come un buttafuori intelligente: indirizza le persone verso le stanze giuste, ma mantiene il backstage privato.

In breve, un reverse proxy è il cavallo di battaglia silenzioso che fa funzionare tutto senza intoppi mentre la vostra origine rimane privata


Proxy inverso con HAProxy: Come funziona

HAProxy è un potente proxy L4/L7 e un bilanciatore di carico. Le richieste dei clienti arrivano prima a HAProxy, dove

  • TLS (HTTPS) può essere terminato.
  • Vengono aggiunte intestazioni come ##ATP_NOTR_13_CODE_TAG_NOTR_ATP###, ##ATP_NOTR_14_CODE_TAG_NOTR_ATP### e X-Forwarded-Host.
  • Il traffico viene instradato ai backend in base al nome dell’host, al percorso o a regole personalizzate.
  • Sono disponibili controlli sullo stato di salute, failover automatico, limiti di velocità, compressione, cache leggera, WebSocket e gRPC pass-through.
  • I registri dettagliati e una pagina di statistiche in tempo reale consentono di osservare la situazione.

In conclusione: HAProxy semplifica l’architettura, aumenta la sicurezza e le prestazioni e rende semplice la scalabilità


Pro e contro di HAProxy

Pro (perché HAProxy brilla)

  • Prestazioni elevate e basso overhead (event-driven, multi-thread).
  • Intelligenza L4 + L7 (passthrough TCP/SNI o routing/ritiro HTTP completo).
  • Robusto bilanciamento del carico e controlli sullo stato di salute (round-robin, leastconn, hashing; controlli attivi, failover).
  • Funzioni di sicurezza (terminazione TLS, HSTS, ACL, limitazione della velocità tramite stick-tables, IP allow/deny).
  • Osservabilità (registri ricchi, statistiche live socket/pagina; esportatori Prometheus disponibili).
  • Affidabilità (ricariche graziose, quasi a tempo zero; testato in battaglia).
  • Ingombro ridotto (funziona praticamente ovunque: Linux/BSD/container).

Contro (compromessi)

  • Curva di apprendimento (configurazione potente ma verbosa).
  • Automazione della certificazione non integrata (da abbinare a Certbot/lego o all’API Data Plane).
  • Individuazione manuale dei servizi per impostazione predefinita (i backend dinamici necessitano di modelli/API).
  • Caching/static serving integrato limitato (utilizzare CDN/Varnish/Nginx se necessario).
  • Nessun WAF comunitario nativo (utilizzare un WAF separato o HAProxy Enterprise).
  • Le riscritture complesse possono risultare molto laboriose.
  • Supporto Windows limitato (meglio su Linux/BSD).

Cosa vi serve

  • Un server VPS/pubblico per HAProxy (il reverse proxy).
  • Il vostro server di origine (ad esempio, ###ATP_NOTR_16_CODE_TAG_NOTR_ATP##).
  • Un dominio (ad esempio, ###ATP_NOTR_17_CODE_TAG_NOTR_ATP##) con DNS A/AAA che punta all’IP pubblico del server HAProxy.

Suggerimento per la privacy: per nascondere veramente l’IP di origine, assicuratevi che l’origine non sia raggiungibile pubblicamente, che sia firewallata in modo da accettare traffico solo dal server HAProxy ed evitate record DNS che rivelino l’origine


Passo 1 – Installare HAProxy

Ubuntu/Debian

sudo apt update
sudo apt install -y haproxy

RHEL/Alma/Rocky

##ATP_NOTR_2_CODE_TAG_NOTR_ATP###


Passo 2 – Ottenere un certificato TLS (Let’s Encrypt)

Lasciamo che sia Certbot a ottenere un certificato e lo mettiamo in bundle con HAProxy

Installare certbot e ottenere il certificato (una tantum)

# Ubuntu/Debian
sudo apt install -y certbot
sudo certbot certonly --standalone -d example.com --agree-tos -m you@example.com --non-interactive

Creare il bundle PEM di 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

Ricaricare automaticamente HAProxy ai rinnovi

##ATP_NOTR_5_CODE_TAG_NOTR_ATP###


Passo 3 – Configurazione minima di HAProxy pronta per la produzione (HTTPS + redirect)

Sostituire ##ATP_NOTR_18_CODE_TAG_NOTR_ATP## e l’IP/porta del backend dove indicato. ##ATP_NOTR_6_CODE_TAG_NOTR_ATP###Perché funziona

  • HAProxy termina il TLS su ##ATP_NOTR_19_CODE_TAG_NOTR_ATP## e reindirizza ##ATP_NOTR_20_CODE_TAG_NOTR_ATP##.
  • Il traffico regolare va all’origine a ##ATP_NOTR_21_CODE_TAG_NOTR_ATP##.
  • Solo ##ATP_NOTR_22_CODE_TAG_NOTR_ATP## viene instradato verso un piccolo server web locale che Certbot eseguirà durante i rinnovi.

Passo 4 – Avviare, ricaricare e convalidare

##ATP_NOTR_7_CODE_TAG_NOTR_ATP###


Passo 5 – Rinnovi a mani libere

Lasciare che Certbot si leghi brevemente a ##ATP_NOTR_23_CODE_TAG_NOTR_ATP## mentre HAProxy mantiene aperto ##ATP_NOTR_24_CODE_TAG_NOTR_ATP##:
##ATP_NOTR_8_CODE_TAG_NOTR_ATP###Durante il rinnovo, Certbot risponde alla sfida sulla porta ##ATP_NOTR_25_CODE_TAG_NOTR_ATP##; HAProxy instrada già quel percorso su ##ATP_NOTR_26_CODE_TAG_NOTR_ATP###.


Varianti (scegliete quello che vi serve)

A) Origini multiple per nome di host

# 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 (l’origine gestisce TLS/mTLS)

Utilizzare la modalità TCP con instradamento SNI. Nessuna riscrittura dell’intestazione o funzionalità 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 inverso minimo solo HTTP (senza TLS)

Solo per uso interno/test, usare HTTPS per la produzione.

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

Controlli rapidi e risoluzione dei problemi

##ATP_NOTR_12_CODE_TAG_NOTR_ATP###Suggerimenti per il firewall

  • Bloccare l’origine in modo che accetti solo il traffico dal server HAProxy (ad esempio, con ###ATP_NOTR_27_CODE_TAG_NOTR_ATP##, firewalld o gruppi di sicurezza cloud).
  • Bloccare facoltativamente l’accesso pubblico diretto all’IP di origine a livello di provider.

Note finali

  • Mantenere timeout ragionevoli per i carichi di lavoro (WebSockets/gRPC potrebbero richiedere un valore più alto).
  • Esponete un endpoint ##ATP_NOTR_29_CODE_TAG_NOTR_ATP## nella vostra applicazione per ##ATP_NOTR_30_CODE_TAG_NOTR_ATP##.
  • Pianificare le distribuzioni a tempo zero: svuotare un server (###ATP_NOTR_31_CODE_TAG_NOTR_ATP##) durante le distribuzioni, quindi riattivarlo.

Avviso importanteNel caso in cui non si sia sicuri di come configurare correttamente il server, si consiglia vivamente di rivolgersi a un professionista per completare la configurazione. È essenziale assicurarsi che tutte le impostazioni siano eseguite in modo accurato, compreso il controllo delle porte del firewall per verificare che non vi siano blocchi delle porte. È importante avere almeno una conoscenza di base dei firewall e dei comandi Linux per poter eseguire il processo di configurazione in modo efficace. Si prega di notare che non siamo responsabili per eventuali danni o problemi che possono derivare dal processo di configurazione. Tutte le informazioni fornite qui sono solo a scopo di conoscenza tecnica e di apprendimento. Grazie per la vostra comprensione