Аналог XRay и VPN но с tun

Некоторым открытием стал для меня проект sing-box. В борьбе с ускорением YouTube я работал до этого с XRay, который давал возможность tproxy, socks и даже http-proxy. Это давало возможность для маневров, но все равно выглядело довольно криво.
Проблема самого XRay не только в его настройке (а проблема есть и еще какая), но и в том, что он не умеет полноценно поднимать tun-интерфейс. А с интерфейсом всё проще - птицы поют, небо радуется, солнышко светит и роутинг становится намного удобнее. А когда тебе не надо этот роутинг еще и самостоятельно писать и скриптовать, становится вдвойне приятно.
Дальше в статье будут примеры, которые где-то можно использовать для копипасты.
Итак, у меня есть некоторый сервер в РФ, который занимает замедлением для меня YouTube, но при этом значительно ускоряет мне сайты в Германии. На этом сервере я развернул простейший xray-сервер. Вдаваться в подробности не буду, подробности можно найти в интернете, если очень постараться (не ищите экстремистские материалы пожалуйста!)
Далее у нас есть некоторый роутер на OpenWRT.
Обновляем пакеты
opkg update
Ставим то, что понадобится для работы sing-box
opkg install kmod-inet-diag kmod-netlink-diag kmod-tun iptables-nft
Такой список, даже не смотря на то, что у вас в качестве фаерволла на OpenWRT стоит nft, нужен непосредственно для sing-box.
А теперь ставим и сам sing-box
opkg install sing-box
Теперь смотрите значит какое дело. У нас в /etc/sing-box появится файл с примером конфига - config.json
Его по умолчанию и загружает sing-box. Что я сделал в данном конкретном случае. У нас есть 2 варианта автоматической загрузке списка адресов для РФ. Первый, он же основной и вероятно подойдет вообще всем - это готовый srs-файл от разработчиков sing-box. Честно говоря, я его и рекомендую. О втором способе чуть попозже расскажу.
Обычно список адресов находится где-то здесь:
https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-ru.srs
Это релизная ветка, но прямой доступ к уже скомпиленному списку находится там и его можно использовать as is.
Вот пример нашего конфига для sing-box:
{
"log": {
"level": "warn"
},
"inbounds": [
{
"type": "tun",
"tag": "tun-in",
"domain_strategy": "prefer_ipv4",
"interface_name": "tun-singbox",
"address": ["100.127.0.1/30", "fd00:127:0:1::1/126"],
"mtu": 9000,
"auto_route": true,
"route_exclude_address": [
"10.0.0.0/8",
"172.16.0.0/12",
"192.168.0.0/16",
"169.254.0.0/16",
"fc00::/7",
"fe80::/10"
],
"iproute2_table_index": 2022,
"iproute2_rule_index": 9000,
"auto_redirect": true,
"auto_redirect_input_mark": "0x2023",
"auto_redirect_output_mark": "0x2024",
"stack": "system",
"endpoint_independent_nat": true,
"sniff": true,
"sniff_override_destination": true
}
],
"outbounds": [
{
"type": "vless",
"tag": "proxy",
"server": "myproxy.domain.com",
"server_port": 443,
"uuid": "918de6b0-ccf9-4a75-acdd-2bf279e9b816",
"flow": "xtls-rprx-vision",
"packet_encoding": "xudp",
"tls": {
"enabled": true,
"insecure": false
}
},
{
"type": "direct",
"tag": "direct"
},
{
"type": "block",
"tag": "block"
}
],
"route": {
"auto_detect_interface": true,
"rules": [
{
"ip_is_private": true,
"outbound": "direct"
},
{
"ip_cidr": [
"10.0.0.0/8",
"172.16.0.0/12",
"192.168.0.0/16",
"169.254.0.0/16",
"fc00::/7",
"fe80::/10"
],
"outbound": "direct"
},
{
"rule_set": "geoip-ru",
"outbound": "proxy"
},
{
"outbound": "direct"
}
],
"rule_set": [
{
"tag": "geoip-ru",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-ru.srs",
"download_detour": "direct"
}
]
},
"experimental": {
"cache_file": {
"enabled": true
}
}
}
В этом конфиге поясню главные ключевые моменты:
"domain_strategy": "prefer_ipv4"
- нужно для резолва. Иначе вы будете проходить на IP-адреса через singbox, а именно открытие сайтов по доменному имени будет идти напрямую.
"interface_name": "tun-singbox"
- название интерфейса в системе. Именно так и будет называться интерфейс на OpenWRT.
"address": ["100.127.0.1/30", "fd00:127:0:1::1/126"]
- список локальных адресов на интерфейсе. Думаю, что можете копировать, проблем быть не должно.
"auto_route": true
и "auto_redirect": true
- должны быть оба в true. Это пригодится нам для динамической маркировки трафика. sing-box сделает всё за нас, пропишет нужные правила, роуты, таблицы. Удобно.
route_exclude_address
- мы исключаем список адресов из роутинга. Чтобы у тебя корректно работала локалка, лучше вписать это.
"route_exclude_address": [
"10.0.0.0/8",
"172.16.0.0/12",
"192.168.0.0/16",
"169.254.0.0/16",
"fc00::/7",
"fe80::/10"
],
"server": "myproxy.domain.com"
и "uuid": "918de6b0-ccf9-4a75-acdd-2bf279e9b816"
- это данные от нашего xray-сервера, через который мы будем ходить на список адресов.
Дальше прописываем правила для route. Это правила, как наш роутер будет пускать нас через себя наружу.
"outbound": "direct"
- везде, где в правиле видим это, значит, что роутер будет пускать нас напрямую, то есть мимо sing-box.
"outbound": "proxy"
- а это означает, что мы идем через sing-box и через наш удаленный сервер.
Если посмотрите в конфиг, то увидите, что все правила кроме geoip-ru стоят в моем случае в direct, только для geoip-ru стоит тип выхода proxy. Это нужно, чтобы я на российские IP-адреса ходил через российский сервер.
Возможно, если вам понадобится сделать наоборот, то есть ходить на российские IP-адреса напрямую, то вы сделаете секцию route немножко иначе:
"route": {
"auto_detect_interface": true,
"rules": [
{
"ip_is_private": true,
"outbound": "direct"
},
{
"ip_cidr": [
"10.0.0.0/8",
"172.16.0.0/12",
"192.168.0.0/16",
"169.254.0.0/16",
"fc00::/7",
"fe80::/10"
],
"outbound": "direct"
},
{
"rule_set": "geoip-ru",
"outbound": "direct"
},
{
"outbound": "proxy"
}
],
"rule_set": [
{
"tag": "geoip-ru",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-ru.srs",
"download_detour": "direct"
}
]
},
Что я изменил. Я поменял последнее правило на proxy. Это значит, что я пойду на все адреса через sing-box, а для geoip-ru я поставил direct. То есть теперь я буду на российские адреса идти напрямую через своего провайдера, а на все остальное через прокси. Ума не приложу, зачем вам это нужно, это просто как пример, для того, чтобы вы понимали, как это работает.
И главный пункт конфига - выкачать адреса.
"rule_set": [
{
"tag": "geoip-ru",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-ru.srs",
"download_detour": "direct"
}
]
Здесь мы выкачиваем с github список адресов при старте сервиса напрямую (direct). Если захотите качать через сервер xray, то установите download_detour в режим proxy.
Это все. Дальше просто запускаем sing-box на роутере и по идее должно все работать.
Запуск такой - /etc/init.d/sing-box start
И еще немного полезных команд для проверки работы.
Запуск не из сервиса, чтобы проверить, что все работает: sing-box run -c /etc/sing-box/config.json
Проверка конфига без запуска сервиса, чтобы проверить конфиг на ошибки: sing-box check -c /etc/sing-box/config.json
И еще один маленький нюанс. Проект очень свежий и пишется активно прямо сейчас. Вы можете увидеть, что конфиг не проходит из-за ошибки, потому что формат конфига изменился. Тогда идем на сайт sing-box и смотрим, как правильно теперь. Все зависит от версии конечно.
Вот мой пример. Уменя установлена версия 1.11.5:
~# sing-box version
sing-box version 1.11.15
Environment: go1.23.11 linux/arm64
Tags: with_acme,with_clash_api,with_ech,with_gvisor,with_quic,with_reality_server,with_utls,with_wireguard
CGO: enabled
И для старых версий sing-box мой конфиг не прокатит. Как и от старых версий sing-box конфиг не подойдет к моему. Поэтому при запуске новой версии sing-box всегда покажет, что необходимо сделать миграцию конфига. У них даже примеры удобные имеются:

Вот тут можно увидеть вкладку "Deprecated". Это вкладка "Было", а во вкладке "New" можно посмотреть как стало. Аккуратно переделываем под новую версию и проверяем конфиг. Должно сработать.
Что даст в итоге запуск sing-box.
Мы запускаем sing-box. Он добавил rule в системе, пропишет роуты через новую таблицу роутинга на список адресов, исключит лишнее и одной командой мы получим ускорение или замедление YouTube (зависит от того, как настроите конфиг).
Выключение удалит все правила. Возможно, если бы я проживал в России, то я именно так и сделал.
Роутер с OpenWRT сейчас найти и купить не так уж сложно, от топовых GL.iNet и до более дешевых. Насколько я знаю, многие микротики шьются на OpenWRT. А некоторые роутеры от TP-Link вообще без проблем заливаются прошивкой.
И да, когда я слез с Mikrotik на OpenWRT я получил намного больше преимуществ, чего и вам желаю. Возможно, это очень хорошо для дома, а не для офиса. Возможно, ваша сеть дома сильно завязана на Mikrotik, тогда в качестве шлюза лучше поставить OpenWRT, а за все остальное оставить в ответе ваш старый роутер. Если бы мне сегодня пришлось в России выбирать роутер, я бы конечно перешел на OpenWRT, потому что это банально дает больше гибкости на сегодня.
Следующей статьей напишу, как сделать собственный srs-файл для sing-box, чтобы включить в него нужный именно вам набор IP-адресов.