Ситуация знакомая многим. Есть пульт Herelink который нужно срочно обновить до свежей прошивки. Проблема в том, что сервера обновлений могут быть заблокированы, а простые VPN-клиенты на телефоне не помогают — пульт требует прямое WiFi-соединение на частоте 5.8 ГГц и видит только локальную сеть.
Решение есть — прозрачный VPN-роутер. Все устройства подключаются к его WiFi и автоматически отправляют трафик через VPN-сервер. Ниже подробная инструкция как настроить VPN на роутере GL-MT3000 Beryl AX работающая из коробки после каждой перезагрузки.
Настройка описанного оборудования требует навыков работы с сетевыми технологиями, понимания базовых принципов TCP/IP, работы с командной строкой Linux и конфигурирования сетевого оборудования. Пользователям без достаточного опыта в области IT может потребоваться помощь квалифицированного специалиста!
Почему Xray и v2rayA не работают на GL.iNet
Стандартный путь через Xray или v2rayA на роутерах GL.iNet не работает из-за ограничений ядра Linux в крайней на сегодняшний день прошивке 4.8.1. Ядро 5.4 не поддерживает опции IP_TRANSPARENT и IP_RECVORIGDSTADDR которые требуются современным Xray 1.8+. Несколько дней промучались, проверяя это на практике — Xray просто падает с ошибкой operation not supported.
Вместо борьбы с прошивкой воспользуемся sing-box 1.9.0 с TUN-режимом и стеком gvisor. Это сочетание работает на вендорских прошивках без модификаций ядра. Sing-box более гибкий в этом плане.
Нам понадобится - роутер GL-MT3000 Beryl AX с прошивкой GL.iNet OS 4.8.1. VPN-сервер* с поддержкой Trojan — подойдёт 3X-UI или аналоги. Компьютер с Windows, macOS или Linux. SSH-клиент на macOS уже есть в Терминале. На компьютере с ОС Windows любой установленный терминал (Termius) или Putty.
*Если вы не знаете как установить свой VPN сервер - пишите в комментариях, будем разбираться!
Установка sing-box на роутер
Сначала скачиваем бинарник sing-box версии 1.9.0 для архитектуры arm64. Это делается на компьютере — файл будет в архиве tar.gz на GitHub.
Распаковываем архив и находим внутри файл sing-box это наш исполняемый модуль.
Далее заходим на роутер по SSH. Пароль по умолчанию совпадает с WiFi-паролем который напечатан на наклейке снизу роутера.
ssh root@192.168.8.1
Попав внутрь системы перемещаем скачанный бинарник в usr/bin и делаем его исполняемым. Проверяем что всё ок командой version.
mv /tmp/sing-box /usr/bin/
chmod +x /usr/bin/sing-box
mkdir -p /etc/sing-box
/usr/bin/sing-box version
Должно показать 1.9.0. Если показало что-то другое или вообще ошибку — вероятно скачали не ту архитектуру.
Конфигурация для прозрачного VPN
Теперь создаём конфиг. Это сердце всей системы — файл etc/sing-box/config.json описывает как sing-box устанавливает VPN-туннель и маршрутизирует трафик.
cat > /etc/sing-box/config.json << 'EOF'
{
"log": {"level": "info"},
"inbounds": [{
"type": "tun",
"tag": "tun-in",
"inet4_address": "172.19.0.1/30",
"mtu": 1280,
"auto_route": true,
"strict_route": true,
"stack": "gvisor"
}],
"outbounds": [
{
"type": "trojan",
"tag": "vpn-out",
"server": "ВАШVPS_IP",
"server_port": "ВАШПОРТ на сервере",
"password": "ВАШПАРОЛЬ",
"tls": {"enabled": true, "server_name": "www.swift.org", "insecure": true},
"bind_interface": "eth0"
},
{"type": "direct", "tag": "direct", "bind_interface": "eth0"}
],
"route": {
"rules": [],
"final": "vpn-out",
"default_interface": "eth0"
}
}
EOF
Вместо ВАШVPS_IP подставляем реальный адрес сервера вместо ВАШПАРОЛЬ — пароль из конфигурации Trojan. ВАШПОРТ на сервере - порт через который осуществляется соединение.
Параметр bind_interface eth0 критически важен — без него трафик к VPN-серверу пытается пойти через туннель и получается замкнутый круг. Сами с этим столкнулись и долго не могли понять почему нет route to internet пока не добавили эту строчку.
Автозапуск VPN при загрузке
OpenWrt использует систему procd для управления демонами. Создаём init-скрипт который будет запускать sing-box при загрузке.
cat > /etc/init.d/sing-box << 'EOF'
#!/bin/sh /etc/rc.common
USE_PROCD=1
START=95
STOP=10
start_service() {
procd_open_instance
procd_set_param command /usr/bin/sing-box run -c /etc/sing-box/config.json
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
}
stop_service() {
killall sing-box
}
EOF
Параметр USE_PROCD=1 обязателен — без него OpenWrt не будет корректно управлять процессом. START=95 значит что скрипт запустится на этапе 95 после базовых сервисов.
Делаем скрипт исполняемым и включаем автозапуск.
chmod +x /etc/init.d/sing-box
/etc/init.d/sing-box enable
Настройка маршрутов
Проблема в том что параметр strict_route на прошивке GL.iNet работает не полностью — default route через eth0 остаётся активным. Трафик к VPN-серверу нужно направить в обход туннеля а весь остальной трафик — в туннель. Для этого создаём скрипт sing-box-routes.
cat > /etc/init.d/sing-box-routes << 'EOF'
#!/bin/sh /etc/rc.common
START=96
STOP=9
start() {
sleep 8
echo 'nameserver 1.1.1.1' > /etc/resolv.conf
echo 'nameserver 8.8.8.8' >> /etc/resolv.conf
ip route add X.X.X.X via 192.168.1.1 dev eth0 2>/dev/null
ip route del default via 192.168.1.1 dev eth0 2>/dev/null
ip route add default via 172.19.0.2 dev tun0 2>/dev/null
iptables -I FORWARD -i br-lan -o tun0 -j ACCEPT 2>/dev/null
iptables -I FORWARD -i tun0 -o br-lan -j ACCEPT 2>/dev/null
Iptables -t nat -I POSTROUTING -o tun0 -j MASQUERADE 2>/dev/null
}
stop() {
iptables -D FORWARD -i br-lan -o tun0 -j ACCEPT 2>/dev/null
iptables -D FORWARD -i tun0 -o br-lan -j ACCEPT 2>/dev/null
Iptables -t nat -D POSTROUTING -o tun0 -j MASQUERADE 2>/dev/null
}
EOF
START=96 значит что этот скрипт запустится после sing-box. Sleep 8 критически важен — sing-box создаёт TUN не мгновенно и если скрипт попытается настроить маршруты раньше времени ничего не выйдет.
Подбирали это значение экспериментально, не сразу получилось, но после нескольких перезагрузок стало ясно — 8 секунд хватает обычно.
Вместо X.X.X.X подставьте IP вашего VPN-сервера. Это маршрут к самому VPN-серверу в обход туннеля.
Включаем автозапуск.
chmod +x /etc/init.d/sing-box-routes
/etc/init.d/sing-box-routes enable
Healthcheck для автоматического восстановления
При обрыве интернет-соединения VPN может не восстановиться автоматически. Кабель выдернули, GSM-модем попал в слепую зону — роутер получит обратно сеть но VPN-туннель останется dead. Попробовали это на практике, дернули провод интернета от роутера. Пришлось лезть в роутер и перезапускать всё вручную.
Наш Healthcheck-скрипт решает эту проблему. Он периодически проверяет работоспособность и перезапускает sing-box при проблемах.
cat > /usr/bin/vpn-healthcheck << 'EOF'
#!/bin/sh
sleep 30
while true; do
if ip route show default 2>/dev/null | grep -q 'dev'; then
if ! curl -s --max-time 5 ipinfo.io/ip >/dev/null 2>&1; then
logger 'VPN healthcheck FAILED - restarting'
/etc/init.d/sing-box restart
sleep 15
/etc/init.d/sing-box-routes restart
sleep 30
fi
fi
sleep 90
done
EOF
Логика простая. После загрузки ждём 30 секунд затем каждые 90 секунд проверяем две вещи. Первая — есть ли вообще маршрут к интернету. Если WAN полностью пропал скрипт просто ждёт. Вторая — работает ли VPN. Если WAN есть но VPN мёртв перезапускаем sing-box ждём 15 секунд перезапускаем routes скрипт и ждём 30 секунд перед следующей проверкой.
Init-скрипт для healthcheck.
cat > /etc/init.d/sing-box-healthcheck << 'EOF'
#!/bin/sh /etc/rc.common
USE_PROCD=1
START=97
start_service() {
procd_open_instance
procd_set_param command /usr/bin/vpn-healthcheck
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
}
stop_service() {
true
}
EOF
Включаем healthcheck.
chmod +x /usr/bin/vpn-healthcheck
chmod +x /etc/init.d/sing-box-healthcheck
/etc/init.d/sing-box-healthcheck enable
Настройка VPN на роутере GL-MT3000 Beryl: почему не грузится Telegram?
Провайдерский DNS может блокировать определенные домены возвращая 127.0.0.1. Столкнулись с этим когда загрузили Telegram и он просто не открывался, хотя VPN работал. Nslookup показывал 127.0.0.1 вместо реального IP.
Решение — использовать Cloudflare DNS вместо провайдерского. Для клиентов через DHCP указываем альтернативный DNS.
uci delete dhcp.lan.dhcp_option 2>/dev/null
uci add_list dhcp.lan.dhcp_option='6,1.1.1.1'
uci commit dhcp
/etc/init.d/dnsmasq restart
Теперь все устройства подключающиеся к роутеру будут получать DNS 1.1.1.1. DNS на самом роутере уже фиксируется в скрипте sing-box-routes через echo в etc/resolv.conf — это нужно потому что после перезагрузки этот файл сбрасывается.
Проверка после перезагрузки
Перезагружаем роутер и проверяем что всё поднялось автоматически.
reboot
Ждём около минуты затем проверяем состояние.
ip route show default
Должно показать: default via 172.X.Х.Х dev tun0
ps | grep sing-box | grep -v grep
Должен показать процесс sing-box
nslookup instagram.com
Должен вернуть реальный IP 157.240.x.x а не 127.0.0.1
На клиентском устройстве подключаемся к WiFi роутера и проверяем IP через сайт ipinfo.io/ip — должен показываться IP VPN-сервера. Если показывается IP провайдера где-то ошибка в маршрутах.
Порядок запуска при загрузке
При загрузке скрипты запускаются в порядке. S95sing-box запускает VPN-клиента. S96sing-box-routes настраивает маршруты и DNS. S97sing-box-healthcheck запускает мониторинг.
Задержки в sing-box-routes и healthcheck неслучайны — sing-box создаёт TUN не мгновенно а VPN-соединение требует времени для handshake.
Проверить что всё включено правильно можно командой:
ls -la /etc/rc.d/S*sing*
Должно показать три симлинка.
Настройка VPN на роутере GL-MT3000 Beryl: типичные проблемы
Если curl на самом роутере выдаёт ошибку no route to internet проверьте bind_interface в конфиге. Без него трафик к VPN-серверу пытается пойти через туннель что создаёт замкнутый круг. Сами с этим боролись дольше всего.
Если показывает старый IP провайдера проверьте ip route — default должен быть через tun0. Также проверьте iptables FORWARD если без правил то трафик блокируется. Команда iptables -L FORWARD -v -n покажет есть ли правила.
Если Telegram не открывается на клиенте но nslookup с роутера работает проблема в DNS на клиенте. Убедитесь что устройство получает DNS по DHCP а не использует статические настройки. Например iPhone это в настройках WiFi нажимаете синюю стрелочку рядом с сетью и смотрите DNS там должно быть автоматическое.
Настройка VPN на роутере GL-MT3000 Beryl: результат
Получается роутер который после включения сам устанавливает VPN-туннель маршрутизирует весь трафик клиентов через него следит за своим состоянием и автоматически восстанавливается после обрывов. Для обновления Herelink пульта достаточно подключить его к WiFi этого роутера и запустить процесс обновления — пульт увидит сервера как будто они находятся в локальной сети.
WiFi 5.8 ГГц который требуется для Herelink поддерживается этим роутером из коробки так что отдельная точка доступа не нужна. Таким же образом обновится и юнит!
Этот же метод подходит для обновления и других устройств, заблокированных в нашей стране.
Данная статья носит исключительно образовательный характер и предназначена для изучения принципов работы сетевых протоколов, маршрутизации трафика и архитектуры современных VPN-решений. Материал не является инструкцией по обходу блокировок или нарушению законодательства любого государства.
Если статья оказалась полезной, ставьте лайк!