MasterDnsVPN - это научно-исследовательский проект, предназначенный для передачи TCP-трафика через DNS-запросы и ответы. В общем смысле он схож с проектами вроде DNSTT или SlipStream, однако использует принципиально иную архитектуру и подход к реализации. Система спроектирована с учётом совместимости с различными типами DNS-резолверов и жёсткими сетевыми условиями, с целью обеспечить максимально возможную стабильность и доставку данных даже в неблагоприятных сценариях.
| Особенность | SlipStream | DNSTT | MasterDnsVPN |
|---|---|---|---|
| Тип протокола | Продвинутый DNS-туннель | Классический DNS-туннель | Продвинутый DNS-туннель / VPN |
| Транспортный протокол | QUIC | KCP + Noise | Кастомный протокол + ARQ |
| Накладные расходы заголовка | 🟠 ~24B | 🔴 ~59B | 🟢 ~5–7B на ≈88% меньше DNSTT на ≈71% меньше SlipStream |
| Тип шифрования | TLS 1.3 (внутри QUIC) | Noise (Curve25519) | AES / ChaCha20 / XOR (XOR легче, но менее безопасен) |
| Архитектура | Монолитная (QUIC обрабатывает всё) | Многоуровневая (KCP + SMUX + Noise) | 🟢 Лёгкая кастомная, оптимизированная под DNS |
| Скорость | 🟡 Высокая (до ~5 раз быстрее, чем DNSTT) | 🔴 Средняя | 🟢 Быстрее, чем другие До ~9 раз быстрее, чем DNSTT До ~3,6 раз быстрее, чем SlipStream |
| Устойчивость к потере пакетов | 🟡 Хорошая | 🟠 Средняя | 🟢 Очень высокая (Multipath + ARQ) |
| Поддержка нескольких резолверов | Да (multipath) | ❌ | Да — расширенный (несколько резолверов + дублирование) |
| Устойчивость к цензуре | Хорошая | Средняя | Очень высокая (основная цель проекта) |
| Сложность настройки | Средняя | Простая | Простая базовая, сложнее при тонкой настройке |
| Поддержка SOCKS5 | Да | Да | Оптимизировано для SOCKS5 / SOCKS4 с уменьшенными накладными расходами SOCKS |
| Поддержка Shadowsocks | ✅ | ❌ | Косвенно: режим TCP-передачи может поддерживать протоколы на основе TCP , например Shadowsocks, VLESS/VMess и т. д. |
| Реальный multipath | Да (QUIC multipath) | ❌ | Да (мультирезолвер + дублирование) |
| Адаптивная маршрутизация | Ограниченная | ❌ | Расширенная (на основе задержки/потерь) |
| Цель проектирования | Высокая скорость и эффективность | Простота и стабильность | Работоспособность в самых сложных сетях — стабильность, скорость и эффективность |
| Язык реализации | Rust | Go | Go (основной), Python (legacy) |
| Встроенный балансировщик | 🔴 | ❌ | 🟢 (8 режимов) |
| Система дублирование пакетов | ❌ | ❌ | Да — увеличивает трафик для повышения надёжности (настраивается или может быть отключено) |
| Допуск MTU | Лучше чем DNSTT | - | Работает даже при очень маленьком значении MTU, т.к. накладные расходы протокола минимальны |
| Отказоустойчивость | ❌ | ❌ | ✅ |
| Скорость загрузки 10MB (Локально) | 🟡 0.978с | 🔴 2.492с | 🟢 0.270с |
| Скорость отправки 10MB (Локально) | 🟡 3.249с | 🔴 16.207с | 🟢 1.746s |
| Проверка состояния резолвера и авто-отключение | ❌ | ❌ | ✅ |
| Фоновая реактивация здоровых резолверов | ❌ | ❌ | ✅ |
| Локальный DNS на клиенте (для предотвращения перехвата DNS) | ❌ | ❌ | ✅ (с сильным/активным DNS кэшированием) |
| DNS через SOCKS5 | ❌ | ❌ | ✅ (с DNS кэшированием) |
| Тонкая настройка | 🟠 | 🟠 | 🟢 Большинство подсистем настраиваемы |
| Не требуется стороннее вспомогательное ПО | ❌ | ❌ | 🟢 Дополнительное программное обеспечение не требуется; при необходимости можно использовать совместно с SOCKS или такими инструментами, как Shadowsocks или OpenVPN |
|
MasterDnsVPN предоставляется исключительно в образовательных и исследовательских целях.
- Предоставляется без гарантии: Данное программное обеспечение предоставляется “КАК ЕСТЬ”, без каких-либо явных или подразумеваемых гарантий, включая гарантии товарной пригодности, пригодности для конкретной цели или отсутствия нарушений прав.
- Ограничение ответственности: Разработчики и участники проекта не несут ответственности за любые прямые, косвенные, случайные, последующие или иные убытки, возникающие в результате использования данного ПО или невозможности его использования.
- Ответственность пользователя: Использование данного проекта за пределами тестовых сред может привести к сбоям в работе сети или ее повреждению. Пользователь несет полную ответственность за все последствия установки, настройки и использования.
- Соблюдение законодательства: Использование данного проекта с целью обхода местного законодательства может повлечь за собой гражданско-правовые или уголовные последствия. Перед использованием ознакомьтесь с законодательством и нормативными актами вашей страны. Разработчики не несут ответственности за нарушение пользователями местного, национального или международного законодательства.
- Условия лицензии: Использование, копирование, распространение или модификация данного программного обеспечения регулируются условиями лицензии MIT, изложенными в файле LICENSE данного репозитория. Любое использование, не соответствующее этим условиям, запрещено.
Чтобы быть в курсе последних новостей, релизов и новостей о проектах, подпишитесь на наш канал в Telegram: Telegram Channel
Если вам понравился этот проект, пожалуйста, поддержите его, поставив звездочку на GitHub (⭐). Это поможет проекту привлечь внимание.
- TON:
masterking32.ton
- EVM-совместимые сети (ETH и совместимые цепочки):
0x517f07305D6ED781A089322B6cD93d1461bF8652
- TRC20 (TRON):
TLApdY8APWkFHHoxebxGY8JhMeChiETqFH
Мы ценим каждый вклад и каждый отзыв. Ваша поддержка напрямую способствует дальнейшему развитию и совершенствованию проекта..
Краткий обзор основных возможностей MasterDnsVPN:
- Устойчивость к цензуре и работоспособность в сложных сетях: 🛡️ Разработан для работы в сетях с фильтрацией, при нестабильном соединении и в условиях жестких ограничений по размеру MTU.
- Оптимизированный кастомный протокол: 🔄 Использует кастомный протокол с механизмом повторной передачи данных, что позволяет сократить накладные расходы и увеличить полезный объем данных DNS.
- Multipath и дублирование пакетов: 📡 Трафик передается по нескольким маршрутам, а также поддерживается выборочное дублирование для повышения вероятности доставки в нестабильных сетях.
- Умный выбор резолверов и проверка их работоспособности: ⚡ Выбор резолверов на основе их качества и работоспособности, а также автоматическое управление проблемными резолверами.
- Определение и синхронизация MTU: 🧰 Определяет фактический размер MTU рабочих маршрутов и синхронизирует их с ним, чтобы уменьшить фрагментацию и повысить стабильность.
- Поддержка и оптимизация SOCKS5 / SOCKS4: 🧦 Оптимизирована работа с локальным прокси для популярных приложений.
- Объединение блоков управления и снижение нагрузки на каналы управления: 📦 Объединяет пакеты подтверждения (ACK) и управляющий трафик для уменьшения количества управляющих сообщений.
- Опциональное сжатие и упаковка запросов: 🗜️ Уменьшает количество запросов и повышает эффективность при использовании малых значений MTU.
- Гибкое шифрование: 🔐 Поддерживает несколько методов шифрования для обеспечения оптимального соотношения скорости и безопасности.
- Опциональный клиентский DNS и кэширование: 📛 Позволяет предоставлять доступ к локальному DNS-сервису, сокращать задержки и ограничивать возможности перехвата.
- Масштабируемое управление ресурсами: ⚙️ Может работать на небольших серверах или быть настроено для более высоких нагрузок.
Этот список представляет собой лишь общее краткое изложение. В соответствующих разделах ниже каждая область описана более подробно.
MasterDnsVPN — это не просто теоретический проект. Он прошел испытание в реальных условиях и доказал свою эффективность в ситуациях, когда глобальный интернет полностью отключен.
Недавно, во время 88-дневного отключения интернета в Иране, власти не просто заблокировали VPN или отфильтровали сайты — они полностью отключили международную пропускную способность. Поскольку 99% связи с внешним миром было физически отключено, пользователи оказались запертыми в закрытой локальной сети.
Стандартные инструменты обхода блокировок бесполезны, когда нет международного интернета, к которому можно подключиться. Однако во время этого масштабного отключения MasterDnsVPN выделился как один из немногих спасательных кругов, которые действительно позволили пользователям оставаться на связи с глобальной сетью.
Как он выжил при полном отключении? Вместо того чтобы действовать как стандартный VPN, MasterDnsVPN использует интеллектуальные технологии DNS-туннелирования, чтобы пробиться сквозь блокировку:
- Несколько резолверов: он направляет трафик через различные DNS-резолверы, гарантируя, что соединение никогда не будет зависеть от одного, легко блокируемого пути.
- Шифрование и разбиение данных: он шифрует ваши данные и разбивает их на крошечные, разбросанные фрагменты.
- Маскировка под легитимный трафик: он упаковывает эти фрагменты данных в стандартные, совершенно обычные DNS-запросы.
- Обход локальных ограничений: поскольку трафик выглядит точно так же, как обычные повседневные DNS-запросы, брандмауэры пропускают его. Данные преобразуются и попадают во внешний мир — даже если сеть заставляет вас использовать собственные ограниченные локальные серверы преобразования, контролируемые государством.
Именно эта комбинация позволила MasterDnsVPN поддерживать стабильное соединение, когда доступ к внешнему миру был полностью заблокирован.
Чтобы принимать DNS-запросы непосредственно на вашем сервере, необходимо делегировать ему субдомен. Проще говоря, создайте две записи: одну A запись, указывающую на IP-адрес вашего сервера, и одну запись NS, делегирующую субдомен туннеля этой A записи.
- Тип:
A - Имя: короткое имя, например
ns - Значение: IPv4-адрес вашего сервера
Пример:
ns.example.com -> 1.2.3.4
Примечание Cloudflare: если для домена используется Cloudflare, откройте страницу
DNSи нажмите на значок облака рядом сAзаписью, чтобы он стал серым (Только DNS). Прокси должен быть отключён.
- Тип:
NS - Имя: субдомен туннеля, например
v - Значение / Цель:
ns.example.com
Пример:
v.example.com -> ns.example.com
Примечание Cloudflare: добавьте запись
NSв обычном порядке. Cloudflare не проксирует записи NS, но убедитесь, что для записи Ansуже установлен параметрТолько DNS.
Более короткие доменные имена оставляют больше места для фактических данных в каждом DNS-запросе. Для повышения пропускной способности используйте короткие имена. Если вы используете Cloudflare, все равно сохраняйте соответствующие записи в режиме Только DNS.
Если вы хотите развернуть сервер MasterDnsVPN на Linux, проще всего воспользоваться скриптом автоматической установки. Выполните на Linux сервере следующую команду:
bash <(curl -Ls https://raw.githubusercontent.com/masterking32/MasterDnsVPN/main/server_linux_install.sh)Скрипт автоматически выполняет установку и настройку. По завершении сервер запускается, а ключ шифрования отображается в терминале и записывается в файл encrypt_key.txt, расположенный рядом с исполняемым файлом. Храните этот ключ в надежном месте.
- В процессе установки вам будет предложено указать домен. Это должен быть тот же делегированный субдомен, который вы настроили в
NSзаписи, напримерv.example.com. - После создания DNS-записей дождитесь их распространения (propagation). Это может занять от нескольких минут до нескольких часов, а в отдельных случаях — до 48 часов, в зависимости от значения TTL и используемого DNS-провайдера.
- Для проверки настройки DNS можно использовать утилиты
digилиnslookup, например:dig v.example.com NSилиnslookup -type=ns v.example.com. Для прямого запроса к новому DNS-серверу:dig @ns.example.com v.example.com A. - Если на сервере включен брандмауэр, разрешите UDP-порт 53. Пример для
ufw:
sudo ufw allow 53/udp
sudo ufw reloadДля firewalld:
sudo firewall-cmd --add-port=53/udp --permanent
sudo firewall-cmd --reload- Если порт
53уже занят другой службой, напримерsystemd-resolved, обратитесь к разделу по устранению неполадок “Устранение проблемы с занятым портом 53”. - Ключ шифрования (
encrypt_key.txt) отображается после установки. Скопируйте его и храните в надежном месте, так как он необходим клиенту для подключения.
Вы можете установить и запустить этот проект двумя способами:
- Использовать готовые бинарные файлы (рекомендуется для большинства пользователей)
- Запустить напрямую из исходного кода с помощью Go (рекомендуется для разработчиков)
Для удобства, в разделе релизов размещены готовые бинарные файлы клиента и сервера. Загрузите архив, соответствующий вашей операционной системе, и распакуйте его.
💡 Примечание: Архивы содержат исполняемый файл и примеры конфигурационных файлов.
| Операционная система | Архитектура | Совместимость | Загрузка |
|---|---|---|---|
| Windows 🪟 | AMD64 (64-bit) |
Windows 10 and 11 | Download Windows Client ⬇️ |
| Windows 🪟 | x86 (32-bit) |
Older 32-bit Windows systems | Download Windows x86 Client ⬇️ |
| Windows 🪟 | ARM64 |
Windows on ARM devices | Download Windows ARM64 Client ⬇️ |
| macOS 🍎 | ARM64 |
Apple Silicon Macs (M1 / M2 / M3) | Download macOS Client ⬇️ |
| macOS 🍎 | AMD64 |
Intel Macs | Download macOS Intel Client ⬇️ |
| Linux 🐧 | AMD64 (64-bit) |
Modern distributions (Ubuntu 22.04+, Debian 12+) | Download Linux Client ⬇️ |
| Linux 🐧 | x86 (32-bit) |
Older 32-bit Linux systems | Download Linux x86 Client ⬇️ |
| Linux (Legacy) 🐧 | AMD64 (64-bit) |
Older distributions (Ubuntu 20.04, Debian 11) | Download Linux Legacy Client ⬇️ |
| Linux (Legacy) 🐧 | ARM64 |
Older ARM64 Linux systems that need broader compatibility | Download Linux Legacy ARM64 Client ⬇️ |
| Linux (ARM) 🐧 | ARM64 |
ARM servers, Raspberry Pi, and similar boards | Download Linux ARM Client ⬇️ |
| Linux (ARM) 🐧 | ARMv7 |
32-bit ARM boards and older embedded Linux devices | Download Linux ARMv7 Client ⬇️ |
| Linux (ARM) 🐧 | ARMv6 |
Older ARM boards and lightweight Linux devices | Download Linux ARMv6 Client ⬇️ |
| Linux (ARM) 🐧 | ARMv5 |
Very old ARM devices and embedded Linux systems | Download Linux ARMv5 Client ⬇️ |
| Linux 🐧 | RISCV64 |
RISC-V Linux boards and servers | Download Linux RISCV64 Client ⬇️ |
| Linux (MIPS) 🐧 | MIPS |
Big-endian MIPS Linux and router platforms | Download Linux MIPS Client ⬇️ |
| Linux (MIPS) 🐧 | MIPSLE |
Little-endian MIPS Linux and router platforms | Download Linux MIPSLE Client ⬇️ |
| Linux (MIPS) 🐧 | MIPS64 |
64-bit big-endian MIPS Linux systems | Download Linux MIPS64 Client ⬇️ |
| Linux (MIPS) 🐧 | MIPS64LE |
64-bit little-endian MIPS Linux systems | Download Linux MIPS64LE Client ⬇️ |
| Termux / Android 📱 | ARM64 |
Modern Android phones running Termux | Download Termux ARM64 Client ⬇️ |
| Termux / Android 📱 | ARMv7 |
Older Android phones running 32-bit Termux environments | Download Termux ARMv7 Client ⬇️ |
(Используйте это, если не хотите использовать скрипт автоматический установки для Linux.)
| Операционная система | Архитектура | Совместимость | Загрузка |
|---|---|---|---|
| Windows 🪟 | AMD64 (64-bit) |
Windows Server, Windows 10 and 11 | Download Windows Server ⬇️ |
| Windows 🪟 | x86 (32-bit) |
Older 32-bit Windows systems | Download Windows x86 Server ⬇️ |
| Windows 🪟 | ARM64 |
Windows on ARM devices | Download Windows ARM64 Server ⬇️ |
| Linux 🐧 | AMD64 (64-bit) |
Ubuntu 22.04+, Debian 12+ servers | Download Linux Server ⬇️ |
| Linux 🐧 | x86 (32-bit) |
Older 32-bit Linux systems | Download Linux x86 Server ⬇️ |
| Linux (Legacy) 🐧 | AMD64 (64-bit) |
Older servers (Ubuntu 20.04, Debian 11) | Download Linux Legacy Server ⬇️ |
| Linux (Legacy) 🐧 | ARM64 |
Older ARM64 Linux systems that need broader compatibility | Download Linux Legacy ARM64 Server ⬇️ |
| Linux (ARM) 🐧 | ARM64 |
ARM servers | Download Linux ARM Server ⬇️ |
| Linux (ARM) 🐧 | ARMv7 |
32-bit ARM servers and embedded Linux devices | Download Linux ARMv7 Server ⬇️ |
| Linux (ARM) 🐧 | ARMv6 |
Older ARM boards and lightweight Linux devices | Download Linux ARMv6 Server ⬇️ |
| Linux (ARM) 🐧 | ARMv5 |
Very old ARM devices and embedded Linux systems | Download Linux ARMv5 Server ⬇️ |
| Linux 🐧 | RISCV64 |
RISC-V Linux boards and servers | Download Linux RISCV64 Server ⬇️ |
| Linux (MIPS) 🐧 | MIPS |
Big-endian MIPS Linux and router platforms | Download Linux MIPS Server ⬇️ |
| Linux (MIPS) 🐧 | MIPSLE |
Little-endian MIPS Linux and router platforms | Download Linux MIPSLE Server ⬇️ |
| Linux (MIPS) 🐧 | MIPS64 |
64-bit big-endian MIPS Linux systems | Download Linux MIPS64 Server ⬇️ |
| Linux (MIPS) 🐧 | MIPS64LE |
64-bit little-endian MIPS Linux systems | Download Linux MIPS64LE Server ⬇️ |
| macOS 🍎 | ARM64 |
Apple Silicon Macs | Download macOS Server ⬇️ |
| macOS 🍎 | AMD64 |
Intel Macs | Download macOS Intel Server ⬇️ |
| Termux / Android 📱 | ARM64 |
Modern Android / Termux environments | Download Termux ARM64 Server ⬇️ |
| Termux / Android 📱 | ARMv7 |
Older Android / 32-bit Termux environments | Download Termux ARMv7 Server ⬇️ |
Этот Docker образ запускает сервер MasterDnsVPN в контейнерной среде и поддерживает сборки для нескольких архитектур.
Он автоматически:
- Загружает конфигурацию по умолчанию, если собственная отсутствует
- Добавляет ваш домен при первом запуске
- Сохраняет постоянные данные в каталоге
/data
- linux/amd64
- linux/arm/v5
- linux/arm/v7
- linux/arm64/v8
- linux/mips64le
Запуск через docker run:
docker run -d \
--name masterdnsvpn \
--restart unless-stopped \
-e DOMAIN=v.example.com \
-v $(pwd)/data:/data \
-p 53:53/tcp \
-p 53:53/udp \
ghcr.io/masterking32/masterdnsvpn:latestservices:
masterdnsvpn:
image: ghcr.io/masterking32/masterdnsvpn:latest
restart: unless-stopped
environment:
- DOMAIN=v.example.com
volumes:
- ./data:/data
ports:
- "53:53/tcp"
- "53:53/udp"| Переменная | Описание |
|---|---|
| DOMAIN | Ваш DNS домен (требуется при первом запуске) |
⚠️ Если при первом запуске переменнаяDOMAINне указана, контейнер будет остановлен с ошибкой.
Хранятся в /data:
server_config.tomlencrypt_key.txt
Вы можете смонтировать его в качестве тома (volume):
-v ./data:/dataДля контейнеров MikroTik:
- Используйте последнюю версию MikroTik RouterOS v7
- Настройте NAT-перенаправление на порт UDP/TCP 53 в ваш контейнер
- Полная инструкция по настройке контейнера MikroTik: https://help.mikrotik.com/docs/spaces/ROS/pages/84901929/Container
Пример:
/container mounts
add dst=/data list=MasterDnsVPN src=/containers/mounts/MasterDnsVPN
/container envs
add key=DOMAIN list=MasterDnsVPN value=v.example.com
/container add check-certificate=no dns=1.1.1.1 envlists=MasterDnsVPN hostname=MasterDnsVPN interface=MasterDnsVPN layer-dir="" mountlists=MasterDnsVPN name=MasterDnsVPN remote-image=ghcr.io/masterking32/masterdnsvpn:latest root-dir=/containers/data/MasterDnsVPN start-on-boot=yes- Обязателен порт DNS
53(UDP/TCP) - НЕ запускайте другой DNS-сервис на том же хосте
- Предназначен для использования в производственной среде, но при этом остается компактным
- Не требует модификации systemd или хоста
- После загрузки пакета для Windows распакуйте его.
- Откройте файл
client_config.tomlв текстовом редакторе, например в Блокноте. - Замените значения по умолчанию на свой реальный домен, ключ шифрования и список резолверов.
- Запустите исполняемый файл клиента.
- Настройте браузер или приложение на использование локального SOCKS5-прокси по адресу
127.0.0.1:18000, если вы не изменили настройки по умолчанию.
После загрузки пакета для Linux:
sudo apt update
sudo apt install unzip nanoРаспакуйте архив:
unzip MasterDnsVPN_Client_Linux_AMD64.zip
lsПри необходимости предоставьте права на выполнение:
chmod +x MasterDnsVPN_Client_Linux_AMD64
chmod +x MasterDnsVPN_Server_Linux_AMD64Отредактируйте файлы конфигурации:
nano client_config.toml
nano server_config.tomlЗапуск:
./MasterDnsVPN_Client_Linux_AMD64
./MasterDnsVPN_Server_Linux_AMD64
⚠️ Этот раздел предназначен для разработчиков или пользователей, которые хотят запустить текущий исходный код Go напрямую.
- Go
1.24или новее
git clone https://github.com/masterking32/MasterDnsVPN.git
cd MasterDnsVPN
go build -o masterdnsvpn-client ./cmd/client
go build -o masterdnsvpn-server ./cmd/serverНа Windows:
git clone https://github.com/masterking32/MasterDnsVPN.git
cd MasterDnsVPN
go build -o masterdnsvpn-client.exe .\cmd\client
go build -o masterdnsvpn-server.exe .\cmd\serverНа Linux и macOS:
cp client_config.toml.simple client_config.toml
cp server_config.toml.simple server_config.toml
cp client_resolvers.simple client_resolvers.txtНа Windows:
Copy-Item client_config.toml.simple client_config.toml
Copy-Item server_config.toml.simple server_config.toml
Copy-Item client_resolvers.simple client_resolvers.txt./masterdnsvpn-server -config server_config.toml
./masterdnsvpn-client -config client_config.tomlНа Windows:
.\masterdnsvpn-server.exe -config server_config.toml
.\masterdnsvpn-client.exe -config client_config.tomlОба исполняемых файла поддерживают эти аргументы:
| Параметр | Описание |
|---|---|
-config |
Пуль к файлу конфигурации |
-log |
Опциональный путь для лог файлов |
-version |
Вывод версии |
Пример:
./masterdnsvpn-server -config server_config.toml -log server.log
./masterdnsvpn-client -config client_config.toml -log client.log| Файл | Назначение |
|---|---|
client_config.toml |
Основная конфигурация клиента |
server_config.toml |
Основная конфигурация сервера |
client_resolvers.txt |
Список резолверов |
encrypt_key.txt |
Ключ шифрования на стороне сервера |
client_config.toml.simple |
Полный пример конфигурации клиента для текущей версии Go |
server_config.toml.simple |
Полный пример конфигурации сервера для текущей версии Go |
Допустимые форматы в client_resolvers.txt:
IPIP:PORTCIDRCIDR:PORT
Пример:
8.8.8.8
1.1.1.1:53
9.9.9.0/24
208.67.222.0/24:5353
На клиенте должны присутствовать следующие обязательные параметры::
ENCRYPTION_KEYдолжен совпадать с содержимым файлаencrypt_key.txtна сервереDOMAINSдолжен соответствовать домену сервераclient_resolvers.txtдолжен содержать рабочие DNS-резолверы- Для обычного использования оставьте
PROTOCOL_TYPE = "SOCKS5"
На сервере критически важны следующие настройки:
- Установите
DOMAINв значение вашего делегированного туннельного домена DATA_ENCRYPTION_METHODдолжен совпадать с клиентской конфигурациейENCRYPTION_KEY_FILEзадаёт путь к файлу ключа на сервере- Для прямых исходящих подключений оставьте
USE_EXTERNAL_SOCKS5 = false - Если требуется цепочка через внешний SOCKS5-прокси, установите
USE_EXTERNAL_SOCKS5 = trueи заполнитеFORWARD_IP/FORWARD_PORT
| Параметр | Пример значения | Значения | Полное описание |
|---|---|---|---|
PROTOCOL_TYPE |
"SOCKS5" |
"SOCKS5" или "TCP" |
Выбирает режим локальной службы, предоставляемый клиентом.SOCKS5 — это режим по умолчанию, рекомендуемый для обычного использования.TCP удобен в тех случаях, когда требуется перенаправлять трафик на один фиксированный удаленный адрес, а не предоставлять приложениям SOCKS-прокси. |
DOMAINS |
["v.example.com"] |
Непустой список строк | Это туннельные домены, используемые для формирования DNS-запросов. Каждый домен в списке должен относиться к тому же туннелю, который настроен на сервере. Если список задан неверно, клиент может формировать корректные DNS-запросы, которые сервер будет просто игнорировать. |
DATA_ENCRYPTION_METHOD |
1 |
0..5 |
Должен совпадать с сервером. 0=None (без шифрования), 1=XOR, 2=ChaCha20, 3=AES-128-GCM, 4=AES-192-GCM, 5=AES-256-GCM. XOR лёгкий, но менее надёжный. Режимы AEAD (ChaCha20, AES) обеспечивают более высокую безопасность, но имеют больше накладных расходов. |
ENCRYPTION_KEY |
"" |
Строка | Секретный ключ, используемый клиентом. Он должен точно совпадать с ключом шифрования на стороне сервера. Если ключ указан неверно, пакеты могут быть интерпретированы как мусорные данные, и туннель не будет работать. |
| Параметр | Пример значения | Значения | Полное описание |
|---|---|---|---|
LISTEN_IP |
"127.0.0.1" |
Строка с IPv4 | |
| Адрес, на котором клиент принимает подключения от локальных пользователей прокси. Используйте 127.0.0.1 для обычного локального использования.Если на системе некоторые приложения предпочитают IPv6 localhost, вариант localhost может быть более подходящим для локального доступа.Используйте 0.0.0.0 только в случае, если требуется открыть прокси для сети и понятны связанные риски безопасности. |
|||
LISTEN_PORT |
18000 |
0..65535 |
Порт для локального прокси-сервера. Ваши приложения должны использовать этот порт для отправки трафика через туннель. |
SOCKS5_AUTH |
false |
true/false |
Включает аутентификацию по имени пользователя и паролю на локальном SOCKS5-прокси. Если вы используете привязку к 0.0.0.0, настоятельно рекомендуется включить эту опцию. |
SOCKS5_USER |
"master_dns_vpn" |
До 255 байт | Имя пользователя для локального SOCKS5-прокси. Используется только при значении SOCKS5_AUTH=true. |
SOCKS5_PASS |
"master_dns_vpn" |
До 255 байт | Пароль для локального SOCKS5-прокси. Используется только при значении SOCKS5_AUTH=true. |
| Параметр | Пример значения | Значения | Полное описание |
|---|---|---|---|
LOCAL_DNS_ENABLED |
false |
true/false |
Если эта опция включена, клиент предоставляет доступ к локальной службе DNS и может выполнять разрешение DNS-имен через туннель. Это полезно для предотвращения перехвата DNS-запросов или в тех случаях, когда необходимо, чтобы приложения также использовали туннель для работы с DNS. |
LOCAL_DNS_IP |
"127.0.0.1" |
Строка с IPv4 | Адрес для локального прослушивателя DNS. |
LOCAL_DNS_PORT |
53 |
0..65535 |
Порт локальной службы DNS. Стандартный порт — 53, но в некоторых системах он может быть уже занят другой службой. |
LOCAL_DNS_CACHE_MAX_RECORDS |
5000 |
Если <1, применяется значение по умолчанию |
Максимальное количество записей в локальном кэше DNS. Более высокое значение сокращает количество повторных запросов к DNS, но требует большего объема памяти. |
LOCAL_DNS_CACHE_TTL_SECONDS |
28800.0 |
Если <=0, применяется значение по умолчанию |
Срок хранения успешных записей DNS в локальном кэше. |
LOCAL_DNS_PENDING_TIMEOUT_SECONDS |
300.0 |
Если <=0, применяется значение по умолчанию |
Если в данный момент выполняется локальный DNS-запрос, последующие запросы могут дождаться его завершения вместо отправки нового запроса на сервер. Это значение определяет, как долго они могут ждать. |
LOCAL_DNS_CACHE_PERSIST_TO_FILE |
true |
true/false |
Если эта опция включена, содержимое локального кэша DNS может быть сохранено на диск для повторного использования между запусками. |
LOCAL_DNS_CACHE_FLUSH_INTERVAL_SECONDS |
60.0 |
Если <=0, применяется значение по умолчанию |
Периодичность записи сохраненного локального кэша DNS на диск. |
DNS_RESPONSE_FRAGMENT_TIMEOUT_SECONDS |
10.0 |
Если <=0, применяется значение по умолчанию |
Сколько времени клиент будет ждать отсутствующие фрагменты ответа DNS-туннеля, прежде чем прекратить попытку. |
| Параметр | Пример значения | Значения | Полное описание |
|---|---|---|---|
RESOLVER_BALANCING_STRATEGY |
2 |
0..8 |
Определяет способ выбора резолверов.0/2 = Round Robin (по кругу), 1 = случайный выбор, 3 = минимальные потери, 4 = наименьшая задержка, 5 = гибридная оценка, 6 = сначала потери, затем задержка, 7 = случайный выбор среди лучших по потерям, 8 = циклический выбор среди лучших по потерям.Гибридный режим использует взвешенную комбинированную оценку. Режим "сначала потери, затем задержка" сначала отбирает по уровню потерь, затем предпочитает меньшую задержку внутри этой группы и распределяет нагрузку между близкими по характеристикам кандидатами. Режим «top-random» выбирает случайно из лучшей группы по потерям, чтобы нагрузка не концентрировалась на одном резолвере. Режим "top-round-robin" последовательно перебирает ту же лучшую группу по потерям с детерминированной ротацией. |
PACKET_DUPLICATION_COUNT |
2 |
Допустимое значение ограничего в коде | Количество дублирования исходящих пакетов в обычном режиме. Более высокие значения увеличивают сетевые накладные расходы, но повышают устойчивость на нестабильных каналах. |
SETUP_PACKET_DUPLICATION_COUNT |
2 |
Допустимое значение ограничего в коде | Аналогично PACKET_DUPLICATION_COUNT, но используется для пакетов, чувствительных к настройкам, таких как создание потока и другие критические управляющие события. |
STREAM_RESOLVER_FAILOVER_RESEND_THRESHOLD |
2 |
Если <1, применяется значение по умолчанию |
Если поток накапливает повторные запросы на повторную отправку через один и тот же предпочитаемый резолвер, клиент может переключить этот поток на другой резолвер. Этот порог определяет, как быстро происходит такое переключение. |
| STREAM_RESOLVER_FAILOVER_COOLDOWN | 2.5 | Если <=0, применяется значение по умолчанию | Минимальная задержка между двумя переключениями резолвера для одного и того же потока.
Предотвращает нестабильные "качели" (oscillation) между резолверами.
| RECHECK_INACTIVE_SERVERS_ENABLED | true | true/false | Включает фоновую повторную проверку резолверов, которые отключены или считаются неработоспособными.
Если отключено, резолвер, ставший недоступным, останется отключённым до перезапуска или ручного восстановления. |
| AUTO_DISABLE_TIMEOUT_SERVERS | true | true/false | Включает автоматическое отключение резолверов, которые постоянно не отвечают и не показывают успешной активности. |
| AUTO_DISABLE_TIMEOUT_WINDOW_SECONDS | 30.0 | Если <=0, применяется значение по умолчанию | Время для определения того, отвечает ли резолвер.
Если все наблюдения в пределах этого интервала — таймауты, резолвер может быть отключён. |
| BASE_ENCODE_DATA | false | true/false | Если включено, полезная нагрузка кодируется в безопасный для передачи формат (base-safe) перед туннелированием.
Обычно это снижает эффективность передачи, но может помочь в условиях строгих резолверов. |
| Параметр | Пример значения | Значения | Полное описание |
|---|---|---|---|
UPLOAD_COMPRESSION_TYPE |
0 |
0..3 |
0=Выкл., 1=ZSTD, 2=LZ4, 3=ZLIB.Управляет сжатием исходящих данных на стороне клиента. |
DOWNLOAD_COMPRESSION_TYPE |
0 |
0..3 |
Тип сжатия, ожидаемый или предпочтительный для данных, передаваемых от сервера к клиенту. |
COMPRESSION_MIN_SIZE |
120 |
Если значение неверно, применяется значение по умолчанию. | Минимальный размер полезной нагрузки, при котором применяется сжатие. Очень маленькие пакеты часто увеличиваются после сжатия вместо уменьшения, поэтому этот порог предотвращает бессмысленные вычисления. |
| Параметр | Пример значения | Значения | Полное описание |
|---|---|---|---|
MIN_UPLOAD_MTU |
38 |
Положительное число | Минимальный MTU для исходящего трафика, который клиент допускает при тестировании резолверов. Минимально допустимое значение ограничено размером инициализационного пакета сессии (10). |
MIN_DOWNLOAD_MTU |
100 |
Положительное число | Минимальный MTU для входящего трафика, который клиент допускает при тестировании резолверов. Минимально допустимое значение ограничено размером пакета подтверждения сессии (20). |
MAX_UPLOAD_MTU |
150 |
Положительное число | Верхняя граница MTU при тестировании для исходящего трафика. |
MAX_DOWNLOAD_MTU |
500 |
Положительное число | Верхняя граница MTU при тестировании для входящего трафика. |
MTU_TEST_RETRIES |
2 |
Если неверно, применяется значение по умолчанию | Количество повторных попыток для каждого MTU. |
MTU_TEST_TIMEOUT |
2.0 |
Если неверно, применяется значение по умолчанию | Тайм-аут для одного MTU. |
MTU_TEST_PARALLELISM |
16 |
Если неверно, применяется значение по умолчанию | Количество резолверов, тестируемых параллельно во время MTU-сканирования. Более высокие значения ускоряют сканирование, но увеличивают нагрузку на CPU и сеть и могут давать больше ложных/шумовых сбоев. |
SAVE_MTU_SERVERS_TO_FILE |
false |
true/false |
Если включено, успешные результаты резолверов записываются в выходной файл. |
MTU_SERVERS_FILE_NAME |
"masterdnsvpn_success_test_{time}.log" |
Строка | Шаблон имени выходного файла для резолверов, успешно прошедших MTU-тестирование. |
MTU_SERVERS_FILE_FORMAT |
"{IP} ({DOMAIN}) - UP: {UP_MTU} DOWN: {DOWN-MTU}" |
Строка | Формат вывода, используемый в файле результатов MTU-тестирования. |
MTU_USING_SECTION_SEPARATOR_TEXT |
"" |
Строка | Необязательный разделитель, вставляемый в файл результатов MTU-тестирования. |
MTU_REMOVED_SERVER_LOG_FORMAT |
"Resolver {IP} ({DOMAIN}) removed at {TIME} due to {CAUSE}" |
Строка | Формат записи в лог/вывод при удалении резолвера из допустимого набора. |
MTU_ADDED_SERVER_LOG_FORMAT |
"Resolver {IP} ({DOMAIN}) added back at {TIME} (UP {UP_MTU}, DOWN {DOWN_MTU})" |
Строка | Формат записи в лог/вывод при восстановлении резолвера. |
MTU_REACTIVE_ADDED_SERVER_LOG_FORMAT |
"Resolver {IP} ({DOMAIN}) added back at {TIME} after reactive recheck (UP {UP_MTU}, DOWN {DOWN_MTU})" |
Строка | Формат записи в лог/вывод при восстановлении резолвера фоновыми проверками состояния. |
| Параметр | Пример значения | Значения | Полное описание |
|---|---|---|---|
RX_TX_WORKERS |
4 |
Если неверно, применяется значение по умолчанию | Количество общих потоков выполнения, используемых для чтения и записи UDP-туннеля. |
TUNNEL_PROCESS_WORKERS |
6 |
Если неверно, применяется значение по умолчанию | Количество потоков, обрабатывающих пакеты туннеля после их чтения. |
TUNNEL_PACKET_TIMEOUT_SECONDS |
10.0 |
Если неверно, применяется значение по умолчанию | Общий тайм-аут обработки пакетов туннеля. |
DISPATCHER_IDLE_POLL_INTERVAL_SECONDS |
0.020 |
Если неверно, применяется значение по умолчанию | Если отправлять нечего, диспетчер "засыпает" на этот интервал перед следующим опросом очереди. |
RX_CHANNEL_SIZE |
4096 |
Если неверно, применяется значение по умолчанию | Ёмкость входного канала пакетов туннеля. |
SOCKS_UDP_ASSOCIATE_READ_TIMEOUT_SECONDS |
30.0 |
Если неверно, применяется значение по умолчанию | Тайм-аут чтения для режима SOCKS UDP Associate. |
CLIENT_TERMINAL_STREAM_RETENTION_SECONDS |
45.0 |
Если неверно, применяется значение по умолчанию | Время, в течение которого завершённые потоки остаются в учётных структурах клиента перед окончательной очисткой. |
CLIENT_CANCELLED_SETUP_RETENTION_SECONDS |
120.0 |
Если неверно, применяется значение по умолчанию | Время хранения для setup-потоков, отменённых до завершения. |
SESSION_INIT_RETRY_BASE_SECONDS |
1.0 |
Если неверно, применяется значение по умолчанию | Базовая задержка для повторных попыток инициализации сессии. |
SESSION_INIT_RETRY_STEP_SECONDS |
1.0 |
Если неверно, применяется значение по умолчанию | Шаг увеличения, используемый в схеме повторных попыток. |
SESSION_INIT_RETRY_LINEAR_AFTER |
5 |
Если неверно, применяется значение по умолчанию | После этого количества попыток интервал между повторными попытками становится более линейным. |
SESSION_INIT_RETRY_MAX_SECONDS |
60.0 |
Если неверно, применяется значение по умолчанию | Максимальная задержка между повторными попытками инициализации сессии. |
SESSION_INIT_BUSY_RETRY_INTERVAL_SECONDS |
60.0 |
Если неверно, применяется значение по умолчанию | Задержка повторной попытки, если сервер явно отвечает SESSION_BUSY. |
| Параметр | Пример значения | Значения | Полное описание |
|---|---|---|---|
PING_AGGRESSIVE_INTERVAL_SECONDS |
0.100 |
Положительное число | Минимальный интервал пинга, используемый в состоянии максимальной активности. |
PING_LAZY_INTERVAL_SECONDS |
0.750 |
Положительное число | Обычный интервал пинга в режиме нормальной работы. |
PING_COOLDOWN_INTERVAL_SECONDS |
2.0 |
Положительное число | Интервал пинга в режиме охлаждения (cooldown). |
PING_COLD_INTERVAL_SECONDS |
15.0 |
Положительное число | Интервал пинга при "холодной" сессии, когда соединение в основном простаивает. |
PING_WARM_THRESHOLD_SECONDS |
8.0 |
Положительное число | Порог, после которого сессия считается "тёплой" (активной). |
PING_COOL_THRESHOLD_SECONDS |
20.0 |
Положительное число | Порог, после которого сессия считается находящейся в режиме снижения активности (cooling down). |
PING_COLD_THRESHOLD_SECONDS |
30.0 |
Положительное число | Порог, после которого сессия считается "холодной" (неактивной). |
| Параметр | Пример значения | Значения | Полное описание |
|---|---|---|---|
MAX_PACKETS_PER_BATCH |
8 |
По умолчанию, если указано некорректное значение | Максимальное количество управляющих элементов, которые клиент пытается объединить в один пакет за один цикл отправки. |
ARQ_WINDOW_SIZE |
600 |
Допустимый положительный диапазон | Размер окна отправки/приёма ARQ для каждого потока. |
ARQ_INITIAL_RTO_SECONDS |
1.0 |
Допустимое значение ограничего в коде | Начальный тайм-аут повторной передачи для пакетов данных. |
ARQ_MAX_RTO_SECONDS |
5.0 |
Допустимое значение ограничего в коде | Максимальный тайм-аут повторной передачи для пакетов данных. |
ARQ_CONTROL_INITIAL_RTO_SECONDS |
0.5 |
Допустимое значение ограничего в коде | Начальный тайм-аут повторной передачи для управляющих пакетов. |
ARQ_CONTROL_MAX_RTO_SECONDS |
3.0 |
Допустимое значение ограничего в коде | Максимальный тайм-аут повторной передачи для управляющих пакетов. |
ARQ_MAX_CONTROL_RETRIES |
400 |
Допустимое значение ограничего в коде | Максимальное количество повторных попыток для управляющих пакетов. |
ARQ_INACTIVITY_TIMEOUT_SECONDS |
1800.0 |
Допустимое значение ограничего в коде | Тайм-аут неактивности потока. |
ARQ_DATA_PACKET_TTL_SECONDS |
2400.0 |
Допустимое значение ограничего в коде | TTL пакетов данных до их отбрасывания. |
ARQ_CONTROL_PACKET_TTL_SECONDS |
1200.0 |
Допустимое значение ограничего в коде | TTL управляющих пакетов. |
ARQ_MAX_DATA_RETRIES |
1200 |
Допустимое значение ограничего в коде | Максимальное количество повторных попыток для пакетов данных. |
ARQ_DATA_NACK_MAX_GAP |
16 |
Допустимое значение ограничего в коде | Максимальный размер разрыва для генерации NACK при поступлении пакетов вне порядка. |
ARQ_DATA_NACK_INITIAL_DELAY_SECONDS |
0.1 |
Допустимое значение ограничего в коде | Начальная задержка перед отправкой NACK для отсутствующих пакетов данных. Определяет, насколько быстро система запрашивает повторную передачу. |
ARQ_DATA_NACK_REPEAT_SECONDS |
1.0 |
Допустимое значение ограничего в коде | Минимальный интервал перед повторной отправкой NACK для той же отсутствующей последовательности. |
ARQ_TERMINAL_DRAIN_TIMEOUT_SECONDS |
120.0 |
Допустимое значение ограничего в коде | Время ожидания после перехода потока в терминальное состояние до очистки очереди. |
ARQ_TERMINAL_ACK_WAIT_TIMEOUT_SECONDS |
90.0 |
Допустимое значение ограничего в коде | Время ожидания финального терминального ACK от клиента. |
| Параметр | Пример значения | Значения | Полное описание |
|---|---|---|---|
LOG_LEVEL |
"INFO" |
Обычно: DEBUG, INFO, WARN, ERROR |
Управляет уровнем детализации логов клиента.INFO обычно достаточно для нормальной работы.DEBUG используется при анализе состояния резолверов, переключений, ARQ или маршрута пакетов. |
ℹ️ Примечание: в примере конфигурации сервера присутствует ключ с именем
CONFIG_VERSION, однако текущий код на Go не считывает его вServerConfig. По этой причине он не включен в приведенную ниже таблицу и не влияет на поведение реального сервера.
| Параметр | Пример значения в файле server_config.toml.simple |
Значения | Полное описание |
|---|---|---|---|
DOMAIN |
["v.domain.com"] |
список строк | Домен или домены, которые данный сервер рассматривает как принадлежащие его туннелю. Они должны совпадать с параметром DOMAINS клиента, в противном случае пакеты туннеля не будут распознаваться правильно. |
PROTOCOL_TYPE |
"SOCKS5" |
только "SOCKS5" или "TCP" |
Определяет, какой тип настройки сервер принимает для новых потоков. В режиме SOCKS5 сервер ожидает пакет PACKET_SOCKS5_SYN и извлекает адрес назначения из полезных данных клиента. В режиме TCP настройка происходит через PACKET_STREAM_SYN, и сервер подключается к FORWARD_IP:FORWARD_PORT. |
MIN_VPN_LABEL_LENGTH |
не показано на образце | Если <=0, используется 3 |
Минимальная длина метки данных туннеля. Это помогает избежать путаницы между обычными DNS-запросами и запросами туннеля. Если этот параметр отсутствует в вашем старом файле README или конфигурации, его стоит добавить, так как код его поддерживает. |
SUPPORTED_UPLOAD_COMPRESSION_TYPES |
[0, 1, 2, 3] |
только действительные идентификаторы сжатия | Режимы сжатия, которые сервер разрешает клиентам запрашивать для трафика загрузки. |
SUPPORTED_DOWNLOAD_COMPRESSION_TYPES |
[0, 1, 2, 3] |
только действительные идентификаторы сжатия | То же самое касается трафика загрузки с сервера на клиент. |
| Парамент | Пример значения | Значения | Полное описание |
|---|---|---|---|
UDP_HOST |
"0.0.0.0" |
если поле пустое, используется значение по умолчанию. | Адрес, на котором привязан DNS-сервер. 0.0.0.0 означает прослушивание на всех интерфейсах. |
UDP_PORT |
53 |
1..65535 |
UDP-порт, используемый сервером. В большинстве случаев должно быть 53, чтобы резолверы могли напрямую отправлять запросы на этот порт. |
UDP_READERS |
4 |
По умолчанию если <=0 |
Количество горутин, осуществляющих чтение непосредственно из UDP-сокета. Большее количество может помочь на очень загруженных серверах, но после определенного предела это только увеличивает количество переключений контекста. |
DNS_REQUEST_WORKERS |
8 |
По умолчанию если <=0 |
Количество обработчиков, которые принимают запросы из входной очереди и передают их на уровень сеанса/декодирования. |
MAX_CONCURRENT_REQUESTS |
16384 |
По умолчанию если <=0 |
Емкость очереди входящих запросов. Если эта очередь заполняется, пакеты отбрасываются, и сервер выдает сообщения о перегрузке с ограничением скорости. |
SOCKET_BUFFER_SIZE |
4194304 |
По умолчанию если <=0 |
Запрос размера буфера сокета операционной системы для UDP-прослушивателя. Это важно при интенсивных всплесках входящего трафика. |
MAX_PACKET_SIZE |
65535 |
По умолчанию если <=0 |
Размер самого большого буфера пакетов, выделяемого пулом пакетов. |
DROP_LOG_INTERVAL_SECONDS |
2.0 |
По умолчанию если <=0 |
Минимальный интервал между повторными логами о перегрузке/падении, чтобы избежать избыточного количества логов. |
| Парамент | Пример значения | Значения | Полное описание |
|---|---|---|---|
DEFERRED_SESSION_WORKERS |
4 |
до 128 |
Количество рабочих процессов отложенных сеансов. Эти рабочие процессы обрабатывают задачи, чувствительные к порядку выполнения и требующие значительных настроек, такие как настройка потока, подключение по SOCKS и некоторые задачи сборки DNS. Слишком малое количество может замедлить настройку потока; слишком большое количество может привести к ненужной конкуренции. |
DEFERRED_SESSION_QUEUE_LIMIT |
4096 |
256..14336 |
Емкость очереди для задач с отложенным выполнением. Если она заполнится, новые задачи настройки или задачи с отложенным выполнением могут быть отклонены. |
SESSION_ORPHAN_QUEUE_INITIAL_CAPACITY |
авто | вычисляется автоматически | Начальные размеры очередей orphan/control рассчитываются автоматически на основе количества рабочих процессов сервера и нагрузки на пакетную обработку. |
STREAM_QUEUE_INITIAL_CAPACITY |
авто | вычисляется автоматически | Начальная емкость очереди для каждого потока рассчитывается автоматически на основе размера окна ARQ и степени заполнения. |
DNS_FRAGMENT_STORE_CAPACITY |
авто | вычисляется автоматически | Емкость хранилища фрагментов DNS-туннеля рассчитывается автоматически на основе количества одновременных запросов и числа рабочих процессов. |
SOCKS5_FRAGMENT_STORE_CAPACITY |
авто | вычисляется автоматически | Емкость хранилища фрагментов при настройке SOCKS5 определяется автоматически на основе нагрузки от отложенных сеансов и уровня параллелизма. |
| Парамент | Пример значения | Значения | Полное описание |
|---|---|---|---|
INVALID_COOKIE_WINDOW_SECONDS |
2.0 |
По умолчанию если <=0 |
Временной интервал, используемый для подсчета ошибок, связанных с недействительными файлами cookie. Это помогает серверу выявлять прерванные сеансы или клиентов, которые неоднократно используют неверный файл cookie. |
INVALID_COOKIE_ERROR_THRESHOLD |
10 |
По умолчанию если <=0 |
Если количество ошибок, связанных с недействительными файлами cookie, превысит указанный порог в рамках вышеуказанного интервала, сервер начнет реагировать более жестко. |
SESSION_TIMEOUT_SECONDS |
300.0 |
По умолчанию если <=0 |
Если в течение этого времени в сеансе не наблюдается активности, сервер устанавливает таймаут и удаляет его. |
SESSION_CLEANUP_INTERVAL_SECONDS |
30.0 |
По умолчанию если <=0 |
С какой периодичностью запускается цикл очистки сеансов. |
CLOSED_SESSION_RETENTION_SECONDS |
600.0 |
По умолчанию если <=0 |
Как долго хранятся метаданные закрытых сеансов, чтобы можно было распознавать опоздавшие пакеты. |
SESSION_INIT_REUSE_TTL_SECONDS |
600.0 |
1..86400 секунд |
Как долго хранятся подписи session-init для повторного использования и простой защиты от повторного воспроизведения. |
RECENTLY_CLOSED_STREAM_TTL_SECONDS |
600.0 |
1..86400 секунд |
Как долго недавно закрытые потоки остаются в таблице "недавно закрытых", чтобы опоздавшие пакеты SYN не могли их возобновить. |
RECENTLY_CLOSED_STREAM_CAP |
2000 |
1..1000000 |
Максимальное количество записей о недавно закрытых потоках, которые хранит сервер. |
TERMINAL_STREAM_RETENTION_SECONDS |
45.0 |
Диапазон 1..86400 секунд |
Как долго терминальные потоки остаются перед окончательным удалением. |
| Парамент | Пример значения | Значения | Полное описание |
|---|---|---|---|
DNS_UPSTREAM_SERVERS |
["1.1.1.1:53", "1.0.0.1:53"] |
По умолчание если не задано | Когда клиент отправляет реальный DNS-запрос через туннель, сервер перенаправляет его на эти вышестоящие резолверы. Этот раздел посвящён исключительно протоколу DNS-over-tunnel, а не самому туннельному транспорту. |
DNS_UPSTREAM_TIMEOUT |
4.0 |
По умолчанию если <=0 |
Таймаут для каждого обмена данными с реальным DNS-сервером. |
DNS_INFLIGHT_WAIT_TIMEOUT_SECONDS |
60.0 |
Диапазон0.1..120 секунд |
Если одновременно поступает несколько одинаковых DNS-запросов, выполняется только один запрос к вышестоящему серверу, а остальные запросы ожидают в режиме "последователей". Это значение определяет, как долго "последователи" будут ждать результата основного запроса. |
DNS_FRAGMENT_ASSEMBLY_TIMEOUT |
300.0 |
По умолчанию если <=0 |
Время, в течение которого сервер ожидает поступления всех фрагментов туннелированного DNS-запроса. |
DNS_CACHE_MAX_RECORDS |
50000 |
По умолчанию если <1 |
Максимальный размер внутреннего кэша DNS сервера для туннелируемых DNS-запросов. |
DNS_CACHE_TTL_SECONDS |
300.0 |
По умолчанию если <=0 |
Общее время жизни (TTL) внутреннего кэша DNS на стороне сервера. |
| Парамент | Пример значения | Значения | Полное описание |
|---|---|---|---|
SOCKS_CONNECT_TIMEOUT |
120.0 |
По умолчанию если <=0 |
Таймаут для исходящего соединения сервера с конечным адресатом или внешним сервером SOCKS5. В примере указано большее значение, но в реальном коде используется 8 секунд. |
USE_EXTERNAL_SOCKS5 |
false |
true/false |
Если true, сервер направляет исходящий трафик через внешний SOCKS5-сервер вместо прямого подключения.Это в основном полезно для цепочки серверов или маскировки исходящего трафика сервера. |
SOCKS5_AUTH |
false |
true/false |
Требует ли внешний сервер SOCKS5 аутентификацию с помощью имени пользователя и пароля. |
SOCKS5_USER |
"admin" |
до 255 байт | Имя пользователя для внешнего сервера SOCKS5. |
SOCKS5_PASS |
"123456" |
до 255 байт | Пароль для внешнего сервера SOCKS5. Если включена аутентификация и имя пользователя/пароль неверны, конфигурация становится недействительной. |
FORWARD_IP |
"" |
строка | В режиме TCP это фиксированный адрес назначения исходящего соединения.В режиме SOCKS5 при значении USE_EXTERNAL_SOCKS5=true это адрес самого вышестоящего SOCKS5-сервера. |
FORWARD_PORT |
0 |
0..65535 |
Порт конечной точки, указанной выше. Если USE_EXTERNAL_SOCKS5=true, это должно быть допустимое значение, отличное от нуля. |
| Парамент | Пример значения | Значения | Полное описание |
|---|---|---|---|
DATA_ENCRYPTION_METHOD |
1 |
0..5 |
Должно совпадать с клиентом. Если указано недопустимое значение, будет использоваться 1 как значение по умолчанию . |
ENCRYPTION_KEY_FILE |
"encrypt_key.txt" |
относительный или абсолютный путь | Путь к файлу ключа шифрования сервера. Если путь указан относительно, он преобразуется относительно каталога конфигурации. Если поле пустое, по умолчанию используется файл encrypt_key.txt. |
| Парамент | Пример значения | Значения | Полное описание |
|---|---|---|---|
MAX_PACKETS_PER_BATCH |
5 |
По умолчанию если <1 |
Максимальное количество блоков управления, которые сервер пытается объединить в один ответ. Важное примечание: если значение неверно, по умолчанию используется значение 20. |
PACKET_BLOCK_CONTROL_DUPLICATION |
1 |
1..16 |
Сколько дополнительных циклов следует повторить последний сжатый блок управления. 1 фактически означает, что дублирование отключено. Это полезно на каналах связи с потерями данных, чтобы критически важные данные подтверждения (ACK) и закрытия соединения доходили более надежно. |
STREAM_SETUP_ACK_TTL_SECONDS |
400.0 |
1..86400 секунд |
Общее время передачи (TTL) пакетов ACK, связанных с установкой потока. |
STREAM_RESULT_PACKET_TTL_SECONDS |
300.0 |
1..86400 секунд |
Время жизни (TTL) пакетов с результатами, таких как уведомления об успешном или неудачном подключении, которые должны дойти до клиента. |
STREAM_FAILURE_PACKET_TTL_SECONDS |
120.0 |
1..86400 секунд |
Общее время передачи пакетов с ошибками, связанных с установкой соединения или исходящими данными. |
ARQ_WINDOW_SIZE |
800 |
1..16384 |
Размер окна ARQ для каждого потока на сервере. |
ARQ_INITIAL_RTO_SECONDS |
1 |
0.05..60 секунд |
Начальный таймаут повторной передачи для пакетов данных. |
ARQ_MAX_RTO_SECONDS |
5.0 |
[ARQ_INITIAL_RTO_SECONDS, 120] |
Максимальное время ожидания повторной передачи для пакетов данных. |
ARQ_CONTROL_INITIAL_RTO_SECONDS |
0.5 |
0.05..60 секунд |
Начальный таймаут повторной передачи для пакетов управления. |
ARQ_CONTROL_MAX_RTO_SECONDS |
3.0 |
[ARQ_CONTROL_INITIAL_RTO_SECONDS, 120] |
Максимальное время ожидания повторной передачи для пакетов управления. |
ARQ_MAX_CONTROL_RETRIES |
300 |
5..5000 |
Максимальное количество попыток для контрольных пакетов. |
ARQ_INACTIVITY_TIMEOUT_SECONDS |
1800.0 |
30..86400 секунд |
Таймаут бездействия для потоков. |
ARQ_DATA_PACKET_TTL_SECONDS |
2400.0 |
30..86400 секунд |
Время жизни (TTL) для пакетов данных. |
ARQ_CONTROL_PACKET_TTL_SECONDS |
1200.0 |
30..86400 секунд |
Время жизни (TTL) для пакетов управления. |
ARQ_MAX_DATA_RETRIES |
1200 |
60..100000 |
Максимальное количество попыток для пакетов данных. |
ARQ_DATA_NACK_MAX_GAP |
16 |
0..255 |
В случае поступления некорректных пакетов этот параметр определяет, насколько большой пропуск может быть указан в NACK. |
ARQ_DATA_NACK_INITIAL_DELAY_SECONDS |
0.3 |
Допустимые значения ограничены в коде | Начальная задержка перед отправкой NACK в случае отсутствия пакетов данных. Определяет, насколько активно система запрашивает повторную передачу. |
ARQ_DATA_NACK_REPEAT_SECONDS |
1.0 |
0.1..30 секунд |
В случае отсутствия последовательности это определяет, через какое время можно повторно отправить NACK. |
ARQ_TERMINAL_DRAIN_TIMEOUT_SECONDS |
120.0 |
10..3600 секунд |
После того как поток становится конечным, сколько времени сервер ожидает, пока очереди не опустеют. |
ARQ_TERMINAL_ACK_WAIT_TIMEOUT_SECONDS |
90.0 |
5..3600 секунд |
Сколько времени сервер ожидает окончательного подтверждения (ACK) после закрытия терминала. |
| Парамент | Пример значения | Значения | Полное описание |
|---|---|---|---|
LOG_LEVEL |
"INFO" |
DEBUG, INFO, WARN, ERROR |
Уровень журнала сервера. Для обычной эксплуатации в производственной среде обычно достаточно уровня INFO.Для углубленного анализа сеансов, отложенных задач или поведения ARQ временно используйте уровень DEBUG. |
Во время фазы SESSION_INIT сервер может добавить к SESSION_ACCEPT блок сжатых настроек.
Клиент применяет эти ограничения непосредственно перед началом обычного выполнения.
- Значения
max, навязываемые сервером, уменьшают значение на стороне клиента только в том случае, если запрошенное значение выше. - Значения
min, навязываемые сервером, увеличивают значение на стороне клиента только в том случае, если запрошенное значение ниже. - Ограничения MTU применяются с обеих сторон:
- Сервер фиксирует принимаемое значение MTU сеанса во время инициализации.
- Клиент также фиксирует свои локальные настройки на время выполнения после декодирования.
- Состояние, определяемое во время выполнения, такое как количество рабочих процессов, очереди, хранилища фрагментов и размер упакованных блоков, восстанавливается на основе фактических синхронизированных значений.
- Устаревшие серверы, которые по-прежнему отправляют старую 7-байтовую полезную нагрузку
SESSION_ACCEPT, остаются совместимыми; синхронизация политик просто пропускается.
Поиск подходящих резолверов — одна из важнейших составляющих любого проекта по созданию DNS-туннелей. В данном проекте клиент может автоматически находить исправные резолверы и проверять их MTU.
Вы можете использовать эту функцию клиента для поиска исправных резолверов, тестирования собственных резолверов или сканирования диапазонов резолверов.
Просто поместите все IP-адреса построчно в файл client_resolvers.txt.
Затем создайте резервную копию текущего файла client_config.toml, откройте его в текстовом редакторе и замените следующие значения на предложенные:
- Уменьшите верхний предел MTU, чтобы найти все серверы, которые действительно ведут себя как DNS-серверы, и установите одинаковые значения для Min и Max, чтобы ускорить сканирование, избегая автоматического зондирования в стиле бинарного поиска.
MIN_UPLOAD_MTU=30
MIN_DOWNLOAD_MTU=40
MAX_UPLOAD_MTU=30
MAX_DOWNLOAD_MTU=40- Увеличить количество параллельных проверок резолвера:
MTU_TEST_PARALLELISM = 200- Сохраните результаты работы программы-резолвера в текстовом файле для последующего просмотра:
SAVE_MTU_SERVERS_TO_FILE = true- Измените формат вывода так, чтобы выводился только IP-адрес, который проще использовать повторно:
MTU_SERVERS_FILE_FORMAT = "{IP}"- Уменьшите количество повторных попыток и время ожидания, чтобы ускорить сканирование. При таких настройках вы можете пропустить некоторые немного более медленные, но все же исправные резолверы, поэтому увеличьте эти значения, если хотите получить более точные результаты.
MTU_TEST_RETRIES = 1
MTU_TEST_TIMEOUT = 1.0
⚠️ Важное примечание: Перед выполнением этой операции у вас уже должен быть запущен сервер, а его ключ и домен должны быть указаны в файлеclient_config.toml. В противном случае клиент не сможет правильно выполнить тесты MTU и, скорее всего, помечает все резолверы как недействительные.
Теперь запустите программу и дождитесь завершения тестов. По окончании процесса закройте программу. Сохраненный список резолверов будет находиться в новом файле с расширением .txt, расположенном рядом с основным файлом; его можно будет использовать в качестве нового файла client_resolvers.txt.
После этого вернитесь к прежним настройкам и используйте найденные исправные резолверы для обеспечения максимальной производительности.
Этот проект в значительной степени зависит от правильного значения MTU. Если установить слишком высокое значение MTU:
- увеличивается количество сбоев при разрешении адресов
- время запуска увеличивается
- возрастает фрагментация и количество потерь
Если установить слишком низкое значение:
- скорость снижается
- но стабильность повышается
- Начните с примера конфигурации.
- Позвольте клиенту протестировать резолверы.
- Проанализируйте результаты по MTU и количество работоспособных резолверов.
- Если качество связи низкое, слегка уменьшите значения
MIN_UPLOAD_MTUиMIN_DOWNLOAD_MTU. - Если требуется ускорить запуск, сузьте диапазон значений
MIN/MAXMTU и уменьшите разницу между ними.
На данный момент у нас нет официального приложения для Android или iOS, но вы все равно можете использовать туннель на мобильном устройстве одним из следующих способов. Вы также можете воспользоваться клиентами для Android, разработанными другими разработчиками, которые описаны в разделе 5.1.
- Установите для параметра
LISTEN_IPзначение0.0.0.0 - Запустите клиент на своем компьютере
- Подключите телефон и компьютер к одной сети
- Настройте на телефоне прокси SOCKS5, указав IP-адрес компьютера и значение
LISTEN_PORT
- Запустите главный сервер в конечной точке назначения
- Запустите клиент на промежуточном сервере
- Установите для параметра
LISTEN_IPзначение0.0.0.0 - Подключите телефон к SOCKS5-прокси на этом промежуточном сервере
Если на сервере уже установлена другая панель управления или запущена другая служба, вы можете настроить их исходящий трафик на локальный SOCKS5-сервер клиента MasterDnsVPN и использовать его в качестве выходного маршрута.
- Если
LISTEN_IP = "0.0.0.0", включите аутентификацию SOCKS5 или убедитесь, что ваша сеть является доверенной. В противном случае любой пользователь в этой сети сможет воспользоваться вашим туннелем. Настоятельно рекомендуется использовать логин и пароль при подключении к SOCKS5 через Интернет. - Вы также можете изменить значение
LISTEN_PORTпо умолчанию, чтобы снизить уязвимость к автоматическому сканированию. - Если устройства не могут подключиться, проверьте системный брандмауэр.
В этом разделе мы представляем несколько проектов, связанных с MasterDnsVPN, которые были разработаны другими людьми. Они могут пригодиться для практического применения, в качестве источника вдохновения или для экспериментов. Обратите внимание, что эти проекты не связаны с самим MasterDnsVPN и могут работать иначе или включать собственные дополнительные функции и особенности дизайна.
Если вы используете эти проекты или извлекаете пользу из их идей, пожалуйста, подумайте о поддержке их разработчиков, добавив их репозитории на GitHub в избранное. Если у вас возникли проблемы или есть предложения, лучше всего открыть тикет или, если возможно, внести свой вклад в виде пулл-реквеста непосредственно в эти проекты.
Вы можете ознакомиться с этими проектами здесь:
-
MDV HN Edition Android Client Приложение для Android, созданное на базе MasterDnsVPN, которое позволяет подключаться к серверам MasterDnsVPN с телефона. Этот проект разработан Hidden Node.
-
MasterDnsVPN GG Android Client Еще один Android-клиент, созданный на базе MasterDnsVPN. Этот проект разрабатывается RevocGG.
-
Persian Config Builder for MasterDnsVPN - Web Config Builder Инструмент, помогающий создавать конфигурационные файлы MasterDnsVPN с пояснениями на персидском языке и интуитивно понятным интерфейсом. Этот проект разработан datacoder-io
-
MasterDnsWeb (Web Management Client) Веб-клиент для управления MasterDnsVPN, предназначенный для удобного управления одним или несколькими экземплярами одновременно. Разработан Abolix.
- KevinNet DNS Вспомогательный инструмент для MasterDnsVPN, который находит и проверяет работоспособность DNS-резолверов, в первую очередь для пользователей из Ирана. Он генерирует готовые к использованию файлы конфигурации и выполняет сквозную проверку туннеля. Этот проект разработан Kevin Haji.
В большинстве дистрибутивов Linux порт 53 уже занят процессом systemd-resolved. Если сервер не запускается:
sudo nano /etc/systemd/resolved.confУстановите значение:
DNSStubListener=no
После этого выполните:
sudo systemctl restart systemd-resolved
⚠️ Важное предупреждение: на одном сервере по порту53нельзя запускать одновременно несколько проектов DNS-туннелей.
Вы можете использовать клиент MasterDnsVPN в качестве локального прокси-сервера в таких панелях управления, как 3X-UI, или в любой другой системе, поддерживающей локальные исходящие прокси-серверы. Выполните следующие действия:
- Запустите клиент MasterDnsVPN на том же сервере, где работает ваша панель управления.
- В 3X-UI перейдите в раздел Inbound и создайте новый входящий трафик (VLESS/VMess или любой другой нужный вам протокол).
- Откройте Xray Configs, затем перейдите на вкладку Outbound.
- Нажмите Add Outbound, чтобы создать новый исходящий трафик.
- Установите Protocol в Socks.
- Выберите тег (например:
MasterDnsVPN-Out). - В поле Address введите локальный IP-адрес клиента MasterDnsVPN (обычно
127.0.0.1). - В поле Порт введите
LISTEN_PORT, который вы задали вclient_config.toml(например,18000). - Если в MasterDnsVPN включена аутентификация SOCKS, введите здесь то же имя пользователя и пароль.
- Нажмите Добавить исходящий, чтобы сохранить настройки.
- Перейдите на вкладку Правила маршрутизации и нажмите Добавить правило.
- В поле Входящие теги выберите созданный вами входящий тег.
- В поле Исходящие теги выберите тег
MasterDnsVPN-Out. - Нажмите Сохранить и Перезапустить Xray.
Теперь весь трафик для этого входящего соединения будет проходить через MasterDnsVPN и выходить через ваш DNS-туннель.
MasterDnsVPN сочетает в себе мультиплексирование сеансов, балансировку резолверов, дублирование пакетов, настраиваемый уровень ARQ и отложенное выполнение сеансов на основе протоколов UDP/DNS, что позволяет обойти типичные ограничения обычных туннелей.
graph TD
subgraph Client_Side ["🖥️ User Device (Client)"]
App["📱 Applications (Browser, Telegram, etc.)"]
Proxy["🧦 Local SOCKS5 / TCP Proxy"]
LDNS["📛 Local DNS (Optional)"]
ResolverRuntime["⚡ Balancer + Duplication + Resolver Health"]
ClientARQ["🔄 ARQ + Session/Stream Runtime"]
end
subgraph DNS_Network ["🌐 Public DNS Network"]
R1["📡 Resolver 1"]
R2["📡 Resolver 2"]
RN["📡 Resolver N"]
end
subgraph Server_Side ["🖥️ Remote Server"]
UDP["📥 UDP Listener + Request Workers"]
Sessions["🧠 Session Store + Deferred Workers"]
ServerARQ["🔄 Server ARQ + Packed Control Blocks"]
DNSUp["📛 DNS Upstream / Cache"]
Out["🌐 Direct Dial or External SOCKS5"]
end
App --> Proxy
App --> LDNS
Proxy --> ClientARQ
LDNS --> ClientARQ
ClientARQ --> ResolverRuntime
ResolverRuntime --> R1
ResolverRuntime --> R2
ResolverRuntime --> RN
R1 --> UDP
R2 --> UDP
RN --> UDP
UDP --> Sessions
Sessions --> ServerARQ
Sessions --> DNSUp
ServerARQ --> Out
DNSUp --> UDP
sequenceDiagram
participant App as 📱 User App
participant Client as 🖥️ Client
participant DNS as 📡 Resolvers
participant Server as 🖥️ Server
participant Target as 🌐 Final Target
App->>Client: Create SOCKS5 / TCP connection
Note over Client: Build Session/Stream<br/>Encrypt, ARQ, choose resolver
Client->>DNS: Send DNS query with duplication and balancing
DNS->>Server: Deliver query to the server NS
Note over Server: Checksum / Cookie / Session lookup<br/>Deferred setup / ARQ / Queueing
Server->>Target: Direct dial or external SOCKS5
Target-->>Server: Return target response
Note over Server: Put data into ARQ<br/>Build ACKs and packed control blocks
Server-->>DNS: DNS response
DNS-->>Client: DNS reply
Note over Client: ARQ reorder / ACK consume / deliver to app
Client-->>App: Ordered clean data
| Концепция | Описание |
|---|---|
| Session | Одно общее соединение между клиентом и сервером |
| Stream | Одна независимая логическая связь, реализуемая в рамках сеанса |
| Resolver Runtime | Выбор резолвера, дублирование, мониторинг работоспособности, автоматическое отключение и повторная проверка |
| ARQ | Запрос, подтверждение, повторная передача, таймаут и работа с терминалами |
| Deferred Session Runtime | Задачи, чувствительные к порядку выполнения, такие как настройка, обработка DNS-запросов и обработка важных потоков пакетов |
| Packed Control Blocks | Несколько небольших пакетов ACK или управляющих пакетов, объединенных в один блок |
| Synced MTU | Общий размер MTU, выбранный для пула исправных резолверов |
- ⚡ Прямое подключение или внешний SOCKS5: Если
USE_EXTERNAL_SOCKS5 = false, сервер подключается к целевому ресурсу напрямую. Еслиtrue, соединение проходит через внешний SOCKS5-прокси. В обычных условиях внешний SOCKS5-сервер, как правило, не требуется, поэтому этот параметр можно оставить отключенным. - 🧠 Переключение на резервный резолвер для каждого потока: если поток застревает на слабом резолвере, его предпочтительный резолвер может переключиться на другой.
- 📦 Повторение упакованных блоков управления: сервер может повторять последний упакованный блок управления на несколько дополнительных циклов, чтобы важные пакеты ACK/close имели больше шансов выжить на каналах с потерями.
- 🔒 Генерация ключа на стороне сервера: Если файл
encrypt_key.txtотсутствует, сервер создает его при запуске.
Мы приветствуем любой вклад. Если у вас есть идея, сообщение об ошибке или предложение по повышению производительности, пожалуйста, создайте заявку или отправьте пул-реквест.
Этот проект опубликован по лицензии MIT. Более подробную информацию см. в файле LICENSE.
Developed with ❤️ by: MasterkinG32