zapret2-mcp 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +7 -5
- package/knowledge/config/auto-hostlist.md +109 -0
- package/knowledge/config/desync-profiles.md +118 -0
- package/knowledge/config/hostlists-ipsets.md +139 -0
- package/knowledge/config/migration-v1-to-v2.md +1 -1
- package/knowledge/config/security-hardening.md +110 -0
- package/knowledge/platforms/supported.md +51 -12
- package/knowledge/strategies/community-strategies.md +129 -0
- package/knowledge/strategies/fake-packets.md +91 -4
- package/knowledge/strategies/lua-scripting.md +123 -0
- package/knowledge/strategies/orchestration.md +27 -4
- package/knowledge/troubleshooting/common-issues.md +27 -4
- package/knowledge/tspu/architecture.md +18 -3
- package/knowledge/tspu/blocking-methods.md +30 -2
- package/knowledge/tspu/dpi-engine.md +15 -2
- package/knowledge/tspu/legal-risks.md +37 -0
- package/knowledge/tspu/night-reconfig.md +35 -0
- package/knowledge/tspu/two-stage-blocking.md +4 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.7.2](https://github.com/rcd27/zapret2-mcp/compare/v0.7.1...v0.7.2) (2026-03-28)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **knowledge:** ряд статей и правок, согласно опыту community ([e7769c0](https://github.com/rcd27/zapret2-mcp/commit/e7769c0cadc372e679c3bf5dff2e234069629e41))
|
|
9
|
+
* **knowledge:** стратегии сообщества + данные по ночным перезагрузкам + правки ([2173d3b](https://github.com/rcd27/zapret2-mcp/commit/2173d3bc39711cc1ee2bdf779effff6d6ffd8a5c))
|
|
10
|
+
|
|
11
|
+
## [0.7.1](https://github.com/rcd27/zapret2-mcp/compare/v0.7.0...v0.7.1) (2026-03-28)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
* **knowledge:** deep-wiki, как источник №1 ([5ed5d46](https://github.com/rcd27/zapret2-mcp/commit/5ed5d4637f2be2a5710f60bf8a54ab38eaaddb85))
|
|
17
|
+
|
|
3
18
|
## [0.7.0](https://github.com/rcd27/zapret2-mcp/compare/v0.6.1...v0.7.0) (2026-03-28)
|
|
4
19
|
|
|
5
20
|
|
package/README.md
CHANGED
|
@@ -2,24 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/rcd27/zapret2-mcp/actions/workflows/ci.yml)
|
|
4
4
|
[](https://www.npmjs.com/package/zapret2-mcp)
|
|
5
|
-
[](https://www.npmjs.com/package/zapret2-mcp)
|
|
6
|
+
[](./knowledge/)
|
|
6
7
|
[](LICENSE)
|
|
7
8
|
|
|
8
9
|
База знаний по [zapret2](https://github.com/bol-van/zapret2) (DPI bypass) и [blockcheckw](https://github.com/rcd27/blockcheckw) (сканер стратегий). Работает как [MCP-сервер](https://modelcontextprotocol.io/) для LLM-агентов и как обычная документация.
|
|
9
10
|
|
|
10
|
-
> **Можно использовать без агентов.** [`knowledge/`](./knowledge/) —
|
|
11
|
+
> **Можно использовать без агентов.** [`knowledge/`](./knowledge/) — 32 статьи на русском языке. Открывайте и читайте как обычную документацию, без установки чего-либо.
|
|
11
12
|
|
|
12
13
|
## Что внутри
|
|
13
14
|
|
|
14
15
|
| Раздел | Статей | Темы |
|
|
15
16
|
|--------|--------|------|
|
|
16
|
-
| [strategies/](./knowledge/strategies/) |
|
|
17
|
-
| [config/](./knowledge/config/) |
|
|
17
|
+
| [strategies/](./knowledge/strategies/) | 9 | TCP segmentation, fake packets, Lua scripting, QUIC, circular, Discord, Telegram, orchestration |
|
|
18
|
+
| [config/](./knowledge/config/) | 9 | nfqws2 CLI, zapret2 config, desync profiles, hostlists/ipsets, auto-hostlist, security hardening, UCI, blobs, миграция v1 → v2 |
|
|
18
19
|
| [troubleshooting/](./knowledge/troubleshooting/) | 5 | Smart TV + YouTube, QUIC, IPv6, FLOWOFFLOAD, конфликты с Podkop |
|
|
19
20
|
| [tspu/](./knowledge/tspu/) | 4 | Архитектура ТСПУ, DPI engine, методы блокировки, двухстадийная система |
|
|
20
21
|
| [workflows/](./knowledge/workflows/) | 2 | Установка, поиск стратегии |
|
|
21
22
|
| [blockcheckw/](./knowledge/blockcheckw/) | 2 | Overview, команды |
|
|
22
|
-
| [platforms/](./knowledge/platforms/) | 1 |
|
|
23
|
+
| [platforms/](./knowledge/platforms/) | 1 | Linux, OpenWrt, Windows, FreeBSD, OpenBSD, Android |
|
|
23
24
|
|
|
24
25
|
## Подключение к LLM-агенту
|
|
25
26
|
|
|
@@ -90,6 +91,7 @@ npm start
|
|
|
90
91
|
|
|
91
92
|
## Источники
|
|
92
93
|
|
|
94
|
+
- [deepwiki/zapret2](https://deepwiki.com/bol-van/zapret2) — AI-сгенерированная документация из исходного кода (приоритетный источник)
|
|
93
95
|
- [zapret2](https://github.com/bol-van/zapret2) — DPI bypass от bol-van
|
|
94
96
|
- [blockcheckw](https://github.com/rcd27/blockcheckw) — быстрый сканер стратегий
|
|
95
97
|
- [tspu-docs](https://github.com/DanielLavrushin/tspu-docs) — документация ТСПУ
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Auto-Hostlist and Failure Detection
|
|
3
|
+
zapret2-version: v0.9.4.5
|
|
4
|
+
tags: auto-hostlist, failure detection, retransmission, rst, redirect, autohostlist, blocking detection
|
|
5
|
+
source: deepwiki/bol-van/zapret2, official-docs
|
|
6
|
+
created: 2026-03-28
|
|
7
|
+
updated: 2026-03-28
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Авто-хостлист и детекция отказов
|
|
11
|
+
|
|
12
|
+
Автоматическое обнаружение заблокированных доменов по паттернам сбоев соединений. Домены, которые повторно не загружаются, автоматически добавляются в хостлист для применения DPI bypass.
|
|
13
|
+
|
|
14
|
+
## Принцип работы
|
|
15
|
+
|
|
16
|
+
1. Демон мониторит сетевые соединения на признаки DPI-блокировки
|
|
17
|
+
2. При обнаружении сбоя увеличивает счётчик для данного домена
|
|
18
|
+
3. При достижении порога — домен записывается в файл auto-hostlist
|
|
19
|
+
4. С этого момента к домену применяется стратегия обхода
|
|
20
|
+
|
|
21
|
+
## Механизмы детекции (C-side)
|
|
22
|
+
|
|
23
|
+
Встроенная детекция активна когда у профиля настроен `hostlist_auto`:
|
|
24
|
+
|
|
25
|
+
| Тип сбоя | Направление | Как определяется |
|
|
26
|
+
|----------|-------------|-----------------|
|
|
27
|
+
| TCP Retransmission | Исходящий | Sequence number ≤ ранее отслеженной позиции |
|
|
28
|
+
| Incoming RST | Входящий | RST-флаг в пределах `hostlist_auto_incoming_maxseq` |
|
|
29
|
+
| HTTP Redirect | Входящий | DPI-редирект (домен в Location не совпадает с оригиналом) |
|
|
30
|
+
| UDP Timeout | Оба | Исходящих ≥ порога И входящих ≤ порога |
|
|
31
|
+
|
|
32
|
+
### Детекция TCP-ретрансмиссий
|
|
33
|
+
|
|
34
|
+
Функция `is_retransmission()` сравнивает sequence текущего пакета с отслеженной позицией (`ctrack->pos.client.tcp.uppos_prev`). Когда `req_retrans_counter` достигает `hostlist_auto_retrans_threshold` — вызывается `auto_hostlist_failed()`.
|
|
35
|
+
|
|
36
|
+
Опционально: `hostlist_auto_retrans_reset` — отправка spoofed RST для сброса цикла ретрансмиссий.
|
|
37
|
+
|
|
38
|
+
### Детекция HTTP-редиректов
|
|
39
|
+
|
|
40
|
+
`is_dpi_redirect()` сравнивает домен из заголовка `Location` с оригинальным hostname. Если домены не совпадают — это DPI-редирект.
|
|
41
|
+
|
|
42
|
+
## Lua-based детекция
|
|
43
|
+
|
|
44
|
+
`standard_failure_detector` в `zapret-auto.lua` зеркалит C-логику со скриптовыми порогами:
|
|
45
|
+
- RST-детекция: проверка TCP reset flag в диапазоне `inseq`
|
|
46
|
+
- HTTP-редирект: через `is_dpi_redirect()`
|
|
47
|
+
- UDP failure: порог исходящих при отсутствии входящих
|
|
48
|
+
|
|
49
|
+
## Управление состоянием
|
|
50
|
+
|
|
51
|
+
### Host Records (`hrec`)
|
|
52
|
+
Постоянные счётчики и текущий индекс стратегии для каждого домена.
|
|
53
|
+
|
|
54
|
+
### Connection Records (`crec`)
|
|
55
|
+
Счётчики ретрансмиссий и защита от дубликатов для каждого соединения.
|
|
56
|
+
|
|
57
|
+
### Failure Pool (`hostfail_pool`)
|
|
58
|
+
In-memory linked list доменов, ожидающих добавления в хостлист. Каждая запись имеет expiration time для предотвращения застревания.
|
|
59
|
+
|
|
60
|
+
### Сброс по таймауту
|
|
61
|
+
|
|
62
|
+
`automate_failure_counter()` управляет инкрементом счётчиков с time-based reset. Если интервал между сбоями превышает `maxtime` — счётчик сбрасывается в ноль.
|
|
63
|
+
|
|
64
|
+
## Процесс добавления в хостлист
|
|
65
|
+
|
|
66
|
+
1. **Purge**: `HostFailPoolPurge()` — удаление просроченных записей
|
|
67
|
+
2. **Find/Add**: поиск или создание записи в failure pool
|
|
68
|
+
3. **Threshold**: `counter >= hostlist_auto_fail_threshold` → обработка
|
|
69
|
+
4. **Duplicate check**: `HostlistCheck()` — домен не должен уже быть в активных хостлистах
|
|
70
|
+
5. **Persist**: `append_to_list_file()` — запись домена в файл `--hostlist-auto`
|
|
71
|
+
6. **In-memory update**: `HostlistPoolAddStrLen()` — немедленное обновление активного пула
|
|
72
|
+
|
|
73
|
+
## Параметры конфигурации
|
|
74
|
+
|
|
75
|
+
| Параметр CLI | Описание | По умолчанию |
|
|
76
|
+
|-------------|----------|-------------|
|
|
77
|
+
| `--hostlist-auto=<file>` | Путь к файлу auto-hostlist | — |
|
|
78
|
+
| `--hostlist-auto-fail-threshold=<N>` | Количество сбоев для добавления | 3 |
|
|
79
|
+
| `--hostlist-auto-fail-time=<sec>` | Временное окно для подсчёта сбоев | 60 |
|
|
80
|
+
| `--hostlist-auto-retrans-threshold=<N>` | Порог TCP-ретрансмиссий | 3 |
|
|
81
|
+
| `--hostlist-auto-retrans-reset` | Отправка RST для сброса ретрансмиссий | off |
|
|
82
|
+
|
|
83
|
+
## Пример использования
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
--name=auto-detect --filter-tcp=443 --filter-l7=tls
|
|
87
|
+
--payload=tls_client_hello
|
|
88
|
+
--hostlist-auto=/opt/zapret2/ipset/auto-blocked.txt
|
|
89
|
+
--hostlist-auto-fail-threshold=3
|
|
90
|
+
--hostlist-auto-fail-time=60
|
|
91
|
+
--lua-desync=fake:blob=fake_default_tls:tcp_md5
|
|
92
|
+
--lua-desync=multisplit:pos=1,midsld
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
При таком конфиге:
|
|
96
|
+
- Все TLS-соединения на порт 443 мониторятся на сбои
|
|
97
|
+
- После 3 сбоев за 60 секунд домен добавляется в `auto-blocked.txt`
|
|
98
|
+
- Стратегия `fake + multisplit` применяется к доменам из списка
|
|
99
|
+
|
|
100
|
+
## Интеграция со стратегией ротации
|
|
101
|
+
|
|
102
|
+
Auto-hostlist работает совместно с circular strategy (см. `orchestration.md`):
|
|
103
|
+
- `circular` ротирует стратегии при сбоях
|
|
104
|
+
- `standard_failure_detector` определяет сбои для ротации
|
|
105
|
+
- Если все стратегии исчерпаны — домен считается полностью заблокированным
|
|
106
|
+
|
|
107
|
+
## Флаг финализации
|
|
108
|
+
|
|
109
|
+
`ctrack->failure_detect_finalized` предотвращает повторную детекцию после того, как исход соединения определён окончательно. Это оптимизация для долгоживущих потоков.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Desync Profile System
|
|
3
|
+
zapret2-version: v0.9.4.5
|
|
4
|
+
tags: profiles, desync, new, filter, matching, template, import, lua-desync, l7, l3, l4
|
|
5
|
+
source: deepwiki/bol-van/zapret2, official-docs
|
|
6
|
+
created: 2026-03-28
|
|
7
|
+
updated: 2026-03-28
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Система desync-профилей
|
|
11
|
+
|
|
12
|
+
Профиль — основная единица конфигурации zapret2. Каждый профиль инкапсулирует полную стратегию обхода DPI: правила фильтрации пакетов, целевые хостлисты/IP-диапазоны и цепочку Lua desync-функций.
|
|
13
|
+
|
|
14
|
+
## Создание профилей
|
|
15
|
+
|
|
16
|
+
Профили создаются через разделитель `--new`:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
--name=youtube --filter-tcp=443 --filter-l7=tls
|
|
20
|
+
--payload=tls_client_hello
|
|
21
|
+
--hostlist-domains=youtube.com,googlevideo.com
|
|
22
|
+
--lua-desync=fake:blob=fake_default_tls:tcp_md5
|
|
23
|
+
--lua-desync=multisplit:pos=1,midsld
|
|
24
|
+
--new
|
|
25
|
+
--name=quic --filter-udp=443 --filter-l7=quic
|
|
26
|
+
--payload=quic_initial
|
|
27
|
+
--lua-desync=fake:blob=fake_default_quic:repeats=6
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Каждый `--new` начинает новый профиль. Параметры до первого `--new` относятся к первому профилю.
|
|
31
|
+
|
|
32
|
+
## Многоуровневая фильтрация
|
|
33
|
+
|
|
34
|
+
Профиль содержит каскад фильтров. Пакет проверяется сверху вниз, первый совпавший профиль применяется:
|
|
35
|
+
|
|
36
|
+
| Уровень | Фильтр | Пример |
|
|
37
|
+
|---------|--------|--------|
|
|
38
|
+
| L3 | IPv4/IPv6 | `--filter-ipv4`, `--filter-ipv6` |
|
|
39
|
+
| L4 | Протокол и порты | `--filter-tcp=443`, `--filter-udp=443` |
|
|
40
|
+
| L7 | Прикладной протокол | `--filter-l7=tls,quic,http,mtproto` |
|
|
41
|
+
| IPset | IP-диапазоны | `--ipset=/path/to/ips.txt` |
|
|
42
|
+
| Hostlist | Домены (SNI/Host) | `--hostlist=/path/to/hosts.txt` |
|
|
43
|
+
|
|
44
|
+
### Порядок сопоставления (matching)
|
|
45
|
+
|
|
46
|
+
1. L3 → L4 → L7 → IPset → Hostlist
|
|
47
|
+
2. **Первый совпавший профиль возвращается**
|
|
48
|
+
3. Если у профиля есть hostlist но hostname ещё неизвестен — сопоставление откладывается до парсинга L7
|
|
49
|
+
4. Профиль с `hostlist_auto` и известным hostname совпадает немедленно
|
|
50
|
+
5. Профиль без hostlist совпадает сразу после прохождения L3/L4/L7/IPset
|
|
51
|
+
|
|
52
|
+
### Кеширование профиля
|
|
53
|
+
|
|
54
|
+
После выбора профиль кешируется в connection tracking (`ctrack->dp`). Кеш сбрасывается при:
|
|
55
|
+
- Обнаружении L7-протокола (первый TLS ClientHello)
|
|
56
|
+
- Извлечении hostname (из SNI или HTTP Host)
|
|
57
|
+
|
|
58
|
+
Это запускает повторный поиск профиля с более специфичными критериями.
|
|
59
|
+
|
|
60
|
+
## Шаблоны и наследование
|
|
61
|
+
|
|
62
|
+
Шаблоны определяются через `--template` и хранятся отдельно от активных профилей:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
--template --name=base-tls --filter-tcp=443 --filter-l7=tls --payload=tls_client_hello
|
|
66
|
+
--new
|
|
67
|
+
--import=base-tls --hostlist=/path/youtube.txt --lua-desync=multisplit:pos=1,midsld
|
|
68
|
+
--new
|
|
69
|
+
--import=base-tls --hostlist=/path/discord.txt --lua-desync=fake:blob=fake_default_tls:tcp_md5
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
`--import` копирует конфигурацию из шаблона через `dp_copy()`. Копируются **только явно установленные** значения (используются boolean-флаги `b_filter_l3`, `b_filter_l7` и т.д.).
|
|
73
|
+
|
|
74
|
+
## Цепочка Lua desync-функций
|
|
75
|
+
|
|
76
|
+
Поле `lua_desync` — связный список инстансов функций. Каждый инстанс:
|
|
77
|
+
- Содержит свои аргументы и параметры
|
|
78
|
+
- Может иметь payload-фильтр, ограничивающий выполнение
|
|
79
|
+
- Возвращает вердикт: `VERDICT_PASS`, `VERDICT_MODIFY`, `VERDICT_DROP`
|
|
80
|
+
|
|
81
|
+
Инстансы выполняются последовательно. Вердикты агрегируются: **DROP > MODIFY > PASS**.
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
# Два инстанса в одном профиле: сначала fake, потом split
|
|
85
|
+
--lua-desync=fake:blob=fake_default_tls:tcp_md5
|
|
86
|
+
--lua-desync=multisplit:pos=1,midsld
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Именование профилей
|
|
90
|
+
|
|
91
|
+
`--name=` и `--cookie=` — опциональные идентификаторы для отладки и логирования. Имена помогают в диагностике:
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
--name=youtube --filter-tcp=443 --filter-l7=tls
|
|
95
|
+
--hostlist-domains=youtube.com
|
|
96
|
+
--lua-desync=multisplit:pos=10:seqovl=1
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Типичные паттерны
|
|
100
|
+
|
|
101
|
+
### Разные стратегии для разных сервисов
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
--name=youtube --filter-tcp=443 --filter-l7=tls --payload=tls_client_hello
|
|
105
|
+
--hostlist=/opt/zapret2/ipset/youtube.txt
|
|
106
|
+
--lua-desync=fake:blob=fake_default_tls:tcp_md5:repeats=11
|
|
107
|
+
--lua-desync=multidisorder:pos=1,midsld
|
|
108
|
+
--new
|
|
109
|
+
--name=discord --filter-udp=50000-50100 --filter-l7=quic
|
|
110
|
+
--lua-desync=fake:blob=fake_default_quic:repeats=6
|
|
111
|
+
--new
|
|
112
|
+
--name=other --filter-tcp=443 --filter-l7=tls --payload=tls_client_hello
|
|
113
|
+
--lua-desync=multisplit:pos=2
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Fallback-профиль
|
|
117
|
+
|
|
118
|
+
Последний профиль без hostlist/ipset работает как catch-all для всего остального трафика.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Hostlists and IPsets
|
|
3
|
+
zapret2-version: v0.9.4.5
|
|
4
|
+
tags: hostlist, ipset, filtering, domains, ip, include, exclude, gzip, auto-reload, sighup
|
|
5
|
+
source: deepwiki/bol-van/zapret2, official-docs
|
|
6
|
+
created: 2026-03-28
|
|
7
|
+
updated: 2026-03-28
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Хостлисты и IP-множества (IPsets)
|
|
11
|
+
|
|
12
|
+
Файловые механизмы фильтрации для избирательного применения стратегий обхода DPI. Каждый desync-профиль может ссылаться на несколько хостлистов и ipset-ов для включения (apply) и исключения (exclude).
|
|
13
|
+
|
|
14
|
+
## Хостлисты
|
|
15
|
+
|
|
16
|
+
### Формат файла
|
|
17
|
+
|
|
18
|
+
Один домен на строку. Поддерживаются plain text и gzip (`.gz`).
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
# Комментарий (также ; и / в начале строки)
|
|
22
|
+
example.com # совпадает с example.com и *.example.com
|
|
23
|
+
^example.com # строгое совпадение: ТОЛЬКО example.com, не субдомены
|
|
24
|
+
youtube.com
|
|
25
|
+
googlevideo.com
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
- Регистр не важен — все домены приводятся к lowercase при загрузке
|
|
29
|
+
- Пробелы и табы в конце строки обрезаются
|
|
30
|
+
|
|
31
|
+
### Логика поиска (matching)
|
|
32
|
+
|
|
33
|
+
**Обычная запись** (`example.com`):
|
|
34
|
+
- Рекурсивный поиск по субдоменам: `sub.example.com` → `example.com` → `com`
|
|
35
|
+
- Совпадает, если домен или любой родительский домен есть в списке
|
|
36
|
+
|
|
37
|
+
**Строгая запись** (`^example.com`):
|
|
38
|
+
- Помечается флагом `HOSTLIST_POOL_FLAG_STRICT_MATCH`
|
|
39
|
+
- Совпадает ТОЛЬКО при полном совпадении домена, без рекурсии по субдоменам
|
|
40
|
+
|
|
41
|
+
### CLI-параметры
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
--hostlist=/path/to/include.txt # список включения
|
|
45
|
+
--hostlist-exclude=/path/to/exclude.txt # список исключения
|
|
46
|
+
--hostlist-domains=a.com,b.com # inline-домены (без файла)
|
|
47
|
+
--hostlist-auto=/path/to/auto.txt # авто-хостлист (см. auto-hostlist.md)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## IPsets
|
|
51
|
+
|
|
52
|
+
### Формат файла
|
|
53
|
+
|
|
54
|
+
IP-адреса и CIDR-подсети, один на строку. IPv4 и IPv6. Поддерживается gzip.
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
# Комментарий
|
|
58
|
+
1.2.3.4
|
|
59
|
+
10.0.0.0/8
|
|
60
|
+
2001:db8::1
|
|
61
|
+
fd00::/32
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### CLI-параметры
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
--ipset=/path/to/include-ips.txt # список включения
|
|
68
|
+
--ipset-exclude=/path/to/exclude-ips.txt # список исключения
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Внутреннее устройство
|
|
72
|
+
|
|
73
|
+
IPset хранит IPv4 и IPv6 пулы отдельно в radix/binary tree для эффективного поиска O(log n).
|
|
74
|
+
|
|
75
|
+
## Логика include/exclude
|
|
76
|
+
|
|
77
|
+
Порядок проверки детерминирован:
|
|
78
|
+
|
|
79
|
+
1. **Exclude проверяется первым** — если хост/IP в exclude-списке, пакет отклоняется
|
|
80
|
+
2. **Include проверяется вторым** — если include-коллекция пуста, пакет проходит (обратная совместимость)
|
|
81
|
+
3. Если include непуста — пакет должен совпасть хотя бы с одним include-списком
|
|
82
|
+
|
|
83
|
+
Эта логика одинакова для hostlists и ipsets.
|
|
84
|
+
|
|
85
|
+
## Gzip-поддержка
|
|
86
|
+
|
|
87
|
+
Прозрачная декомпрессия:
|
|
88
|
+
- Magic header `1F 8B` определяет gzip-файл
|
|
89
|
+
- `z_readfile()` декомпрессирует через `zlib` в буфер в памяти
|
|
90
|
+
- Декомпрессированный контент парсится построчно идентично plain text
|
|
91
|
+
- Полезно для больших списков (экономия места на роутерах)
|
|
92
|
+
|
|
93
|
+
## Авто-перезагрузка (hot reload)
|
|
94
|
+
|
|
95
|
+
Хостлисты и ipset-ы перезагружаются без перезапуска демона:
|
|
96
|
+
|
|
97
|
+
### Автоматическая детекция изменений
|
|
98
|
+
- `file_mod_signature()` проверяет mtime и размер файла через `stat()`
|
|
99
|
+
- Проверка происходит при обработке пакетов
|
|
100
|
+
- При изменении — файл перезагружается в память
|
|
101
|
+
|
|
102
|
+
### Ручная перезагрузка
|
|
103
|
+
```bash
|
|
104
|
+
# Отправить SIGHUP для немедленной перезагрузки всех списков
|
|
105
|
+
kill -HUP $(pidof nfqws2)
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Скрипты управления списками
|
|
109
|
+
|
|
110
|
+
Директория `ipset/` содержит утилиты для обновления списков из внешних источников:
|
|
111
|
+
|
|
112
|
+
| Скрипт | Назначение |
|
|
113
|
+
|--------|-----------|
|
|
114
|
+
| `def.sh` | Общие утилиты: `zzcat` (прозрачная gzip/plain декомпрессия), `digger` (DNS-резолвинг) |
|
|
115
|
+
| `get_reestr_preresolved.sh` | Загрузка пре-резолвленных IP-списков |
|
|
116
|
+
| `get_antifilter_ipsmart.sh` | Загрузка smart IP-списков |
|
|
117
|
+
| `hup_zapret_daemons()` | Отправка SIGHUP для немедленной перезагрузки |
|
|
118
|
+
|
|
119
|
+
## Типичные паттерны
|
|
120
|
+
|
|
121
|
+
### Разные списки для разных профилей
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
--name=youtube --filter-tcp=443 --filter-l7=tls
|
|
125
|
+
--hostlist=/opt/zapret2/ipset/youtube.txt
|
|
126
|
+
--lua-desync=fake:blob=fake_default_tls:tcp_md5
|
|
127
|
+
--new
|
|
128
|
+
--name=general --filter-tcp=443 --filter-l7=tls
|
|
129
|
+
--hostlist=/opt/zapret2/ipset/general-blocked.txt
|
|
130
|
+
--hostlist-exclude=/opt/zapret2/ipset/whitelist.txt
|
|
131
|
+
--lua-desync=multisplit:pos=2
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Автообновление списков по cron
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
# /etc/cron.d/zapret-update
|
|
138
|
+
0 3 * * * root /opt/zapret2/ipset/get_antifilter_ipsmart.sh && kill -HUP $(pidof nfqws2)
|
|
139
|
+
```
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Миграция стратегий zapret v1 → zapret2 (lua-desync)
|
|
3
3
|
zapret2-version: v0.9.4.5
|
|
4
|
-
tags: migration, v1, v2, lua-desync, dpi-desync, config, conversion
|
|
4
|
+
tags: migration, v1, v2, lua-desync, dpi-desync, config, conversion, profiles, lua
|
|
5
5
|
source: community
|
|
6
6
|
created: 2026-03-28
|
|
7
7
|
updated: 2026-03-28
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Security Hardening
|
|
3
|
+
zapret2-version: v0.9.4.5
|
|
4
|
+
tags: security, seccomp, capabilities, privilege, droproot, sandbox, hardening, cap_net_admin, daemonize
|
|
5
|
+
source: deepwiki/bol-van/zapret2, official-docs
|
|
6
|
+
created: 2026-03-28
|
|
7
|
+
updated: 2026-03-28
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Security Hardening
|
|
11
|
+
|
|
12
|
+
zapret2 реализует многоуровневую защиту (defense-in-depth) для минимизации поверхности атаки. Все защитные механизмы активируются при инициализации демона, до входа в основной цикл обработки пакетов.
|
|
13
|
+
|
|
14
|
+
## Seccomp (Linux)
|
|
15
|
+
|
|
16
|
+
BPF-фильтр блокирует опасные системные вызовы на уровне ядра:
|
|
17
|
+
|
|
18
|
+
| Категория | Заблокированные syscall-ы |
|
|
19
|
+
|-----------|--------------------------|
|
|
20
|
+
| Выполнение | `execve`, `execveat` |
|
|
21
|
+
| Файловая система | `chmod`, `fchmod`, `chown`, `fchown` |
|
|
22
|
+
| Структура каталогов | `symlink`, `link`, `mkdir`, `rmdir` |
|
|
23
|
+
| Манипуляция процессами | `ptrace`, `process_vm_readv` |
|
|
24
|
+
| Сигналы | `kill`, `tkill`, `tgkill` |
|
|
25
|
+
|
|
26
|
+
Фильтр устанавливается через `prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER)` и динамически компилируется под текущую архитектуру (x86_64, ARM, MIPS, RISC-V).
|
|
27
|
+
|
|
28
|
+
## Linux Capabilities
|
|
29
|
+
|
|
30
|
+
После биндинга привилегированных сокетов демон сбрасывает все capabilities, кроме:
|
|
31
|
+
- `CAP_NET_ADMIN` — управление сетевыми параметрами
|
|
32
|
+
- `CAP_NET_RAW` — работа с raw-сокетами
|
|
33
|
+
|
|
34
|
+
Процесс:
|
|
35
|
+
1. `capget`/`capset` для манипуляции capabilities
|
|
36
|
+
2. Определение максимальной capability через `/proc/sys/kernel/cap_last_cap`
|
|
37
|
+
3. `prctl(PR_CAPBSET_DROP, cap)` для каждой ненужной capability
|
|
38
|
+
4. Финализация без `CAP_SETCAP`
|
|
39
|
+
|
|
40
|
+
## Сброс привилегий (droproot)
|
|
41
|
+
|
|
42
|
+
Функция `droproot()` — кросс-платформенное понижение привилегий:
|
|
43
|
+
|
|
44
|
+
1. `prctl(PR_SET_KEEPCAPS, 1L)` — сохранить capabilities при смене UID
|
|
45
|
+
2. `initgroups()` / `setgroups()` — настройка supplementary groups
|
|
46
|
+
3. `setgid()` — установка primary group
|
|
47
|
+
4. `setuid()` — смена пользователя (**необратимая** операция)
|
|
48
|
+
|
|
49
|
+
После `droproot()` цикл обработки пакетов работает с минимальными привилегиями.
|
|
50
|
+
|
|
51
|
+
## NO_NEW_PRIVS
|
|
52
|
+
|
|
53
|
+
Флаг `prctl(PR_SET_NO_NEW_PRIVS)` запрещает повышение привилегий через `execve()` — критическая защита от цепочек эксплойтов.
|
|
54
|
+
|
|
55
|
+
## Lua Sandbox
|
|
56
|
+
|
|
57
|
+
- FFI-модуль **отключён** в LuaJIT → невозможен произвольный доступ к памяти
|
|
58
|
+
- Stack guards (`LUA_STACK_GUARD_ENTER/LEAVE`) защищают от corruption при C↔Lua переходах
|
|
59
|
+
- Lua-окружение изолировано от файловой системы и опасных операций
|
|
60
|
+
|
|
61
|
+
## Daemonization (изоляция процесса)
|
|
62
|
+
|
|
63
|
+
- `fork()` — отсоединение от родительского процесса
|
|
64
|
+
- `setsid()` — создание новой группы процессов
|
|
65
|
+
- `chdir("/")` — освобождение смонтированных файловых систем
|
|
66
|
+
- fd 0, 1, 2 → `/dev/null` — изоляция I/O
|
|
67
|
+
|
|
68
|
+
## Windows (winws2)
|
|
69
|
+
|
|
70
|
+
Компиляция с security-флагами:
|
|
71
|
+
- **ASLR/DEP**: `--nxcompat`, `--high-entropy-va`
|
|
72
|
+
- **Dynamic base**: `--dynamicbase`
|
|
73
|
+
- **Sandbox**: low integrity level + job object restrictions
|
|
74
|
+
- **Static linking**: защита от DLL injection
|
|
75
|
+
|
|
76
|
+
## Android
|
|
77
|
+
|
|
78
|
+
- Graceful handling отсутствия `/etc/passwd`
|
|
79
|
+
- Интеграция с `logcat` через `liblog`
|
|
80
|
+
- Статическая линковка (ограничения Bionic libc)
|
|
81
|
+
|
|
82
|
+
## Порядок инициализации
|
|
83
|
+
|
|
84
|
+
Безопасность применяется в строгом порядке:
|
|
85
|
+
|
|
86
|
+
1. Парсинг конфигурации
|
|
87
|
+
2. Проверка привилегий
|
|
88
|
+
3. Открытие PID-файла (до смены привилегий)
|
|
89
|
+
4. **Сброс привилегий** (`droproot`)
|
|
90
|
+
5. Проверка доступности файлов после смены привилегий
|
|
91
|
+
6. Тестирование Lua-скриптов до активации sandbox
|
|
92
|
+
7. **Применение seccomp** и capability restrictions
|
|
93
|
+
8. Инициализация raw-сокетов
|
|
94
|
+
9. Daemonization
|
|
95
|
+
10. Регистрация signal handlers
|
|
96
|
+
11. Инициализация Lua VM в sandbox-окружении
|
|
97
|
+
12. Инициализация платформенного перехвата пакетов
|
|
98
|
+
13. **Вход в main event loop** с минимальными привилегиями
|
|
99
|
+
|
|
100
|
+
## Рекомендации для деплоя
|
|
101
|
+
|
|
102
|
+
- **Всегда** включать droproot до непривилегированного пользователя
|
|
103
|
+
- Настроить права на файлы hostlists/ipsets **до** сброса привилегий
|
|
104
|
+
- Тестировать доступность файлов после смены привилегий
|
|
105
|
+
- Использовать systemd/init-скрипты с правильными security contexts
|
|
106
|
+
- Мониторить reload через SIGHUP для изменений конфигурации
|
|
107
|
+
|
|
108
|
+
## Философия
|
|
109
|
+
|
|
110
|
+
Компрометация одного слоя (например, escape из Lua sandbox) **не** даёт полный доступ к системе: seccomp фильтрует syscall-ы, capabilities ограничены, привилегии сброшены. Каждый слой работает независимо.
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Supported Platforms
|
|
3
3
|
zapret2-version: v0.9.4.5
|
|
4
|
-
tags: platforms, linux, openwrt, wsl2, windows, macos
|
|
5
|
-
source: official-docs
|
|
4
|
+
tags: platforms, linux, openwrt, wsl2, windows, macos, freebsd, openbsd, bsd, dvtws2, winws2, android
|
|
5
|
+
source: deepwiki/bol-van/zapret2, official-docs
|
|
6
6
|
created: 2026-03-25
|
|
7
|
-
updated: 2026-03-
|
|
7
|
+
updated: 2026-03-28
|
|
8
|
+
revision: 2
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Поддерживаемые платформы
|
|
@@ -30,16 +31,54 @@ Firewall: nftables (предпочтительно) или iptables.
|
|
|
30
31
|
|
|
31
32
|
## Windows
|
|
32
33
|
|
|
33
|
-
|
|
34
|
-
- zapret2 использует NFQUEUE (Linux kernel), Windows использует WinDivert
|
|
35
|
-
- Bash-скрипты vs .cmd
|
|
36
|
-
- Пути: `/opt/zapret2` vs `C:\zapret`
|
|
34
|
+
Поддерживается через **winws2** (WinDivert-based). Демон `winws2` — нативный Windows-бинарник.
|
|
37
35
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
Особенности:
|
|
37
|
+
- Использует WinDivert вместо NFQUEUE для перехвата пакетов
|
|
38
|
+
- Компилируется со статической линковкой зависимостей (защита от DLL injection)
|
|
39
|
+
- Security: ASLR/DEP (`--nxcompat`, `--high-entropy-va`), dynamic base relocation
|
|
40
|
+
- Sandbox: low integrity level + job object restrictions
|
|
41
|
+
|
|
42
|
+
**Альтернатива**: WSL2 (Windows Subsystem for Linux) — установить zapret2 как на обычный Linux.
|
|
43
|
+
|
|
44
|
+
## FreeBSD
|
|
45
|
+
|
|
46
|
+
Поддерживается через **dvtws2** (DiVerT WorkStation 2). Использует `ipfw` с divert-сокетами.
|
|
47
|
+
|
|
48
|
+
Особенности:
|
|
49
|
+
- Один divert-сокет обслуживает и IPv4, и IPv6
|
|
50
|
+
- Firewall: `ipfw` с divert-правилами
|
|
51
|
+
- Интерфейс определяется из `sockaddr` после `recvfrom()`
|
|
52
|
+
- Совместим с pfSense/OPNsense через специальные скрипты
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
# Пример ipfw-правила
|
|
56
|
+
ipfw add divert 989 tcp from any to any 443 out
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Ограничения BSD**: нет фильтрации по payload в firewall, нет per-flow kernel filtering, каждый пакет проходит через userspace.
|
|
60
|
+
|
|
61
|
+
## OpenBSD
|
|
62
|
+
|
|
63
|
+
Поддерживается через **dvtws2**. Использует `pf` с `divert-packet`.
|
|
64
|
+
|
|
65
|
+
Особенности:
|
|
66
|
+
- **Раздельные** divert-сокеты для IPv4 и IPv6 (в отличие от FreeBSD)
|
|
67
|
+
- Firewall: `pf` с правилами `divert-packet`
|
|
68
|
+
- `no state` — чтобы pf не создавал автоматические bidirectional-правила
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
# Пример pf-правила
|
|
72
|
+
pass out on egress inet proto tcp to port 443 divert-packet port 989 no state
|
|
73
|
+
```
|
|
42
74
|
|
|
43
75
|
## macOS
|
|
44
76
|
|
|
45
|
-
|
|
77
|
+
**Не поддерживается.** Apple удалила `ipdivert` из ядра — механизм divert-сокетов недоступен, несмотря на BSD-наследие.
|
|
78
|
+
|
|
79
|
+
## Android
|
|
80
|
+
|
|
81
|
+
Поддерживается (Linux-based). Особенности:
|
|
82
|
+
- Обработка отсутствия `/etc/passwd` для privilege dropping
|
|
83
|
+
- Интеграция с `logcat` через `liblog`
|
|
84
|
+
- Преимущественно статическая линковка (ограничения Bionic libc)
|