Найти в Дзене
FPV COVENANT

Как настроить VPN-роутер для обновления пульта Herelink

Ситуация знакомая многим. Есть пульт Herelink который нужно срочно обновить до свежей прошивки. Проблема в том, что сервера обновлений могут быть заблокированы, а простые VPN-клиенты на телефоне не помогают — пульт требует прямое WiFi-соединение на частоте 5.8 ГГц и видит только локальную сеть. Решение есть — прозрачный VPN-роутер. Все устройства подключаются к его WiFi и автоматически отправляют трафик через VPN-сервер. Ниже подробная инструкция как настроить VPN на роутере GL-MT3000 Beryl AX работающая из коробки после каждой перезагрузки. Настройка описанного оборудования требует навыков работы с сетевыми технологиями, понимания базовых принципов TCP/IP, работы с командной строкой Linux и конфигурирования сетевого оборудования. Пользователям без достаточного опыта в области IT может потребоваться помощь квалифицированного специалиста! Стандартный путь через Xray или v2rayA на роутерах GL.iNet не работает из-за ограничений ядра Linux в крайней на сегодняшний день прошивке 4.8.1. Яд
Оглавление

Ситуация знакомая многим. Есть пульт Herelink который нужно срочно обновить до свежей прошивки. Проблема в том, что сервера обновлений могут быть заблокированы, а простые VPN-клиенты на телефоне не помогают — пульт требует прямое WiFi-соединение на частоте 5.8 ГГц и видит только локальную сеть.

Решение есть — прозрачный VPN-роутер. Все устройства подключаются к его WiFi и автоматически отправляют трафик через VPN-сервер. Ниже подробная инструкция как настроить VPN на роутере GL-MT3000 Beryl AX работающая из коробки после каждой перезагрузки.

Роутер GL-MT3000 Beryl AX
Роутер 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.

v2rayA не удалось запустить на этом роутере
v2rayA не удалось запустить на этом роутере

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

Находим файл установки в архиве tar.gz на GitHub
Находим файл установки в архиве tar.gz на GitHub

Распаковываем архив и находим внутри файл sing-box это наш исполняемый модуль.

Далее заходим на роутер по SSH. Пароль по умолчанию совпадает с WiFi-паролем который напечатан на наклейке снизу роутера.

ssh root@192.168.8.1

Заходим на роутер по SSH
Заходим на роутер по SSH

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

После установки проверили версию пакета sing-box
После установки проверили версию пакета sing-box

Конфигурация для прозрачного 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*

Должно показать три симлинка.

Эта команда ищет скрипты автозапуска программы sing-box, которые настроены для выполнения при старте операционной системы.
Эта команда ищет скрипты автозапуска программы sing-box, которые настроены для выполнения при старте операционной системы.

Настройка 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-решений. Материал не является инструкцией по обходу блокировок или нарушению законодательства любого государства.

Если статья оказалась полезной, ставьте лайк!