Обход блокировок сайтов с помощью zaborona.help

В связи со сложностями в доступе к некоторым зарубежным ресурсам возникла острая необходимость обеспечить доступ к ним по средствам VPN, но через VPN нужно пропускать только конкретный трафик, а не весь… В связи с этим обратился к уже готовому решению https://zaborona.help/ Но поскольку некоторые нюансы на были учтены, решил дополнить и опубликовать тут.
И так, у нас в наличии сервер в Германии под управлением ubuntu 16.04

Устанавливаем openVpn 2.4 из репозитариев:

Импортируем публичный GPG ключ:

wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -

Теперь добавляем в source.list фрагмент, чтобы apt смог найти OpenVPN:

echo "deb http://build.openvpn.net/debian/openvpn/<version> <osrelease> main" > /etc/apt/sources.list.d/openvpn-aptrepo.list

Где может быть:

stable: stable releases only — no alphas, betas or RCs
testing: latest releases, including alphas/betas/RCs
release/2.3: OpenvPN 2.3 releases
release/2.4: OpenVPN 2.4 releases, including alphas/betas/RCs

а зависит от Вашего дистрибутива:

wheezy (Debian 7.x)
jessie (Debian 8.x)
precise (Ubuntu 12.04)
trusty (Ubuntu 14.04)
xenial (Ubuntu 16.04)

Устанавливаем OpenVPN:
apt-get update && apt-get install openvpn

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

Генерируем ключи и сертификаты:

$ 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

$ ./easyrsa gen-dh

По окончанию получаем набор файлов:

Для сервера:

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

Для клиента:

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

Копируем файлы для сервера /etc/openvpn

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

и создаем server.conf — конфиг сервер

c содержимым:

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 ca.crt
cert zaborona.help.crt
key zaborona.help.key
dh 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"


# 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"



# 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"

И стартуем наш сервер указывая ему, что читать конфигурационный файл server.conf:

systemctl start openvpn@server

Ну и не забываем настройки NAT, в противном случаем мы подключимся, а работать вообще ничего не будет

iptables -v -t nat -A POSTROUTING -o EXTERNAL_IF -s VPN_NET/24 -j SNAT --to-source SERVER_IP

EXTERNAL_IF, VPN_NET и SERVER_IP заменить на внешний интерфейс, сеть VPN и внешний (!) IP сервера соответственно.

Так же выполняем

nano /etc/sysctl.conf

и удаляем # d строке

net.ipv4.ip_forward=1

выполняем, чтобы применить:

sysctl -p 

Дальше на клиентской машине скачиваем клиент openvpn и в папке C:\Program Files\OpenVPN\config создаем .ovpn конфиг-файл с содержимым:

nobind
client

# Адрес сервера
remote 111.222.333.444

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>

Все исходники присутствуют на GitHub