Как известно, в 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, выполните следующие шаги: Скачайте последний релиз отсюда Распакуйте архив tar -xzf freeroute.tar.gz Запустите скрипт установки: где: <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 (сейчас это можно сделать на роутере).