WWW.LUSHNIKOV.NET

linux

Nginx и Apache за реверсным прокси

Как сделать так, чтобы веб-сервер, находящийся за реверсным прокси, видел ip-адреса посетителей, а не этого реверсного прокси? А вот так.

Предположим, что сайт www.example.com живет на внутреннем сервере с адресом 10.0.0.123. Предположим, что реверсные прокси (а их может быть несколько) имеют внутренние адреса 10.0.0.99 и 10.0.10.99.

Настройки реверсного прокси на базе nginx

Создать в nginx виртуалхост такого вида:

server {
        listen          *:80;
        server_name     example.com www.example.com;

        include letsencrypt.inc;

        location / {
                proxy_pass              http://10.0.0.123;
                proxy_set_header        Host             $host;
                proxy_set_header        X-Real-IP        $remote_addr;
                proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
                proxy_buffers           8 16k;
                proxy_buffer_size       32k;
        }
        large_client_header_buffers 4 81920;

        access_log /var/log/nginx/example.com-access.log;
        error_log /var/log/nginx/example.com-error.log;
}

server {
        listen          443;
        server_name     example.com www.example.com;

        include ssl.inc;

        location / {
                proxy_pass              http://10.0.0.123;
                proxy_set_header        Host             $host;
                proxy_set_header        X-Real-IP        $remote_addr;
                proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
                proxy_buffers           8 16k;
                proxy_buffer_size       32k;
        }
        large_client_header_buffers 4 81920;

        access_log /var/log/nginx/example.com-access.log;
        error_log /var/log/nginx/example.com-error.log;
}

Спецефичные для letsencrypt настройки:

Содержимое /etc/nginx/ssl.inc:

        ssl on;
        ssl_certificate /etc/dehydrated/certs/domains/fullchain.pem;
        ssl_certificate_key /etc/dehydrated/certs/domains/privkey.pem;

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
	ssl_prefer_server_ciphers on;

	ssl_stapling on;
	ssl_stapling_verify on;
	resolver 8.8.8.8;

Содержимое /etc/nginx/letsencrypt.inc:

  location /.well-known/acme-challenge {
    alias /var/www/dehydrated;
  }

Разумеется, для работы с Let's encrypt надо корректно установить и настроить упоминаемый в данном конфиге dehydrated. В репах дебиана он есть.

Внутренний веб-сервер на базе nginx

Заменить в /etc/nginx/nginx.conf:

log_format combined1 '$http_x_real_ip - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log combined1;
error_log /var/log/nginx/error.log;

Добавить в конфиг виртуалхоста:

set_real_ip_from 10.0.0.99;
set_real_ip_from 10.0.10.99;
real_ip_header    X-Forwarded-For;
real_ip_recursive on; 

Добавить в «location ~ \.php$»:

fastcgi_param REMOTE_ADDR $http_x_real_ip;

Перезапустить nginx:

# systemctl reload nginx

Внутренний веб-сервер на базе apache

В файл /etc/apache2/conf-available/remoteip.conf написать:

RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 10.0.0.99 10.0.10.99
RemoteIPInternalProxy 10.0.0.99 10.0.10.99
LogFormat "%v:%p %a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %O" common

Включить модуль remoteip, перезапустить апача:

# a2enmod remoteip
# a2enconf remoteip
# systemctl reload apache2
Tags:

Leave a Reply