# 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): ```nginx 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` внутри контейнера. Основные параметры: ```nginx 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 и истечения сертификатов. --- **Связанные разделы:** - [Сервисы и порты](06-services.md) - [Сеть и доступ](04-network.md) - [Мониторинг и логирование](08-monitoring.md) - [Безопасность](10-security.md)