0 Голосов

Изменения документа Stream (SNI-роутинг) в SWAG

Редактировал(а) Anton Krivchenkov 27.05.2026 18:05

От версии 2.1
отредактировано Anton Krivchenkov
на 27.05.2026 18:05
Изменить комментарий: К данной версии нет комментариев
К версии 1.1
отредактировано Anton Krivchenkov
на 27.05.2026 18:05
Изменить комментарий: К данной версии нет комментариев

Сводка

Подробности

Свойства страницы
Содержимое
... ... @@ -1,7 +1,6 @@
1 1  # 📘 Гайд: Stream (SNI-роутинг) в SWAG — полная документация
2 2  
3 -> **Актуально для:** SWAG (linuxserver/docker-swag) + nginx 1.25+
4 ->
3 +> **Актуально для:** SWAG (linuxserver/docker-swag) + nginx 1.25+
5 5  > **Последнее обновление:** 2026-05-27
6 6  
7 7  ---
... ... @@ -9,17 +9,17 @@
9 9  ## 📑 Содержание
10 10  
11 11  1. [Что такое stream и зачем он нужен](#1-что-такое-stream-и-зачем-он-нужен)
12 -1. [Как это работает (схема)](#2-как-это-работает-схема)
13 -1. [Какие проблемы решает](#3-какие-проблемы-решает)
14 -1. [Файловая структура — что куда класть](#4-файловая-структура--что-куда-класть)
15 -1. [Шаг 1: nginx.conf — добавить блок stream](#5-шаг-1-nginxconf--добавить-блок-stream)
16 -1. [Шаг 2: stream.conf — SNI-роутинг](#6-шаг-2-streamconf--sni-роутинг)
17 -1. [Шаг 3: default.conf — перевести http на порт 4443](#7-шаг-3-defaultconf--перевести-http-на-порт-4443)
18 -1. [Шаг 4: site-confs — все server слушают 4443](#8-шаг-4-site-confs--все-server-слушают-4443)
19 -1. [Боевой пример конфигурации](#9-боевой-пример-конфигурации)
20 -1. [Проверка и отладка](#10-проверка-и-отладка)
21 -1. [Типичные ошибки и решения](#11-типичные-ошибки-и-решения)
22 -1. [Docker Compose — порты](#12-docker-compose--порты)
11 +2. [Как это работает (схема)](#2-как-это-работает-схема)
12 +3. [Какие проблемы решает](#3-какие-проблемы-решает)
13 +4. [Файловая структура — что куда класть](#4-файловая-структура--что-куда-класть)
14 +5. [Шаг 1: nginx.conf — добавить блок stream](#5-шаг-1-nginxconf--добавить-блок-stream)
15 +6. [Шаг 2: stream.conf — SNI-роутинг](#6-шаг-2-streamconf--sni-роутинг)
16 +7. [Шаг 3: default.conf — перевести http на порт 4443](#7-шаг-3-defaultconf--перевести-http-на-порт-4443)
17 +8. [Шаг 4: site-confs — все server слушают 4443](#8-шаг-4-site-confs--все-server-слушают-4443)
18 +9. [Боевой пример конфигурации](#9-боевой-пример-конфигурации)
19 +10. [Проверка и отладка](#10-проверка-и-отладка)
20 +11. [Типичные ошибки и решения](#11-типичные-ошибки-и-решения)
21 +12. [Docker Compose — порты](#12-docker-compose--порты)
23 23  
24 24  ---
25 25  
... ... @@ -33,48 +33,50 @@
33 33  
34 34  ### Это НЕ то же самое, что http-проксирование
35 35  
36 -| Характеристика | `http { }` блок | `stream { }` блок |
37 -| -------------------------- | ---------------- | --------------------------- |
38 -| Уровень OSI | L7 (HTTP) | L4 (TCP/UDP) |
39 -| Видит ли HTTP-заголовки | ✅ Да | ❌ Нет |
40 -| Видит ли SNI | ✅ Да (после TLS) | ✅ Да (ssl_preread, без TLS) |
41 -| Terminates TLS | ✅ Да | ❌ Нет (передаёт дальше) |
42 -| Можно ли делать proxy_pass | ✅ Да | ✅ Да (TCP) |
35 +| Характеристика | `http { }` блок | `stream { }` блок |
36 +|---|---|---|
37 +| Уровень OSI | L7 (HTTP) | L4 (TCP/UDP) |
38 +| Видит ли HTTP-заголовки | ✅ Да | ❌ Нет |
39 +| Видит ли SNI | ✅ Да (после TLS) | ✅ Да (ssl_preread, без TLS) |
40 +| Terminates TLS | ✅ Да | ❌ Нет (передаёт дальше) |
41 +| Можно ли делать proxy_pass | ✅ Да | ✅ Да (TCP) |
43 43  
44 44  ---
45 45  
46 46  ## 2. Как это работает (схема)
47 47  
48 - ┌─────────────────────────────────────────────────┐
49 - │ SWAG Container │
50 - │ │
51 - Клиент ──── :443 ───► │ stream { │
52 - (TLS ClientHello) │ ssl_preread on; ← читает SNI без decrypt │
53 - │ map $ssl_preread_server_name $backend { │
54 - │ nextcl.dev0ps.online → remnanode:8443 │
55 - │ * (default) → 127.0.0.1:4443│
56 - │ } │
57 - │ proxy_pass $backend; │
58 - │ } │
59 - │ │ │ │
60 - │ ▼ ▼ │
61 - │ remnanode:8443 http { } :4443 │
62 - │ (Reality/Xray, (SWAG, terminates │
63 - │ TLS не трогаем) TLS, proxy_pass) │
64 - │ │ │
65 - │ ▼ │
66 - │ site-confs/*.conf │
67 - │ proxy-confs/*.conf │
68 - └─────────────────────────────────────────────────┘
47 +```
48 + ┌─────────────────────────────────────────────────┐
49 + │ SWAG Container │
50 + │ │
51 + Клиент ──── :443 ───► │ stream { │
52 + (TLS ClientHello) │ ssl_preread on; ← читает SNI без decrypt │
53 + │ map $ssl_preread_server_name $backend { │
54 + │ nextcl.dev0ps.online → remnanode:8443 │
55 + │ * (default) → 127.0.0.1:4443│
56 + │ } │
57 + │ proxy_pass $backend; │
58 + │ } │
59 + │ │ │ │
60 + │ ▼ ▼ │
61 + │ remnanode:8443 http { } :4443 │
62 + │ (Reality/Xray, (SWAG, terminates │
63 + │ TLS не трогаем) TLS, proxy_pass) │
64 + │ │ │
65 + │ ▼ │
66 + │ site-confs/*.conf │
67 + │ proxy-confs/*.conf │
68 + └─────────────────────────────────────────────────┘
69 +```
69 69  
70 70  ### Поток данных
71 71  
72 72  1. **Клиент** подключается к порту **443**
73 -1. **stream** блок принимает соединение и читает SNI из TLS ClientHello
74 -1. **map** выбирает бекенд на основе SNI:
75 - * `nextcl.dev0ps.online` → `remnanode:8443` (проксирует TCP как есть, TLS не трогается)
76 - * всё остальное → `127.0.0.1:4443` (передаёт в http-блок SWAG)
77 -1. **http** блок на порту **4443** терминирует TLS и делает HTTP-проксирование
74 +2. **stream** блок принимает соединение и читает SNI из TLS ClientHello
75 +3. **map** выбирает бекенд на основе SNI:
76 + - `nextcl.dev0ps.online` → `remnanode:8443` (проксирует TCP как есть, TLS не трогается)
77 + - всё остальное → `127.0.0.1:4443` (передаёт в http-блок SWAG)
78 +4. **http** блок на порту **4443** терминирует TLS и делает HTTP-проксирование
78 78  
79 79  ---
80 80  
... ... @@ -102,25 +102,27 @@
102 102  
103 103  ## 4. Файловая структура — что куда класть
104 104  
105 - swag/nginx/
106 - ├── nginx.conf ← ГЛАВНЫЙ конфиг: добавить stream { } блок
107 - ├── stream.conf ← НОВЫЙ ФАЙЛ: SNI-роутинг (L4)
108 - ├── ssl.conf ← Без изменений
109 - ├── site-confs/
110 - │ ├── default.conf ← ИЗМЕНИТЬ: listen 443 → listen 4443
111 - │ └── dev0ps.online.conf ← ИЗМЕНИТЬ: listen 443 → listen 4443
112 - └── proxy-confs/
113 - └── *.subdomain.conf ← ИЗМЕНИТЬ: listen 443 → listen 4443
106 +```
107 +swag/nginx/
108 +├── nginx.conf ← ГЛАВНЫЙ конфиг: добавить stream { } блок
109 +├── stream.conf ← НОВЫЙ ФАЙЛ: SNI-роутинг (L4)
110 +├── ssl.conf ← Без изменений
111 +├── site-confs/
112 +│ ├── default.conf ← ИЗМЕНИТЬ: listen 443 → listen 4443
113 +│ └── dev0ps.online.conf ← ИЗМЕНИТЬ: listen 443 → listen 4443
114 +└── proxy-confs/
115 + └── *.subdomain.conf ← ИЗМЕНИТЬ: listen 443 → listen 4443
116 +```
114 114  
115 115  ### Порядок действий
116 116  
117 -| Шаг | Файл | Действие |
118 -| --- | -------------------- | -------------------------------------------------------- |
119 -| 1 | `nginx.conf` | Добавить `stream { include /config/nginx/stream.conf; }` |
120 -| 2 | `stream.conf` | Создать с SNI-роутингом |
121 -| 3 | `default.conf` | Заменить `listen 443 ssl` → `listen 4443 ssl` |
122 -| 4 | `site-confs/*.conf` | Заменить `listen 443 ssl` → `listen 4443 ssl` |
123 -| 5 | `proxy-confs/*.conf` | Заменить `listen 443 ssl` → `listen 4443 ssl` |
120 +| Шаг | Файл | Действие |
121 +|-----|------|----------|
122 +| 1 | `nginx.conf` | Добавить `stream { include /config/nginx/stream.conf; }` |
123 +| 2 | `stream.conf` | Создать с SNI-роутингом |
124 +| 3 | `default.conf` | Заменить `listen 443 ssl` → `listen 4443 ssl` |
125 +| 4 | `site-confs/*.conf` | Заменить `listen 443 ssl` → `listen 4443 ssl` |
126 +| 5 | `proxy-confs/*.conf` | Заменить `listen 443 ssl` → `listen 4443 ssl` |
124 124  
125 125  ---
126 126  
... ... @@ -154,9 +154,9 @@
154 154  
155 155  ### ⚠️ Критически важно
156 156  
157 -* `stream { }` должен быть **на верхнем уровне** (не внутри `http { }`!)
158 -* `stream { }` и `http { }` — это **параллельные** блоки одного уровня
159 -* Внутри `stream { }` **нельзя** использовать http-директивы (`server_name`, `location`, `proxy_set_header` и т.д.)
160 +- `stream { }` должен быть **на верхнем уровне** (не внутри `http { }`!)
161 +- `stream { }` и `http { }` — это **параллельные** блоки одного уровня
162 +- Внутри `stream { }` **нельзя** использовать http-директивы (`server_name`, `location`, `proxy_set_header` и т.д.)
160 160  
161 161  ---
162 162  
... ... @@ -245,8 +245,7 @@
245 245  }
246 246  ```
247 247  
248 -> **Полная замена:** везде в default.conf где `443` → заменить на `4443`.
249 ->
251 +> **Полная замена:** везде в default.conf где `443` → заменить на `4443`.
250 250  > Порт 80 оставить без изменений (HTTP → HTTPS редирект).
251 251  
252 252  ---
... ... @@ -275,10 +275,8 @@
275 275  }
276 276  ```
277 277  
278 -> **Массовая замена:** во ВСЕХ файлах заменить `listen 443 ssl` → `listen 4443 ssl`
279 ->
280 -> и `listen [::]:443 ssl` → `listen [::]:4443 ssl`
281 ->
280 +> **Массовая замена:** во ВСЕХ файлах заменить `listen 443 ssl` → `listen 4443 ssl`
281 +> и `listen [::]:443 ssl` → `listen [::]:4443 ssl`
282 282  > Порт 80 не трогать!
283 283  
284 284  ---
... ... @@ -453,7 +453,6 @@
453 453  ```
454 454  
455 455  **Ожидаемый вывод:**
456 -
457 457  ```
458 458  nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
459 459  nginx: configuration file /etc/nginx/nginx.conf test is successful
... ... @@ -472,7 +472,6 @@
472 472  ```
473 473  
474 474  **Ожидаемый вывод:**
475 -
476 476  ```
477 477  LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",...))
478 478  LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",...)) ← stream
... ... @@ -613,3 +613,4 @@
613 613  docker logs swag --tail 30
614 614  docker exec swag tail -30 /config/log/nginx/error.log
615 615  ```
614 +