Как можно узнать фактический IP-адрес клиента в Docker подсети?

У меня возникла проблема: я не могу увидеть IP-адреса клиентов и получаю только внутренние IP-адреса из сети Docker. Вот логи, которые подтверждают это: 

<pre><code>backend-1   |       INFO   172.18.0.5:34934 - "GET /tasks HTTP/1.0" 200
nginx       | 172.18.0.1 - - [11/Jan/2025:11:47:59 +0000] "GET /api/tasks HTTP/1.1" 200 2 "http://dev.zone/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 YaBrowser/24.12.0.0 Safari/537.36"</code></pre> 

Мой файл конфигурации nginx выглядит следующим образом: 

<pre><code class="nginx">events {}

http {
    server {
        listen 80;

        # Фронтенд
        location / {
            root /usr/share/nginx/html;
            index index.html;
        }

        # Прокси на бэкенд
        location /api/ {
            proxy_pass http://backend:8000/;
            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_set_header X-Forwarded-Proto $scheme;
        }

        # Прокси на phpMyAdmin
        location /phpmyadmin/ {
            proxy_pass http://phpmyadmin:80/;
            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_set_header X-Forwarded-Proto $scheme;
        }
    }
}</code></pre> 

Я уже читал похожие статьи на Хабре, но они не помогли решить проблему.
  • 11 января 2025 г. 11:54
Ответы на вопрос 2
Когда вы используете Nginx как обратный прокси, чтобы передавать запросы на бэкенд-сервисы, важно корректно настраивать заголовки, которые передаются через прокси, для того чтобы бэкенд знал фактический IP-адрес клиента.

В вашем случае вы уже правильно добавили следующие строк в конфигурацию Nginx:

```nginx
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
```

Эти строки указывают Nginx отправлять IP-адрес клиента через заголовки. Однако, вам также нужно убедиться, что ваш бэкенд-сервис правильно обрабатывает эти заголовки и использует значение из `X-Forwarded-For` или `X-Real-IP`.

Вот несколько шагов, которые помогут вам в этом:

1. **Проверьте конфигурацию бэкенда**: Убедитесь, что ваш бэкенд-сервис (например, веб-приложение) правильно обрабатывает заголовки `X-Real-IP` и `X-Forwarded-For`. В некоторых фреймворках или языках есть специальные средства для этого.

2. **Настройка бэкенда**: Если вы, например, используете Python с Flask, для получения исходного IP-адреса клиента можно использовать следующий код:

   ```python
   from flask import request

   @app.route('/tasks', methods=['GET'])
   def get_tasks():
       client_ip = request.headers.get('X-Real-IP') or request.headers.get('X-Forwarded-For', '').split(',')[0]
       # Залогируйте или используйте client_ip
   ```

3. **Перезагрузите Nginx**: После внесения изменений в конфигурацию, не забудьте перезапустить Nginx, чтобы применить изменения:

   ```bash
   docker exec <nginx_container_name> nginx -s reload
   ```

4. **Проверьте конфигурацию сети Docker**: Убедитесь, что ваша сеть Docker правильно настроена. Например, если вы используете Docker Compose, проверьте, что сервисы находятся в одной и той же сети.

5. **Логи и мониторинг**: Проверьте логи вашего бэкенда после внесения изменений, чтобы убедиться, что вы теперь получаете ожидаемые IP-адреса клиентов.

Следуя этим шагам, вы сможете увидеть фактические IP-адреса клиентов в ваших логах бэкенда.
Нужно чтобы "снаружи" относительно сети докера был L7 прокси, который видит ip клиента, и который добавит этот ip в заголовки запроса.
Похожие вопросы