Автоперенаправление маршрутов Keenetic на другой интерфейс

Например, у вас есть роутер Keenetic, в который уже встроена конфигурация VPN и прописаны маршруты для точечного пропуска трафика через этот VPN. Иногда нужно разом прописанные маршруты перенаправить на другой VPN. Зачем это делать и как я описал под катом.

Зачем VPN в роутере?

У меня в компании трудится роутер Keenetic Giga, через который все дружно выходят в интернет. У нас есть разные клиенты, которые имеют под капотом свой VPN, который мы встроили в этот роутер и из нашего офиса доступ в сеть клиента происходит без каких-либо дополнительных действий.

Также, в той же компании, трудятся разработчики, которые достаточно сильно привыкли к ассистенту в лице ChatGPT. Но OpenAI отказывается работать, если обнаруживает запрос с IP-адресов из РФ. Работает он только через VPN.

Pasted image 20241224211246.png

Для того, чтобы работал ChatGPT (и другие инструменты, отказавшиеся работать с РФ), я арендовал VPS за границей, поставил туда Wireguard VPN. После чего добавил этот конфиг в роутер и настроил маршруты на IP адреса ChatGPT через VPN…

В итоге на всех устройствах в офисе не нужно включать никакой VPN для нормальной работы с этими инструментами. Это невероятно удобно! До тех пор, пока не сталкиваешься с DDOS-атаками.

Причем тут DDOS?

Все работает прекрасно ровно до тех пор, пока работает сам сервер. Используемый мной хостинг активно DDOS-ят недоброжелатели, что приводит к недоступности моего сервера под VPN.

Pasted image 20241224210923.png

Понятия не имею кому это нужно (может быть, конкуренты), но дудосят активно и уже несколько недель. Как результат — в офисе ChatGPT и другие инструменты работать перестают на это время. По скрину видно, что это время сильно захватывает наше рабочее время и создает ряд неудобств.

Способы решения без программирования

Я арендовал еще один сервер, поставил туда VPN и раздал разработчикам доступы. Теперь, при смерти основного сервера, они включают впн уже у себя на компе и могут пользоваться всем, что нужно. Но при этом перестает работать то, что не работает из-за рубежа (госуслуги, например). Да и вообще ходить через VPN в весь интернет антипаттерн.

Тогда мне пришла в голову мысль добавить это подключение в роутер и перенастроить маршруты на этот сервер. Сказано — сделано! Только «сделано» представляет собой прокликивание руками кучи статических маршрутов с выбором другого VPN провайдера для этого маршрута. И так N раз, где N — количество таких маршрутов.

Pasted image 20241225121632.png

Ведь если мы эмулируем другой IP адрес для ChatGPT, то значит надо на все ресурсы, которые с ним связаны, делать подмену. В случае с GPT там десятки адресов. Поэтому руками так переключать явно не вариант.

Итоговый способ

Попробовав сделать это руками, я устал примерно за 5 секунд. После чего приступил к поиску способа это автоматизировать. Потратив пару часов пришел к финальному результату и решил поделиться им здесь.

Суть метода в том, что скрипт на JS будет делать запросы к RCI (remote cli interface) роутера. Ведь роутер представляет из себя мини сервер с telnet/ssh протоколом. То есть можно автоматизировать даже на уровне bash скрипта эти действия или отправлять через JS и Fetch запросы к роутеру.

Pasted image 20241225121848.png

Сами запросы я подсмотрел из Network в Google Chrome. Ушло некоторое время, чтобы проанализировать в какой момент и что отправляется. Но суть уловить смог:

  • Получение списка маршрутов происходит командой: POST /rci/ { 'show': { 'ip': { 'route': {} } } }])

  • Дальше приходит массив, который надо перебрать для получения нужных маршрутов. Обычная фильтрация

  • После фильтрации нужно создать новый запрос на сначала отключение старого маршрута, а потом включение нового. После чего сделать system configuration save. Всю эту логику можно будет увидеть в конечном целевом скрипте. Там пришлось проявить творчество и щепотку GPT, чтобы сделать все как нужно.

Настройка роутера

Для начала важно, чтобы у вас уже были базовые настройки роутера и он уже бы подключен к нескольким VPN-сетям. Увы, но эту инструкцию я выкладывать не могу по причине новых законов и отсутствия понимания, как под них не попасть. Моя статья направлена исключительно на обход блокировок от OpenAI и других зарубежных компаний, а не Роскомнадзора.

Для того, чтобы подключиться к роутеру на программном уровне нужно сначала сделать так, чтобы был доступен путь /rci для внешних запросов. Изначально роутер может стучаться сам к себе по адресу 127.0.0.1:79/rci. Там нет никакой авторизации и сразу доступен полный админский режим. Но доступа откуда-либо кроме самого роутера к этому адресу нет.

Сделано это для того, чтобы локальные скрипты на роутере спокойно обращались к RCI и выполняли все команды. И обойти это можно двумя способами — опасным и нормальным.

ОПАСНЫЙ СПОСОБ, но простой

Я сначала сделал себе доступ через «Сетевые правила → Переадресация портов» через проброс 81 порта на 79 порт на самом роутере.

Pasted image 20241224220540.png

Этот вариант я подсмотрел в статье по интеграции роутера с Home Assistant ([здесь). Он позволил стучаться напрямую в роутер через curl http://192.168.2.1:81/rci и выполнять команды, но это НЕБЕЗОПАСНО. Можете использовать его на свой страх и риск.

Безопасный способ через облако с авторизацией

Увы, но настроить /rci c авторизацией напрямую я не нашел. Но есть способ делать через http proxy. Для этого добавляем пользователя с возможностью подключаться к http proxy

Pasted image 20241224221033.png

После чего идем в управления доменом (Сетевые правила → Доменное имя). Включаем себе доменное имя через KeenDNS. После активации домена снизу нажимаете »+ Добавить» в блоке «Доступ к веб-приложениям домашней сети»

Pasted image 20241224221256.png

В форме указываем поддомен rci, порт 79 и снизу ставим галочку напротив созданного пользователя.

Pasted image 20241224221338.png

Теперь можно отправлять запрос на RCI роутера с авторизацией. Чтобы убедиться, что все работает, попробуйте выполнить команду в консоли: curl -u USER:PASSWORD https://rci.ВАШДОМЕН.keenetic.link/rci/show/system. Ниже скрин примера ответа

Pasted image 20241224221511.png

Если все сработало верно, то теперь можно переходить непосредственно к скрипту.

Мой скрипт и как им пользоваться

Я выложил скрипт на gist. Для его запуска в переменной config надо указать исходные параметры. В поля from и to нужно указывать ид сетей из мозгов роутера. Для этого переходим в http://IP_РОУТЕРА/webcli/parse и туда вводим show interface. В окне ответа ищем Wireguard конфигурацию с нужным значением в поле «description»

Pasted image 20241224225921.png

В моем роутере основное VPN подключение было с id=Wireguard0, запасное id=Wireguard4. Эти значения запоминаем и вносим в скрипт в поля from и to.Теперь, после запуска этого скрипта, будет изменены все записи о маршрутах. То, что направляло на сеть from начнет направлять на сеть to.

Если у вас не стоит nodejs интерпретатор, то можете настроить его через NVM по моей инструкции. После чего скачиваем файл, и запускаем командой:

node keenetic-batch-route-update.js

Если конфиг заполнен верно и роутер готов принимать подключения от указанного пользователя, то скрипт запустится, стянет все маршруты, которые ведут на исходный VPN и сменит все эти маршруты на целевой.

Итог

Теперь в нашем офисе всегда доступны нужные нам сервисы. Роутер подключен к двум VPN и есть способ перенаправления маршрутов на резерв, если основной отвалился по любым причинам.

Благодарю за внимание! Буду рад подписке на мой Telegram, YouTube, VK .

© Habrahabr.ru