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

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

Некоторым открытием стал для меня проект sing-box. В борьбе с ускорением YouTube я работал до этого с XRay, который давал возможность tproxy, socks и даже http-proxy. Это давало возможность для маневров, но все равно выглядело довольно криво.

🍆
Я настраивал это в ImmortalWRT (сборка OpenWRT для китайцев). Если у вас ванильный OpenWRT, возможно вам понадобится подключать какие-то репозитории. Об этом поищите в интернете.

Проблема самого XRay не только в его настройке (а проблема есть и еще какая), но и в том, что он не умеет полноценно поднимать tun-интерфейс. А с интерфейсом всё проще - птицы поют, небо радуется, солнышко светит и роутинг становится намного удобнее. А когда тебе не надо этот роутинг еще и самостоятельно писать и скриптовать, становится вдвойне приятно.

Дальше в статье будут примеры, которые где-то можно использовать для копипасты.

💡
Дорогие мои друзья, кто вообще читает мои высеры в интернет, я категорически вам рекомендую переходить на OpenWRT. Любой уважающий себя любитель YouTube из Китая давно на него перешел. Я абсолютно понимаю и разделяю вашу любовь к Mikrotik, но если вы хотите более гибкое ускорение YouTube, вам необходимо иметь для этого Linux в качестве роутера.

Итак, у меня есть некоторый сервер в РФ, который занимает замедлением для меня 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 - sing-box
The universal proxy platform.

Вот тут можно увидеть вкладку "Deprecated". Это вкладка "Было", а во вкладке "New" можно посмотреть как стало. Аккуратно переделываем под новую версию и проверяем конфиг. Должно сработать.

Что даст в итоге запуск sing-box.

Мы запускаем sing-box. Он добавил rule в системе, пропишет роуты через новую таблицу роутинга на список адресов, исключит лишнее и одной командой мы получим ускорение или замедление YouTube (зависит от того, как настроите конфиг).

Выключение удалит все правила. Возможно, если бы я проживал в России, то я именно так и сделал.

Роутер с OpenWRT сейчас найти и купить не так уж сложно, от топовых GL.iNet и до более дешевых. Насколько я знаю, многие микротики шьются на OpenWRT. А некоторые роутеры от TP-Link вообще без проблем заливаются прошивкой.

И да, когда я слез с Mikrotik на OpenWRT я получил намного больше преимуществ, чего и вам желаю. Возможно, это очень хорошо для дома, а не для офиса. Возможно, ваша сеть дома сильно завязана на Mikrotik, тогда в качестве шлюза лучше поставить OpenWRT, а за все остальное оставить в ответе ваш старый роутер. Если бы мне сегодня пришлось в России выбирать роутер, я бы конечно перешел на OpenWRT, потому что это банально дает больше гибкости на сегодня.

Следующей статьей напишу, как сделать собственный srs-файл для sing-box, чтобы включить в него нужный именно вам набор IP-адресов.