Российские ресурсы, недоступные извне. Автоматизация доступа к ним при работе через VPN

Российские ресурсы, недоступные извне. Автоматизация доступа к ним при работе через VPN

Находясь в России, пришлось пустить весь домашний трафик через VPN на зарубежном сервере. +40мс к пингу в ежедневной работе не замечается, но возникла новая сложность: госуслуги и даже некоторые магазины не пускают с иностранных IP. Думаю, проще составить список того, что не работает из-за рубежа, чем наоборот.

Проблемы и задачи.

1. Нужен список важных российских ресурсов, недоступных из-за рубежа. Сходу найти готовый такой не удалось, да и не тратил много времени на поиски.

2. Прописывать статические маршруты в роутере вручную для каждого ресурса оказалось неприятной и трудоёмкой ручной работой. Более того, некоторые сервисы по nslookup отдают список всех своих IP, что хорошо. А некоторые – всего один, и каждый раз разный. Таким образом, прописав один IP, не факт, что не придётся повторять процедуру через 5 минут, полчаса или день. Нужно всё это как-то автоматизировать.

Решения.

1. Список составил сам и выложил на github в формате csv, поля – хост, категория, подкатегория. Кроме недоступных извне, имеет смысл также добавить туда стриминговые ресурсы.

2. Нужна программа, которая будет парсить список из п. 1 и сама прописывать маршруты к хостам.

Далее про программу.

VPN настроен на роутере Keenetic. Роутер даёт возможность по ssh прописать постоянные маршруты.

Каким предполагался алгоритм работы программы:

1. При старте считывает настройки, если их нет – запрашивает у пользователя.

2. Парсит файл недоступных ресурсов hosts.csv

3. Парсит файл приватных недоступных ресурсов private_hosts.csv (рабочие vpn-хосты, финансовые сервисы и т. п.) – то, что не нужно выкладывать в публичный доступ.

4. Генерирует файл с командами роутеру routes.txt

5. Запускает plink из поставки putty с параметрами доступа к роутеру и сгенерированным на выполнение файлом.

Т. к. планирую переход с pl/sql на java, то в целях обучения программу решил писать на java.

При реализации программы возникли следующие сложности:

1. Есть ресурсы, которые показывают только один IP из нескольких, по факту запроса. Если по nslookup ресурс отдаёт всего один IP – то нужно повторять процедуру десятки раз.

2. Необходимо учесть, что каждый ресурс может иметь версию с www-префиксом. Для каждого ресурса, если он не начинается с www, нужно запрашивать IP и для варианта с www-префиксом. Таким образом избавляемся от необходимости в файле hosts.csv указывать дважды один ресурс.

3. plink не смог передать файл с командами роутеру используя параметр -m, но у него получается передавать команды напрямую с параметром -batch

Теперь я избавился от ручного труда по прописыванию маршрутов в роутере.

Дальнейшее развитие программы:

1. Возможно, десятки раз резолвить доменное имя в попытке выявить все IP адреса – не лучшая идея, и есть способы получше?

Насколько я понимаю, в кинетиках у команды iproute есть недокументированный параметр – всё, что после символа ! в конце команды, интерпретируется как пользовательское описание маршрута и соответственно отображается в личном кабинете роутера. Чтобы работало более универсально, можно предусмотреть внешний шаблон формирования команды из текстового файла.

Начать дискуссию