Как стать автором
Обновить

Возвращаем 2007 год, или делаем Интернет без блокировок

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров66K

Как известно, в 2007 году кроме того, что деревья были выше, а трава зеленей, еще и в Интернете не было особых ограничений - можно было открыть почти любой сайт и наслаждаться им. До ковровых блокировок Telegram оставалось ещё 10 лет... К сожалению, в наше время такой возможности уже нет. Причины тут всем известны, в частности, некоторые компании уже не предоставляют своих услуг в России.

Хорошо, что существует возможность в рамках домашней сети восстановить свободный Интернет таким, каким он был в 2007-м. Именно этим мы и займемся. Стоит отметить, что в 2007 году довольно часто можно было встретить подключения на скорости 64-128 Кб/с, а то и вовсе dial-up; Wi-Fi был редкостью, а мобильная связь - довольно дорогим удовольствием. Однако, эти особенности того времени мы постараемся не воспроизводить.

Представляю вашему вниманию Freeroute - простой маршрутизатор, который позволяет направлять трафик на разные шлюзы в зависимости от домена назначения. Free в названии, как водится, означает свободный, а не бесплатный.

Справедливости ради отмечу, что закон об ограничении доступа к сайтам, нарушающим авторские права, был принят в 2006 году. Но очень уж хотелось написать и про деревья, и про траву, и про 2007 год.

Github проекта

Откуда идея

Помню, как я сделал себе первый 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, выполните следующие шаги:

  1. Скачайте последний релиз отсюда

  2. Распакуйте архив tar -xzf freeroute.tar.gz

  3. Запустите скрипт установки:

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 я сделал такие настройки:

Настройки DHCP
Настройки DHCP

Если не хочется сразу переключать всех клиентов на 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 (сейчас это можно сделать на роутере).

Теги:
Хабы:
Всего голосов 69: ↑65 и ↓4+76
Комментарии98

Публикации