Как настроить vpn для обхода блокировок
Перейти к содержимому

Как настроить vpn для обхода блокировок

  • автор:

Поднимаем свой VPN за 5 минут, который точно не заблокируют

Поднимаем свой VPN за 5 минут, который точно не заблокируют

Для решения поставленной задачи обратимся к нашим друзьям по Китаю и Ирану, и там и там существуют тотальные блокировки ящурных сервисов. Китайские ребята придумали как обходить, а иранцы сделали это удобным. Важно отметить, что данный VPN поможет обойти блокировки в Туркменистане (в личку пару раз обращались за помощью наши братья туркмены).

�� Для Туркменистана существует проблема заблокированных хостингов, если найдете рабочие сервера то сообщите пожалуйста.

И так представляю вам чудо VPN, он же прокси, он же обфускатор VLESS xtls-reality. Если вкратце, то мы будем упаковывать свой трафик в HTTPS и прятаться за чужими доменами. То есть даже если провайдер будет проверять наш трафик то он получит данные и сертификат сайта за которым мы прикрываемся. И заблокировать у провайдеров всё это получится очень не скоро.

Как работает данная технология хорошо описана в статье на Хабре, а мы как обычные пользователи не будем углубляться и просто и быстро поднимем свой VPN сервер.

Как купить и провести первоначальную настройку есть в моем прошлом гайде:

Как поднять свой VPN за 139р/мес за 30 минут для чайников. Обновлено!

В связи с предстоящей блокировкой Инстаграма я решил поставить себе ВПН, быстро и без запар. (Шутка, клал я на этот инстаграм). Главный плюс этого ВПН то что он будет работать на L2TP/IPSec, то есть не требует установки отдельных приложений итд. Так как данный протокол уже встроен во все современные устройства.

Поднимаем свой VPN за 5 минут, который точно не заблокируютПоднимаем свой VPN за 5 минут, который точно не заблокируютПоднимаем свой VPN за 5 минут, который точно не заблокируютПоднимаем свой VPN за 5 минут, который точно не заблокируютПоднимаем свой VPN за 5 минут, который точно не заблокируютПоднимаем свой VPN за 5 минут, который точно не заблокируютПоднимаем свой VPN за 5 минут, который точно не заблокируютПоднимаем свой VPN за 5 минут, который точно не заблокируютПоднимаем свой VPN за 5 минут, который точно не заблокируютПоднимаем свой VPN за 5 минут, который точно не заблокируют Поднимаем свой VPN за 5 минут, который точно не заблокируютПоднимаем свой VPN за 5 минут, который точно не заблокируютПоднимаем свой VPN за 5 минут, который точно не заблокируют Поднимаем свой VPN за 5 минут, который точно не заблокируют

Главное не забывайте перезагружать панель после введенных изменений. Возможностей масса главное немного разобраться, можете изучить все это самостоятельно.

Каждый кто дочитал тот молодец и хочу разыграть среди вас 3 штуки VPN на 1 год которым вы можете распоряжаться как хотите, для этого оставьте любой коммент с фразой «х-уй» и я вам отправлю QR-код. Итоги подведем в эту субботу.

ПС. Ну и как всегда задавайте ваши вопросы помогу чем смогу.

ППС. Домашнее задание: настройте файрвол на сервере, сделайте отдельного пользователя в системе под которым будет работать панель с ВПНом, сделайте разграничение трафика чтобы он ходил через ВПН только на запрещенные сайты и сервисы.

Как подключиться к VPN из стран с ограниченным доступом к сети?

How to connect to Surfshark VPN in a country with internet restrictions?

Некоторые страны вводят запреты на использования сети и блокируют некоторые подключения. Если вы заметили, что не можете подключиться к Surfshark, возможно причина тому цензура в интернете. Тем не менее, всегда есть способ обойти запреты и пользоваться неограниченным доступом в интернет — так и должно быть.

Если вы находитесь в одной из стран, где действуют запреты на использование интернета и невозможно подключиться к Surfshark VPN, попробуйте следующее:

Restricted_access_VPN

Попробуйте подключиться к VPN, используя другие методы

Профиль Tunnelblick или OpenVPN могут отлично помочь обойти запреты на доступ в интернет, если к приложению Surfshark не подключиться. Вы сможете подключиться к сервисам Surfshark, и вам будет обеспечен тот же уровень защиты.

Выберите свое устройство и прочитайте инструкцию по подключению к VPN вручную:

Настройка приложения Surfshark

  1. Попробуйте изменить протокол . Перейдите в раздел Settings (настройки) -> Advanced (сложные) -> Protocol (протокол) и попробуйте подключиться с использованием разных протоколов.
  2. Попробуйте подключиться к другим сервисам. Попробуйте, по крайней мере, пять различных локаций.
  3. Выключите другие VPN.

Попробуйте подключиться к VPN вручную при помощи приложения Surfshark

Если у вас на устройстве установлен Windows или Android, возможно стоит попробовать подключиться вручную.

  • Здесь руководство по подключению вручную в Windows
  • А здесь — в системе Android.

Точечный обход блокировок по доменам на роутере с OpenWrt

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

Я предоставляю уже готовый конфиг с самыми востребованными доменами, который можно дополнять.

Настроить роутер можно с помощью скрипта. Если вдруг не заведётся сразу, то другим скриптом можно найти, что не работает. Настройка с помощью Ansible никуда не делась, только модифицировалась и стала лучше.

Помимо инструкций по настройке туннелей Wireguard и OpenVPN, написал инструкцию по использованию технологий, которые помогут в обходе блокировок по протоколу: Shadowsocks, VLESS и прочими.

Эта инструкция написана под свежую OpenWrt 23.05 и скрипт работает только с ней. Но на предыдущих версиях можно также настроить всё вручную, либо с помощью Ansible. На них всё работает, но есть свои особенности, которые описаны в первой статье.

Видеоверсия

Зачем обходить блокировки точечно

Думаю, в 2023 году большинство людей сами могут ответить на этот вопрос. Но список лишним не будет:

  • Есть российские сайты, которые блокируют доступ с нероссийских IP-адресов. Уверен, вы с этим сталкивались
  • Высокий Latency, время ожидания открытия ресурса. Если вы, например, находитесь в Москве, а сервер с сайтом в Подмосковье, то у вас короткий маршрут. Через VPN делается петля через другую страну. Это влияет на скорость загрузки ресурса
  • Сайты определяют вашу локацию по стране, где расположен VPN-сервер. Например, гугл вас будет приветствовать по-немецки. Нужно будет переключать локацию вручную, чтоб делать поиск по российским ресурсам
  • Если у вас не быстрый VPN-сервер, то все ваши гигабиты по оптике превращаются в тыкву. VPN создаёт бутылочное горлышко
  • Юрисдикция другой страны. Например, у некоторых правообладателей поставлены на поток обнаружение раздач нелегальных копий их контента. Система обнаружения отработает, и владелец VPN-сервера получит автоматическую абузу на сервер и вытекающие из неё проблемы
  • Нагрузка на сам VPN-сервер. Об этом мало задумываются. Точечный обход блокировок — жирный плюс для VPN-сервера

Проблемы готовых списков IP-адресов

Главная проблема — это отсутствие необходимого вам ресурса в подготовленных списках. Как это решать? Можно резолвить домены, получать IP-адреса ресурса и заносить их в свой ещё один список. Со временем эти IP-адреса меняются и придётся делать по новой.

Antifilter постарались решить эту проблемы с помощью сommunity списка. Чтоб каждый мог добавить нужный ему сайт. Есть список доменов и список IP-адресов, которые автоматически добавляются через резолвинг доменов. Крутая идея, но многих доменов нет, а их добавление не факт, что будет одобрено. Как я понимаю, резолвинг доменов в списки работает не из одной локации, но всё равно бывает так, что адрес, который резолвится у вас, будет отсутствовать в списках.

Вторая проблема касается непосредственно OpenWrt. В 22ой версии совершился переход от iptables к nftables. Nftables sets потребляет больше памяти, чем ipset. Большие списки IP-адресов на роутерах с небольшим количеством оперативной памяти стали выдавать ошибку:

netlink: Error: Could not process rule: No buffer space available The rendered ruleset contains errors, not doing firewall restart. 

Это означает переполнение памяти. Если эта ошибка появляется только при перезагрузке фаервола (тут срабатывает атомарность nftables, существующие списки не удаляются сразу, а ждут полного добавления новых из файла), то помогает «обнуление» списков перед загрузкой новых nft flush ruleset .

Моя реализация списка доменов

Каждому по отдельности вытаскивать самостоятельно домены заблокированных сервисов довольно непродуктивно для сообщества. Поэтому я сформировал свои списки доменов. Да, именно спискИ.

На данный момент есть три списка:

  • Россия, для людей внутри страны. Тут всё понятно думаю
  • Россия, для людей извне. Список из сайтов, которые пускают к себе только с российских IP-адресов
  • Украина. Тут просто берётся список с ресурса https://uablacklist.net/

Раньше приходилось конвертировать списки в конфиг dnsmasq прямо на роутере. Я сделал уже готовый конфиг для dnsmasq и получились такие форматы:

  • RAW — это просто списки доменов
  • Dnsmasq ipset — готовый конфиг для ipset+iptables (Для OpenWrt 21ой версии и более ранних)
  • Dnsmasq nfset — готовый конфиг для nfset+nftables (Для OpenWrt начиная с 22ой версии)

Более подробно почитать о том, как можно добавить свои домены, как формируются списки и т.д. можно в README репозитория.

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

Плюсы и минусы использования списков доменов

  • Вы оперируете доменами, не опускаетесь до резолвинга
  • Универсальность: подходит для обхода блокировок в любой стране
  • В sets не будет IP-адреса вашего VPN-сервера
  • Помимо готового списка доменов, можно добавлять свои прям на роутере
  • В маршрутизации участвуют только необходимые IP-адреса, полученные из доменов. Меньше IP-адресов в списках — меньше потребление памяти
  • Механизм резолвинга не идеален. При первом обращении к сайту вам придётся немного подождать, чтоб dnsmasq добавил IP-адрес в sets. Но после добавления всё происходит моментально
  • Существуют приложения, которые не используют DNS-сервер роутера, а используют свою встроенную реализацию резолвинга прям в приложении. Здесь просто требуется отключение этой функции, подробнее в конце статьи.

Как это работает?

Тут нет никакой магии, всё реализуется довольно распространёнными open source инструментами. Два главных участника этой затеи — это dnsmasq и nftables.

Рассмотрим всё на примере сайта graylog.org. WAF Cloudflare настроен у него на блокировку по стране, это означает, что с российского IP доступ запрещён.

Для соединения с сайтом прежде всего компьютер отправляет роутеру DNS запрос, в котором просит зарезолвить домен. Начиная с этого момента включается механизм обхода. За DNS в OpenWrt отвечает dnsmasq. У него есть крутая фича: можно задать домен в конфигурации и все зарезолвенные IP-адреса этого домена он будет складывать в nftables sets.

Выглядит конфигурация таким образом:

config ipset list name 'vpn_domains' list domain 'graylog.org' 

list name — это тот самый set, в который требуется складывать IP-адреса.

Dnsmasq получает запрос на резолвинг домена graylog.org, спрашивает адрес у вышестоящего DNS сервера, получает их. После этого отдаёт IP-адрес клиенту и складывает их в set vpn_domains.

Далее, когда роутеру приходит пакет, направленный к IP-адресу из списка, маршрутизация отправляет его в заранее поднятый туннель. А весь остальной трафик идёт, как раньше — через провайдера. Более подробно о маршрутизации и туннелях будет чуть дальше, а пока посмотрите схему работы, которую я нарисовал в одном заблокированном сервисе благодаря этому методу:

Что потребуется

  1. В первую очередь, роутер, поддерживающий OpenWrt. Если у вас нет роутера, поддерживающего OpenWrt, то я составил список подходящих роутеров, которые можно купить в России и в соседних странах. С выходом 23.05 список поддерживаемых роутеров расширился, смотрите рекомендации по поиску в конце той статьи.
  2. Какой-нибудь VPN. Точно работают с OpenWrt: Wireguard, OpenVPN, Shadowsocks.
    Если давно хотели свой сервер с VPN, то вот моя подборка VPS провайдеров, у которых есть российский эквайринг и сервера вне России (в России у них тоже есть). Wireguard наиболее прост в настройке, но есть вероятность его блокировки в ближайшем будущем. Но пока что можно начать с него, чтоб не забуксовать на этом этапе. Статья с обзором решений для простого разворачивания и управления WG-сервером.
  3. Умение работать в консоли Linux или желание научиться этому.
  4. Осознание, что это не простая установка VPN на винду, а решение состоящее из нескольких связаных программ, которое может не заработать с первого раза. Существует вероятность, что придётся страдать и разбираться.

Настройка

Автоматическая установка и настройка через shell-скрипт

Я написал скрипт, который автоматизирует всё, что написано ниже.
Предполагается, что у вас свежая установка OpenWrt или не особо навороченная. В случаях, когда у вас уже есть туннели, и какая-то другая логика обхода, скрипт может отработать неверно.

Вам нужно зайти на роутер по ssh и запустить:

Habr не поддерживает встраивание asciinema. Визуально ход настройки через скрипт можно посмотреть на сайте asciinema:
https://asciinema.org/a/614149

В первую очередь вам нужно выбрать какой туннель будет использовать роутер. Для WG можно сразу предоставить данные, и скрипт вам сам настроит WG.

OpenVPN, sing-box, tun2socks конфигурируется чуть сложнее. Поэтому для них создаются необходимые зона, правило маршрутизации и переадресации. А саму конфигурацию клиента нужно будет настроить самостоятельно по инструкциям ниже. Для sing-box скрипт создаст файл с уже подготовленным темплейтом.

Если ваш провайдер подменяет DNS запросы, то согласитесь на установку DNSCrypt-proxy2 или stubby. Второй занимает намного меньше места, давая тот же результат. Если не знаете, нужно ли оно вам, можете пропустить. Потом можно будет установить заново запустя скрипт.

Далее нужно будет выбрать необходимый список доменов.

С помощью скрипта можно поменять один туннель на другой. Он исправит правила в firewall. Но остановить другой туннель нужно будет самостоятельно. Например, у вас был OpenVPN с интерфейсом tun0, и вы поставили sing-box. Здесь будет конфликт интерфейсов. Нужно будет стопнуть openvpn службу и убрать её из автозапуска. Или можно вручную поменять один из них с tun0 на tun1.

Если возникли вопросы по определенным пунктам или хотите настроить вручную, читайте дальше.

Настраиваем туннель

OpenWrt поддерживает несколько туннелей. Чтобы не перегружать эту статью, для каждого протокола есть свой мануал:

  • Wireguard на OpenWrt
  • OpenVPN на OpenWrt
  • Sing-box и tun2socks на OpenWrt. Они поддерживают Shadowsocks, SOCKS5, Trojan, VMess, VLESS итд

Если вы покупаете VPN как продукт, он, скорее всего, поддерживает OpenVPN.

Установка пакетов

В первую очередь нужен пакет dnsmasq-full. По дефолту в OpenWrt идёт урезанный dnsmasq для экономии места.

Dnsmasq ключевой пакет в системе и его удаление ломает DNS на роутере. Поэтому для установки сначала нужно выгрузить его пакет в /tmp.
Если у вас что-то важное настроено в /etc/config/dhcp , не выполняйте последнюю строку, перенесите конфигурацию вручную.

opkg update && cd /tmp/ && opkg download dnsmasq-full opkg remove dnsmasq && opkg install dnsmasq-full --cache /tmp/ mv /etc/config/dhcp-opkg /etc/config/dhcp 

Также для скрипта обновления списков и скрипта проверки потребуется curl

opkg install curl 

Настройка маршрутизации

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

Начнём с создания специальной таблицы маршрутизации. Можно командой

echo '99 vpn' >> /etc/iproute2/rt_tables 

Можно добавить вручную строку 99 vpn последней строкой в файл /etc/iproute2/rt_tables.

Добавим правило, чтоб весь маркированный трафик уходил в созданную таблицу. Через UCI:

uci add network rule uci set network.@rule[-1].name='mark0x1' uci set network.@rule[-1].mark='0x1' uci set network.@rule[-1].priority='100' uci set network.@rule[-1].lookup='vpn' uci commit network 

Либо добавляем это правило в файл /etc/config/network

config rule option name 'mark0x1' option mark '0x1' option priority '100' option lookup 'vpn' 

Добавляем правило для таблицы маршрутизации, чтоб весь трафик, направленный в эту таблицу, уходил в туннель.

В случае c WG используем interface wg0. Раньше через UCI нельзя было сделать такое правило и приходилось костылять через hotplug. Теперь можно через UCI:

uci set network.vpn_route=route uci set network.vpn_route.interface='wg0' uci set network.vpn_route.table='vpn' uci set network.vpn_route.target='0.0.0.0/0' uci commit network 

Либо добавляем это правило в /etc/config/network

config route 'vpn_route' option name 'vpn' option interface 'wg0' option table 'vpn' option target '0.0.0.0/0' 

Если вам нужно временно выключить обход блокировок, просто закомментируйте строку option interface .

В случае с OpenVPN, Sing-box, tun2socks всё так же костыляем через hotplug. Потому что они сами создают интерфейс, который обозначается в OpenWrt как device , а тип device в route записать нельзя.

Создаём файл /etc/hotplug.d/iface/30-rknroute со скриптом внутри:

#!/bin/sh sleep 5 ip route add table vpn default dev tun0 

Задержка нужна для sing-box. Вероятно, для других можно обойтись без неё.

Можно сделать конфигурацию с прослойкой в /etc/config/network , что бы в route закидывать interface. Но на sing-box интерфейс tun0 не поднимается при рестарте сети. Вероятно, для OpenVPN может быть другое поведение. Поэтому вот пример с конфигурацией прослойки:

config interface 'vpn0' option name 'vpn0' option proto 'none' option auto '1' option device 'tun0' config route 'vpn_route' option name 'vpn_route' option interface 'vpn0' option table 'vpn' option target '0.0.0.0/0' 

Настройка firewall

Необходимо создать зону для туннеля, чтобы разрешить хождение трафика через туннель. Эта настройка описана в каждом мануале по туннелям.

Добавляем nftables set с именем vpn_domains, это список, куда будут складываться заблокированные IP-адреса. И правило, которое будет маркировать весь трафик, который идёт к IP-адресам из этого списка.

uci add firewall ipset uci set firewall.@ipset[-1].name='vpn_domains' uci set firewall.@ipset[-1].match='dst_net' uci add firewall rule uci set firewall.@rule[-1]=rule uci set firewall.@rule[-1].name='mark_domains' uci set firewall.@rule[-1].src='lan' uci set firewall.@rule[-1].dest='*' uci set firewall.@rule[-1].proto='all' uci set firewall.@rule[-1].ipset='vpn_domains' uci set firewall.@rule[-1].set_mark='0x1' uci set firewall.@rule[-1].target='MARK' uci set firewall.@rule[-1].family='ipv4' uci commit firewall 

Файлы, откуда будем брать IP-адреса, больше не нужны. Ваш роутер сам будет формировать список IP-адресов под ваши потребности.

Подтягиваем список доменов скриптом

Изначальный скрипт hirkn со временем разросся новыми списками, проверкой доступности интернета и конвертацией для доменов. А загрузка списков IP-адресов в sets занимала прилично времени.

При использовании доменов нужен только один список, а точнее, конфигурация для dnsmasq, которую нужно закинуть в /tmp/dnsmasq.d/ . Там хранятся «временные» конфигурации dnsmasq.

Конфиг выглядит так:

nftset=/graylog.org/4#inet#fw4#vpn_domains nftset=/terraform.io/4#inet#fw4#vpn_domains 

Это означает, что когда приходит запрос на резолвинг домена graylog.org и всех его субдоменов, все зарезолвенные IP-адреса будут добавляться в список vpn_domains.

Когда я использовал community список от antifilter.download, приходилось конвертировать список доменов в dnsmasq конфиг скриптом на роутере. Но теперь есть готовые конфиги, которые просто надо скачать.

Таким образом, теперь всё, что требуется делать скриптом:

  • Проверять есть ли доступ к интернету. Тут поясню: после перезагрузки роутера доступ к интернету может появиться не сразу (поиск сети в 4G, отсуствие электричества у коммутатора в доме) и скрипт просто не выполнится. Это значит обход блокировок работать не будет. Без такой проверки нужно будет заходить на роутер и запускать скрипт вручную
  • Выкачка готового конфига сразу в /tmp/dnsmasq.d/
  • Проверка конфига. У меня настроен CI, который проверяет валидность конфигов после их генерации, но перепроверка лишней не будет
  • Если конфиг валидный, то рестарт Dnsmasq

Скрипт для примера с конфигом для inside-dnsmasq-nfset.lst. Ссылки на другие списки в репозитории.

#!/bin/sh /etc/rc.common START=99 start () < DOMAINS=https://raw.githubusercontent.com/itdoginfo/allow-domains/main/Russia/inside-dnsmasq-nfset.lst count=0 while true; do if curl -m 3 github.com; then curl -f $DOMAINS --output /tmp/dnsmasq.d/domains.lst break else echo "GitHub is not available. Check the internet availability [$count]" count=$((count+1)) fi done if dnsmasq --conf-file=/tmp/dnsmasq.d/domains.lst --test 2>&1 | grep -q "syntax check OK"; then /etc/init.d/dnsmasq restart fi > 

Складываем его в /etc/init.d/getdomains .

Делаем исполняемым и добавляем в автозагрузку

chmod +x /etc/init.d/getdomains ln -sf ../init.d/getdomains /etc/rc.d/S99getdomains 

Добавим автоматическое обновление доменов. Открываем редактирование crontab crontab -e
И вставляем строку

0 */8 * * * /etc/init.d/getdomains start 

Рестартуем сеть и первый раз запускаем скрипт вручную

service network restart service getdomains start 

Теперь у вас работает обход блокировок на роутере ��

Свои домены

Открываем конфиг /etc/config/dhcp и добавляем в конец:

config ipset list name 'vpn_domains' list domain 'graylog.org' list domain 'terraform.io' 

Каждый необходимый домен добавляем новой строкой. Dnsmasq работает по wildcard, поэтому субдомены добавлять не нужно.

Для применения этой настройки нужно рестартануть dnsmasq

service dnsmasq restart 

Провайдер нарушает работу DNS

У вас может работать обход блокировок, но провайдер будет подменять IP-адреса у заблокированных доменов. Из-за этого обход блокировок не будет работать.

Какие бывают ситуации?
Опишу, что я видел лично. Пойдём по возрастанию в степени упоротости.

  1. DNS-серверы провайдера просто подменяют IP-адреса, если использовать их. В этом случае можно просто поменять DNS сервер на роутере с провайдерского на 8.8.8.8, 8.8.4.4 и т.д.
  2. DNS-серверы подменяют запросы на своих серверах. Помимо этого, если обращаться к другим DNS-серверам (например 8.8.8.8), то оборудование провайдера перехватывает эти запросы и подменяет их.
  3. Провайдер тупо блокирует весь трафик по 53 порту, кроме запросов к своим DNS-серверам. Тут в принципе не получится использовать другие DNS-серверы.

Если у вас первый вариант, то просто поменяйте DNS-сервер в настройках. А вот если 2 или 3, то вам нужно настроить резолвер, который использует DNS over TLS или DNS over HTTPS.

Для OpenWrt есть два варианта:

  • DNSCrypt-proxy2 — много чего умеет, но занимает 10.7M
  • Stubby — не такой навороченный и поэтому занимает 36K + библиотеки

Оба приложения решают проблемы 2 и 3. Выбирать вам. Если у вас на роутере 16М флешка, то выбор очевиден.

DNSCrypt-proxy2
opkg update && opkg install dnscrypt-proxy2 

Его конфигурационный файл находится в /etc/dnscrypt-proxy2/dnscrypt-proxy.toml
Можно поменять используемые серверы в server_names .

После этого нужен рестарт

service dnscrypt-proxy restart 

Получили резолвер, который шифрует свои запросы. Он висит по дефолту на 127.0.0.53:53 .

Можно послать ему DNS-запрос прямо на роутере

nslookup itdog.info 127.0.0.53:53 

Настраиваем dnsmasq, чтоб он использовал dnscrypt как DNS-сервер.

Необходимо в конфиге /etc/config/dhcp в блоке config dnsmasq

  • Убрать или заккомментировать параметры list server
  • Добавить option noresolv ‘1’
  • Добавить dnscrypt как сервер list server ‘127.0.0.53#53’

Можно это сделать через команды UCI:

uci set dhcp.@dnsmasq[0].noresolv="1" uci -q delete dhcp.@dnsmasq[0].server uci add_list dhcp.@dnsmasq[0].server="127.0.0.53#53" uci commit dhcp 
service dnsmasq restart 
Stubby
opkg update && opkg install stubby 

Stubby использует по дефолту DNS-серверы Cloudflare. Если нужно поменять, настраивается в /etc/config/stubby .
По дефолту висит на 127.0.0.1:5453 .

Настройка dnsmasq идентичная, только вместо 127.0.0.53#53 , нужно указать 127.0.0.1#5453 .

Настройка через Ansible

  • Теперь через него можно настроить OpenVPN и sing-box, пока что тоже в полуручном режиме
  • Можно настроить помимо доменов ещё списки IP-адресов
  • Появился выбор между DNSCrypt-proxy2 и Stubby, либо вообще их отсутствие.
  • Для доменов можно выбрать необходимый список
  • И через него можно настраивать все последние (21, 22, 23) версии OpenWrt

Поиск ошибок и возможные проблемы

Есть скрипт для автоматического поиска ошибок. Как его использовать описано тут

Также есть отдельная статья, с подробным разбором каждого пункта.

В плане туннелей там описан поиск ошибок только для WG. OpenVPN проверяется примерно так же, а как проверять sing-box и tun2socks описано в их статье.

Если не получилось разобраться самостоятельно, есть чат для взаимопомощи.

Не работает на определённой программе или устройстве

Такое может встречаться, когда DNS запросы не доходят до роутера. И причина в том, что сейчас некоторые программы и даже целые операционные системы стали по дефолту шифровать DNS.

Если у вас возникает такая проблема на устройстве или программе, слова для гугла: «$PROGRAM + DNS encrypt/DNS over https/DNS over tls».

Firefox

Firefox какое-то время назад начал это делать по умолчанию. Цитата c support.mozilla.org:

В 2019 году мы завершили развёртывание DoH по умолчанию для всех пользователей Firefox для компьютера в Соединённых Штатах и в 2021 году — для всех пользователей Firefox для компьютера в Канаде. Мы начали развёртывание по умолчанию для пользователей Firefox на ПК в России и Украине в марте 2022 года. Сейчас мы работаем над развёртыванием DoH в большем числе стран.

Отключается в SettingsPrivacy & Security — в самом низу DNS over HTTPSOff.

Android

Начиная с 9ой версии это включено по умолчанию. Здесь идёт шифрование всех запросов в системе.

В обычном Android отключается в SettingsNetwork & InternetAdvancedPrivate DNSOff

В MIUI: Settings — в поиске «dns» — Private DNSOff.

Пишите в комментарии, где ещё сталкивались с этим.

DNS-сервер роутера не является основным в локальной сети

Например, у вас на домашнем сервере развёрнут DNS-сервер и он раздаётся клиентам через DHCP. Все DNS запросы идут к нему, а не к dnsmasq на роутере. В этой ситуации создание списков IP-адресов не работает.

Клиенты должны использовать DNS-сервер OpenWrt роутера, а он уже будет обращаться к вашему отдельному DNS-серверу. Это настраивается в /etc/config/dhcp

list server '192.168.1.2#53' 

IPv6

Всё описанное тут, и скрипт в том числе, написано для IPv4. Поддержку IPv6 нужно допиливать самостоятельно.
Я это сделаю, когда у меня появится провайдер, предоставляющий IPv6.

Благодарности

Благодарю @viloncool за направление в сторону доменов.

Также спасибо за помощь в исправлении ошибок и советы, как сделать лучше, следующим людям:
@sigo73, @Grayver, @SantaClaus16, @dborzov, hotsezus.

Материалы про VPN и точечный обход блокировок, которые не дотягивают до полноценной статьи, публикую в моём телеграм-канале.

  • точечный обход блокировок
  • обход блокировок
  • dnsmasq
  • nftables
  • openwrt

Настройка точечного обхода блокировок на роутере с OpenWRT

Думаю, не стоит объяснять, почему проблема блокировок в рунете стоит настолько остро. И дело даже не в пресловутых сериалах на торрентах. Если не обходить блокировки, то банально сложно работать: то bugs.python.org заблокирован, то документация по нужному тебе сервису недоступна, то какой-нибудь репозиторий с пакетами отвалился, из-за чего у тебя внезапно перестают собираться контейнеры, то LinkedIn пишет письма на почту, а зайти на него ты не можешь. Например, вот здесь можно найти список опенсорс-проектов, которые были заблокированы Роскомнадзором. Это всё тянется еще с тех времён в 2018 году, когда Роскомнадзор пытался накрыть Telegram ковровыми блокировками, блокируя без разбора всех направо и налево. Какое-то время я пытался с этим жить, игнорируя проблему, но однажды мое терпение лопнуло, во мне пробудился дух цифрового сопротивления, и я решил настроить себе VPN — да так, чтобы это работало на всех моих устройствах сразу.

Resistance Dog Good Boy

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

Так как большая часть моего трафика всё-таки ходит к незаблокированной части интернета, то логично пускать через VPN лишь тот трафик, который в этом нуждается. Ну нет ведь смысла гонять через VPN просмотр видео на YouTube или какую-нибудь игру? В итоге получится просто более медленный доступ, а профита никакого.

Стоит отметить, что если вам нужен обход блокировок только на одном устройстве, там вам намного проще будет настроить VPN именно на нём. У многих провайдеров VPN есть программы-клиенты, которые в несколько кликов по красивым кнопкам настроят вам всё, что нужно — просто погуглите, сравните цены и условия. Ещё можете посмотреть в сторону таких бесплатных проектов, как АнтиЗапрет.

Опишу свой процесс настройки роутера на OpenWRT с точечным обходом блокировок. Мне уже приходилось делать это пару раз (то переезд со сменой провайдера, то смена роутера), и вот на третий раз я решил наконец задокументировать этот процесс, чтобы в следующие разы было легче. Может и ещё кому пригодится.

Роутер и прошивка

OpenWRT — это опенсорсный проект, который разрабатывает прошивки для роутеров на основе Linux. В той или иной мере, пожалуй, поддерживаются все существующие девайсы. Внутри есть даже свой собственный пакетный менеджер. Так как роутер с OpenWRT — это почти настоящая линукс-машина, то открывается огромное поле для различных извращений — файловые шары, торрент-клиенты, блокировка рекламы на уровне роутера, VPN — да что угодно.

Мой нынешний роутер — это Xiaomi Mi WiFi Router 3G. Выбрал его, потому что в нём достаточно мощи, чтобы на нём хорошо работала OpenWRT. Да и вообще, Mir3G — это, похоже, один из самых популярных девайсов в тусовке людей, которые занимаются дрессировкой роутеров, так что в сети по нему уже есть много мануалов и обсуждений на форумах. Если захотите купить такой же, то будьте аккуратны с конкретной моделью — их две под одним названием, а хорошая только та, у которой есть порт USB3. Такой роутер должно быть несложно купить на Авито или других досках объявлений.

У меня на данный момент установлена почти последняя версия прошивки:

OpenWrt 19.07.3, r11063-85e04e9f46 

Прошивка OpenWRT и базовая настройка роутера выходит за рамки этой статьи. Поищите мануалы для вашего роутера. Далее предполагается, что у вас уже есть роутер с OpenWRT, подключенный к интернету, и к нему настроен доступ по SSH.

Блокировки

Грубо говоря, существует два типа блокировок:

  1. по доменным именам;
  2. по IP-адресам.

Нам нужно победить оба. Разберёмся с каждым из них по порядку.

Шаг 1. Шифрованный DNS

DNS (Domain Name System) — это распределенная система (нет, это не сеть магазинов), состоящая из множества серверов по всему миру, которая позволяет вашему компьютеру преобразовать человекочитаемое имя сайта в машиночитаемый IP-адрес, например, из github.com получить 140.82.121.3 . Этот процесс называется «разрешением» или «резолвингом» доменного имени.

Блокировка по доменным именам зачастую реализуется провайдером следующим образом: ваш роутер по умолчанию использует DNS-сервер, который контролируется провайдером и для заблокированных доменных имён возвращает специальный адрес сайта-заглушки. Именно это происходит, когда вы видите в браузере «доступ к ресурсу ограничен в соответствии со 149-ФЗ».

Доступ ограничен

Кажется, что решение очевидно — просто не пользоваться DNS-сервером провайдера, а использовать, например, Google DNS, IP-адреса которого уже стоит знать наизусть как считалку — 8.8.8.8, 8.8.4.4 . Раньше это действительно работало, но сегодня провайдеры уже не дадут вам так просто себя обмануть.

Поскольку DNS — это очень старый протокол, в котором никак не было предусмотрено шифрование от слова «вообще», у провайдеров есть возможность перехватывать ваши запросы и подменять ответы, вставляя свой сайт-заглушку, даже если запрос шёл, например, к Google DNS. Именно этим они и занимаются. По сути, провайдер проводит против вас атаку DNS hijacking.

Вот как это работает, если всё хорошо. В таком сценарии можно даже не заметить этого «человека посередине» в лице вашего провайдера:

DNS-запрос к незаблокированному домену

А вот так это работает, когда всё плохо. Провайдер наверняка даже не отправляет запрос к DNS-серверу, которому он предназначался, а просто сразу же возвращает ответ, подставляя адрес своей заглушки:

DNS-запрос к заблокированному домену

Но по-настоящему эффективное решение есть. Если провайдер не сможет увидеть, к какому домену происходит обращение, то не сможет и подменить ответ. А ещё лучше, если он вообще не будет знать, что происходит резолвинг имени. Этого можно достичь шифрованием.

Совсем недавно стали появляться шифрованные версии протокола DNS — DNSCrypt, DoT (DNS-over-TLS) и DoH (DNS-over-HTTPS). Судя по всему, именно последний из них (DoH) получит наибольшую популярность. При использовании этого протокола DNS-запрос складывается внутрь HTTPS-запроса, который, само собой, зашифрован. Для человека посередине, который перехватит такой трафик, это будет выглядеть как просто один из миллиарда шифрованных HTTP-запросов к Google или Cloudflare.

DNS-over-HTTPS мы и собираемся настроить в первую очередь. Ничего принципиально нового я не скажу, вся информация взята с соответствующей страницы вики OpenWRT.

~ $ ssh root@192.168.1.1 root@192.168.1.1's password: BusyBox v1.30.1 () built-in shell (ash) _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ----------------------------------------------------- OpenWrt 19.07.3, r11063-85e04e9f46 ----------------------------------------------------- root@OpenWrt:~# 
opkg update 
opkg install dnsmasq https-dns-proxy luci-app-https-dns-proxy 
/etc/init.d/rpcd restart 
# это было до настройки $ nslookup linkedin.com . Name: linkedin.com Address: 95.213.158.61 # это после настройки $ nslookup linkedin.com . Name: linkedin.com Address: 13.107.42.14 Name: linkedin.com Address: 2620:1ec:21::14 

Обратите внимание, что адреса возвращаются разные: до настройки DoH — неправильный, это результат подмены адресов провайдером, а после — правильный. Можно считать это маленькой победой!

По умолчанию используются DNS-over-HTTPS сервера от Google и Cloudflare — очень разумный выбор, потому что на этих двух компаниях держится добрая половина глобального интернета, и их блокировка наверняка приведёт к катастрофическим последствиям, так что блокировать их, надеюсь, никто не будет. Если же хочется сменить используемые сервера, то сделать это теперь можно через веб-интерфейс: Services > DNS HTTPS Proxy .

OpenWRT LuCI DoH settings

Сам по себе обход блокировок по DNS вряд ли даст ожидаемый эффект, потому что, как правило, в довесок к доменному имени, ресурс блокируется еще и по IP-адресам — видимо, для надежности. Это следующий тип блокировок, которые нужно победить.

Стоит упомянуть про побочные эффекты от такой настройки — могут стать недоступными различные внутренние ресурсы провайдера. Например, когда у меня кончается интернет и я забываю его оплатить, провайдер просто не может меня переадресовать на страницу, куда он обычно направляет своих забывчивых абонентов. Для меня выглядит это всё так, будто интернет просто пропал, без каких-либо объяснений. Я даже первый раз из-за этого чуть не поругался с поддержкой, а оказалось, что это я сам дурак. Что ж, просто приходится платить заранее.

Если нравится статья, то подпишитесь на уведомления о новых постах в блоге, чтобы ничего не пропустить! А ещё читайте другие мои посты!

Шаг 2. Настройка VPN WireGuard

Для того, чтобы обходить блокировки по IP-адресам, придётся настроить VPN — другого способа нет. VPN «спрячёт» от провайдера ваши IP-пакеты так, что он не будет знать куда именно они направляются и что в себе содержат. В качестве протокола предлагаю использовать WireGuard — легковесный VPN-протокол, который к тому же довольно легко настраивать.

Всё описанное дальше вдохновлено и по сути является пересказом вот этой замечательной статьи на Хабре с некоторыми (минимальными) дополнениями от меня.

VPN — это клиент-серверный протокол. Наш роутер будет клиентом, но также нам обязательно нужен сервер. Можно либо поднять свой VPN-сервер самостоятельно (смотрите инструкцию в статье по ссылке выше, это не сложно), либо оформить подписку на какой-нибудь готовый VPN-сервис. Я пробовал оба варианта, но поддерживать свой VPN-сервер оказалось достаточно трудозатратно, и это тоже, как ни странно, стоит денег. Сложнее всего найти хостинг для своего VPN с незаруиненной репутацией. Проблема, с которой я столкнулся, заключалась в том, что все дешевые хостинги уже имеют плохую репутацию (спасибо вам, господа спамеры), и некоторые ресурсы, типа Пикабу (который тоже, как выяснилось, немножко заблокирован), сразу же заранее отвечают ошибкой 403. Намного проще купить готовый VPN, и пусть лучше кто-то другой за меня беспокоится о том, чтобы мне были доступны все нужные мне сайты.

В последнее время появляется очень много VPN-сервисов, которые работают по протоколу WireGuard — это нынче горячая тема. Недавно поддержка WireGuard была добавлена в основной состав ядра Linux. Погуглите, выбор сервисов действительно есть. Сейчас я пользуюсь RedShieldVPN, и меня пока что всё устраивает.

Бонус для читателей: при регистрации по этой ссылке вам подарят месяц бесплатного VPN.

Дальше буду описывать процесс для RedShieldVPN, но, думаю, для других подобных сервисов процесс должен быть похожим.

    Переходим в раздел WireGuard, авторизуемся, выбираем страну и скачиваем конфиг. Я обычно выбираю какую-нибудь европейскую страну, чтобы пинг был приемлемым. В этот раз возьму Финляндию. Вот примерно такой файл конфигурации скачался (ключи я заменил):

[Interface] Address = 10.7.1.177/32, 6343:72e7:7ac3:e245:2675:1b79:4638:193a/128 PrivateKey = private_key_goes_here DNS = 10.254.254.254 MTU = 1412 [Peer] PublicKey = public_key_goes_here AllowedIPs = 0.0.0.0/0, ::/0 Endpoint = fin.lopata.today:51820 PersistentKeepalive = 10 
opkg install wireguard 
config interface 'wg0' option private_key 'private_key_goes_here' list addresses '10.7.1.177/32' option listen_port '51820' option proto 'wireguard' config wireguard_wg0 option public_key 'public_key_goes_here' option allowed_ips '0.0.0.0/0' option route_allowed_ips '0' option persistent_keepalive '10' option endpoint_host 'fin.lopata.today' option endpoint_port '51820' 
/etc/init.d/network restart 
# wg show interface: wg0 public key: C4zR9CoziizrJcPFtcUg4yyyG1S6+a+/bAuGi2BpmlM= private key: (hidden) listening port: 51820 peer: public_key_goes_here endpoint: 185.103.110.133:51820 allowed ips: 0.0.0.0/0 latest handshake: 33 seconds ago transfer: 1012 B received, 3.53 KiB sent persistent keepalive: every 10 seconds 

Шаг 3. Скрипт для сбора списков заблокированных адресов

Это возможно благодаря крутейшему сервису antifilter.download, который обрабатывает выгрузки Роскомнадзора и отдает их в виде списков IP-адресов в машиночитаемых форматах. Мы настроим периодическую выгрузку списков заблокированных адресов с antifilter.download, чтобы всегда иметь актуальную информацию о блокировках. По моему опыту обновлять этот список раз в сутки (например, ночью) вполне достаточно.

Кроме того, нам нужно настроить файрволл роутера, чтобы он помечал пакеты, которые направляются к заблокированным адресам, специальным маркером. Такие маркированные пакеты должны маршрутизироваться роутером через VPN.

Начнём со скрипта, который реализует эту логику по обновлению списков заблокированных адресов.

opkg install ipset curl 
#!/bin/sh START=99 dir=/tmp/lst mkdir -p $dir echo "Downloading lists of blocked addresses. " curl -z $dir/subnet.lst https://antifilter.download/list/subnet.lst --output $dir/subnet.lst curl -z $dir/ipsum.lst https://antifilter.download/list/ipsum.lst --output $dir/ipsum.lst echo "Restarting firewall. " /etc/init.d/firewall restart 
chmod +x /etc/init.d/hirkn 
ln -s /etc/init.d/hirkn /etc/rc.d/S99hirkn 
crontab -e 

В открывшемся редакторе нужно добавить на новой строке:

0 4 * * * /etc/init.d/hirkn 
/etc/init.d/cron enable /etc/init.d/cron start 
/etc/init.d/hirkn 

Если файлы со списками заблокированных адресов появились, то всё ок:

# ls -lh /tmp/lst/ -rw-r--r-- 1 root root 270.4K Dec 7 07:18 ipsum.lst -rw-r--r-- 1 root root 132 Dec 7 07:18 subnet.lst 

Шаг 4. Дальнейшая настройка

Теперь осталось настроить роутер так, чтобы он правильно маршрутизировал пакеты через VPN-туннель.

    Создадим таблицу маршрутизации для VPN, добавив в файл /etc/iproute2/rt_tables строчку следующего вида:

99 vpn 
ip route add table vpn default dev wg0 

Чтобы сделать это изменение постоянным, чтобы оно переживало перезагрузки роутера, создадим файл /etc/hotplug.d/iface/30-rknroute с вот таким содержимым:

#!/bin/sh ip route add table vpn default dev wg0 
config rule option priority '100' option lookup 'vpn' option mark '0x1' 
config zone option name 'wg' option family 'ipv4' option masq '1' option output 'ACCEPT' option forward 'REJECT' option input 'REJECT' option mtu_fix '1' option network 'wg0' config forwarding option src 'lan' option dest 'wg' config ipset option name 'vpn_subnets' option storage 'hash' option loadfile '/tmp/lst/subnet.lst' option match 'dst_net' config ipset option name 'vpn_ipsum' option storage 'hash' option loadfile '/tmp/lst/ipsum.lst' option match 'dst_net' config rule option name 'mark_subnet' option src 'lan' option proto 'all' option ipset 'vpn_subnets' option set_mark '0x1' option target 'MARK' config rule option name 'mark_ipsum' option src 'lan' option proto 'all' option ipset 'vpn_ipsum' option set_mark '0x1' option target 'MARK' 
/etc/init.d/network restart 

И запустим наш скрипт:

/etc/init.d/hirkn 

Шаг 5. Отключаем IPv6

Этот шаг мой самый нелюбимый, потому что я за всё новое и против всего старого. По моему глубокому убеждению IPv4 уже давно должен умереть и быть вытеснен шестой версией протокола. К сожалению, дела у IPv6 пока идут не так гладко, как хотелось бы (сейчас он занимает всего около 30% процентов трафика).

Проблема в том, что antifilter.download выдаёт только заблокированные IPv4 адреса. Это значит, что наш обход блокировок не будет работать по IPv6. Если разрешить вашему роутеру работать по IPv6, то многие ваши устройства предпочтут открывать сайты по IPv6 либо напарываясь на страницы с блокировками от провайдеров, либо просто получая ошибки подключения по таймауту.

Отключаем IPv6 (команды взяты отсюда):

uci set 'network.lan.ipv6=off' uci set 'network.wan.ipv6=off' uci set 'dhcp.lan.dhcpv6=disabled' /etc/init.d/odhcpd disable uci commit 

После этого может потребоваться ещё одна перезагрузка роутера, чтобы он перестал раздавать вновь подключенным устройствам IPv6-адреса.

Заключение

Вот как-то так можно при помощи несложных (ладно, сложных) манипуляций настроить свой роутер на точечный обход блокировок. Все незаблокированные сайты работают как обычно, а заблокированные — через VPN. С такой конфигурацией можно полностью забыть про мелкие пакости от Роскомнадзора и начать, наконец, жить 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *