Обход блокировок на 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.

Руководство будет включать:

  1. Установку из репозитория

  2. Настройку sing-box для shadowsocks (на примере Outline VPN)

  3. Установку 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 Мб, так что решение что называется на грани.