2009.08.07.
Reverse proxy + a kliens valódi IP-címe
Egy reverse proxy manapság nem probléma. Egy apró kellemetlen mellékhatása azonban van a dolognak: a reverse proxy mögött lévő web szerver nem a HTTP kérést elküldő kliens IP-címét látja, hanem a proxy IP-címét. Ez pedig gondot okozhat, ha egy site-ot pl. IP-címre kell lekorlátozni.
Szerencsére van egy mod_rpaf nevű Apache modul (1.3.x – 2.x.x), amely a következő trükköt tudja: Az “X-Forwarded-For:” HTTP fejlécben érkező címet kiexportálja a REMOTE_ADDR változóba. Így az Apache már a kliens valódi IP-címét látja, amikor pl. egy .htaccess fájl alapján kell eldönteni, hogy a kérést elfogadjuk vagy sem.
Ehhez Apache oldalon az alábbi konfigra van szükség:
LoadModule rpaf_module /usr/local/libexec/mod_rpaf-2.0.so RPAFenable On RPAFproxy_ips 127.0.0.1 1.2.3.4 RPAFsethostname On RPAFheader X-Forwarded-For
Ezzel a nehezén túl is vagyunk, már csak egy olyan reverse proxyra van szükségünk, ami támogatja, ill. beleteszi a tovább passzolt kérésbe a X-Forwarded-For mezőt. Ha a dedikált reverse proxykat preferálod, akkor pl. a pound a te barátod, amely az alábbi konfiggal vígan elszalad:
User "pound"
Group "pound"
ListenHTTP
Address 1.2.3.4
Port 80
Service
BackEnd
Address 127.0.0.1
Port 80
End
End
End
Ha azonban komplex access control vagy egyéb fancy feature-ök is kellenek, akkor jobb választás lehet egy pehelysúlyú webszerver, mint pl. a lighttpd vagy az nginx, esetleg a cherokee.
Az előbbi elketyeg egy ilyesmi konfiggal:
server.modules = (
"mod_status",
"mod_proxy",
"mod_simple_vhost")
server.errorlog = "/var/log/lighttpd/error.log"
server.document-root = "/tmp"
server.port = 80
server.bind = "1.2.3.4"
server.username = "lighttpd"
server.groupname = "lighttpd"
proxy.server = ( "" =>
( "1.2.3.4" =>
(
"host" => "127.0.0.1",
"port" => 80
)
)
)
Ha pedig a backend webszerver nem Apache, hanem lighttpd, akkor az gyárilag kezelni tudja az X-Forwarded-For fejlécet.





August 7th, 2009 at 15:30:08
http://hup.hu/node/74454#comment-823327
August 7th, 2009 at 19:24:11
Kössz.