Возвращаем 2007 год, или делаем Интернет без блокировок
- вторник, 11 июля 2023 г. в 00:00:20
Как известно, в 2007 году кроме того, что деревья были выше, а трава зеленей, еще и в Интернете не было особых ограничений - можно было открыть почти любой сайт и наслаждаться им. До ковровых блокировок Telegram оставалось ещё 10 лет... К сожалению, в наше время такой возможности уже нет. Причины тут всем известны, в частности, некоторые компании уже не предоставляют своих услуг в России.
Хорошо, что существует возможность в рамках домашней сети восстановить свободный Интернет таким, каким он был в 2007-м. Именно этим мы и займемся. Стоит отметить, что в 2007 году довольно часто можно было встретить подключения на скорости 64-128 Кб/с, а то и вовсе dial-up; Wi-Fi был редкостью, а мобильная связь - довольно дорогим удовольствием. Однако, эти особенности того времени мы постараемся не воспроизводить.
Представляю вашему вниманию Freeroute - простой маршрутизатор, который позволяет направлять трафик на разные шлюзы в зависимости от домена назначения. Free в названии, как водится, означает свободный, а не бесплатный.
Справедливости ради отмечу, что закон об ограничении доступа к сайтам, нарушающим авторские права, был принят в 2006 году. Но очень уж хотелось написать и про деревья, и про траву, и про 2007 год.
Помню, как я сделал себе первый VPN-сервер. Это было как раз во времена блокировок Telegram. Тогда я поехал в незнакомый для меня город, а Яндекс карты и Google Maps отказались работать - я не мог найти нужный мне адрес. В тот же вечер я сделал себе VPN-сервер, чтобы такое больше не повторялось.
Позже начались блокировки некоторых средств массовой информации, а также известных социальных сетей, и VPN был уже необходим. Но тогда я заметил, что стал потреблять меньше информации из свежезаблокированных источников, потому что мне было лень включать/выключать VPN. Сидеть с VPN постоянно тоже не хотелось, потому что это снижало скорость подключения, да и некоторые сайты не работали с VPN.
Я думаю, что каждый человек вправе сам решать, какую информацию ему читать, а какую нет. У меня появилась идея создать такой маршрутизатор, который будет автоматически перенаправлять трафик для заблокированных сайтов через VPN, а для остальных - напрямую. Но довольно долго я просто размышлял о такой возможности.
Последней каплей стало то, что перестал работать GitHub Copilot - и мне пришлось постоянно сидеть с VPN. Поэтому я решил, что настало время воплотить мою идею в жизнь.
Я создал Freeroute. Это простой сервис на Python с небольшой админкой на React. Github проекта.
Freeroute устанавливается на отдельную машину с Linux в домашней сети (подойдёт также виртуальная машина в режиме моста). Адрес этой машины устанавливается на клиентах или на DHCP-сервере в качестве шлюза по умолчанию и DNS сервера. Freeroute резолвит DNS-запросы клиентов, получает IP-адреса запрашиваемых доменов и перенаправляет трафик на соответствующие IP-адреса через нужный шлюз согласно спискам доменов. Перенаправление трафика реализовано с помощью команды ip route add
.
Списки доменов можно настраивать в админке. На самом деле они включают суффиксы. Т.е., если в списке есть bbc.com
, запросы на www.bbc.com
тоже будут перенаправляться в соответствующий шлюз.
Также по умолчанию Freeroute раз в час будет скачивать списки заблокированных сайтов с https://antifilter.download/, спасибо коллегам за их замечательный сервис.
Возникает вопрос, почему не используется список IP-адресов заблокированных ресурсов с того же сайта? Для этого сразу несколько причин. Во-первых, этот список не решает проблему с Copilot и другими сервисами, которые не работают в России по собственному желанию. Во-вторых, данный список не совсем точный, например, в нем есть некоторые адреса youtube, что приводит к тому, что youtube берет местоположение VPN. В-третьих, списки IP-адресов сложнее редактировать, чем списки доменов, ну и IP-адреса, бывает, меняются. Ещё такой подход помогает бороться с замедлениями трафика, это полезно, например, для Twitter, который не заблокирован полностью, а поэтому его нет в списках заблокированных доменов, но он замедлен до той степени, что им невозможно пользоваться.
То же самое можно было бы сделать с помощью связки dnsmasq + nftables. Но такое решение имеет фатальный недостаток (если вы понимаете, о чём я), да и редактировать списки доменов там не так удобно. Пришлось бы что-то придумывать с автоматическим обновлением списков antifilter.
В каталоге с релизом есть скрипт install.sh
, который установит Freeroute и настроит его. Этот же скрипт установит и настроит OpenVPN клиент.
Предполагается, что Freeroute будет развернут на чистой Debian 11 или 12. В итоге сервис будет работать от имени непривилегированного пользователя, а перенаправление трафика будет происходить с помощью команды sudo ip route
. DNS-сервер будет работать на порту 5553, поэтому скрипт также настроит nftables, чтобы трафик с 53 порта перенаправлялся на 5553.
Запускается Freeroute от имени обычного пользователя с sudo-правами.
Для установки Freeroute, выполните следующие шаги:
Скачайте последний релиз отсюда
Распакуйте архив tar -xzf freeroute.tar.gz
Запустите скрипт установки:
sudo ./install.sh <network interface> <openVPN config file>
-- или --
sudo ./install.sh <network interface> <openVPN config file> -u <username> -p <password>
где:
<network interface>
это основной сетевой интерфейс машины (например, eth0), через который она подключена к интернету;
<openVPN config file>
это конфигурационный файл OpenVPN;
<username>
и <password>
это имя пользователя и пароль для VPN. Это опционально и заполняется, только если VPN требует аутентификации.
В настройках DHCP домашнего роутера укажите адрес Freeroute в качестве шлюза по умолчанию и DNS сервера. Например, для своего Keenetic я сделал такие настройки:
Если не хочется сразу переключать всех клиентов на Freeroute, можно настроить только некоторые устройства. Тогда придется вручную указывать DNS сервер и адрес шлюза в настройках сети на этих устройствах. Есть и другие способы настроить девайсы по-разному, но этот вопрос уже выходит за рамки данной статьи.
В файле config.yaml
находится конфигурация Freeroute. В нём можно настроить следующие параметры:
списки VPN подключений (по умолчанию будет одно, которое было задано при установке), но может быть полезно, если нужно подключаться к разным VPN, например, перенаправить трафик Steam через Казахстанский VPN;
списки доменов, которые нужно перенаправлять через VPN;
автообновление списков доменов и периодичность их загрузки;
на каком порту будет работать DNS-сервер;
на каком порту будет работать админка;
уровни логирования.
Списки доменов сохраняются в каталоге вместе с конфигом, и имеют имя вида list_<domain list name>.txt
.
Ручные списки доменов применяются в том порядке, в котором они указаны в конфиге, затем применяются списки, загружаемые автоматически.
Существует особый список force_default
, содержащий домены, которые всегда будут направлены по прямому соединению. Это нужно для того, чтобы была возможность переопределить поведение автоматически загружаемых списков. Например, это решает проблему с youtube - она существует и для доменов тоже, а не только для IP.
Админка доступна по адресу http://<ip адрес>:8080/index.html
. Здесь можно настроить списки доменов, а также посмотреть логи - какой адрес разрезолвился в какие IP-адреса и в какой шлюз трафик был направлен. Внешний вид админки представлен на скриншоте:
На данный момент меня всё устраивает, и если проект не вызовет интереса у других людей, то я не буду его развивать. Но если появятся интересные идеи, буду рад их реализовать. Ну и пул реквесты, как всегда, приветствуются.
Вот список того, что можно ещё сделать:
сделать контейнер Docker;
сделать админку более красивой и удобной;
написать тесты;
переписать сервис на C, чтобы проект можно было запускать прямо на слабых роутерах (возможна интеграция с https://github.com/karen07/antiblock);
улучшить работу DNS сервера, сейчас он резолвит только записи A и CNAME;
добавить поддержку IPv6;
добавить возможность подключаться к вышестоящему DNS серверу через DoH или DoT (сейчас это можно сделать на роутере).