Привет. Давно ничего не писал, но тут такое дело, нужен сильно был VPN, платить разным конторам вообще не вариант, поэтому делаем свой сервер. Я привык пользоваться OpenVPN, а не всякими там PPTP и L2TP\IPsec, На сервере где мне нужно было его поднять, стоит Centos 7 так что выбор операционной системы чисто случайный. И да, если кто-то говорит, что OpenVPN медленный или еще несет какую то чушь, смело игнорируйте, у меня на Iphone 7 с включенным OpenVPN выдает 66 Мb/s на мой дешевый российский сервер и это на мобильном интернете. Поехали!

Настройка OpenVPN сервера

Сразу ставим все необходимое:

yum install epel-release
yum install openvpn easy-rsa -y

После установки пакета, всякие говно мануалы будут предлагать вам скопировать в папку /etc/openvpn кучу конфигов. Не ведитесь! Сделаем свой.

vim /etc/openvpn/server.conf

Содержимое должно быть таким

local 145.33.1.31
port 1194
 
proto udp
dev tun
 
ca ca.crt
cert server.crt
key server.key
 
dh dh2048.pem
 
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
 
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
 
keepalive 10 120
 
cipher AES-256-CBC
compress lz4-v2
 
comp-lzo
max-clients 100
 
user nobody
group nobody
 
persist-key
persist-tun
 
status openvpn-status.log
 
verb 3
explicit-exit-notify 1

Отлично. Не забудьте в строке local вставить свой внешний адрес, а не копировать мой. Теперь когда конфиг файл сервера готов, давайте замутим сертификатов, опять таки для сервера.

Создадим для этого уютную папку

mkdir -p /etc/openvpn/easy-rsa/keys

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

cp -av /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa

Ах да, нам будут нужны кое какие переменные среды, которыми пользуются эти скрипты, давайте для удобства засунем их файл, во всяком случае так они рекомендуют делать.

vim /etc/openvpn/easy-rsa/vars

Там поменять нужно только вот эти строки

export KEY_COUNTRY="IL"
export KEY_PROVINCE="IL"
export KEY_CITY="TelAviv"
export KEY_ORG="linuxspace"
export KEY_EMAIL="xxxxx@gmail.com"
export KEY_OU="HackDep"
export KEY_NAME="linuxspace"
export KEY_CN="openvpn.linuxspace.org"

И совсем забыл, нам нужна будет конфигурация OpenSSL

cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf

Теперь когда все более-менее готово
Идем в папку где лежат скрипты и запускаем скрипт на очистку

cd /etc/openvpn/easy-rsa
source ./vars

Теперь делаем корневой сертификат

./build-ca

Теперь делаем ключ и публичный сертификат

./build-key-server server

И наконец Diffie-Hellman ключ

./build-dh

Теперь если мы зайдем сюда

cd /etc/openvpn/easy-rsa/keys

То вы увидите свои ключи
Давайте их бережно скопируем вот сюда

cp dh2048.pem ca.crt server.crt server.key /etc/openvpn

Смотрим что из этого вышло
Untitled

Теперь давайте займемся генерацией ключей и сертификатов для нашего первого клиента. Идем в уже знакомую нам папку и запускаем скрипт.

cd /etc/openvpn/easy-rsa
./build-key client

Теперь ключи для клиента готовы. Красными прямоугольниками выделены файлы которые нужны будут клиенту для подключения к серверу, это
ca.crt
client.crt
client.key

client.key – Ваш секретный и приватный ключ
Untitled

Еще один важный вопрос. Это роутинг на сервере и форвардинг пакетов. Мне крайне лень объяснять что к чему, по этому давайт просто сделаем так

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

Ставим iptables, в Centos 7 его заменили говном по имени firewalld
Делаем NAT и сохраняем

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

10.8.0.0/24 – это наша Virtual Private Network
Такой адрес будет у сервера и у каждого из клиентов.

Форвардинг пакетов надо включть в ядре

vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
systemctl restart network.service

Запускаем OpenVPN демона

systemctl -f enable openvpn@server.service
systemctl start openvpn@server.service

Смотрим что он живой

netstat -nau
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
udp        0      0 145.23.3.89:1194        0.0.0.0:*

С сервером покончено и он готов к эксплуатации

Настройка клиентов для OpenVPN

Помним что ключи для клиента это
/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/keys/client.crt
/etc/openvpn/easy-rsa/keys/client.key

В случаем с Линукс машиной, вы можете создать файл client.ovpn вида

vim client.ovpn

Содержание конфига client.ovpn

client
dev tun
proto udp
remote your_server_ip 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
ca /path/to/ca.crt
cert /path/to/client.crt
key /path/to/client.key

Помним что ключи надо скопировать на клиент.
Если вам по како-то причине не хочется возиться с ключами (как мне) я сделал client.ovpn файл, но только сами ключи запихнул внутрь. Это удобно по двум причинам:

1) Не нужно возиться с копированием целой стопки файлов
2) Лихо работает на мобильных устройствах

Вот как должен выглядеть файл

client
dev tun
dev-type tun
server-poll-timeout 4
ns-cert-type server
reneg-sec 604800
sndbuf 100000
rcvbuf 100000
auth-user-pass
proto udp
remote 125.33.1.91 1194
resolv-retry infinite
nobind
 
persist-key
persist-tun
 
mute-replay-warnings
 
<ca>
-----BEGIN CERTIFICATE-----
тело файла 
-----END CERTIFICATE-----
</ca>
 
<cert>
-----BEGIN CERTIFICATE-----
тело файла
-----END CERTIFICATE-----
</cert>
 
<key>
-----BEGIN PRIVATE KEY-----
тело файла
-----END PRIVATE KEY-----
</key>
 
key-direction 1
remote-cert-tls server
;tls-auth ta.key 1
cipher AES-256-CBC
 
comp-lzo
verb 3

Теперь например в Windows 10 можно поставить программу OpenVPN GUI. Делаем импорт с файла
Untitled

И жмакаем коннект
Untitled

Вы так же можете скопировать файл на свой мобильный телефон, в моем случае это iPhone 7 и скачать программу OpenVPN Connect
photo_2017-04-24_00-03-33

Скопируйтe файл client.ovpn на ваш мобильный и заимпортируйте в программе OpenVPN Connect
photo_2017-04-24_00-03-38

Собственно в конфиге сервера server.conf мы указали, что подключаться могут 100 клиентов одновременно. Так что можете нагенерить ключей своим друзьям или себе для разных устройств. Конечно я так ленив, что не показал в рамках этой статьи как замутить все по красоте, с использованием Docker, Ansible и OpenVPN Access Server, но думаю в следующий раз обязательно напишу.