Настройка sing-box (openwrt)
Kiro MaplesSing-box — это прокси-программа с открытым исходным кодом, предназначенная для обхода интернет-цензуры и обеспечения конфиденциальности пользователей. Для начала работы требуется наличие уже настроенного VPN-сервера (например, WireGuard (wg), VLESS, Shadowsocks (ss) и т. д.). В данной статье мы рассмотрим процесс установки и настройки Sing-box на роутере с OpenWRT.
Установка
Sing-box доступен в репозитории OpenWRT и устанавливается простой командой. Если необходимо, обновите список пакетов перед установкой.
opkg update opkg install sing-box
После установки необходимо настроить сервис Sing-box, выполнив следующие команды:
uci set sing-box.main.enabled="1" uci set sing-box.main.user="root" uci commit sing-box
Примечание: Мы устанавливаем пользователя на root, так как без этого Sing-box не сможет создать туннельный интерфейс (tun).
На этом этапе рекомендуется также отключить автозагрузку Sing-box. В случае возникновения проблем вы сможете просто перезагрузить роутер. После настройки и тестирования автозагрузку можно будет включить обратно:
service sing-box disable
Настройка Sing-box
Основная часть настройки заключается в конфигурировании самого Sing-box. Это осуществляется через JSON-файл /etc/sing-box/config.json. В приведённом ниже примере я настраиваю его для использования протокола VLESS.
{
"log": {
"disabled": false,
"level": "warning"
},
"inbounds": [
{
"tag": "all-in",
"type": "tun",
"domain_strategy": "prefer_ipv4",
"inet4_address": "172.16.0.1/30",
"mtu": 9000,
"stack": "system",
"auto_route": true,
"strict_route": false,
"sniff": true,
"sniff_override_destination": true
}
],
"outbounds": [
{
"tag": "proxy-out",
"type": "vless",
"server": "**********",
"server_port": 443,
"uuid": "**********",
"flow": "xtls-rprx-vision",
"tls": {
"enabled": true,
"insecure": false,
"server_name": "*********",
"utls": {
"enabled": true,
"fingerprint": "chrome"
},
"reality": {
"enabled": true,
"public_key": "**********",
"short_id": "*********"
}
}
},
{
"tag": "direct-out",
"type": "direct"
},
{
"tag": "block-out",
"type": "block"
},
{
"tag": "dns-out",
"type": "dns"
}
],
"route": {
"auto_detect_interface": true,
"final": "direct-out",
"rules": [
{
"protocol": "dns",
"outbound": "dns-out"
},
{
"protocol": "bittorrent",
"outbound": "direct-out"
},
{
"ip_is_private": true,
"outbound": "direct-out"
},
{
"rule_set": "geosite-category-ads-all",
"outbound": "block-out"
},
{
"domain_suffix": [
".com",
".net",
".org",
".ai"
],
"outbound": "proxy-out"
},
{
"domain": [
"4pda.to"
],
"outbound": "proxy-out"
},
{
"rule_set": [
"antizapret",
"geosite-facebook",
"geosite-github",
"geosite-google",
"geosite-microsoft"
],
"outbound": "proxy-out"
}
],
"rule_set": [
{
"tag": "antizapret",
"type": "remote",
"format": "binary",
"url": "https://github.com/savely-krasovsky/antizapret-sing-box/releases/latest/download/antizapret.srs",
"download_detour": "proxy-out"
},
{
"tag": "geosite-google",
"type": "remote",
"format": "binary",
"url": "https://raw.github.com/SagerNet/sing-geosite/rule-set/geosite-google.srs",
"download_detour": "proxy-out"
},
{
"tag": "geosite-microsoft",
"type": "remote",
"format": "binary",
"url": "https://raw.github.com/SagerNet/sing-geosite/rule-set/geosite-microsoft.srs",
"download_detour": "proxy-out"
},
{
"tag": "geosite-github",
"type": "remote",
"format": "binary",
"url": "https://raw.github.com/SagerNet/sing-geosite/rule-set/geosite-github.srs",
"download_detour": "proxy-out"
},
{
"tag": "geosite-facebook",
"type": "remote",
"format": "binary",
"url": "https://raw.github.com/SagerNet/sing-geosite/rule-set/geosite-facebook.srs",
"download_detour": "proxy-out"
},
{
"tag": "geosite-category-ads-all",
"type": "remote",
"format": "binary",
"url": "https://raw.github.com/SagerNet/sing-geosite/rule-set/geosite-category-ads-all.srs",
"download_detour": "proxy-out"
}
]
},
"dns": {
"servers": [
{
"tag": "cf-dns",
"address": "tls://one.one.one.one",
"address_resolver": "local-dns",
"detour": "proxy-out"
},
{
"tag": "local-dns",
"address": "local",
"detour": "direct-out"
}
]
},
"experimental": {
"cache_file": {
"enabled": true
}
}
}
В пройстейшем случае вам нужно только отредактировать секцию "outbounds" и настроить в ней ваш VPN.
Редактирование config.json
Я создаю/редактирую файл sing-box.json у себя на компьютере и переношу его на сервер через ssh с помощью команды:
ssh root@192.168.0.1 "cat > /etc/sing-box/config.json && service sing-box restart" < sing-box.json
здесь 192.168.0.1 IP-адрес вашего сервера
Теперь подробно разберём этот файл по частям, чтобы было понятно, что происходит и как настраивать его под ваши нужды.
1. log – настройка логирования
"log": {
"disabled": false,
"level": "warning"
}
В этой секции мы включаем логирование и устанавливаем уровень логов на "warning". Логи будут доступны по команде: logread -e sing-box.
2. inbounds – настройка входящего трафика
"inbounds": [
{
"tag": "all-in",
"type": "tun",
"domain_strategy": "prefer_ipv4",
"inet4_address": "172.16.0.1/30",
"mtu": 9000,
"stack": "system",
"auto_route": true,
"strict_route": false,
"sniff": true,
"sniff_override_destination": true
}
]
Здесь мы создаём виртуальное устройство типа "tun" (по умолчанию tun0), через которое сетевой трафик будет проходить в Sing-box. Параметр "inet4_address": "172.16.0.1/30" назначает IP-адресацию для этого интерфейса.
"auto_route": true— указывает, что маршрут будет использоваться по умолчанию, то есть все пакеты без дополнительных настроек будут направляться через этот интерфейс.- Остальные параметры (
"mtu","stack","sniff", и т.д.) обеспечивают оптимальную работу туннельного интерфейса и анализ трафика.
3. outbounds – настройка исходящего трафика
"outbounds": [
{
"tag": "proxy-out",
"type": "vless",
"server": "**********",
"server_port": 443,
"uuid": "**********",
"flow": "xtls-rprx-vision",
"tls": {
"enabled": true,
"insecure": false,
"server_name": "*********",
"utls": {
"enabled": true,
"fingerprint": "chrome"
},
"reality": {
"enabled": true,
"public_key": "**********",
"short_id": "*********"
}
}
},
{
"tag": "direct-out",
"type": "direct"
},
{
"tag": "block-out",
"type": "block"
},
{
"tag": "dns-out",
"type": "dns"
}
]
В этой секции настраиваются пути для исходящего трафика с присвоением им тегов для последующей маршрутизации.
"tag": "proxy-out"— подключение к вашему VPN-серверу. В данном примере используется протокол VLESS. Необходимо заменить параметры (server,uuid, и т.д.) на свои данные. Для настройки других типов VPN можно обратиться к официальной документации Sing-box."tag": "direct-out"— канал для передачи трафика напрямую через интернет-провайдера без туннелирования."tag": "block-out"— используется для блокирования определённого трафика."tag": "dns-out"— предназначен для обработки DNS-запросов.
4. route - правила маршрутизации трафика
"route": {
"auto_detect_interface": true,
"final": "direct-out",
"rules": [
{
"protocol": "dns",
"outbound": "dns-out"
},
{
"protocol": "bittorrent",
"outbound": "direct-out"
},
{
"ip_is_private": true,
"outbound": "direct-out"
},
{
"rule_set": "geosite-category-ads-all",
"outbound": "block-out"
},
{
"domain_suffix": [
".com",
".net",
".org",
".ai"
],
"outbound": "proxy-out"
},
{
"domain": [
"4pda.to"
],
"outbound": "proxy-out"
},
{
"rule_set": [
"antizapret",
"geosite-facebook",
"geosite-github",
"geosite-google",
"geosite-microsoft"
],
"outbound": "proxy-out"
}
],
Параметры маршрутизации:
"auto_detect_interface": true— позволяет автоматически обнаруживать сетевые интерфейсы."final": "direct-out"— определяет поведение по умолчанию. Если ни одно из правил не сработало, трафик направляется через"direct-out"(то есть без проксирования). Если вы хотите по умолчанию отправлять весь трафик через VPN, измените значение на"proxy-out". В этом случае потребуется пересмотреть и скорректировать правила маршрутизации.
"rules" - здесь находятся правила маршрутизации, каждое правило состоит из условия и тега куда нужно направить трафик.
{
"protocol": "dns",
"outbound": "dns-out"
},
{
"protocol": "bittorrent",
"outbound": "direct-out"
}
Эти 2 правила используют условие по типа протокола (dns, bittorrent) и отправляют весь соответствующий трафик напрямую без проксирования.
{
"rule_set": "geosite-category-ads-all",
"outbound": "block-out"
}
Блокирует весь трафик, соответствующий набору правил geosite-category-ads-all, который содержит категории рекламы и нежелательного контента.
{
"domain_suffix": [
".com",
".net",
".org",
".ai"
],
"outbound": "proxy-out"
}
Направляет весь трафик с указанными доменными зонами через VPN (proxy-out).
{
"domain": [
"4pda.to"
],
"outbound": "proxy-out"
}
Трафик к указанным доменам (например, 4pda.to) направляется через VPN.
{
"rule_set": [
"antizapret",
"geosite-facebook",
"geosite-github",
"geosite-google",
"geosite-microsoft"
],
"outbound": "proxy-out"
}
Проксирует весь трафик, соответствующий перечисленным наборам правил, например, доступ к Facebook, GitHub, Google, Microsoft и обход антизапрета.
5. rule_set - настройка наборов правил
Каждый набор правил определяется с помощью удалённых файлов, которые загружаются из указанных URL-адресов. Это позволяет автоматически обновлять правила по мере их изменения.
Пример одного набора правил:
{
"tag": "antizapret",
"type": "remote",
"format": "binary",
"url": "https://github.com/savely-krasovsky/antizapret-sing-box/releases/latest/download/antizapret.srs",
"download_detour": "proxy-out"
}
"tag"— идентификатор набора правил."type": "remote"— указывает, что набор правил загружается удалённо."format": "binary"— формат файла правил."url"— ссылка на файл набора правил."download_detour": "proxy-out"— определяет, через какой исходящий канал будет происходить загрузка файла (в данном случае через VPN).
5. dns – настройка DNS-сервера
"dns": {
"servers": [
{
"tag": "cf-dns",
"address": "tls://one.one.one.one",
"address_resolver": "local-dns",
"detour": "proxy-out"
},
{
"tag": "local-dns",
"address": "local",
"detour": "direct-out"
}
]
}
В данном случае настроены 2 сервера:
- Защищённый DNS-сервер Cloudflare (
one.one.one.one) через TLS. Запросы к нему направляются через VPN (proxy-out). - Локальный DNS-сервер, запросы направляются напрямую
6. experimental – экспериментальные настройки
"experimental": {
"cache_file": {
"enabled": true
}
}
Включает кэширование файлов для повышения производительности.
После завершения всех настроек необходимо перезагрузить Sing-box и убедиться в корректной работе:
service sing-box restart
Проверка статуса сервиса:
service sing-box status
Проверка логов
logread -e sing-box
Настройка OpenWRT
После настройки Sing-box необходимо создать новый сетевой интерфейс и настроить правила файрвола.
Создание нового интерфейса "proxy"
Выполните следующие команды для создания и настройки интерфейса:
uci set network.proxy=interface uci set network.proxy.proto="none" uci set network.proxy.device="tun0" uci set network.proxy.defaultroute="0" uci set network.proxy.delegate="0" uci set network.proxy.peerdns="0" uci set network.proxy.auto="1" uci commit network service network restart
Описание параметров:
proto="none": Интерфейс без протокола.device="tun0": Указывает на использование туннельного интерфейсаtun0.defaultroute="0",delegate="0",peerdns="0": Отключают автоматическую настройку маршрутов и DNS.auto="1": Включает автоматическое подключение интерфейса.
Настройка правил файрвола
Выполните следующие команды для добавления зоны файрвола и настройки перенаправлений:
uci add firewall zone uci set firewall.@zone[-1].name="proxy" uci set firewall.@zone[-1].forward="REJECT" uci set firewall.@zone[-1].output="ACCEPT" uci set firewall.@zone[-1].input="ACCEPT" uci set firewall.@zone[-1].masq="1" uci set firewall.@zone[-1].mtu_fix="1" uci set firewall.@zone[-1].device="tun0" uci set firewall.@zone[-1].family="ipv4" uci add_list firewall.@zone[-1].network="tun0" uci add firewall forwarding uci set firewall.@forwarding[-1].dest="proxy" uci set firewall.@forwarding[-1].src="lan" uci set firewall.@forwarding[-1].family="ipv4" uci commit firewall service firewall reload
Запуск сервиса
Всё должно корректно работать. В случае каких то проблем просто перезагрузите роутер.
Если после тестирования всё хорошо, можно включить автозагрузку Sing-box:
service sing-box enable
Наслаждаемся!