105 lines
7.2 KiB
Markdown
105 lines
7.2 KiB
Markdown
# 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) |