Умный обход блокировок в Украине

от автора

image

В статье описывается настройка бесплатного сервиса Zaborona.Help для обхода блокировок сайтов в Украине.

Особенность конфигурации в том, что через VPN маршрутизируется трафик только к заблокированным сетям, остальные сайты работают напрямую. Работает на всех основных платформах: Windows, Linux, iOS, MacOS, Android.

То есть не влияет на скорость интернета, не подменяет IP для остальных сайтов и не мешает работе онлайн игр, голосового трафика и т.д.

Проблемы популярных средств обхода блокировок

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

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

Выбор сервера

Сервер для VPN должен иметь хорошую связность на сетевом уровне с вашим провайдером, чтобы задержки были минимальными, а также с ресурсами, которые планируется посещать через этот VPN. То есть датацентры в США, Китае, Японии не лучший выбор.

Приведу несколько вариантов которые я выбрал для сервиса Zaborona.help:


Linode.com — крутой и надежный хостинг с хорошими каналами.
Плюсы:

  • Гигатибный канал, хорошая связность в Европе
  • Маршрутизируемый блок /64 IPv6 адресов. Можно выдавать VPN клиентам реальные IP напрямую.

Минусы:

  • Минимальная стоимость 5$
  • 1TB исходящего трафика на минимальном тарифе
  • 20$ за каждый терабайт превышения лимита

Scaleway.com — дешевый хостинг с безлимитным трафиком.
Плюсы:

  • Минимальная цена за сервер 3€
  • Безлимитный трафик, 200Mbit/s
  • Датацентр в Польше (близко к Украине)

Минусы:

  • Один IPv6 адрес на сервер(какая глупость!)
  • Не лучшая связность с заблокированными ресурсами


Для надежности используются сразу несколько серверов у обоих провайдеров. Балансировка выполняется примитивно на уровне DNS.
Служебный домен, к которому подключаются клиенты vpn.zaborona.help, имеет несколько А-записей направленных на все сервера сразу. Это позволяет равномерно размазать клиентов по серверам. Минимальный TTL записей позволяет быстро убрать проблемный сервер из общего списка и перенаправить клиентов.

Список заблокированных сервисов

Из указа президента Украины №133/2017 известен список компаний, подпадающих под блокировки.
Зная этот список, можно составить список всех диапазонов IP принадлежащих этим компаниям

Для этого можно использовать сервис bgp.he.net
Вот как выглядят bgp анонсы Яндекса bgp.he.net/AS13238#_prefixes
Собираем все нужные диапазоны. Соседние сети объединяем в один диапазон, чтобы уменьшить общее число маршрутов на клиенте.

Cписок сетей маршрутизируемый через сервера Zaborona VPN

# Vkontakte
87.240.128.0/18
93.186.224.0/20
95.142.192.0/20
95.213.0.0/18
185.32.248.0/22

# Yandex
5.45.192.0/18
5.255.192.0/18
37.9.64.0/18
37.140.128.0/18
77.88.0.0/18
84.201.128.0/18
87.250.224.0/19
93.158.128.0/18
95.108.128.0/17
100.43.64.0/19
130.193.32.0/19
141.8.128.0/18
178.154.128.0/17
199.21.96.0/22
199.36.240.0/22
213.180.192.0/19

# Mail.ru
5.61.16.0/21
5.61.232.0/21
79.137.157.0/24
79.137.183.0/24
94.100.176.0/20
95.163.32.0/19
95.163.248.0/21
128.140.168.0/21
178.22.88.0/21
178.237.16.0/20
185.5.136.0/22
185.16.148.0/22
185.16.244.0/22
188.93.56.0/21
194.186.63.0/24
195.211.20.0/22
195.218.168.0/24
217.20.144.0/20
217.69.128.0/20

# Kaspersky Lab
77.74.176.0/22
77.74.181.0/24
77.74.183.0/24
93.159.228.0/22
185.54.220.0/23
185.85.12.0/24
185.85.14.0/23

Этот список меняется крайне редко, поэтому не составит труда его обновить при необходимости.

Настройка OpenVPN

На сервере будет использован OpenVPN 2.4.

Выпуск сертификатов

Для генерации сертификатов проще всего использовать утилитку easy-rsa.

Генерация ключей с помощью easy-rsa

$ git clone https://github.com/ValdikSS/easy-rsa-ipsec.git $ cd easy-rsa-ipsec/easyrsa3 $ ./easyrsa init-pki  init-pki complete; you may now create a CA or requests.  $ ./easyrsa build-ca nopass Generating a 2048 bit RSA private key … Common Name (eg: your user, host, or server name) [Easy-RSA CA]:Cool VPN Server …  $ ./easyrsa build-server-full zaborona.help nopass Generating a 2048 bit RSA private key … Write out database with 1 new entries Data Base Updated  # В данном случае public это имя клиента. Оно может быть любым. $ ./easyrsa build-client-full public nopass     Generating a 2048 bit RSA private key … Write out database with 1 new entries Data Base Updated 

После генерации сертификатов имеем такой список необходимых файлов.

Для сервера:
easyrsa3/pki/ca.crt — корневой сертификат
easyrsa3/pki/issued/zaborona.help.crt — серверный сертификат
easyrsa3/pki/private/zaborona.help.key — ключ от сертификата сервера

Для клиента:
easyrsa3/pki/ca.crt — корневой сертификат
easyrsa3/pki/issued/public.crt — клиентский сертификат
easyrsa3/pki/private/public.key — клиентский ключ

Серверный конфиг

Полученный на предыдущем шаге список сетей добавляем в конфиг сервера. Таким образом при подключении клиенту будут устанавливаться маршруты к заблокированным сетям через VPN сервер. Маршрут по-умолчанию 0.0.0.0 при этом не будет изменен.

Так как многие провайдеры в Украине блокирует DNS запросы к запрещенным сайтам, важно установить клиенту наши резолверы, и сделать так, чтобы доступ к ним был через VPN.

Конфиг сервера OpenVPN

mode server proto tcp  dev-type tun # Тип драйвера tun, так как нам не нужен L2 уровен dev zaborona # Имя tun интерфейса на сервере  topology subnet server 192.168.224.0 255.255.252.0 # Диапазон IP выдаваемых клиентам. Выбираем маску побольше, так как клиентов планируется много  server-ipv6 2a01:7e01:e001:77:8000::/65 # Диапазон IPv6 адресов. Удалите, если у вас нет отдельной маршрутизируемой ipv6 сети на сервере  push "dhcp-option DNS 8.8.8.8" #Устанавливаем DNS резолверы push "route 8.8.8.8"  # Маршрут до этого адреса через VPN  push "dhcp-option DNS 74.82.42.42" # HE.net DNS в качестве вторичных  push "route 74.82.42.42" # Route to HE.net DNS  txqueuelen 250 keepalive 300 900 persist-tun persist-key  cipher AES-128-CBC ncp-ciphers AES-128-GCM  user nobody duplicate-cn  # log logs/openvpn.log #status logs/status.log 30  ca keys/ca.crt cert keys/zaborona.help.crt key keys/zaborona.help.key dh keys/dh2048.pem   # Routes  # Yandex network push "route 5.45.192.0 255.255.192.0" push "route 5.255.192.0 255.255.192.0" push "route 37.9.64.0 255.255.192.0" push "route 37.140.128.0 255.255.192.0" push "route 77.88.0.0 255.255.192.0" push "route 84.201.128.0 255.255.192.0" push "route 87.250.224.0 255.255.224.0" push "route 93.158.128.0 255.255.192.0" push "route 95.108.128.0 255.255.128.0" push "route 100.43.64.0 255.255.224.0" push "route 130.193.32.0 255.255.224.0" push "route 141.8.128.0 255.255.192.0" push "route 178.154.128.0 255.255.128.0" push "route 199.21.96.0 255.255.252.0" push "route 199.36.240.0 255.255.252.0" push "route 213.180.192.0 255.255.224.0"  push "route-ipv6 2620:10f:d000::/44" push "route-ipv6 2a02:6b8::/32"  # Mail.ru network push "route 5.61.16.0 255.255.248.0" push "route 5.61.232.0 255.255.248.0" push "route 79.137.157.0 255.255.255.0" push "route 79.137.183.0 255.255.255.0" push "route 94.100.176.0 255.255.240.0" push "route 95.163.32.0 255.255.224.0" push "route 95.163.248.0 255.255.248.0" push "route 128.140.168.0 255.255.248.0" push "route 178.22.88.0 255.255.248.0" push "route 178.237.16.0 255.255.240.0" push "route 185.5.136.0 255.255.252.0" push "route 185.16.148.0 255.255.252.0" push "route 185.16.244.0 255.255.252.0" push "route 188.93.56.0 255.255.248.0" push "route 194.186.63.0 255.255.255.0" push "route 195.211.20.0 255.255.252.0" push "route 195.218.168.0 255.255.255.0" push "route 217.20.144.0 255.255.240.0" push "route 217.69.128.0 255.255.240.0"  push "route-ipv6 2a00:1148::/32" push "route-ipv6 2a00:a300::/32" push "route-ipv6 2a00:b4c0::/32"  # VK.com network push "route 87.240.128.0 255.255.192.0" push "route 93.186.224.0 255.255.240.0" push "route 95.142.192.0 255.255.240.0" push "route 95.213.0.0 255.255.192.0" push "route 185.32.248.0 255.255.252.0"  push "route-ipv6 2a00:bdc0::/36" push "route-ipv6 2a00:bdc0:e006::/48"  # Kaspersky network push "route 77.74.176.0 255.255.252.0" push "route 77.74.181.0 255.255.255.0" push "route 77.74.183.0 255.255.255.0" push "route 93.159.228.0 255.255.252.0" push "route 185.54.220.0 255.255.254.0" push "route 185.85.12.0 255.255.255.0" push "route 185.85.14.0 255.255.254.0" 

Складываем все файлы на сервере в в папку /etc/openvpn

zaborona.conf — конфиг сервер
ca.crt — корневой сертификат
zaborona.help.crt — сертификат сервера
zaborona.help.key — ключ сервера

Клиентский конфиг

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

Клиентский конфигурационный файл .opvn

nobind client  # Адрес сервера. Используем имя домена для балансировки через DNS. remote vpn.zaborona.help  remote-cert-tls server cipher AES-128-CBC setenv opt ncp-ciphers AES-128-GCM setenv opt block-outside-dns dev tun proto tcp  <ca> содержимое файла easyrsa3/pki/ca.crt </ca>  <cert> Содержимое easyrsa3/pki/issued/public.crt </cert>  <key> содержимое файла easyrsa3/pki/private/public.key  </key> 

Подключение

Процесс настройки подключения на клиенте состоит из двух шагов: установить OpenVPN клиент и импортировать файл с настройками.

Мы написали инструкции c картинками для всех популярных операционных систем:

Windows
MacOS
iOS
Android

Исходники всего проекта, в том числе сайта, доступны на Github.
Если какая-то информация на сайте отсутствует, буду признателен за pull request-ы.

Тем, кто хочет настроить собственный VPN сервер для обхода блокировок, с удовольствием помогу. Можете задавать любые вопросы здесь, либо в комментариях на сайте.
ссылка на оригинал статьи https://habrahabr.ru/post/329248/


Комментарии

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

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