Realizzare un semplice Reverse Proxy con POUND

Postato il Aggiornato il

pound_logoUno dei primi compiti da svolgere, per l’azienda attuale, era di rendere disponibile su  internet la consultazione della email aziendale, ovvero la famosa webmail.
Fortunatamente il nostro server mail ha già incorporato un web server che rende disponibile una webmail ma, per motivi ovvi di sicurezza, era necessario una macchina posta in “dmz” che realizzasse un “reverse proxy” sul server mail in lan.
Dopo diversi tentativi avevo scelto Apache ma ho trovato difficoltà a gestire il reverse proxy in https.
Alla fine ho trovato un leggerissimo programma di nome “POUND” che fa esattamente al caso mio.
Ecco le caratteristiche dal sito:

WHAT POUND IS:

  1. a reverse-proxy: it passes requests from client browsers to one or more back-end servers.
  2. a load balancer: it will distribute the requests from the client browsers among several back-end servers, while keeping session information.
  3. an SSL wrapper: Pound will decrypt HTTPS requests from client browsers and pass them as plain HTTP to the back-end servers.
  4. an HTTP/HTTPS sanitizer: Pound will verify requests for correctness and accept only well-formed ones.
  5. a fail over-server: should a back-end server fail, Pound will take note of the fact and stop passing requests to it until it recovers.
  6. a request redirector: requests may be distributed among servers according to the requested URL.

Pound is a very small program, easily audited for security problems. It can run as setuid/setgid and/or in a chroot jail. Pound does not access the hard-disk at all (except for reading the certificate file on start, if required) and should thus pose no security threat to any machine.

WHAT POUND IS NOT:

  1. Pound is not a Web server: by itself, Pound serves no content – it contacts the back-end server(s) for that purpose.
  2. Pound is not a Web accelerator: no caching is done – every request is passed “as is” to a back-end server.

Browser su cui è testato:

  • IE 5.0/5.5 (Windows) HTTP/HTTPS
  • Netscape 4.7 (Windows/Linux) HTTP/HTTPS
  • Mozilla (Windows/Linux) HTTP/HTTPS
  • Konqueror (Linux) HTTP/HTTPS
  • Galleon (Linux) HTTP/HTTPS
  • Opera (Linux/Windows) HTTP/HTTPS
  • Lynx (Linux) HTTP

Pound è una soluzione ad hoc per me , ovvero reverse proxy e gestione egregia in https….yeah!(entusiasmo da nerd)
Ho scelto ubuntu come distribuzione su cui installare pound.
STEP 1 : Installazione

sudo apt-get install pound

STEP 2 : Configurazione
Sul sito di pound trovate numerosi casi di configurazione e di utilizzo;
Esempio 1:
Semplice configurazione HTTP Proxy
Supponiamo di forwardare le richieste http che arrivano dall”IP pubblico 202.54.10.5 all’IP sulla LAN 192.168.1.5 su cui è configurato un webserver Apache sulla porta 8080.
Editiamo il file di configurazione di pound in una distro Debian/Ubuntu:

vi /etc/pound/pound.cfg

Questo è l’aspetto del file:

ListenHTTP
Address  202.54.10.5
Port          80
Service
BackEnd
Address  192.168.1.5
Port           8080
End
End
End

Salvare e chiudere il file e restartare Pound:

/etc/init.d/pound restart

Esempio 2
Semplice configurazione HTTP & HTTPS Proxy
In questo esempio vediamo come “proxare” una richiesta http e https dallo stesso IP pubblico 202.54.10.5 a due web server 192.168.1.5 e 192.168.1.6, entrambi sulla porta 80:

ListenHTTP
Address  202.54.10.5
Port          80
End

ListenHTTPs
Address   202.54.10.5
Port           443
Cert           “/etc/ssl/local.server.pem”        —–>percorso certificato ssl
End

Service
BackEnd
Address     192.168.1.5
Port              80
Backend
Address     192.168.1.6
Port              80
End
End

Salvare il file di configurazione e restartare pound.
In questo esempio le richieste alla porta 80 all’ ip 202.54.10.5  vengono inoltrate alla porta 80 del webserver 192.168.1.5, mentre le richieste alla porta 443 dall’ ip 202.54.10.5 vengono inoltrate alla porta 80 del web server 192.168.1.6  e in questo caso pound gestisce il certificato ssl, che è possibile generarsi senza alcuna modifica nel backend del web server, che continua a gestire chiamate in http.
Per generere e autofirmare un certficato ssl come da esempio (/etc/ssl/local.pem) digitate il seguente comando:

cd /etc/ssl && openssl req -x509 -newkey rsa:1024 -keyout local.sever -out local.server.pem -days 365 -nodes

I log di Pound vengono gestiti tramite syslog:

tail -f /var/log/messages
grep pound /var/log/messages

Tornando alla mia problematica della webmail, attraverso una opportuna configurazione del firewall, dirotteremo le richieste https , da un nostro specifico ip pubblico, verso la macchina con pound in dmz.
Quindi l’indirizzo IP in ascolto sulla porta 443 sarà quello della macchina in dmz e il backend sarà l’ip del mio webserver il lan in ascolto sulla porta 80 a cui il firewall, debitamente configurato, permetterà il traffico http proxato dalla macchina in dmz, che gestirà anche il certificato ssl.
Buon reverse proxy a tutti!

9 pensieri riguardo “Realizzare un semplice Reverse Proxy con POUND

    Francesco Stupazzoni ha detto:
    10/09/2009 alle 09:38

    Ciao,

    e se uno volesse fare un ftp reverse proxy, cosa consigli?

    […] Oltre all’utilizzo sfrenato dell’ottimo reverse proxy Pound come da precedente mio post, ho avuto la necessità di utilizzare sempre un http reverse proxy ma che gestisca anche […]

    dark ha detto:
    24/11/2010 alle 12:59

    Domanda stupida, ho più di un server web su infrastruttura virtuale e gestisco il tutto usando pound in relazione alla url richiesta, però nelle statistiche dei vari web server mi trovo un unico visitatore (ovvero pound) esiste il modo per evitare che pound modifichi l’IP del client chiamante?

    Grazie mille

      Ivan Zini ha risposto:
      25/11/2010 alle 11:03

      Ciao Dark,
      pound, generalmente, spedisce l’indirizzo IP del chiamante nel header HTTP con il parametro chiamato “X-Forwarded-For”.
      è probabile che siano i tuoi web server che non visualizzano il suddetto parametro…
      Dai un’occhiata qui:
      http://www.bluishcoder.co.nz/2006/04/handling-x-forwarded-for-in-yaws.html
      IZ

        dark ha detto:
        25/11/2010 alle 11:32

        Si,
        perfetto, effettivamente guardando il file di conf di apache ho visto che dovevo abilitare la ricezione dell’IP con x-forward ed adesso funziona alla grande.

        Adesso non so se sia dipendente da pound però chiedo anche per confronto, nei log non mi trovo info su referer e user-agent, però se vado da PHP le variabili server associate ci sono, ma niente sui log

        la conf di apache per i log è la seguente

        LogFormat “%v:%p %{X-Forwarded-For}i %l %u %t \”%r\” %>s %O \”%{Referer}i\” \”%{User-Agent}i\”” vhost_combined
        LogFormat “%{X-Forwarded-For}i %l %u %t \”%r\” %>s %O \”%{Referer}i\” \”%{User-Agent}i\”” combined
        LogFormat “%{X-Forwarded-For}i %l %u %t \”%r\” %>s %O \”%{Referer}i\” \”%{User-Agent}i\”” common
        LogFormat “%{Referer}i -> %U” referer
        LogFormat “%{User-agent}i” agent

        Se per caso hai qualche suggerimento ti ringrazio tantissimo.
        Dark😉

    Met ha detto:
    16/10/2011 alle 14:38

    è possible usare pound verso ad un server non locale?
    perchè l’ho appena installato ma non riesco a farlo funzionare

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...