В данном гайде будем устанавливать пакет 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 Мб, так что решение что называется на грани.

Комментарии (4)


  1. XOR2048
    22.08.2023 12:30
    +2

    Печально, что Trojan, чистый Shadowsocks и VMess уже могут заблокировать...

    Но NaiveProxy смотрится очень интересно для запуска на OpenWRT.

    Есть отличная статья, где можно узнать про разные подобные протоколы и что с ними можно сделать)

    P.S - статья по настройке очень интересная, спасибо Вам за нее!


    1. Andrevich Автор
      22.08.2023 12:30
      +1

      Спасибо за оценку!


    1. atrost
      22.08.2023 12:30
      +2

      Печально, что Trojan, чистый Shadowsocks и VMess уже могут заблокировать...

      Пока поднял NaïveProxy и mieru

      NaïveProxy - очень маленький расход аккумулятора, что важно для мобильных устройств;

      mieru - построен на kcp - очень хороший пинг, но аккумулятор жрет как не в себя - так что только для игр, и то иногда.

      Подключение через ddns freemyip.com. В дальнейшем - двойная маршрутизация с использованием хостинга из России.


  1. atrost
    22.08.2023 12:30
    +1

    Ещё интересное наблюдение, если в родной сервер caddy2-naive долбиться через foxyproxy (https proxy), с которым раньше использовал dumbproxy, которое также "не отвечает" - то прокси не работает. Так что только родной плагин.