Поисковая строка

Скрипт для простой настройки селективного перенаправления трафика в VPN по списку antizapret.info (OpenWRT)

Думаю, всем хорошо знакомы последствия бездумного и агрессивного натягивания поводка в сфере доступа к информации (естественно, в праведном порыве защитить спокойствие граждан), помноженного на привычку "стоять по стойке" и/или непрофессионализм отечественных операторов. До определённого момента, как и многих, меня выручал TOR-браузер, хотя порой скорость работы этой сети вызывала приступы ностальгической грусти по временам диалапа на моей старенькой релейной АТC (гори в аду, donpac). К тому же это решение имело крайне сомнительное удобство использования локально, и ещё меньшее - за пределами ПК. А хотелось получить комплексное и "прозрачное" решение для всей домашней сети, обрабатывающее только необходимые направления и не затрагивающее остальной трафик. Ну что ж, попробуем..

На всякий случай, если не понятно из названия статьи: описываемое решение подразумевает наличие настроенного и работающего VPN-интерфейса в роутере с прошивкой OpenWRT!

В ходе постановки и формализации задачи было сформулировано три тезиса:
  1. для организации прозрачного доступа всех устройств домашней сети, необходима гибкая и хорошо документированная платформа в качестве маршрутизатора;
  2. "выходная точка" может быть только платной, т.к. никакие публичные VPN и прокси не обеспечивают должный уровень скорости и надёжности;
  3. разработать собственное решение "с нуля" я вряд ли смогу ввиду практически нулевого опыта в вопросах маршрутизации на *nix, а значит предстоит найти похожие проекты и отталкиваться от них.
Первый пункт - причина множества споров, в которых каждый предлагаемый вариант объявляется адептами практически безальтернативным. Я определил для себя такие критерии выбора: актуальность, гибкость, популярность, доступность на моём домашнем роутере. В итоге, выбор пал на проект OpenWRT/Lede, с которым я ранее никогда не сталкивался.

Второй пункт был успешно реализован на базе крайне приятного по цене VPS. За скромный 1€ в месяц я получил 1 ядро, 1ГБ памяти, 20ГБ SSD-хранилища, гигабитный линк со статическим публичным IPv4 (лимит 2TB в месяц) и  полную свободу действий. В итоге я преобрёл не только полезный и интересный опыт, но и собственный мультипротокольный VPN-сервер, WEB-сервер для своих скриптовых поделок, и сервер-маршрутизатор для популярной win-утилиты удалённого администрирования. Покупка/настройка всего этого великолепия может стать темой для отдельной статьи, т.к. для меня это было настоящее приключение, особенно с учётом моих крайне ограниченных познаний в *nix-системах :) Если тема интересна - пишите, попробую собрать весь процесс в подобие инструкции.

Третий пункт, собственно, и есть тема моего сегодняшнего графоманского приступа.
Поиск привёл меня к этой статье, из которой я почерпнул бОльшую часть необходимой теории. Дальнейшее гугление выдало ещё этот проект, из которого с минимальными изменениями был позаимствован AWK-парсер списка узлов, а так же некоторые концептуальные моменты в компоновке будущего скрипта. Далее пришло осознание, что я хочу получить максимально простой в установке и обслуживании продукт, состоящий из минимального числа элементов. Ну а затем - вспышка креатива, куча новой полезной (и не очень) информации, несколько итераций полной (реально, почти 100%-ой) переработки концепции и, наконец, вожделенный результат!

Хотя в итоге моё решение довольно далеко ушло от имеющихся примеров, технические особенности реализации описывать здесь я не буду, т.к. для человека "в теме" все ключевые моменты вполне доступно описаны по указанным выше ссылкам, а для остальных - просто незачем. Для особо интересующихся я постарался оставлять в скрипте комментарии, позволяющие понять его структурную логику. Ну а вообще, если на вашем домашнем роутере установлен OpenWRT, значит вам вполне хватит имеющихся знаний для использования моего решения и без понимания тонкостей его работы :) Далее я перечислю и опишу только базовые моменты, итак..

Особенности:
  • все настройки с подробным описанием находятся в самом начале скрипта (раздел "Настройки пользователя"). Наиболее важный параметр, требующий указания - имя VPN-интерфейса. Это именно то имя, которое вводится при его создании в интерфейсе роутера (т.е. без  автоматического протокольного суффикса), например в моём случае - "vpn" :)
  • скрипт все активно обновляемые данные (списки) скачивает/пересоздаёт при загрузке роутера и/или по расписанию автоматически, и хранит их во временной памяти (чтобы не "запиливать" флешку);
  • во время инициализации выполняется автоматическая установка требуемых утилит (awk, ipset, wget, idn, dnsmasq-full), учитывайте необходимое свободное место.
Функционал:
  • автоматическое, в т.ч. по расписанию, создание оптимизированного (без дубликатов, сгруппированного по указанным параметрам) списка узлов по данным antizapret.info;
  • обработка пользовательского списка узлов;
  • перенаправление трафика к узлам из списка в VPN-интерфейс;
  • перенеправление DNS-запросов имён из списка на альтернативный DNS-сервер через общий канал, либо перенаправление всего DNS-трафика на альтернативный DNS-сервер через VPN-интерфейс (обход перехвата и подмены запросов провайдером).
Установка:
  • убедиться, что в роутере установлен (если нет - установить) пакет iptables-mod-conntrack-extra;
  • скопировать файл скрипта любым способом в хранилище роутера, в общем случае - это папка "/etc". Для аккуратности можно (но не обязательно) создать подпапку;
  • запустить скрипт с параметром "install" и дождаться завершения установки/обновления. Кстати, можно не заморачиваться с правами файла, проще сразу выполнить "sh /путь_к_скрипту/имя_скрипта install";
  • при перемещении, переименовании или изменении настроек скрипта - необходимо выполнить его повторную установку.

В дальнейшем статья будет дополнятся по необходимости (если это вообще окажется кому-то интересным и будут возникать вопросы). Сам скрипт, вероятнее всего, переедет на github. Ну а пока, выкладываю по-старинке :)

ОБНОВЛЕНИЯ:

26/10/18
  • реализована корректная работа скрипта при его установке с относительным путём.
21/06/19
  • реализовано корректное определение имени виртуального устройства для VPN-интерфейсов без суффикса в названии;
  • принудительно отключена проверка сертификата при скачивании списка блокировок;
  • в шапку скрипта добавлено упоминание о необходимости модуля iptables-mod-conntrack-extra (оказывается, в сборках по умолчанию его нет).

СКАЧАТЬ
ОБСУДИТЬ В TELEGRAM
ПОКОРМИТЬ КАПИБАРУ :)