29 мая в 14:34

Как обойти блокировки сайтов, не направляя весь трафик через VPN из песочницы

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

На Хабре, да и не только на нем, есть множество инструкций, как обойти блокировки с помощью VPN, в частности, с помощью OpenVPN, есть и прекрасные пошаговые консольные скрипты установки OpenVPN. Однако чаше всего подобные инструкции подразумевают, что в результате весь интернет-трафик будет идти через VPN-соединение, что может быть неудобным по ряду причин. И в этом коротком посте я хотел рассказать, как настроить OpenVPN Access Server и обычный OpenVPN для обслуживания только заблокированных ресурсов.

Установка и начальная настройка OpenVPN Access Server проста и описана много раз. Само собой, что вам понадобится для этого какой-либо сервер за пределами страны-цензора (AWS, Cloudatcost, DigitalOcean, etc.). Суть первоначальной настройки в нашем случае сводится к 3 пунктам:

  1. Advanced VPN → Additional OpenVPN Config Directives (Advanced): Server Config Directives — Добавляем непосредственно список адресов, к которым хотим иметь доступ через OpenVPN (можно воспользоваться командами nslookup или dig, чтобы определить эти адреса):

    push route 77.88.55.77 255.255.255.255 vpn_gateway
    push route 5.255.255.77 255.255.255.255 vpn_gateway
    push route 77.88.55.88 255.255.255.255 vpn_gateway
    push route 5.255.255.88 255.255.255.255 vpn_gateway

    Сохраняем настройки, обновляем конфигурацию сервера

    image

  2. VPN Settings → Routing: Should VPN clients have access to private subnets (non-public networks on the server side)? — Yes, using NAT, после чего добавляем CIDR-блоки сетей, в которых находятся заблокированные ресурсы

    77.88.55.0/24
    5.255.255.0/24

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

  3. VPN Settings → Routing: Should client Internet traffic be routed through the VPN? — No. Сохраняем настройки, обновляем конфигурацию сервера

    image

Конечно, при всей простоте и удобстве такой вариант имеет недостаток в виде ограничения на 2 одновременных подключения в бесплатной версии (минимальный пакет в 10 лицензий на год по $15 за каждую не всем подойдет), поэтому ниже вариант как достичь того же с помощью обычного OpenVPN (файл /etc/openvpn/server.conf):

#Эта строка должна быть удалена или закомментирована
#push "redirect-gateway def1 bypass-dhcp"

#Google public DNS
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
#Ключевой момент -- прописываем маршруты на DNS-сервера через VPN
push "route 8.8.8.8 255.255.255.255 vpn_gateway"
push "route 8.8.4.4 255.255.255.255 vpn_gateway"
#Добавляем необходимые ip-адреса
push "route 77.88.55.77 255.255.255.255 vpn_gateway"
push "route 5.255.255.77 255.255.255.255 vpn_gateway"
push "route 77.88.55.88 255.255.255.255 vpn_gateway"
push "route 5.255.255.88 255.255.255.255 vpn_gateway"

Не забываем перезагрузить конфигурацию нашего сервер:

sudo service openvpn reload

Подключившись после этого к вашему серверу, вы можете проверить результат, скажем, сделав трассировку маршрута на один из адресов/доменов, который заблокирован, а потом на другой, который разрешен в вашей стране. Ожидаемый результат: в первом случае трафик будет идти через шифрованный туннель на ваш сервер, во втором — как обычно, через сеть вашего провайдера. Этот способ прекрасно работает на всех основных платформах, в том числе и на iOS.

Таким образом, при минимальных усилиях вы получаете быстро работающий интернет с несколько замедленным доступом к заблокированным ресурсам. Буду рад, если это кому-то поможет :)
@tijs
карма
5,0
рейтинг 3,0
web developer, devops
Самое читаемое Разное

Комментарии (52)

  • +1
    Как раз искал, как пустить через VPN только некоторые сайты. Спасибо за публикацию.
  • 0

    а можно все это делать по именам доменов а не ip адресам?

    • +1
      Для браузеров есть различные плагины, расширяющие возможности настроек прокси-серверов. Настраиваются прокси-сервера и в них заворачиваются только нужные домены.
      • 0
        <a href=«https://chrome.google.com/webstore/detail/frigate-cdn-smooth-access/mbacbcfdfaapbcnlnbmciiaakomhkbkb>friGate CDN один из них. Вроде как бесплатный. Блокировка по именам доменов, только указанные домены сайтов (есть список для Украины).
    • 0

      Я себе настроил немного наоборот: на своём VPN-сервере крутится OpenVPN, ничего не знающий о блокировках.
      А в качестве клиента – роутер Микторик, на котором запущен скрипт, обходящий заданный список доменов, собирающий их IP-адреса и пускающий их через VPN.

      • 0

        Интересно, можно ли технически, реализовать это с помощью layer 7 в микротике? dns у меня так бегают в офис, а вот с vpn как то совсем не ясно

      • 0
        В последних версия появилась возможность в address-list по именам сайты заносить и mikrotik сам запрашивает ip адрес/адреса.
        • 0

          Ого, спасибо.

    • 0

      У меня поднят обычный proxy-server на машине, у которой есть доступ к недоступным с домашней машины ресурсам. На домашней машине PAC (proxy auto configuration file) файл, в котором написано, куда ходить в случае какого запроса. Ну и естественно, если запрос включает в себя недоступные ресурсы — то браузер идет к прокси-серверу

    • 0
      У меня вместо VPN используется SOCKS over SSH, а в этот SOCKS proxy заворачиваются нужные домены стандартным способом через WPAD.
      В принципе можно SOCKS proxy и за VPN расположить.
      Самое сложное — найти, куда положить скрипт для WPAD.
  • –1

    Как vpn узнает что обратились к нужному айпишнику, если идет блокировка запросов абонентов на уровне URL, IP, и DNS?

    • +1

      Все запросы к DNS заворачиваются в VPN по-умолчанию?


      push "dhcp-option DNS 8.8.8.8"
      push "dhcp-option DNS 8.8.4.4"
      #Ключевой момент -- прописываем маршруты на DNS-сервера через VPN
      push "route 8.8.8.8 255.255.255.255 vpn_gateway"
      push "route 8.8.4.4 255.255.255.255 vpn_gateway"
      • –1
        Слышал, что push "dhcp-option DNS 8.8.8.8" — win-only фича. Разве нет? И даже на моб. телефонах так можно?
        • +1
          У меня нет возможности проверить на андроид, но на iOS работает
    • +1
      Ну DNS то однозначно через VPN пускать! Что и описано в статье.
      #Ключевой момент — прописываем маршруты на DNS-сервера через VPN
      push «route 8.8.8.8 255.255.255.255 vpn_gateway»
      push «route 8.8.4.4 255.255.255.255 vpn_gateway»
      • 0

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

  • +2
    Проблема в том, что OpenVPN_as — позволяет завести только два бесплатных аккаунта, потому — лучше поднимать VPN самому. Да, это будет не одна консольная команда по запуску установочного скрипта, зато без ограничений.

    И потом, VPN — это обычный сервис по собственной безопасности, в бесплатном ВайФай московского метро, в гостиницах и тп. Лучше весь трафик через него пропускать, меньше рисков нарваться на школоло-скрипткидди.
    • 0
      согласен, это добавит безопасности, но может замедлить работу, тут уже каждый выбирает, что важнее
      • +1
        Не замечал замедления работы ни на десктопе, ни на смарте.
    • +1
      С помощью этого скрипта, можно быстро поднять OpenVPN.
    • +1

      А зачем он, если есть Pritunl?
      10-30 минут, включая разворачивание хостинга и дичтрибутива, — и свой OpenVPN-сервер с web-панелью, неограниченным числом клиентов, "организаций", и т. д.,

      • 0
        Спасибо, я не знал об этом, неплохой сервис
        • 0

          Неплохой? ;) Да просто отличный! Если для роутера подойдёт лёгкий "голый" конфиг, то для хостинга на Linux (а это самый дешёвый) лучше решения нет.

      • 0
        Есть огромное количество подобных сервисов и скриптов, и даже готовые образы OpenVPN для VPS.
      • +1
        Если я правильно понял то Pritunl платный или *Non-commercial use only https://github.com/pritunl/pritunl/blob/master/LICENSE
        • 0
          А Вы собираетесь продавать что-то? Тут, вроде, речь идёт об обходе блокировок для себя лично.
          Для некоммерческого использования он бесплатен.
  • –4
    Офис Яндекса.
    Следственные мероприятия проводятся на основании статьи 111 Криминального кодекса Украины – «государственная измена». Виновным по данной статье грозит лишение свободы сроком на 12-15 лет с конфискацией имущества.
  • 0
    Я использовал для подобного набор скриптов вот из этого репозитория:
    https://bitbucket.org/ValdikSS/antizapret
    Небольшая доработка напильником требуется. (он по-умолчанию настроен на github-репозиторий с дампом БД Роскомнадзора)
    Естественно для этого необходим свой сервер...((
  • 0
    Может, есть какая-то возможность отследить блокируемый сайт по ошибке 451, вместо того чтобы вручную их все прописывать?
    • 0
      возможно, но часто бывает так, что блокируемый сайт просто мапят на другой адрес, поэтому вы получаете 200. Если я правильно вас понял
  • 0
    А я вообще если нужно хожу через Удаленный рабочий стол Amazon AWS EC2
  • 0
    Обхожу блокировки с помощью простовпн (1$/мес) прописывая маршруты до нужных сайтов (dockerhub/linkedin/bitbucket/...) на VPN, находясь в Крыму.
    Однако побороть блокировку сервисов google (developers/cloud/issuetracker/...) я не смог, так как google все свои сервисы пропускает через один гейт www3.l.google.com. в том числе Youtube (трафик от которого я пропускать через VPN не хочу). Приходится использовать браузерное расширение специально для этих гугловых сервисов.

    Эксперты по сетям может подскажут, можно ли как-то это ограничение обойти? Пока самое банальное что приходит в голову, это средствами IPTables перенаправлять весь трафик к гуглосервисам за исключением YouTube к VPN, но может есть решение покрасивее?
  • 0
    А если это VK или Яндекс? Как узнать все IP адреса для этих сетей?
  • 0
    Ему плохо не станет, если пропихнуть все маршруты, например, отсюда:
    https://github.com/zapret-info/z-i/blob/master/dump.csv
    ?

    То есть, если не 1-2 адреса, а всё, что как бы закрыто РКН?
    • 0
      Один из выходов — укрупнять блоки адресов, чтобы роутить через впн не просто адреса, а целые подсети. Сервер может и не загнётся, но на клиенте десятки тысяч маршрутов могут быть проблемой
  • 0
    Внес правки в /etc/openvpn/server.conf, подключился, начали плохо грузится сайты (наверно из-за того, что не все ip заблокированных сайтов добавил), даже те, которые не заблокированы. После убрал изменения в этом файле и vpn вообще перестал работать. Что не так?
  • +1
    Shadowsocks — прост, эффективен, стабилен. Сделан китайцами для обхода Щита.
  • +2
    Небольшой совет!
    Во-первых, с помощью директивы config можно инклудить один конфигурационный файл OpenVPN внутрь другого. Тогда вы сможете просто обновлять по крону этот инклуд, не беспокоясь об остальных настройках.

    Во-вторых, можно поместить эти настройки в client config directory. Если у вас не используются индивидуальные настройки клиентов, то можно поместить список маршрутов в файл DEFAULT — он используется когда для клиента нет индивидуальных настроек. Если же они есть, то вроде бы можно также использовать директиву config, чтобы заинклудить файл DEFAULT в настройки для клиента.

    Плюс в том, что при изменении ccd не требуется перезапуск сервера. Хотя я не уверен что сервер сам отправит новые маршруты уже подключенным клиентам — но в этом случае можно сделать перезапуск, или просто послать ему SIGHUP.

    Цитата из man openvpn
    --client-config-dir dir
    Specify a directory dir for custom client config files. After a connecting client has been authenticated, OpenVPN will look in this directory for a file having the same name as the client's X509 common name. If a matching file exists, it will be opened and parsed for client-specific configuration options. If no matching file is found, OpenVPN will instead try to open and parse a default file called «DEFAULT», which may be provided but is not required.

    This file can specify a fixed IP address for a given client using --ifconfig-push, as well as fixed subnets owned by the client using --iroute.

    One of the useful properties of this option is that it allows client configuration files to be conveniently created, edited, or removed while the server is live, without needing to restart the server.

    The following options are legal in a client-specific context: --push, --push-reset, --iroute, --ifconfig-push, and --config.



    Я добиваюсь схожего эффекта с помощью Proxy Auto Config.
    VPN всегда подключён (и на сервере также крутится прокси и свой DNS-сервер). По крону генерируется PAC-файл, который раздается внутрь VPN-сети. PAC настроен так, чтобы направлять блокированные домены/IP через поднятый прокси.
    Такое решение несколько проще чем добавление нескольких десятков-сотен маршрутов, но имеет недостаток.
    Для автоматического обхода клиентский софт должен уметь PAC — читай, работает только с браузерами. Ручной обход требует всего лишь поддержки прокси, но настройки на клиенте все равно требуются.

    Была мысль об использовании iptables (а точнее расширения ipset). Но опять же, это надо вбивать на клиенте VPN (комп или роутер).
    А вот ваш подход интересен тем, что позволяет держать все настройки обхода на сервере, что очень и очень удобно!

    Дополнительно, можно отроутить весь трафик TCP:53/UDP:53 через VPN, а не только гуглоднс — на тот случай если какой-то софт резолвит адреса сам. Хоть это и редкость, я полагаю.
    • 0
      Спасибо, полезное дополнение!
    • 0
      На этот случай пользуюсь такими правилами:
      -A PREROUTING -j PROXYNAMED
      -A PROXYNAMED -d 127.0.0.1/32 -i br0 -p udp -m udp --dport 53 -j RETURN
      -A PROXYNAMED -d 127.0.0.1/32 -i br0 -p tcp -m tcp --dport 53 -j RETURN
      -A PROXYNAMED -i br0 -p udp -m udp --dport 53 -j DNAT --to-destination 127.0.0.1:53
      -A PROXYNAMED -i br0 -p tcp -m tcp --dport 53 -j DNAT --to-destination 127.0.0.1:53
      

      Где br0 — клиентский интерфейс, а на 53 порту локалхоста висит свой dns-сервер. Любой ns запрос на любой адрес будет направлен в него, а тот решит откуда его резолвить — с ns провайдера, с 8.8.8.8 или еще откуда.
  • +1
    Пользуюсь openvpn с подобным анонсированием уже долгое время. За все время использования помимо описанных преимуществ есть очевидные недостатки:
    * У хоста может быть несколько A-записей и их потребуется все добавить (этот вариант проскакивал в комментариях и он особых проблем не вызывает);
    * DNS-сервер в зависимости от нагрузки/региона/настроения админа может выдавать разные адреса на один хост. Здесь иногда спасает добавление подсетей, но не всегда. Сегодня может выдать адрес 1.2.3.4, завтра — 4.3.2.1;
    * Самый неприятный случай: ресурсы на одной и той же странице могут быть с разных ресурсов. Например, какой-нибудь видео-сервис (youtube, к примеру), где html — с одних серверов, картинки (или еще какая статика) — с других, и, наконец, видео — с третьих (каждый раз разных). Один раз наткнулся на ресурс, где на сервер, отдающий видео-контент, передавался ip-адрес, закодированный в url в base64. В итоге, веб-сервис видел мой vpn ip, а видео-сервис — мой прямой ip. Т.к. ip не совпадали, то видео-сервис показывал что-то вроде ошибки 403 и я довольствовался работающим сайтом, но не работающим видео. Пока инспектором не вытащил все адреса, к которым идут обращения, сайт нормально работать не мог. А если для каждого из ресурсов повторяется ситуация 1 или (что еще хуже) 2, то тут уж лучше весь траф направлять через vpn.
    • 0
      А кто у вас в качестве клиента? Обычная машина?
      И оценочно, сколько маршрутов у вас получается?
      • 0
        Ну это все на машинке, на которой стоит линукс, и которая выступает в роли домашнего шлюза, к которому по wifi или проводу подключаются клиенты (телефон, ноут, стационарник и т.д.). Т.к. я редко выхожу за пределы своего «круга» сайтов, то в список попало не очень много маршрутов (порядка 50).
  • 0
    Как-то сложно всё. Вы пытаетесь разделять, группировать конечные точки, сетевые ресурсы по типам (забанен / не забанен). Это бесконечная борьба и перманентный головняк.

    Как на счет пойти от обратного, сделать так, чтобы часть прикладного софта в системе ходила через vpn?
    То есть, на пальцах — два инстанса хрома, с разными user-data-dir, первый ходит через gw вашего провайдера, у второго default gw — это интерфейс vpn'a.
    Можно же, без использования проксей в принципе, любое приложение зарулить на любой интерфейс, разделив таким образом их области применения.

    Конкретно у меня так эти два хрома и работают, один в корп.сетке, через офисный роутер — для работы на работе, второй — через домашний впн, для втентаклей и ютубов.
    Повторюсь, это работа не через прокси, а с помощью линуксовых namespace'ов.

    • 0
      Боюсь, как раз ваша идея — «перманентный головняк».
      «Ой, заблокировали, надо открыть в другом хроме.»
      «Ой, тормозит, надо бы попробовать в первом хроме, может уже разблокировали.»

      Когда хочешь открыть сайт, а видишь фигу (заглушку), потому что в очередной раз CDN улетел под блокировку — это пусть немного, но выбивает из колеи.
      А в предлагаемом случае всё просто работает, пусть и немного медленнее для некоторых сайтов.

      Я полагаю, когда дело дойдет до блокировки IM-сервисов, ваш подход будет результативнее. Тем более что почти все они умеют работать через прокси, так что всё сведется к настройкам IM-клиента.
      Но в конечном итоге, на вкус и цвет.
      • 0
        Ну фиг знает, вести реестр заблокированных ресурсов, постоянно актуализируя таблицу маршрутизации, либо перещелкиваться с одного окна на другое, что проще и удобней?
        Сделал у них разные цвет. схемы, привык за день.
        Единственная история была написать скрипт-автоконфигуратор для openvpn, автоматом создающий неймспейсы, и прокидывабщий в них vpn интерфейс. Сделал, работает как часы, вообще никаких проблем.
        • 0
          Реестр уже ведут, актуальные списки блокированных доменов/айпишников скачать можно на том же антизапрете. Риск минимальный, худшее, что может случиться — заблокированный сайт не будет в списке какое-то время.
  • 0
    Напишите, пожалуйста, кто знает, как можно то же самое сделать на EdgeOS (Ubiquity EdgeRouter X)?

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