- Расширена логика получения IP-адреса с учетом новых заголовков, таких как CF-Connecting-IP и Forwarded. - Добавлено детальное логирование заголовков для упрощения отладки. - Внедрен тестовый эндпоинт для проверки извлечения IP-адресов и отображения заголовков запроса.
150 lines
4.7 KiB
Markdown
150 lines
4.7 KiB
Markdown
# Настройка nginx Proxy Manager для корректной передачи IP-адресов
|
||
|
||
## Проблема
|
||
|
||
При использовании nginx Proxy Manager в режиме bridge, реальный IP-адрес клиента может не передаваться корректно, и вместо него всегда показывается IP-адрес прокси-сервера (например, 90.189.198.107).
|
||
|
||
## Решение
|
||
|
||
### 1. Настройка nginx Proxy Manager
|
||
|
||
В настройках прокси-хоста в nginx Proxy Manager добавьте следующие заголовки:
|
||
|
||
#### В разделе "Advanced" → "Custom Nginx Configuration":
|
||
|
||
```nginx
|
||
# Передача реального IP-адреса клиента
|
||
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;
|
||
proxy_set_header X-Forwarded-Host $host;
|
||
proxy_set_header X-Forwarded-Port $server_port;
|
||
|
||
# Дополнительные заголовки для лучшей совместимости
|
||
proxy_set_header X-Client-IP $remote_addr;
|
||
proxy_set_header X-Forwarded $scheme://$host;
|
||
|
||
# Установка доверенного прокси
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Forwarded-Server $host;
|
||
```
|
||
|
||
#### Или в разделе "Custom Nginx Configuration" (если доступен):
|
||
|
||
```nginx
|
||
location / {
|
||
proxy_pass http://your-app-container:3000;
|
||
|
||
# Передача реального IP-адреса
|
||
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;
|
||
proxy_set_header X-Forwarded-Host $host;
|
||
proxy_set_header X-Forwarded-Port $server_port;
|
||
proxy_set_header X-Client-IP $remote_addr;
|
||
|
||
# Дополнительные настройки
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Forwarded-Server $host;
|
||
|
||
# Таймауты
|
||
proxy_connect_timeout 60s;
|
||
proxy_send_timeout 60s;
|
||
proxy_read_timeout 60s;
|
||
|
||
# Буферизация
|
||
proxy_buffering off;
|
||
proxy_request_buffering off;
|
||
}
|
||
```
|
||
|
||
### 2. Настройка Docker Compose (если используется)
|
||
|
||
Если ваш nginx Proxy Manager работает в Docker, убедитесь, что в docker-compose.yml правильно настроена сеть:
|
||
|
||
```yaml
|
||
version: "3.8"
|
||
services:
|
||
nginx-proxy-manager:
|
||
image: jc21/nginx-proxy-manager:latest
|
||
container_name: nginx-proxy-manager
|
||
ports:
|
||
- "80:80"
|
||
- "443:443"
|
||
- "81:81"
|
||
volumes:
|
||
- ./data:/data
|
||
- ./letsencrypt:/etc/letsencrypt
|
||
networks:
|
||
- npm-network
|
||
restart: unless-stopped
|
||
|
||
your-app:
|
||
image: your-app-image
|
||
container_name: your-app
|
||
networks:
|
||
- npm-network
|
||
restart: unless-stopped
|
||
|
||
networks:
|
||
npm-network:
|
||
driver: bridge
|
||
```
|
||
|
||
### 3. Проверка работы
|
||
|
||
После настройки используйте тестовый эндпоинт для проверки:
|
||
|
||
```bash
|
||
curl -H "X-Forwarded-For: 192.168.1.100" https://your-domain.com/api/debug/ip
|
||
```
|
||
|
||
Или откройте в браузере: `https://your-domain.com/api/debug/ip`
|
||
|
||
### 4. Ожидаемый результат
|
||
|
||
В ответе должно быть:
|
||
|
||
```json
|
||
{
|
||
"detected_ip": "192.168.1.100", // Реальный IP клиента
|
||
"headers": {
|
||
"x-forwarded-for": "192.168.1.100",
|
||
"x-real-ip": "192.168.1.100",
|
||
"x-client-ip": "192.168.1.100"
|
||
}
|
||
}
|
||
```
|
||
|
||
### 5. Отладка
|
||
|
||
Если IP-адрес все еще неправильный:
|
||
|
||
1. Проверьте логи nginx Proxy Manager
|
||
2. Убедитесь, что заголовки передаются (используйте `/api/debug/ip`)
|
||
3. Проверьте настройки сети Docker
|
||
4. Убедитесь, что nginx Proxy Manager не находится за дополнительными прокси
|
||
|
||
### 6. Дополнительные настройки
|
||
|
||
#### Для Cloudflare
|
||
|
||
Если вы используете Cloudflare, добавьте:
|
||
|
||
```nginx
|
||
proxy_set_header CF-Connecting-IP $http_cf_connecting_ip;
|
||
```
|
||
|
||
#### Для AWS Load Balancer
|
||
|
||
```nginx
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
|
||
```
|
||
|
||
## Примечания
|
||
|
||
- После изменения настроек nginx Proxy Manager перезапустите контейнер
|
||
- Убедитесь, что ваш Node.js сервер настроен с `app.set("trust proxy", true)`
|
||
- Тестовый эндпоинт `/api/debug/ip` можно удалить после настройки
|