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

RaPaMaN rapaman at virthost.net
Tue Feb 22 22:10:21 MSK 2005


голос из прошлого :), это я про howto свое :)

И добавлю, чтобы  патчик был полный под mod_rpaf и работал он вместе c geoip 
от maxmind и реагировали Allow + Deny адекватно IP подменяемому.

Нужно еще изменить строчку

ap_hook_post_read_request(change_remote_ip, NULL, NULL, APR_HOOK_MIDDLE);

на 

ap_hook_post_read_request(change_remote_ip, NULL, NULL, APR_HOOK_FIRST);

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

--
Remote Admin Service
http://remote-admin-service.encrypted-life.net

On Tuesday 22 February 2005 20:51, Alexey Bestciokov wrote:
> у мод рпаф есть один недостаток по сравнению с модулем Игоря - он не
> понимает заголовка 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