[HOW-TO] real IP address for apache 2.0.x (backend) and nginx

Alexey Bestciokov proforg at maloletka.ru
Tue Feb 22 21:51:49 MSK 2005


у мод рпаф есть один недостаток по сравнению с модулем Игоря - он не
понимает заголовка X-Real-IP, то есть реальный ip всегда передается в
X-Forwarded-For, что не всегда приемлимо :)

учитывая то что nginx умеет выставлять X-Real-IP,
вот небольшой патчик который это исправляет:

--- mod_rpaf-0.5/mod_rpaf-2.0.c 2004-03-17 18:47:30.000000000 +0300
+++ mod_rpaf-2.0.c      2005-02-22 21:44:45.000000000 +0300
@@ -71,6 +71,8 @@
 #include "http_protocol.h"
 #include "http_vhost.h"
 #include "apr_strings.h"
+#include <arpa/inet.h>
+

 module AP_MODULE_DECLARE_DATA rpaf_module;

@@ -139,8 +141,12 @@
     if (!cfg->enable)
         return DECLINED;

-    if (is_in_array(r->connection->remote_ip, cfg->proxy_ips) == 1) {
-        if (fwdvalue = apr_table_get(r->headers_in, "X-Forwarded-For")) {
+    if (is_in_array(r->connection->remote_ip, cfg->proxy_ips) == 1)  {
+        if (fwdvalue = (char *) apr_table_get(r->headers_in, "X-Real-IP")) {
+            r->connection->remote_ip = fwdvalue;
+            r->connection->remote_addr->sa.sin.sin_addr.s_addr = apr_inet_addr(r->connection->remote_ip);
+        }
+        else if (fwdvalue = (char *) apr_table_get(r->headers_in, "X-Forwarded-For")) {
             apr_array_header_t *arr = apr_array_make(r->pool, 0, sizeof(char*));
             while (*fwdvalue && (val = ap_get_token(r->pool, &fwdvalue, 1))) {
                 *(char **)apr_array_push(arr) = apr_pstrdup(r->pool, val);



то есть при наличии в заголовках X-Real-IP, разбирается только он,
а X-Forwarded-For и соотв X-Forwarded-Host / X-Host уже не трогаются, так
как nginx не умеет их выставлять - да и не должен вобщемто :)

в конфигурации nginx вместо
proxy_add_x_forwarded_for  on;
ставица
proxy_set_x_real_ip        on;

Алексей Бещёков.
proforg at maloletka.ru

                 

R> Доброго времени суток,

R> Смотрел я долго на lighttpd и выбрал nginx, хоть и нужен SSL тоже :)
R> (стабильный, но ssl в nginx еще не пробовал).

R> И возникла единственная проблема на Апаче 2.0.х - реальный IP адрес на
R> backend сервере.
R> Для апача 1.3.х - такой модуль есть, который написал Игорь Сысоев.

R> После раздумий и чтения документации по mod_headers и остальной 
R> компании, понял, что это не поможет.
R> Тогда я зарылся в гугль и после 20 минут лирического диалога с полем
R> поиска нашел нужный модуль, им оказался mod_rpaf

R> Лежит он здесь - http://stderr.net/apache/rpaf/

R> Я его скачал и поставил, а ставится он очень просто с помощью apxs:

R> apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

R> После этого добавляем его строкой в апач:

R> LoadModule rpaf_module modules/mod_rpaf-2.0.so

R> А директивы его описаны в README файле, который идет к нему. Их всего три:
R> - RPAFEnable - включить модуль
R> - RPAFproxy_ips - IP адрес(а) фронт-энд сервера(-ов)
R> - RPAFsethostname - доводит до ума поле HOST, как на фронтэнде.

R> Можете создать просто mod_rpaf.conf и положить его в conf.d/..., текст
R> следующий:

R> ---------------------------- mod_rpaf.conf ----------
R> #
R> LoadModule rpaf_module modules/mod_rpaf-2.0.so
R> #Configuration Directives:
R> RPAFenable On
R> # Enable reverse proxy add forward
R> RPAFproxy_ips YOUR_PROXY_SERVER IP_LIST_OR_ONE_IP
R> # which ips are forwarding requests to us
R> #RPAFsethostname On
R> # let rpaf update vhost settings
R> # allows to have the same hostnames as in the "real"
R> # configuration for the forwarding Apache

R> ------------------------------------------------------

R> RPAFproxy_ips - тут список IP вашего фронтенда или фронендов, пример:
R> RPAFproxy_ips 127.0.0.1 192.168.1.45 182.142.35.24

R> Далее добавляем в конфигурацию nginx (раздел server), следующую строчку:

R> proxy_add_x_forwarded_for  on;

R> Теперь nginx передает бэкэнду IP клиента в поле:
R> X-Forwarded-For, а на другом конце его подхватит mod_rpaf и сделает
R> свое грязное дело ;) :)

R> Теперь оба сервера перезапускаем любым способом, кому как нравится. :)

R> И Voila, как говорят знакомые бразильцы :)

R> Все это проделано на Fedora Core 2 и работает.

R> С Уважением,
R> Дмитрий.

R> - 
R> Owner and Founder of Remote Admin Service
R> http://remote-admin-service.encrypted-life.net







More information about the nginx-ru mailing list