Автоперенаправление маршрутов Keenetic на другой интерфейс
Например, у вас есть роутер Keenetic, в который уже встроена конфигурация VPN и прописаны маршруты для точечного пропуска трафика через этот VPN. Иногда нужно разом прописанные маршруты перенаправить на другой VPN. Зачем это делать и как я описал под катом.
Зачем VPN в роутере?
У меня в компании трудится роутер Keenetic Giga, через который все дружно выходят в интернет. У нас есть разные клиенты, которые имеют под капотом свой VPN, который мы встроили в этот роутер и из нашего офиса доступ в сеть клиента происходит без каких-либо дополнительных действий.
Также, в той же компании, трудятся разработчики, которые достаточно сильно привыкли к ассистенту в лице ChatGPT. Но OpenAI отказывается работать, если обнаруживает запрос с IP-адресов из РФ. Работает он только через VPN.
Для того, чтобы работал ChatGPT (и другие инструменты, отказавшиеся работать с РФ), я арендовал VPS за границей, поставил туда Wireguard VPN. После чего добавил этот конфиг в роутер и настроил маршруты на IP адреса ChatGPT через VPN…
В итоге на всех устройствах в офисе не нужно включать никакой VPN для нормальной работы с этими инструментами. Это невероятно удобно! До тех пор, пока не сталкиваешься с DDOS-атаками.
Причем тут DDOS?
Все работает прекрасно ровно до тех пор, пока работает сам сервер. Используемый мной хостинг активно DDOS-ят недоброжелатели, что приводит к недоступности моего сервера под VPN.
Понятия не имею кому это нужно (может быть, конкуренты), но дудосят активно и уже несколько недель. Как результат — в офисе ChatGPT и другие инструменты работать перестают на это время. По скрину видно, что это время сильно захватывает наше рабочее время и создает ряд неудобств.
Способы решения без программирования
Я арендовал еще один сервер, поставил туда VPN и раздал разработчикам доступы. Теперь, при смерти основного сервера, они включают впн уже у себя на компе и могут пользоваться всем, что нужно. Но при этом перестает работать то, что не работает из-за рубежа (госуслуги, например). Да и вообще ходить через VPN в весь интернет антипаттерн.
Тогда мне пришла в голову мысль добавить это подключение в роутер и перенастроить маршруты на этот сервер. Сказано — сделано! Только «сделано» представляет собой прокликивание руками кучи статических маршрутов с выбором другого VPN провайдера для этого маршрута. И так N раз, где N — количество таких маршрутов.
Ведь если мы эмулируем другой IP адрес для ChatGPT, то значит надо на все ресурсы, которые с ним связаны, делать подмену. В случае с GPT там десятки адресов. Поэтому руками так переключать явно не вариант.
Итоговый способ
Попробовав сделать это руками, я устал примерно за 5 секунд. После чего приступил к поиску способа это автоматизировать. Потратив пару часов пришел к финальному результату и решил поделиться им здесь.
Суть метода в том, что скрипт на JS будет делать запросы к RCI (remote cli interface) роутера. Ведь роутер представляет из себя мини сервер с telnet/ssh протоколом. То есть можно автоматизировать даже на уровне bash скрипта эти действия или отправлять через JS и Fetch запросы к роутеру.
Сами запросы я подсмотрел из Network в Google Chrome. Ушло некоторое время, чтобы проанализировать в какой момент и что отправляется. Но суть уловить смог:
Получение списка маршрутов происходит командой:
POST /rci/ { 'show': { 'ip': { 'route': {} } } }])
Дальше приходит массив, который надо перебрать для получения нужных маршрутов. Обычная фильтрация
После фильтрации нужно создать новый запрос на сначала отключение старого маршрута, а потом включение нового. После чего сделать system configuration save. Всю эту логику можно будет увидеть в конечном целевом скрипте. Там пришлось проявить творчество и щепотку GPT, чтобы сделать все как нужно.
Настройка роутера
Для начала важно, чтобы у вас уже были базовые настройки роутера и он уже бы подключен к нескольким VPN-сетям. Увы, но эту инструкцию я выкладывать не могу по причине новых законов и отсутствия понимания, как под них не попасть. Моя статья направлена исключительно на обход блокировок от OpenAI и других зарубежных компаний, а не Роскомнадзора.
Для того, чтобы подключиться к роутеру на программном уровне нужно сначала сделать так, чтобы был доступен путь /rci
для внешних запросов. Изначально роутер может стучаться сам к себе по адресу 127.0.0.1:79/rci
. Там нет никакой авторизации и сразу доступен полный админский режим. Но доступа откуда-либо кроме самого роутера к этому адресу нет.
Сделано это для того, чтобы локальные скрипты на роутере спокойно обращались к RCI и выполняли все команды. И обойти это можно двумя способами — опасным и нормальным.
ОПАСНЫЙ СПОСОБ, но простой
Я сначала сделал себе доступ через «Сетевые правила → Переадресация портов» через проброс 81 порта на 79 порт на самом роутере.
Этот вариант я подсмотрел в статье по интеграции роутера с Home Assistant ([здесь). Он позволил стучаться напрямую в роутер через curl http://192.168.2.1:81/rci
и выполнять команды, но это НЕБЕЗОПАСНО. Можете использовать его на свой страх и риск.
Безопасный способ через облако с авторизацией
Увы, но настроить /rci
c авторизацией напрямую я не нашел. Но есть способ делать через http proxy. Для этого добавляем пользователя с возможностью подключаться к http proxy
После чего идем в управления доменом (Сетевые правила → Доменное имя). Включаем себе доменное имя через KeenDNS. После активации домена снизу нажимаете »+ Добавить» в блоке «Доступ к веб-приложениям домашней сети»
В форме указываем поддомен rci, порт 79 и снизу ставим галочку напротив созданного пользователя.
Теперь можно отправлять запрос на RCI роутера с авторизацией. Чтобы убедиться, что все работает, попробуйте выполнить команду в консоли: curl -u USER:PASSWORD https://rci.ВАШДОМЕН.keenetic.link/rci/show/system
. Ниже скрин примера ответа
Если все сработало верно, то теперь можно переходить непосредственно к скрипту.
Мой скрипт и как им пользоваться
Я выложил скрипт на gist. Для его запуска в переменной config надо указать исходные параметры. В поля from и to нужно указывать ид сетей из мозгов роутера. Для этого переходим в http://IP_РОУТЕРА/webcli/parse
и туда вводим show interface
. В окне ответа ищем Wireguard конфигурацию с нужным значением в поле «description»
В моем роутере основное VPN подключение было с id=Wireguard0
, запасное id=Wireguard4
. Эти значения запоминаем и вносим в скрипт в поля from и to.Теперь, после запуска этого скрипта, будет изменены все записи о маршрутах. То, что направляло на сеть from начнет направлять на сеть to.
Если у вас не стоит nodejs интерпретатор, то можете настроить его через NVM по моей инструкции. После чего скачиваем файл, и запускаем командой:
node keenetic-batch-route-update.js
Если конфиг заполнен верно и роутер готов принимать подключения от указанного пользователя, то скрипт запустится, стянет все маршруты, которые ведут на исходный VPN и сменит все эти маршруты на целевой.
Итог
Теперь в нашем офисе всегда доступны нужные нам сервисы. Роутер подключен к двум VPN и есть способ перенаправления маршрутов на резерв, если основной отвалился по любым причинам.
Благодарю за внимание! Буду рад подписке на мой Telegram, YouTube, VK .