OpenVPN — Выборочный траффик (mail.ru, yandex.ru, vk.com, ok.ru, kaspersky.ru)

Thank you for reading this post, don't forget to subscribe!

Цель:
Пустить через VPN толь­ко сети, кото­рые попа­да­ют под запрет, осталь­ные долж­ны идти "напря­мую". Так же важ­но удоб­ство под­клю­че­ния устройств, крос­сплат­фор­мен­ность, ско­рость и безопасность.

Все шаги были выпол­не­ны на CentOS 7.

Уста­но­вим репо­зи­то­рий EPEL, если его еще нет в систе­ме и уста­но­вим нуж­ные пакеты:

yum install epel-release -y
yum install openvpn easy-rsa -y
Созда­ем файл конфигурации:

vim /etc/openvpn/server.conf

И копи­ру­ем в него следующее:

local CHANGE_THIS_ON_YOUR_PUBLIC_IP
port 1194
proto udp
dev-type tun
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
topology subnet
server 10.8.0.0 255.255.255.0
txqueuelen 250
keepalive 300 900
cipher AES-128-CBC
ncp-ciphers AES-128-GCM
user nobody
group nobody
duplicate-cn
persist-key
persist-tun
status openvpn-status.log
client-config-dir ccd

Для того, что­бы не весь наш траф­фик ходил через VPN, а толь­ко необ­хо­ди­мые сети, созда­дим файл кон­фи­гу­ра­ции для клиента:

mkdir /etc/openvpn/ccd
vim /etc/openvpn/ccd/DEFAULT
И ско­пи­ру­ем в него следующее:

push "dhcp-option DNS 8.8.8.8"
push "route 8.8.8.8"
push "dhcp-option DNS 74.82.42.42" # HE.net DNS
push "route 74.82.42.42" # Route to HE.net DNS

# Persist TUN
push "persist-tun"

# 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.75.152.0 255.255.248.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 109.235.160.0 255.255.248.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 185.32.185.0 255.255.255.0"
push "route 185.32.186.0 255.255.255.0"
push "route 185.71.76.0 255.255.252.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 2001:678:384::/48"
push "route-ipv6 2620:10f:d000::/44"
push "route-ipv6 2a02:6b8::/32"
push "route-ipv6 2a02:5180::/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.211.128.0 255.255.252.0"
push "route 195.218.168.0 255.255.255.0"
push "route 208.87.92.0 255.255.252.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.29.130.0 255.255.255.0"
push "route 185.32.248.0 255.255.252.0"

push "route-ipv6 2a00:bdc0::/36"
push "route-ipv6 2a00:bdc0:e003::/48"
push "route-ipv6 2a00:bdc0:e004::/46"
push "route-ipv6 2a00:bdc0:e008::/48"
push "route-ipv6 2a00:bdc0:f000::/36"

# Kaspersky network
push "route 77.74.176.0 255.255.248.0"
push "route 91.103.64.0 255.255.248.0"
push "route 93.159.224.0 255.255.248.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"
push "route-ipv6 2a03:2480::/33"

Созда­ем пап­ку для клю­чей и копи­ру­ем нуж­ные скрип­ты для созда­ния их:

mkdir -p /etc/openvpn/easy-rsa/keys
cp -a /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa
Для удоб­ства можем сра­зу в пере­мен­ные сре­ды ука­зать инфор­ма­цию нуж­ную для созда­ния клю­чей, дабы в буду­щем ее посто­ян­но не вводить:

vim /etc/openvpn/easy-rsa/vars
И при­ве­дем его к тако­му виду:

export KEY_COUNTRY="UA"
export KEY_PROVINCE="UA"
export KEY_CITY="Kiev"
export KEY_ORG="openvpn"
export KEY_EMAIL="admin@test.services"
export KEY_OU="VPN"
export KEY_NAME="openvpn"
export KEY_CN="openvpn.test.services"

Копи­ру­ем кон­фи­гу­ра­цию OpenSSL:

cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf
Пере­хо­дим в пап­ку со скрип­та­ми для созда­ния клю­чей, и очи­ща­ем содер­жи­мое ее для наших буду­щих ключей:

cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
Созда­дим кор­не­вой сертификат:

./build-ca
Созда­дим ключ и пуб­лич­ный сертификат:

./build-key-server server
Созда­дим Diffie-Hellman ключ:

./build-dh
Перей­дем в ката­лог с клю­ча­ми и сер­ти­фи­ка­та­ми, кото­рые мы создали:
cd /etc/openvpn/easy-rsa/keys

И ско­пи­ру­ем нуж­ные нам фай­лы в ката­лог OpenVPN'a:
cp -a dh2048.pem ca.crt server.crt server.key /etc/openvpn

Важ­но что­бы после копи­ро­ва­ния у этих фай­лов сохра­ни­лись права

Созда­дим сер­ти­фи­кат и ключ для клиента:

cd /etc/openvpn/easy-rsa
./build-key client
Даль­ше кон­фи­гу­ра­ция при­во­дит­ся для iptables, если исполь­зу­ет­ся firewalld то отклю­чить его мож­но сле­ду­ю­щим образом:

yum install iptables-services -y
systemctl mask firewalld
systemctl enable iptables
systemctl stop firewalld
systemctl start iptables
iptables --flush

Добав­ля­ем пра­ви­ло в iptables и сохраняем:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
iptables-save > /etc/sysconfig/iptables

Обя­за­тель­но про­верь­те пра­виль­ность назва­ния интер­фей­са, в моем слу­чае это eth0

В фай­ле "/etc/sysctl.conf" раз­ре­ша­ем фор­вар­динг пакетов:
net.ipv4.ip_forward = 1

И пере­за­пус­ка­ем служ­бу сети:
systemctl restart network.service

Добав­ля­ем служ­бу OpenVPN в авто­за­пуск и стар­ту­ем ее:
systemctl -f enable openvpn@server.service
systemctl start openvpn@server.service

Созда­дим файл кон­фи­гу­ра­ции кли­ен­та для под­клю­че­ния к сер­ве­ру, сра­зу вста­вив нуж­ные клю­чи и сертификаты:

vim openvpn.ovpn
И ско­пи­ру­ем в него следующее:

client
remote test.services 1194
nobind
remote-cert-tls server
cipher AES-128-CBC
setenv opt ncp-ciphers AES-128-GCM
setenv opt block-outside-dns
dev tun
proto udp
<ca>
СОДЕРЖИМОЕ ФАЙЛА ca.crt
</ca>

<cert>
СОДЕРЖИМОЕ ФАЙЛА client.crt
</cert>

<key>
СОДЕРЖИМОЕ ФАЙЛА client.key
</key>
Даль­ше этот файл мож­но импор­ти­ро­вать на устрой­ства кли­ен­тов и под­клю­чать­ся к серверу.