zapret2-mcp 0.7.2 → 0.7.4
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 +22 -0
- package/README.md +15 -6
- package/build/index.js +38 -5
- package/build/index.js.map +1 -1
- package/knowledge/obsidian-gui/argument-ordering.md +106 -0
- package/knowledge/obsidian-gui/blobs-detailed.md +218 -0
- package/knowledge/obsidian-gui/lua-desync-reference.md +1005 -0
- package/knowledge/obsidian-gui/main-flags.md +124 -0
- package/knowledge/obsidian-gui/mtproto-detection.md +639 -0
- package/knowledge/obsidian-gui/out-range-in-range.md +90 -0
- package/knowledge/obsidian-gui/payload-types.md +195 -0
- package/knowledge/obsidian-gui/windivert-filters.md +699 -0
- package/knowledge/platforms/desktop-linux-nftables.md +196 -0
- package/knowledge/strategies/community-strategies.md +155 -9
- package/knowledge/strategies/discord-bypass.md +43 -19
- package/knowledge/strategies/fake-packets.md +105 -37
- package/knowledge/strategies/udp-quic.md +113 -9
- package/knowledge/troubleshooting/youtube-video-not-loading.md +141 -0
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.7.4](https://github.com/rcd27/zapret2-mcp/compare/v0.7.3...v0.7.4) (2026-03-30)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **knowledge:** fallback до первоисточников, чтобы агент не гуглил лишнее ([e25c950](https://github.com/rcd27/zapret2-mcp/commit/e25c950cd90b81762484acfbda620844f4f03f16))
|
|
9
|
+
* **knowledge:** обогащение статей стратегиями из community ([6e737f6](https://github.com/rcd27/zapret2-mcp/commit/6e737f65d831173b6476df3f231c5491295ed619))
|
|
10
|
+
* **knowledge:** проблемы с ютубом и особенности zapret2 на десктопе ([5cd3110](https://github.com/rcd27/zapret2-mcp/commit/5cd3110aab0975c6c60be5135f3a93487584ad28))
|
|
11
|
+
* **knowledge:** цикл выжимок из статей на obsidian ([ea072e2](https://github.com/rcd27/zapret2-mcp/commit/ea072e222b478d04f44d0f6b98fd552b06a25d41))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
* **contract:** явное указание языка ([1b4ca5b](https://github.com/rcd27/zapret2-mcp/commit/1b4ca5b62f2f3b69390db080e440a854cb4aa840)), closes [#9](https://github.com/rcd27/zapret2-mcp/issues/9)
|
|
17
|
+
|
|
18
|
+
## [0.7.3](https://github.com/rcd27/zapret2-mcp/compare/v0.7.2...v0.7.3) (2026-03-28)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
### Bug Fixes
|
|
22
|
+
|
|
23
|
+
* **readme:** актуальное состояние базы знаний в readme ([c91441c](https://github.com/rcd27/zapret2-mcp/commit/c91441ce8ef223bbcfe15619a01ba5f2fa7066ad))
|
|
24
|
+
|
|
3
25
|
## [0.7.2](https://github.com/rcd27/zapret2-mcp/compare/v0.7.1...v0.7.2) (2026-03-28)
|
|
4
26
|
|
|
5
27
|
|
package/README.md
CHANGED
|
@@ -3,24 +3,25 @@
|
|
|
3
3
|
[](https://github.com/rcd27/zapret2-mcp/actions/workflows/ci.yml)
|
|
4
4
|
[](https://www.npmjs.com/package/zapret2-mcp)
|
|
5
5
|
[](https://www.npmjs.com/package/zapret2-mcp)
|
|
6
|
-
[](./knowledge/)
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
|
|
9
9
|
База знаний по [zapret2](https://github.com/bol-van/zapret2) (DPI bypass) и [blockcheckw](https://github.com/rcd27/blockcheckw) (сканер стратегий). Работает как [MCP-сервер](https://modelcontextprotocol.io/) для LLM-агентов и как обычная документация.
|
|
10
10
|
|
|
11
|
-
> **Можно использовать без агентов.** [`knowledge/`](./knowledge/) —
|
|
11
|
+
> **Можно использовать без агентов.** [`knowledge/`](./knowledge/) — 45 статей на русском языке. Открывайте и читайте как обычную документацию, без установки чего-либо.
|
|
12
12
|
|
|
13
13
|
## Что внутри
|
|
14
14
|
|
|
15
15
|
| Раздел | Статей | Темы |
|
|
16
16
|
|--------|--------|------|
|
|
17
|
-
| [strategies/](./knowledge/strategies/) |
|
|
17
|
+
| [strategies/](./knowledge/strategies/) | 10 | TCP segmentation, fake packets, Lua scripting, QUIC, circular, Discord, Telegram, orchestration, community production strategies |
|
|
18
18
|
| [config/](./knowledge/config/) | 9 | nfqws2 CLI, zapret2 config, desync profiles, hostlists/ipsets, auto-hostlist, security hardening, UCI, blobs, миграция v1 → v2 |
|
|
19
|
-
| [troubleshooting/](./knowledge/troubleshooting/) |
|
|
20
|
-
| [tspu/](./knowledge/tspu/) |
|
|
19
|
+
| [troubleshooting/](./knowledge/troubleshooting/) | 6 | Smart TV + YouTube, YouTube видео не грузится (googlevideo CDN), QUIC, IPv6, FLOWOFFLOAD, конфликты с Podkop |
|
|
20
|
+
| [tspu/](./knowledge/tspu/) | 6 | Архитектура ТСПУ, DPI engine, методы блокировки, двухстадийная система, ночные реконфигурации, юридические риски |
|
|
21
21
|
| [workflows/](./knowledge/workflows/) | 2 | Установка, поиск стратегии |
|
|
22
22
|
| [blockcheckw/](./knowledge/blockcheckw/) | 2 | Overview, команды |
|
|
23
|
-
| [platforms/](./knowledge/platforms/) |
|
|
23
|
+
| [platforms/](./knowledge/platforms/) | 2 | Linux, OpenWrt, Windows, FreeBSD, OpenBSD, Android, десктопный Linux + nftables |
|
|
24
|
+
| [obsidian-gui/](./knowledge/obsidian-gui/) | 8 | lua-desync справочник, payload типы, out-range/in-range, блобы, WinDivert фильтры, порядок аргументов, MTProto, основные флаги |
|
|
24
25
|
|
|
25
26
|
## Подключение к LLM-агенту
|
|
26
27
|
|
|
@@ -69,6 +70,12 @@ npm start
|
|
|
69
70
|
|------|----------|
|
|
70
71
|
| `query-zapret-knowledge(topic, tokens?)` | Keyword-поиск по базе знаний с ранжированием |
|
|
71
72
|
|
|
73
|
+
### Resources
|
|
74
|
+
|
|
75
|
+
| URI | Описание |
|
|
76
|
+
|-----|----------|
|
|
77
|
+
| `zapret2://knowledge/{path}` | Прямой доступ к статьям базы знаний по пути (listResources для списка всех) |
|
|
78
|
+
|
|
72
79
|
### Prompts
|
|
73
80
|
|
|
74
81
|
| Prompt | Описание |
|
|
@@ -95,6 +102,8 @@ npm start
|
|
|
95
102
|
- [zapret2](https://github.com/bol-van/zapret2) — DPI bypass от bol-van
|
|
96
103
|
- [blockcheckw](https://github.com/rcd27/blockcheckw) — быстрый сканер стратегий
|
|
97
104
|
- [tspu-docs](https://github.com/DanielLavrushin/tspu-docs) — документация ТСПУ
|
|
105
|
+
- Academic: [IMC 2022](https://dl.acm.org/doi/10.1145/3517745.3561461), [IMC 2021](https://dl.acm.org/doi/10.1145/3487552.3487858), [NDSS 2020](https://www.ndss-symposium.org/ndss-paper/decentralized-control-a-case-study-of-russia/), [USENIX Security 2023](https://www.usenix.org/conference/usenixsecurity23/presentation/ramesh-network-responses) — рецензированные исследования архитектуры и поведения ТСПУ
|
|
106
|
+
- [Zapret GUI Docs](https://publish.obsidian.md/zapret) — документация сообщества (импорт через `npm run import:obsidian`)
|
|
98
107
|
- Community — обезличенные знания из открытых обсуждений
|
|
99
108
|
|
|
100
109
|
## Лицензия
|
package/build/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import { resolve, dirname } from "path";
|
|
|
6
6
|
import { fileURLToPath } from "url";
|
|
7
7
|
import { KnowledgeIndex } from "./indexer.js";
|
|
8
8
|
import { registerPrompts } from "./prompts.js";
|
|
9
|
+
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
10
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
10
11
|
const knowledgeDir = resolve(__dirname, "..", "knowledge");
|
|
11
12
|
const index = new KnowledgeIndex(knowledgeDir);
|
|
@@ -23,14 +24,20 @@ It provides contextual documentation and expert knowledge about:
|
|
|
23
24
|
- Troubleshooting common issues
|
|
24
25
|
|
|
25
26
|
Use the query-zapret-knowledge tool to search the knowledge base.
|
|
27
|
+
IMPORTANT: The entire knowledge base is written in Russian. Always query in Russian for accurate results (e.g. 'стратегия split2' instead of 'split2 strategy').
|
|
26
28
|
Use getPrompt for guided workflows: setup-zapret, find-bypass-strategy, troubleshoot, strategy-knowledge.
|
|
27
29
|
|
|
28
|
-
This server does NOT execute commands — it provides knowledge and guidance. The consuming agent executes commands directly
|
|
30
|
+
This server does NOT execute commands — it provides knowledge and guidance. The consuming agent executes commands directly.
|
|
31
|
+
|
|
32
|
+
FALLBACK: If query-zapret-knowledge returns no results or insufficient information, check these primary sources directly (via web fetch):
|
|
33
|
+
1. DeepWiki (most complete, generated from source code): https://deepwiki.com/bol-van/zapret2
|
|
34
|
+
2. Official docs: https://github.com/bol-van/zapret2/blob/master/docs/manual.md
|
|
35
|
+
3. Community docs (Obsidian Publish): https://publish.obsidian.md/zapret — raw markdown available at https://publish-01.obsidian.md/access/18b1b883e5b94cb062854c94fb182bb4/{path}.md (e.g. Zapret/Zapret2%20-%20lua-desync.md)`,
|
|
29
36
|
});
|
|
30
|
-
server.tool("query-zapret-knowledge", "Search zapret2 and blockcheckw knowledge base by topic. Returns relevant documentation, strategy guides, configuration references, and troubleshooting information.", {
|
|
31
|
-
topic: z.string().describe("What to search for (e.g. 'split2
|
|
37
|
+
server.tool("query-zapret-knowledge", "Search zapret2 and blockcheckw knowledge base by topic. Returns relevant documentation, strategy guides, configuration references, and troubleshooting information. IMPORTANT: The entire knowledge base is in Russian. Always send queries in Russian for best results.", {
|
|
38
|
+
topic: z.string().describe("What to search for — MUST be in Russian (e.g. 'стратегия split2', 'сканирование blockcheckw', 'диагностика dns', 'конфигурация nfqws2_opt')"),
|
|
32
39
|
tokens: z.number().optional().describe("Maximum approximate token count for the response (default: 4000). Use 0 for unlimited."),
|
|
33
|
-
context: z.string().optional().describe("What you already know or checked (e.g. 'curl
|
|
40
|
+
context: z.string().optional().describe("What you already know or checked, in Russian (e.g. 'curl работает на роутере, QUIC отключен, flow_offloading_hw=1'). Helps narrow results by deprioritizing already-covered topics."),
|
|
34
41
|
}, async (args) => {
|
|
35
42
|
const tokenLimit = args.tokens === 0 ? undefined : (args.tokens ?? 4000);
|
|
36
43
|
const results = index.query(args.topic, tokenLimit, args.context);
|
|
@@ -39,7 +46,7 @@ server.tool("query-zapret-knowledge", "Search zapret2 and blockcheckw knowledge
|
|
|
39
46
|
content: [
|
|
40
47
|
{
|
|
41
48
|
type: "text",
|
|
42
|
-
text: `No results found for "${args.topic}".
|
|
49
|
+
text: `No results found for "${args.topic}". The knowledge base is in Russian — try querying in Russian. Broader keywords to try: стратегии, конфигурация, blockcheckw, диагностика, установка, платформы.\n\nFallback: check primary sources directly via web fetch:\n1. https://deepwiki.com/bol-van/zapret2 (most complete)\n2. https://github.com/bol-van/zapret2/blob/master/docs/manual.md\n3. https://publish-01.obsidian.md/access/18b1b883e5b94cb062854c94fb182bb4/Zapret/home.md (community docs, raw markdown)`,
|
|
43
50
|
},
|
|
44
51
|
],
|
|
45
52
|
};
|
|
@@ -63,6 +70,32 @@ server.tool("query-zapret-knowledge", "Search zapret2 and blockcheckw knowledge
|
|
|
63
70
|
};
|
|
64
71
|
});
|
|
65
72
|
registerPrompts(server);
|
|
73
|
+
// MCP Resources: expose knowledge articles for browsing
|
|
74
|
+
server.resource("knowledge-article", new ResourceTemplate("zapret2://knowledge/{+path}", {
|
|
75
|
+
list: async () => ({
|
|
76
|
+
resources: index.all().map((entry) => ({
|
|
77
|
+
uri: `zapret2://knowledge/${entry.path}`,
|
|
78
|
+
name: entry.title,
|
|
79
|
+
description: `Tags: ${entry.tags.join(", ")}`,
|
|
80
|
+
mimeType: "text/markdown",
|
|
81
|
+
})),
|
|
82
|
+
}),
|
|
83
|
+
}), { description: "Knowledge base article", mimeType: "text/markdown" }, async (uri, variables) => {
|
|
84
|
+
const path = variables.path;
|
|
85
|
+
const entry = index.all().find((e) => e.path === path);
|
|
86
|
+
if (!entry) {
|
|
87
|
+
throw new Error(`Article not found: ${path}`);
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
contents: [
|
|
91
|
+
{
|
|
92
|
+
uri: uri.href,
|
|
93
|
+
mimeType: "text/markdown",
|
|
94
|
+
text: `# ${entry.title}\n\n${entry.content}`,
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
});
|
|
66
99
|
async function main() {
|
|
67
100
|
const transport = new StdioServerTransport();
|
|
68
101
|
await server.connect(transport);
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Последовательность аргументов в zapret2
|
|
3
|
+
zapret2-version: v0.9.4.5
|
|
4
|
+
tags: аргументы, порядок, payload, lua-desync, hostlist, профиль, filter
|
|
5
|
+
created: 2026-03-29
|
|
6
|
+
updated: 2026-03-29
|
|
7
|
+
source: community
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 📋 **Короткий ответ: Порядок между `--hostlist` и `--payload` не важен**
|
|
11
|
+
|
|
12
|
+
Но **порядок `--payload` относительно `--lua-desync` — важен!**
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 🔍 **Как это работает**
|
|
17
|
+
|
|
18
|
+
### **`--hostlist`** — фильтр **профиля**
|
|
19
|
+
- Применяется ко всему профилю в целом
|
|
20
|
+
- Проверяется при входе соединения в профиль
|
|
21
|
+
- Позиция внутри профиля не важна
|
|
22
|
+
|
|
23
|
+
### **`--payload`** — фильтр для **`--lua-desync`**
|
|
24
|
+
- Применяется к **последующим** `--lua-desync` функциям
|
|
25
|
+
- Действует до следующего `--payload` или до конца профиля
|
|
26
|
+
- **Порядок относительно `--lua-desync` важен!**
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## ✅ **Эквивалентные варианты (все работают одинаково):**
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# Вариант 1: hostlist первый
|
|
34
|
+
--hostlist=list.txt --payload=tls_client_hello --lua-desync=fake:blob=fake_default_tls
|
|
35
|
+
|
|
36
|
+
# Вариант 2: payload первый
|
|
37
|
+
--payload=tls_client_hello --hostlist=list.txt --lua-desync=fake:blob=fake_default_tls
|
|
38
|
+
|
|
39
|
+
# Вариант 3: hostlist в конце
|
|
40
|
+
--payload=tls_client_hello --lua-desync=fake:blob=fake_default_tls --hostlist=list.txt
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Все три варианта работают одинаково!**
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## ⚠️ **Что ВАЖНО: порядок `--payload` и `--lua-desync`**
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# ✅ ПРАВИЛЬНО: payload ПЕРЕД lua-desync
|
|
51
|
+
--payload=tls_client_hello --lua-desync=fake:blob=fake_default_tls
|
|
52
|
+
|
|
53
|
+
# ❌ НЕПРАВИЛЬНО: payload ПОСЛЕ lua-desync (не влияет на эту функцию!)
|
|
54
|
+
--lua-desync=fake:blob=fake_default_tls --payload=tls_client_hello
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 📊 **Область действия фильтров**
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
--filter-tcp=80,443 # Фильтр профиля (весь профиль)
|
|
63
|
+
--filter-l7=http,tls # Фильтр профиля (весь профиль)
|
|
64
|
+
--hostlist=youtube.txt # Фильтр профиля (весь профиль)
|
|
65
|
+
--payload=http_req # Фильтр lua-desync (до следующего --payload)
|
|
66
|
+
--lua-desync=fake:blob=fake_default_http # Применяется фильтр http_req
|
|
67
|
+
--lua-desync=multisplit:pos=method+2 # Применяется фильтр http_req
|
|
68
|
+
--payload=tls_client_hello # Новый фильтр (отменяет предыдущий)
|
|
69
|
+
--lua-desync=fake:blob=fake_default_tls # Применяется фильтр tls_client_hello
|
|
70
|
+
--new # Конец профиля
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 💡 **Рекомендуемый стиль (для читабельности)**
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Сначала фильтры профиля
|
|
79
|
+
--filter-tcp=443
|
|
80
|
+
--filter-l7=tls
|
|
81
|
+
--hostlist=mylist.txt
|
|
82
|
+
|
|
83
|
+
# Потом payload + lua-desync группами
|
|
84
|
+
--payload=tls_client_hello
|
|
85
|
+
--lua-desync=fake:blob=fake_default_tls:tcp_md5
|
|
86
|
+
--lua-desync=multisplit:pos=1,midsld
|
|
87
|
+
|
|
88
|
+
--new
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Это не обязательно, но **легче читать и поддерживать**.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 📝 **Итог**
|
|
96
|
+
|
|
97
|
+
| Параметр | Область действия | Порядок важен? |
|
|
98
|
+
| ------------------ | --------------------------- | ------------------------------- |
|
|
99
|
+
| `--filter-tcp/udp` | Весь профиль | Нет |
|
|
100
|
+
| `--filter-l7` | Весь профиль | Нет |
|
|
101
|
+
| `--hostlist` | Весь профиль | Нет |
|
|
102
|
+
| `--ipset` | Весь профиль | Нет |
|
|
103
|
+
| `--payload` | До следующего `--payload` | **Да, перед `--lua-desync`** |
|
|
104
|
+
| `--out-range` | До следующего `--out-range` | **Да, перед `--lua-desync`** |
|
|
105
|
+
| `--in-range` | До следующего `--in-range` | **Да, перед `--lua-desync`** |
|
|
106
|
+
| `--lua-desync` | Конкретный вызов | Да (последовательность вызовов) |
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Блобы (blobs) — бинарные данные для fake-пакетов
|
|
3
|
+
zapret2-version: v0.9.4.5
|
|
4
|
+
tags: blob, fake, tls_mod, fake_default_tls, fake_default_http, fake_default_quic, бинарные данные
|
|
5
|
+
created: 2026-03-29
|
|
6
|
+
updated: 2026-03-29
|
|
7
|
+
source: community
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Блобы (Blobs) в Zapret2
|
|
11
|
+
|
|
12
|
+
**Блоб (blob)** — это переменная Lua типа `string`, содержащая блок **двоичных данных** произвольной длины (от 1 байта до гигабайтов). Блобы используются для хранения fake-пакетов и других бинарных данных.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 📦 **Стандартные блобы**
|
|
17
|
+
|
|
18
|
+
nfqws2 автоматически инициализирует **3 стандартных блоба** при запуске:
|
|
19
|
+
|
|
20
|
+
### 1. **`fake_default_tls`** (680 байт)
|
|
21
|
+
|
|
22
|
+
**Что это:** TLS Client Hello пакет с SNI `www.microsoft.com`
|
|
23
|
+
|
|
24
|
+
**Содержимое:**
|
|
25
|
+
- TLS версия: 1.2/1.3
|
|
26
|
+
- Cipher suites: современные шифры
|
|
27
|
+
- SNI: `www.microsoft.com` (по умолчанию)
|
|
28
|
+
- Поддержка HTTP/2
|
|
29
|
+
- Расширения: supported_groups, signature_algorithms, key_share и др.
|
|
30
|
+
|
|
31
|
+
**Использование:**
|
|
32
|
+
```bash
|
|
33
|
+
--payload=tls_client_hello --lua-desync=fake:blob=fake_default_tls
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 2. **`fake_default_http`** (227 байт)
|
|
37
|
+
|
|
38
|
+
**Что это:** HTTP GET запрос
|
|
39
|
+
|
|
40
|
+
**Содержимое:**
|
|
41
|
+
```http
|
|
42
|
+
GET / HTTP/1.1
|
|
43
|
+
Host: www.iana.org
|
|
44
|
+
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0
|
|
45
|
+
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
|
|
46
|
+
Accept-Encoding: gzip, deflate, br
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Использование:**
|
|
50
|
+
```bash
|
|
51
|
+
--payload=http_req --lua-desync=fake:blob=fake_default_http
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 3. **`fake_default_quic`** (620 байт)
|
|
55
|
+
|
|
56
|
+
**Что это:** QUIC Initial пакет (минимальный валидный пакет)
|
|
57
|
+
|
|
58
|
+
**Содержимое:**
|
|
59
|
+
- Первый байт: `0x40` (QUIC long header)
|
|
60
|
+
- Остальное: нули (620 байт всего)
|
|
61
|
+
|
|
62
|
+
**Использование:**
|
|
63
|
+
```bash
|
|
64
|
+
--payload=quic_initial --lua-desync=fake:blob=fake_default_quic
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 🔧 **Модификации TLS блоба (`tls_mod`)**
|
|
70
|
+
|
|
71
|
+
Функция **`tls_mod(blob, modlist, payload)`** модифицирует TLS Client Hello.
|
|
72
|
+
|
|
73
|
+
### Доступные модификации:
|
|
74
|
+
|
|
75
|
+
#### 1. **`rnd`** - Рандомизация поля "random"
|
|
76
|
+
- Заменяет 32-байтовое поле "random" в TLS handshake на случайные данные
|
|
77
|
+
- Делает каждый fake-пакет уникальным
|
|
78
|
+
|
|
79
|
+
#### 2. **`rndsni`** - Случайный SNI
|
|
80
|
+
- Генерирует случайное доменное имя
|
|
81
|
+
- Заменяет SNI в TLS расширении
|
|
82
|
+
- Пример: `www.microsoft.com` → `a7b3c.com`
|
|
83
|
+
|
|
84
|
+
#### 3. **`sni=<домен>`** - Установить конкретный SNI
|
|
85
|
+
- Заменяет SNI на указанный домен
|
|
86
|
+
- Пример: `sni=www.google.com`
|
|
87
|
+
|
|
88
|
+
#### 4. **`dupsid`** - Дублировать Session ID
|
|
89
|
+
- Копирует Session ID из **реального** TLS handshake (из `payload`)
|
|
90
|
+
- Требует третий параметр — реальный payload пакета
|
|
91
|
+
- Делает fake более похожим на настоящий
|
|
92
|
+
|
|
93
|
+
#### 5. **`padencap`** - Padding encapsulation
|
|
94
|
+
- Добавляет padding в TLS расширения
|
|
95
|
+
- Увеличивает размер пакета
|
|
96
|
+
|
|
97
|
+
#### 6. **`none`** - Без модификаций
|
|
98
|
+
- Явно указывает, что модификации не нужны
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## 💡 **Примеры использования**
|
|
103
|
+
|
|
104
|
+
### Базовое использование стандартных блобов:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# TLS fake без модификаций
|
|
108
|
+
--lua-desync=fake:blob=fake_default_tls
|
|
109
|
+
|
|
110
|
+
# HTTP fake
|
|
111
|
+
--lua-desync=fake:blob=fake_default_http
|
|
112
|
+
|
|
113
|
+
# QUIC fake
|
|
114
|
+
--lua-desync=fake:blob=fake_default_quic
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Модификация TLS при старте:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
# Однократно при старте изменить SNI на случайный и рандомизировать поле random
|
|
121
|
+
--lua-init="fake_default_tls = tls_mod(fake_default_tls,'rnd,rndsni')"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Модификация TLS на лету:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
# При каждой отправке менять SNI на google.com и копировать session ID
|
|
128
|
+
--lua-desync=fake:blob=fake_default_tls:tls_mod=rnd,dupsid,sni=www.google.com
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Комбинированные примеры:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# Для YouTube: fake с google.com SNI, MD5 signature, 11 повторов
|
|
135
|
+
--payload=tls_client_hello --lua-desync=fake:blob=fake_default_tls:tcp_md5:repeats=11:tls_mod=rnd,dupsid,sni=www.google.com
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Создание собственных блобов:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
# Загрузить blob из hex-строки
|
|
142
|
+
--blob=myblob:0x1603010000
|
|
143
|
+
|
|
144
|
+
# Загрузить blob из файла
|
|
145
|
+
--blob=custom_tls:@/path/to/tls_clienthello.bin
|
|
146
|
+
|
|
147
|
+
# Загрузить с offset
|
|
148
|
+
--blob=custom_tls:+100@/path/to/file.bin
|
|
149
|
+
|
|
150
|
+
# Использовать свой blob
|
|
151
|
+
--lua-desync=fake:blob=myblob
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 🔍 **Как работает `tls_mod`**
|
|
157
|
+
|
|
158
|
+
### Синтаксис:
|
|
159
|
+
```lua
|
|
160
|
+
tls_mod(blob, modlist, [payload])
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Параметры:**
|
|
164
|
+
1. `blob` - исходный TLS Client Hello (строка с бинарными данными)
|
|
165
|
+
2. `modlist` - список модификаций через запятую
|
|
166
|
+
3. `payload` (опционально) - реальный TLS handshake для копирования Session ID
|
|
167
|
+
|
|
168
|
+
**Возвращает:** модифицированный TLS Client Hello
|
|
169
|
+
|
|
170
|
+
### Примеры в Lua:
|
|
171
|
+
|
|
172
|
+
```lua
|
|
173
|
+
-- При старте программы
|
|
174
|
+
fake_default_tls = tls_mod(fake_default_tls, 'rnd,rndsni')
|
|
175
|
+
|
|
176
|
+
-- В desync функции с реальным payload
|
|
177
|
+
fake_payload = tls_mod(fake_default_tls, 'dupsid,sni=www.google.com', desync.reasm_data)
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## 📋 **Полный пример конфигурации**
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
nfqws2 \
|
|
186
|
+
--lua-init=@zapret-lib.lua --lua-init=@zapret-antidpi.lua \
|
|
187
|
+
--lua-init="fake_default_tls = tls_mod(fake_default_tls,'rnd,rndsni')" \
|
|
188
|
+
--blob=quic_google:@quic_initial_www_google_com.bin \
|
|
189
|
+
\
|
|
190
|
+
--filter-tcp=80 --filter-l7=http \
|
|
191
|
+
--payload=http_req --lua-desync=fake:blob=fake_default_http:tcp_md5 \
|
|
192
|
+
--lua-desync=multisplit:pos=method+2 \
|
|
193
|
+
--new \
|
|
194
|
+
\
|
|
195
|
+
--filter-tcp=443 --filter-l7=tls \
|
|
196
|
+
--payload=tls_client_hello --lua-desync=fake:blob=fake_default_tls:tcp_md5:repeats=6 \
|
|
197
|
+
--lua-desync=multidisorder:pos=1,midsld \
|
|
198
|
+
--new \
|
|
199
|
+
\
|
|
200
|
+
--filter-udp=443 --filter-l7=quic \
|
|
201
|
+
--payload=quic_initial --lua-desync=fake:blob=quic_google:repeats=11
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## 🎯 **Ключевые моменты**
|
|
207
|
+
|
|
208
|
+
1. **Стандартные блобы** инициализируются автоматически — не нужно их загружать
|
|
209
|
+
2. **`fake_default_tls`** содержит SNI `www.microsoft.com` по умолчанию
|
|
210
|
+
3. **`tls_mod`** может применяться:
|
|
211
|
+
- **Один раз при старте** через `--lua-init`
|
|
212
|
+
- **На лету** при каждой отправке через параметр `tls_mod=` в desync функции
|
|
213
|
+
4. **`dupsid`** требует реальный payload — работает только в функциях `fake`, `syndata` и подобных
|
|
214
|
+
5. **Модификации комбинируются** через запятую: `rnd,rndsni,dupsid,sni=domain.com`
|
|
215
|
+
|
|
216
|
+
Блобы — это мощный механизм для создания fake-пакетов любой сложности без жестко зашитых параметров в коде программы!
|
|
217
|
+
|
|
218
|
+
---
|