Docs/docs/07-proxy-ssl.md
2026-03-20 16:24:08 +05:00

105 lines
7.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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)