Как настроить HTTPS-прокси-сервер на одном IP-адресе так, чтобы серверная часть (backend) могла видеть реальный IP-адрес клиента?

У меня есть задача, связанная с маршрутизацией трафика. У меня есть один IP-адрес, на который настроены семь доменных имен, и за ним находятся семь серверов, работающих на различных операционных системах и веб-серверах (включая NGINX и Apache), каждый из которых имеет свои уникальные настройки. Я хочу, чтобы один обратный прокси управлял всем входящим трафиком, действуя как маршрутизатор, но маршрутизировал по доменным именам, а не по IP-адресам. 

Я уже настроил такой прокси на NGINX и прописал конфигурацию для всех сайтов. Вот пример конфигурации: 
<pre><code>server {
        listen 443  ssl;
        server_name sd-info.ru www.site1.ru;
        access_log /var/log/nginx/site1.ru.access.log;
        error_log /var/log/nginx/site1.ru.error.log notice;
        ssl_certificate /etc/letsencrypt/live/site1.ru/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/site1.ru/privkey.pem; # managed by Certbot
        ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
        ssl_prefer_server_ciphers on;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

        location ~* {
                proxy_ignore_client_abort on;
                proxy_pass https://192.168.88.111;
                proxy_redirect https://192.168.88.111 ~*;
                proxy_set_header Host $host;
                proxy_max_temp_file_size 0;
                proxy_ssl_server_name on;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header HTTPS YES;

                # WebSocket support
                proxy_http_version 1.1;
                proxy_set_head
  • 20 ноября 2024 г. 15:33
Ответы на вопрос 3
Чтобы настроить HTTPS-прокси-сервер на NGINX так, чтобы серверная часть могла видеть реальный IP-адрес клиента, вам нужно правильно передавать заголовки `X-Real-IP` и `X-Forwarded-For`, как вы уже начали делать в вашем конфигурационном фрагменте. Однако для полной конфигурации важно удостовериться, что серверная часть (backend) правильно обрабатывает эти заголовки.

Вот несколько шагов для реализации этой задачи:

### 1. Настройка NGINX как обратного прокси

Ваш текущий конфигурационный файл имеет правильные строки для передачи информации о клиенте. Убедитесь, что он завершён корректно и выглядит примерно так:

```nginx
server {
    listen 443 ssl;
    server_name sd-info.ru www.site1.ru;
    
    access_log /var/log/nginx/site1.ru.access.log;
    error_log /var/log/nginx/site1.ru.error.log notice;

    ssl_certificate /etc/letsencrypt/live/site1.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/site1.ru/privkey.pem; # managed by Certbot
    ssl_protocols TLSv1.2 TLSv1.3; 
    ssl_ciphers 'HIGH:!aNULL:!MD5:!3DES:!RC4'; 

    location / {
        proxy_pass https://192.168.88.111; # Ваш backend адрес
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr; # Передача реального IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # Добавляем IP
        proxy_set_header X-Forwarded-Proto $scheme; 
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_ssl_server_name on;
        
        # Опционально, для поддержки WebSocket
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
```

### 2. Настройка вашего backend-сервера

На стороне вашего backend-сервера (например, на Apache или NGINX) вам нужно убедиться, что он правильно обрабатывает заголовки, передаваемые от прокси:

#### Для NGINX как backend:

```nginx
http {
    ...
    set_real_ip_from 192.168.88.1; # IP вашего NGINX-прокси
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
    ...
}
```

#### Для Apache как backend:

В конфигурации Apache можно использовать модуль `mod_remoteip`. Вам необходимо добавить следующее в конфигурацию вашего виртуального хоста:

```apache
<IfModule mod_remoteip.c>
    RemoteIPHeader X-Forwarded-For
    RemoteIPTrustedProxy 192.168.88.1 # IP-адрес вашего NGINX-прокси
</IfModule>
```

### 3. Тестирование конфигурации

После внесения всех изменений перезапустите NGINX и ваш backend-сервер. Проверьте логи на наличие реальных IP-адресов клиентов:

- Для NGINX проверяйте файл `/var/log/nginx/site1.ru.access.log`.
- Для вашего backend-сервера проверьте соответствующий лог-файл.

### 4. Заключение

С учетом этих шагов настройка вашего HTTPS-прокси-сервера должна быть правильна и позволит вашему backend-серверу видеть реальные IP-адреса клиентов. Не забудьте протестировать все сценарии, чтобы убедиться в корректной работе системы в целом.
Ну так Nginx настройте, под каждый домен свой конфиг отдельный и всё...
если от https://nginx.org/en/docs/stream/ngx_stream_ssl_pr... и https://nginx.org/en/docs/stream/ngx_stream_proxy_... (через proxy_protocol on ) не получится добиться желаемого, то на одном ip-адресе ваше "нужно" идёт в пешее эротическое 

да и то оно хоть как-то имеет смысл если не используется EncryptedHello и "серверы" согласятся использовать PROXY-протокол

и с https по-другому никак, в этом его суть, что на уровне ниже 7 до расшифровки (терминирования tls-сессии) это просто набор зашифрованных данных, на который можно медитировать до посинения, но так не узнать что там есть
Похожие вопросы