[Linuxtrent] Re: una domanda al giorno leva il bug di torno...

  • From: Flavio Stanchina <flavio@xxxxxxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Wed, 23 Feb 2011 11:47:25 +0100

On 23/02/2011 1:17,
Marco Ciampa <ciampix@xxxxxxxxx> wrote:
Sto usando joomla 1.6. Il server su cui gira ha un ip interno  [...]
L'unico server web accessibile dall'esterno usa le direttive ProxyPass e
ProxyPassReverse per accedere a tale sito interno. Purtroppo appena
carico una pagina, questa la vedo costruita con l'ip interno della
macchina e non con il nome della macchina dato dalla variabile
ServerName di Apache2 [...]

Ci ho sbattuto il naso anch'io qualche giorno fa... la natura del problema è ovviamente ovvia, come tutte le cose ovvie dopo che ci arrivi. Prima un po' meno. :)

La differenza tra un redirect a livello di TCP/IP sul firewall (DNAT) ed un proxy è che nel primo caso la richiesta arriva inalterata e mantiene l'IP sorgente originale, mentre nel secondo caso la richiesta viene processata dal proxy ed arriva al server dall'IP interno del proxy. Nel caso di un proxy HTTP con ProxyPass, *il proxy riscrive anche l'header HTTP*! Questo è il dettaglio ovvio che mi ero perso...

Quindi se tu hai:
* 192.168.x.x: server vero sulla rete interna
* 192.168.x.y: indirizzo interno del proxy
* 1.2.3.4: indirizzo esterno del proxy
* foo.example.com: DNS assegnato all'indirizzo esterno
* ProxyPass / http://192.168.x.x/

...l'applicazione che genera pagine contenenti il nome pescato dall'header avrà problemi perché l'header HTTP che arriva al server interno contiene 192.168.x.x, non foo.example.com; ProxyPassReverse non aiuta in questo caso, perché aggiusta gli header in uscita, non certo il contenuto delle pagine.

La soluzione più naturale è aggiustare tutte le pagine sul server interno in modo che usino URL relativi, ma ciò può essere complicato o impossibile quando ci sono di mezzo applicazioni che non prevedono un meccanismo per adattarsi a situazioni di questo tipo, come spiegavi nelle mail successive.

La soluzione che ho trovato (e non sono sicuro che sia l'unica, né la migliore) è mettere nel file /etc/hosts del proxy una riga che associa a foo.example.com all'IP interno del server:
 192.168.x.x foo.example.com

...ed aggiustare la direttiva ProxyPass per usare il nome:

 ProxyPass / http://foo.example.com/

Quindi foo.example.com punta a 1.2.3.4 per chi sta all'esterno, mentre per il proxy punta a 192.168.x.x; in questo modo l'header arriva al proxy interno con lo stesso nome usato dal client esterno.

Ovviamente tutto ciò funziona solo se stai proxegiando l'intero sito (generalmente all'interno di un NameVirtualHost); se vuoi "incollare" l'applicazione interna in una subdirectory del sito visibile dall'esterno, bisogna inventarsi qualcos'altro.

--
Ciao, Flavio
--
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con OGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx


Other related posts: