В течение почти месяца искал простое легковесное решение, чтоб "отдал кому-нибудь, а тот просто запустил" наткнулся универсальную прокси-платформу Sing-Box (как раз NekoBox/Ray использует).
Все очень здорово и привлекательно, но использование CIDR для маршрутизации вылилось очень неприятными проблемами (пинг, что не надо туннелировалось и мало гибкости), правила маршрутизации же конкретных адресов являлись большой/длинной портянкой (в веб-морде роутера тяжело воспринимать, файлы конфигурации OVPN и WG раздувались)..
В погоне за гибкостью ушел искать десктопные решения (под Windows в моем случае).. ProxyCap — Заворачивание трафика определенных программ в прокси (на примере Guilded — аналог Discord) чрезвычайно не гибок, но с проксированием трафика определенного софта его хватает, хочешь чтобы только один из кучи, что установлены в системе, работал через внешний прокси сервер — пожалуйста, ограничивается все лишь использованием Shadowsocks, если нужна поддержка UDP конечно. Clash for Windows (CFW) (ядро Clash) заставлял себя настраивать, как и NekoBox (под Windows — NekoRay, ядро Sing-Box), но в первом случае идентичная настройка на разных машинах приводила к непредсказуемым результатам. NekoRay — круто, но так и не разобрался с автозапуском в режиме TUN, просто лень уже было.. и опять же.. давай настраивай его, но уже, спасибо, проще чем CFW..
Поиск большей информации по параметрам конфигов NekoBox, описание на Github — Qt based cross-platform GUI proxy configuration manager (backend: sing-box), привели сюда, и заставили думать зачем мне графический интерфейс, я хочу "мало весящий архив — распаковал — запустил — работает".
Так вот, мой конфиг Sing-Box (урезан в правилах конечно же 🫡)
Настроен под работу с VMess
{
"log": {
"level": "info",
"timestamp": true
},
"dns": {
"servers": [
{
"tag": "google",
"address": "tls://8.8.8.8"
},
{
"tag": "cloudflare",
"address": "https://1.1.1.1/dns-query"
},
{
"tag": "local",
"address": "223.5.5.5"
}
],
"rules": [
{
"outbound": "any",
"server": "local"
}
]
},
"inbounds": [
{
"type": "tun",
"inet4_address": "172.16.0.1/30",
"interface_name": "Sing-Box Kravenrus",
"auto_route": true,
"strict_route": true,
"sniff": true,
"domain_strategy": "prefer_ipv4"
}
],
"outbounds": [
{
"type": "direct",
"tag": "direct-out"
},
{
"type": "vmess",
"tag": "vmess-out",
"server": "109.120.129.231",
"server_port": 27589,
"uuid": "1f429211-0a5f-4e1c-a798-53aa709ac672",
"security": "auto",
"alter_id": 0,
"global_padding": false,
"authenticated_length": true,
"tls": {},
"packet_encoding": "",
"transport": {},
"multiplex": {}
},
{
"type": "dns",
"tag": "dns-out"
}
],
"route": {
"rules": [
{
"rule_set": "github-rule-set",
"outbound": "vmess-out"
},
{
"domain_suffix": [
"amd.com",
"apple.com"
],
"outbound": "vmess-out"
},
{
"protocol": "dns",
"outbound": "dns-out"
},
{
"domain_keyword": [
"whatismyip",
"openai",
"chatgpt"
],
"outbound": "vmess-out"
},
{
"process_name": [
"steam.exe",
"steamservice.exe",
"steamwebhelper.exe"
],
"outbound": "direct-out"
},
{
"process_name": [
"Guilded.exe",
"firefox.exe"
],
"outbound": "vmess-out"
},
{
"ip_cidr": [
"66.22.192.0/18"
],
"outbound": "vmess-out"
},
{
"port_range": [
"50000:65535"
],
"outbound": "vmess-out"
}
],
"rule_set": [
{
"type": "remote",
"tag": "github-rule-set",
"format": "binary",
"url": "https://github.com/.../rule-set.srs",
"download_detour": "vmess-out"
}
],
"auto_detect_interface": true
},
"experimental": {
"cache_file": {
"enabled": true
}
}
}
Описание параметров конфигурации
Конфигурационный файл Sing-Box представляет собой JSON-документ, в котором указаны параметры настройки логирования, DNS-серверов, входящих и исходящих соединений, правил маршрутизации и экспериментальных функций. Более подробно про конфигурацию описано здесь. Вот что значат мои параметры:
level: Уровень логирования. В данном случае "info" — для записи информационных сообщений. Возможны значения: debug, info, warn, error, fatal.
timestamp: Если true, то в логе будет включено время записи каждого сообщения.
servers: Список DNS-серверов, которые будут использоваться.
tag: Метка для сервера, чтобы его можно было идентифицировать.
address: Адрес DNS-сервера, может использовать различные протоколы (например, tls://8.8.8.8 или https://1.1.1.1/dns-query).
rules: Определяет правила выбора сервера DNS для различных типов трафика.
outbound: Задает тип исходящего соединения, для которого будет использован сервер DNS.
server: Выбранный сервер DNS, указанный по tag в списке серверов.
Входящие подключения (inbounds)
type: Тип входящего подключения. В данном случае это tun (виртуальный туннельный интерфейс).
inet4_address: IPv4-адрес, который будет использоваться для туннеля.
interface_name: Имя интерфейса, под которым будет создан туннель.
auto_route: Автоматически добавляет маршруты для трафика.
strict_route: Определяет, нужно ли строго следовать заданным маршрутам.
sniff: Если включено, Sing-Box будет пытаться анализировать (сниффить) трафик, чтобы определить его тип.
domain_strategy: Стратегия выбора IP-адреса. "prefer_ipv4" означает, что будет предпочтение отдаваться IPv4-адресам.
Исходящие подключения (outbounds)
type: Тип исходящего подключения. Возможные значения включают:
direct: Для прямого подключения.
vmess: Протокол VMess, используемый для соединений через серверы.
dns: Используется для выхода на DNS-сервисы.
tag: Метка для идентификации исходящего подключения.
server и server_port: IP-адрес и порт сервера, к которому будет подключаться клиент (для vmess).
uuid: Уникальный идентификатор пользователя, необходимый для VMess.
security: Уровень шифрования (например, "auto").
alter_id: Настройка дополнительного шифрования в VMess (0 означает отсутствие дополнительных идентификаторов).
global_padding и authenticated_length: Опции шифрования и целостности пакетов.
tls и packet_encoding: Параметры для использования TLS и кодирования пакетов.
transport и multiplex: Опции транспорта и мультиплексирования.
rules: Список правил маршрутизации:
rule_set: Название набора правил, который будет использован.
outbound: Исходящее подключение для трафика, соответствующего данному правилу.
domain_suffix: Трафик к доменам с определенными суффиксами будет направлен через указанный outbound.
protocol: Протокол, для которого применяется правило.
domain_keyword и process_name: Позволяет указать ключевые слова или названия процессов для фильтрации.
ip_cidr и port_range: Указывает диапазоны IP-адресов и портов, на которые применяется правило.
rule_set: Задает дополнительные настройки для набора правил, например, возможность скачивания с удаленного ресурса (url) и использование определенного исходящего канала для загрузки (download_detour).
auto_detect_interface: Опция автоматического обнаружения сетевого интерфейса.
Экспериментальные функции (experimental)
Эти настройки позволяют гибко настраивать поведение Sing-Box в соответствии с потребностями сети и требованиями безопасности.
Подробное описание моих правил (для общего понимания)
Правила в разделе rules определяют, каким образом будет маршрутизироваться трафик в зависимости от условий и характеристик соединений. Вот к какому поведению приведут указанные мною правила:
Использование удаленного набора правил (rule_set)
Трафик, соответствующий набору правил из файла по URL, будет перенаправляться через выход vmess-out. Этот файл может содержать динамически обновляемые правила для более гибкого и актуального управления трафиком.
Маршрутизация по доменным суффиксам
Все запросы к доменам с суффиксами amd.com и apple.com будут отправляться через vmess-out. Это может быть полезно для безопасного или анонимного доступа к этим ресурсам.
Весь трафик, использующий протокол dns, будет направляться через исходящее соединение dns-out, что обеспечивает отдельный канал для запросов к DNS-серверам.
Маршрутизация по ключевым словам доменов
Любые запросы к доменам, содержащим ключевые слова whatismyip, openai, и chatgpt, будут отправляться через vmess-out. Это позволит обеспечить дополнительную защиту или конфиденциальность для доступа к этим сервисам.
Маршрутизация по названию процессов:
Запросы от процессов steam.exe, steamservice.exe, и steamwebhelper.exe будут отправлены напрямую (direct-out), что может сократить задержки при использовании Steam.
Запросы от процессов Guilded.exe и firefox.exe будут направляться через vmess-out, обеспечивая безопасность или проксирование для этих приложений.
Маршрутизация по диапазону IP-адресов (ip_cidr)
Трафик, направленный к IP-адресам в диапазоне 66.22.192.0/18, будет отправляться через vmess-out. Это может использоваться для маршрутизации специфического трафика, связанного с этим диапазоном.
Маршрутизация по диапазону портов (port_range)
Трафик на порты в диапазоне 50000:65535 будет направляться через vmess-out, что может быть полезно для приложений, использующих высокие порты (например, игровые или P2P-сервисы, голосовые каналы).
В целом, данные правила создают избирательную маршрутизацию для обеспечения безопасности, проксирования доступа к определенным сервисам и выполнения DNS-запросов через специальное соединение.
Про распространение знакомым
Для начала задумался над простотой старта, создал .bat для запуска от имени Администратора
@Echo off
reg add HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1 /f
cd /d "%~dp0"
set "config_file="
for %%F in (config-vmess-*.json) do (
set "config_file=%%F"
goto :found
)
:found
if defined config_file (
start "Sing-Box" sing-box.exe run -c "%config_file%"
) else (
echo Файл не найден!
)
Для корректного отображения цвета, скрипт изменяет ключ VirtualTerminalLevel на единицу. Далее ищет конфиг по шаблону (поскольку я передаю пользователям его в виде config-vmess-uuid.json) и запускает Sing-Box с первым найденным конфигом в новом окне.
Дабы не объяснять что откуда скачать, что куда скопировать было решено отправлять знакомым только их UUID для дальнейшей генерации архива с исполняемым файлом Sing-Box и их файлом конфигурации (с внесенным изменением соответствующего поля UUID на цифры пользователя), создал страницу с формой.
Далее от пользователя требуется как раз таки только скачать и распаковать архив, и запустить run.cmd от имени Администратора.
Итог
Ну а итоги те же, что и были ожидаемы исходя из правил :)
Жаль, что есть и проблемы, на двух-трех машинах из 15-ти либо не поднимается TUN, либо трафик не проксируется должным образом, либо не работает доступ напрямую, и все это из-за настройки пользователем своей операционной системы, а именно сетевых настроек, если человек туда не лез, то и проблем не возникало..