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

На Хабре, да и не только на нем, есть множество инструкций, как обойти блокировки с помощью 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.

Таким образом, при минимальных усилиях вы получаете быстро работающий интернет с несколько замедленным доступом к заблокированным ресурсам. Буду рад, если это кому-то поможет :)
Поделиться с друзьями
-->

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


  1. Punk_Joker
    29.05.2017 15:10
    +1

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


  1. ARad
    29.05.2017 15:17

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


    1. Lelik13a
      29.05.2017 15:37
      +1

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


      1. bgBrother
        30.05.2017 22:22

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



    1. norlin
      29.05.2017 16:01

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


      1. mac2000
        29.05.2017 20:18

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


      1. fifthsound
        29.05.2017 22:07

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


        1. norlin
          29.05.2017 22:16

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


    1. Crystal_HMR
      30.05.2017 15:21

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


    1. Skyroger2
      01.06.2017 08:45

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


  1. Alexsandr_SE
    29.05.2017 15:37
    -1

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


    1. arandomic
      29.05.2017 15:55
      +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. TheShock
        30.05.2017 09:26
        -1

        Слышал, что push "dhcp-option DNS 8.8.8.8" — win-only фича. Разве нет? И даже на моб. телефонах так можно?


        1. tijs
          30.05.2017 16:39
          +1

          У меня нет возможности проверить на андроид, но на iOS работает


    1. DrakeMazzy
      29.05.2017 15:56
      +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»


      1. Alexsandr_SE
        29.05.2017 16:12

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


  1. vconst
    29.05.2017 15:40
    +2

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

    И потом, VPN — это обычный сервис по собственной безопасности, в бесплатном ВайФай московского метро, в гостиницах и тп. Лучше весь трафик через него пропускать, меньше рисков нарваться на школоло-скрипткидди.


    1. tijs
      29.05.2017 15:58

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


      1. vconst
        29.05.2017 16:00
        +1

        Не замечал замедления работы ни на десктопе, ни на смарте.


    1. Suvitruf
      29.05.2017 16:41
      +1

      С помощью этого скрипта, можно быстро поднять OpenVPN.


    1. ABATAPA
      29.05.2017 22:20
      +1

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


      1. tijs
        29.05.2017 22:20

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


        1. ABATAPA
          29.05.2017 22:33

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


      1. vconst
        30.05.2017 10:43

        Есть огромное количество подобных сервисов и скриптов, и даже готовые образы OpenVPN для VPS.


      1. datsen
        30.05.2017 13:21
        +1

        Если я правильно понял то Pritunl платный или *Non-commercial use only https://github.com/pritunl/pritunl/blob/master/LICENSE


        1. ABATAPA
          31.05.2017 11:08

          А Вы собираетесь продавать что-то? Тут, вроде, речь идёт об обходе блокировок для себя лично.
          Для некоммерческого использования он бесплатен.


  1. frees2
    29.05.2017 15:46
    -4

    Офис Яндекса.
    Следственные мероприятия проводятся на основании статьи 111 Криминального кодекса Украины – «государственная измена». Виновным по данной статье грозит лишение свободы сроком на 12-15 лет с конфискацией имущества.


  1. arandomic
    29.05.2017 15:53

    Я использовал для подобного набор скриптов вот из этого репозитория:
    https://bitbucket.org/ValdikSS/antizapret
    Небольшая доработка напильником требуется. (он по-умолчанию настроен на github-репозиторий с дампом БД Роскомнадзора)
    Естественно для этого необходим свой сервер...((


  1. Alter2
    29.05.2017 15:59

    Может, есть какая-то возможность отследить блокируемый сайт по ошибке 451, вместо того чтобы вручную их все прописывать?


    1. tijs
      29.05.2017 16:00

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


  1. alexoron
    29.05.2017 16:00

    А я вообще если нужно хожу через Удаленный рабочий стол Amazon AWS EC2


  1. Amet13
    29.05.2017 16:40

    Обхожу блокировки с помощью простовпн (1$/мес) прописывая маршруты до нужных сайтов (dockerhub/linkedin/bitbucket/...) на VPN, находясь в Крыму.
    Однако побороть блокировку сервисов google (developers/cloud/issuetracker/...) я не смог, так как google все свои сервисы пропускает через один гейт www3.l.google.com. в том числе Youtube (трафик от которого я пропускать через VPN не хочу). Приходится использовать браузерное расширение специально для этих гугловых сервисов.

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


  1. madcap99
    29.05.2017 16:46

    А если это VK или Яндекс? Как узнать все IP адреса для этих сетей?


    1. tijs
      29.05.2017 17:37

      Мне помогает вот это: https://toolbox.googleapps.com/apps/dig/



    1. SADM
      30.05.2017 03:42

      Вот список, спасибо zhovner


  1. rezdm
    29.05.2017 16:46

    Ему плохо не станет, если пропихнуть все маршруты, например, отсюда:
    https://github.com/zapret-info/z-i/blob/master/dump.csv
    ?

    То есть, если не 1-2 адреса, а всё, что как бы закрыто РКН?


    1. tijs
      29.05.2017 17:36

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


  1. Hachapury
    29.05.2017 16:46

    Внес правки в /etc/openvpn/server.conf, подключился, начали плохо грузится сайты (наверно из-за того, что не все ip заблокированных сайтов добавил), даже те, которые не заблокированы. После убрал изменения в этом файле и vpn вообще перестал работать. Что не так?


  1. kurtov
    30.05.2017 06:33
    +1

    Shadowsocks — прост, эффективен, стабилен. Сделан китайцами для обхода Щита.


  1. Vindicar
    30.05.2017 13:38
    +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.


    1. tijs
      30.05.2017 13:41

      Спасибо, полезное дополнение!


    1. loginsin
      30.05.2017 13:50

      На этот случай пользуюсь такими правилами:

      -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. loginsin
    30.05.2017 13:41
    +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.


    1. Vindicar
      30.05.2017 13:43

      А кто у вас в качестве клиента? Обычная машина?
      И оценочно, сколько маршрутов у вас получается?


      1. loginsin
        30.05.2017 13:57

        Ну это все на машинке, на которой стоит линукс, и которая выступает в роли домашнего шлюза, к которому по wifi или проводу подключаются клиенты (телефон, ноут, стационарник и т.д.). Т.к. я редко выхожу за пределы своего «круга» сайтов, то в список попало не очень много маршрутов (порядка 50).


  1. grieverrr
    30.05.2017 15:51

    Как-то сложно всё. Вы пытаетесь разделять, группировать конечные точки, сетевые ресурсы по типам (забанен / не забанен). Это бесконечная борьба и перманентный головняк.

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

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


    1. Vindicar
      01.06.2017 23:20

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

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

      Я полагаю, когда дело дойдет до блокировки IM-сервисов, ваш подход будет результативнее. Тем более что почти все они умеют работать через прокси, так что всё сведется к настройкам IM-клиента.
      Но в конечном итоге, на вкус и цвет.


      1. grieverrr
        03.06.2017 18:40

        Ну фиг знает, вести реестр заблокированных ресурсов, постоянно актуализируя таблицу маршрутизации, либо перещелкиваться с одного окна на другое, что проще и удобней?
        Сделал у них разные цвет. схемы, привык за день.
        Единственная история была написать скрипт-автоконфигуратор для openvpn, автоматом создающий неймспейсы, и прокидывабщий в них vpn интерфейс. Сделал, работает как часы, вообще никаких проблем.


        1. Vindicar
          05.06.2017 12:20

          Реестр уже ведут, актуальные списки блокированных доменов/айпишников скачать можно на том же антизапрете. Риск минимальный, худшее, что может случиться — заблокированный сайт не будет в списке какое-то время.


  1. dmitry_dvm
    30.05.2017 18:22

    Напишите, пожалуйста, кто знает, как можно то же самое сделать на EdgeOS (Ubiquity EdgeRouter X)?