7.2 KiB
07. Проксирование и SSL (Nginx Proxy Manager)
Обзор
Nginx Proxy Manager (NPM) запущен в Docker-контейнере на хосте gateway (192.168.1.201). Он принимает входящие HTTP/HTTPS-запросы на порты 80 и 443 и проксирует их к внутренним сервисам. SSL-сертификаты автоматически выпускаются и обновляются через Let's Encrypt.
Заголовки безопасности
Для защиты веб-сервисов рекомендуется добавлять следующие HTTP-заголовки для каждого проксируемого домена (настройка в интерфейсе NPM → Advanced):
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options SAMEORIGIN always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), camera=(), microphone=(), payment=()" always;
Назначение заголовков
| Заголовок | Назначение |
|---|---|
| Strict-Transport-Security (HSTS) | Заставляет браузер всегда использовать HTTPS, предотвращая атаки понижения протокола. |
| X-Content-Type-Options | Запрещает браузеру выполнять MIME-sniffing, снижая риск атак типа XSS. |
| X-Frame-Options | Защищает от clickjacking, разрешая встраивание только в страницы того же источника. |
| Referrer-Policy | Контролирует, какая информация о referer передаётся при переходе на другие сайты. |
| Permissions-Policy | Отключает ненужные API (геолокация, камера, микрофон) для всех страниц. |
Глобальная конфигурация NPM
Глобальные настройки находятся в /etc/nginx/nginx.conf внутри контейнера. Основные параметры:
client_max_body_size 2000m; # максимальный размер загружаемого файла (2 ГБ)
proxy_read_timeout 90s; # таймаут чтения прокси
set_real_ip_from 10.0.0.0/8; # доверенные подсети для определения реального IP
set_real_ip_from 172.16.0.0/12;
set_real_ip_from 192.168.0.0/16;
real_ip_header X-Real-IP;
real_ip_recursive on;
- client_max_body_size 2000m – позволяет загружать большие файлы (например, видео в Jellyfin).
- proxy_read_timeout 90s – защищает от зависания долгих запросов.
- set_real_ip_from – определяет реальный IP клиента, что важно для корректной работы логирования и ограничений.
Доступ к админке NPM
Административный интерфейс доступен по адресу https://192.168.1.201:81 (только локально). Учётные данные хранятся в зашифрованном виде во встроенной базе данных SQLite.
Проксируемые домены
Список всех активных прокси (актуально на 20 марта 2026):
| Домен | Бэкенд | SSL | Статус |
|---|---|---|---|
| ab.zailon.ru | http://192.168.1.203:45132 | Let's Encrypt | Online |
| book.zailon.ru | http://192.168.1.202:45133 | Let's Encrypt | Online |
| bw.zailon.ru | http://192.168.1.202:45131 | Let's Encrypt | Online |
| chat.zailon.ru | https://192.168.1.206:8443 | Let's Encrypt | Online |
| cloud.zailon.ru | http://192.168.1.213:45131 | Let's Encrypt | Online |
| cook.zailon.ru | http://192.168.1.202:45132 | Let's Encrypt | Online |
| git.zailon.ru | http://192.168.1.209:45130 | Let's Encrypt | Online |
| jellyfin.zailon.ru | http://192.168.1.203:45131 | Let's Encrypt | Online |
| mnemozailon.ru | http://192.168.1.202:45133 | Let's Encrypt | Online |
| mon.zailon.ru | http://192.168.1.208:45132 | Let's Encrypt | Online |
| music.zailon.ru | http://192.168.1.203:45132 | Let's Encrypt | Online |
| nc.zailon.ru | https://192.168.1.205:443 | Let's Encrypt | Online |
| olimp.zailon.ru | http://192.168.1.201:45131 | Let's Encrypt | Online |
| oracul.zailon.ru | http://192.168.1.208:45131 | Let's Encrypt | Online |
| photo.zailon.ru | http://192.168.1.204:45131 | Let's Encrypt | Online |
| qb.zailon.ru | http://192.168.1.211:8080 | Let's Encrypt | Offline |
Проблема:
qb.zailon.ruотображается как Offline. Необходимо проверить доступность qBittorrent на порту 8080 и корректность прокси-правила.
Мониторинг NPM
- Логи NPM собираются Promtail (на gateway) и отправляются в Loki.
- В Grafana настроены дашборды для отслеживания ошибок и статистики запросов.
- Ключевые метрики: количество запросов, коды ответов (4xx, 5xx), загрузка сертификатов.
Проблемы и рекомендации
🔴 Отсутствие заголовков безопасности
Большинство прокси не имеют настроенных заголовков HSTS, X-Content-Type-Options и других. Это повышает риски атак. Рекомендуется добавить заголовки для всех публичных доменов через интерфейс NPM (вкладка Advanced).
🟡 Использование тега latest
Образ NPM (jc21/nginx-proxy-manager:latest) обновляется неконтролируемо. Рекомендуется зафиксировать версию в docker-compose.yml (например, jc21/nginx-proxy-manager:2.12.3).
🟠 Прокси с Offline статусом
qb.zailon.ru недоступен. Проверьте:
- Запущен ли контейнер qBittorrent на хосте
torrent? - Слушает ли он порт 8080 (
ss -tulnwp | grep 8080)? - Корректно ли правило прокси (IP и порт)?
🟢 Мониторинг
Убедитесь, что логи NPM попадают в Loki. Проверьте конфигурацию Promtail на gateway. В Grafana создайте дашборд для отслеживания ошибок 5xx и истечения сертификатов.
Связанные разделы: