Обход блокировок на OpenWRT с помощью Sing-box (vless, vmess, trojan, ss)
В данном гайде будем устанавливать пакет sing-box на OpenWRT на примере стабильной 22.03.5. Рекомендуется роутер минимум с 128 МБ RAM (256 предпочтительно) и памятью более 16 Мб, так же будет описан способ установки sing-box в оперативную память (подходит для устройств с малым количеством ПЗУ <16 Мб)
Sing-Box — это бесплатная прокси-платформа с открытым исходным кодом, которая позволяет пользователям обходить интернет-цензуру и получать доступ к заблокированным веб-сайтам. Это альтернатива V2ray и XRAY. Его можно использовать с различными клиентами V2Ray на таких платформах, как Windows, macOS, Linux, Android и iOS.
Помимо поддержки протоколов Shadowsocks, Trojan, Vmess и Socks, он также поддерживает новые протоколы, такие как ShadowTLS, Hysteria и NaiveProxy.
Руководство будет включать:
Установку из репозитория
Настройку sing-box для shadowsocks (на примере Outline VPN)
Установку sing-box в оперативную память и настройку автозапуска
1. Установка sing-box
Для версии OpenWRT 22.03.5 необходимо добавить репозиторий командой:
sed -i 's/option check_signature/# option check_signature/g' /etc/opkg.conf
echo "src/gz custom_generic https://raw.githubusercontent.com/lrdrdn/my-opkg-repo/main/generic" >> /etc/opkg/customfeeds.conf
echo "src/gz custom_arch https://raw.githubusercontent.com/lrdrdn/my-opkg-repo/main/$(grep "OPENWRT_ARCH" /etc/os-release | awk -F '"' '{print $2}')" >> /etc/opkg/customfeeds.conf
На версии SNAPSHOT sing-box есть в стандартном репозитории OpenWRT.
Обновляем список пакетов:
opkg update
Далее устанавливаем необходимые для работы sing-box модули ядра и пакет совместимости с iptables:
opkg install kmod-inet-diag kmod-netlink-diag kmod-tun iptables-nft
Ждём завершения установки, пакеты заняли около 1Мб памяти
Далее переходим к установке sing-box
opkg install sing-box
Пакет занимает около 10Мб, поэтому установить его на устройства с 16 Мб ПЗУ не удастся без дополнительных манипуляций (об этом в п.3 этой статьи)
Если пакет успешно установлен, переходим к настройке соединения, если нет - переходим к п.3
2. Настройка sing-box для shadowsocks
Далее переходим к файлу конфигурации, по умолчанию это /etc/sing-box/config.json, но при установке доступен /etc/sing-box/config.json.example
/etc/sing-box/config.json нужно создать самостоятельно
На сайте проекта sing-box и vpnrouter.homes доступны многочисленные примеры конфигураций для различных протоколов
Я приведу пример файла config.json для настройки Outline VPN (выпуск ключей и их расшифровку на пароль и тип шифрования из формата base64 я рассматривал здесь)
Пример config.json:
{
"log": {
"disabled": false,
"level": "warn",
"output": "/tmp/sing-box.log",
"timestamp": true
},
"dns": {
"servers": [{
"tag": "local",
"address": "217.218.127.127",
"detour": "direct"
},
{
"tag": "google",
"address": "udp://8.8.8.8"
}, {
"tag": "block",
"address": "rcode://success"
}
],
"rules": [{
"geosite": "category-ads-all",
"server": "block"
}, {
"domain_suffix": ".ir",
"server": "local"
}],
"final": "google",
"strategy": "prefer_ipv4",
"disable_cache": false,
"disable_expire": false
},
"inbounds": [{
"type": "mixed",
"tag": "mixed-in",
"listen": "127.0.0.1",
"listen_port": 1080,
"tcp_fast_open": true,
"sniff": true,
"sniff_override_destination": true,
"set_system_proxy": false
}, {
"type": "tun",
"tag": "tun-in",
"interface_name": "tun0",
"inet4_address": "172.19.0.1/30",
"inet6_address": "fdfe:dcba:9876::1/128",
"stack": "gvisor",
"mtu": 9000,
"auto_route": true,
"strict_route": false,
"endpoint_independent_nat": false,
"sniff": true,
"sniff_override_destination": true
}],
"outbounds": [{
"type": "shadowsocks",
"tag": "shadowsocks-out",
"server": "$SHADOWSOCKS-SERVER-IP",
"server_port": $PORT,
"method": "chacha20-ietf-poly1305",
"password": "$PASSWORD"
},
{
"type": "direct",
"tag": "direct"
}, {
"type": "block",
"tag": "block"
},
{
"type": "dns",
"tag": "dns-out"
}
],
"route": {
"geoip": {
"download_url": "https://github.com/SagerNet/sing-geoip/releases/latest/download/geoip.db",
"download_detour": "direct"
},
"geosite": {
"download_url": "https://github.com/SagerNet/sing-geosite/releases/latest/download/geosite.db",
"download_detour": "direct"
},
"rules": [{
"protocol": "dns",
"outbound": "dns-out"
},
{
"geoip": "private",
"outbound": "direct"
},
{
"geosite": "category-ads-all",
"outbound": "block"
},
{
"domain_keyword": [
"yektanet",
"adengine.telewebion.com"
],
"outbound": "block"
},
{
"domain_suffix": [
".ir",
"aparat.com",
"digikala.com",
"telewebion.com",
"varzesh3.com"
],
"outbound": "direct"
},
{
"port": [
22,
3389
],
"outbound": "direct"
}
],
"final": "shadowsocks-out",
"auto_detect_interface": true
}
}
Конфигурация пишет в лог /tmp/sing-box.log предупреждения и ошибки, поднимает socks proxy на порту 1080, поднимает туннель tun0 с помощью kmod-tun,
параметр "auto_route": true определяет shadowsocks как маршрут по умолчанию, замените значение на false если это не требуется.
В раздел outbounds нужно ввести параметры вашего прокси: IP, порт и пароль (в случае использования иного shadowsocks сервера, проверьте правильность выбранного шифрования)
Далее проверяем работоспособность конфигурации:
sing-box check -c /etc/sing-box/config.json
Если всё правильно команда не выдаст ошибок
Далее проверяем работу прокси:
sing-box run -c /etc/sing-box/config.json
Если параметр "auto_route": true то работоспособность можно проверить открыв любой сайт определяющий ваш IP, либо в параллельной вкладке запускаем команду:
wget -qO- http://ipecho.net/plain | xargs echo
Если всё работает команда выдаст IP вашего прокси
Если "auto_route": false, добавьте маршрут для проверки соединения и запустите проверку
ip route add 34.160.111.0/24 dev tun0
wget -qO- http://ipecho.net/plain | xargs echo
После чего маршрут можно удалить
ip route del 34.160.111.0/24
Если всё сработало, можем добавить sing-box в автозапуск, для этого вводим команды
/etc/init.d/sing-box enable
/etc/init.d/sing-box start
На этом настройка sing-box завершена, для настройки точечного обхода блокировок рекомендую статьи:
Точечный обход блокировок на роутере OpenWrt c помощью BGP / Хабр (habr.com) С помощью BGP (bird2).
Точечный обход блокировок PKH на роутере с OpenWrt с помощью WireGuard и DNSCrypt / Хабр (habr.com) (путём скачивания списков и настройкой маршрутов в iptables, nftables).
3. Установка sing-box в оперативную память
Если установить sing-box в ПЗУ не удалось (а это вполне вероятный сценарий для большинства роутеров среднего ценового сегмента), возможно произвести установку в ОЗУ и подгружать пакет при запуске устройства
Установленный и запущенный sing-box занимает около 35 Мб ОЗУ
Для начала нам необходимо установить в ПЗУ модули ядра и iptables-nft
opkg install kmod-inet-diag kmod-netlink-diag kmod-tun iptables-nft
Это должно занять около 1Мб памяти, после чего установим sing-box в ОЗУ:
opkg install sing-box -d ram
Если всё успешно установилось, далее нужно будет создать папку конфигурации
mkdir /etc/sing-box
После чего помещаете ваш файл config.json из п.2 в /etc/sing-box/config.json
Проверяем работу прокси (более подробно в п.2):
/tmp/usr/bin/sing-box run -c /etc/sing-box/config.json
Если всё заработало, далее настраиваем автозапуск sing-box
Для автоматической установки пакета при загрузке системы в файл /etc/rc.local добавляем строки перед exit 0
opkg update
opkg install sing-box -d ram
exit 0
при помощи текстового редактора, либо через Luci

Сохраняем изменения и создаём службу автозапуска для sing-box
Создаём файл /etc/init.d/sing-box следующего содержания
#!/bin/sh /etc/rc.common
#
# Copyright (C) 2022 by nekohasekai <contact-sagernet@sekai.icu>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
START=99
USE_PROCD=1
##### ONLY CHANGE THIS BLOCK ######
PROG=/tmp/usr/bin/sing-box # Положение sing-box в ОЗУ
RES_DIR=/etc/sing-box/ # resource dir / working dir / the dir where you store ip/domain lists
CONF=./config.json # where is the config file, it can be a relative path to $RES_DIR
##### ONLY CHANGE THIS BLOCK ######
start_service() {
sleep 10 # Ожидание скачивания пакета sing-box при загрузке системы
procd_open_instance
procd_set_param command $PROG run -D $RES_DIR -c $CONF
procd_set_param user root
procd_set_param limits core="unlimited"
procd_set_param limits nofile="1000000 1000000"
procd_set_param stdout 1
procd_set_param stderr 1
procd_set_param respawn "${respawn_threshold:-3600}" "${respawn_timeout:-5}" "${respawn_retry:-5}"
procd_close_instance
iptables -I FORWARD -o tun+ -j ACCEPT
echo "sing-box is started!"
}
stop_service() {
service_stop $PROG
iptables -D FORWARD -o tun+ -j ACCEPT
echo "sing-box is stopped!"
}
reload_service() {
stop
sleep 5s
echo "sing-box is restarted!"
start
}
Делаем файл исполняемым
chmod +x /etc/init.d/sing-box
После чего добавляем в автозапуск
/etc/init.d/sing-box enable
/etc/init.d/sing-box start
На этом настройка окончена.
P.S. 35 Мб это достаточно большой объём занимаемой оперативной памяти для роутера со 128 Мб, так что решение что называется на грани.