Данный материал представляет пример последовательности действий при установке и настройке VPN-сервера на базе OpenVPN. А также для полной картины работы сервера OpenVPN расмотрены действия по конфигурации клиентов OpenVPN на Ubuntu, Windows.
Все действия из данной статьи могут производится как на локальном сервере, так и на VPS под управление KVM с Ubuntu 20.04.

Серверная часть:

1. Обновляем систему
sudo apt update && apt upgrade -y​

2.Установка OpenVPN

sudo sudo apt install openvpn

3. Ставим пакет для работы с 'git'

sudo apt install git -y

4. Повышаем права до рута. Клонируем репозиторий 'easy-rsa'.

sudo -s
git clone https://github.com/OpenVPN/easy-rsa.git /etc/openvpn/easy-rsa

5. Настраиваем и активируем удостоверяющий центр

cd /etc/openvpn/easy-rsa/easyrsa3/

Создаем файл с настройками

nano vars.example

вносим в созданный файл данные со своими значениями

set_var EASYRSA_REQ_COUNTRY    "RU"
set_var EASYRSA_REQ_PROVINCE   "MO"
set_var EASYRSA_REQ_CITY       "Moscow"
set_var EASYRSA_REQ_ORG        "my_example.org"
set_var EASYRSA_REQ_EMAIL      "admin@my_example.org"
set_var EASYRSA_REQ_OU         "my IT dep"
set_var EASYRSA_KEY_SIZE       2048
set_var EASYRSA_ALGO           rsa
set_var EASYRSA_CA_EXPIRE      3650
set_var EASYRSA_CERT_EXPIRE    3650

Расшифровку параметров можно посмотреть здесь:

cat /etc/openvpn/easy-rsa/easyrsa3/vars.example
./easyrsa init-pki

Генерируем корневой сертификат, для дополнительной защиты указываем пароль:

./easyrsa build-ca

Генерируем ключ Диффи-Хельмана

./easyrsa gen-dh

Генерируем ключ и сертификат сервера (имя сервера в данном примере - 'openvpn_server'):

./easyrsa build-server-full openvpn_server nopass

nopass - елси нам надо чтобы система не спрашивала при запуске OpenVPN сервера пароль, например при перезагрузке.

6. Генерация ключей для клиентов
Генерация ключей без пароля, не безопасный метод.

./easyrsa build-client-full user1 nopass
./easyrsa build-client-full user2 nopass

Генерация ключей защищенных паролем

./easyrsa build-client-full user3

7. Для генерации списка отозванных сертификатов используем команду

./easyrsa gen-crl

Данная список позволяет запрещать доступ уже не актуальным и скомпреметированным ключам.

8. Настройка маршрутизации

nano /etc/sysctl.conf

Раскомментируем строку(удаляем #)

#net.ipv4.ip_forward=1

9. Настраиваем фаерволл iptables.
Ддя начала узнаем имя сетевого интерфейса

ip a

в нашем случае это eth0
Добавляем правила

iptables -A FORWARD -o tun0 -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 172.16.10.0/24 -o eth0 -j MASQUERADE

Здесь мы указываем нашу vpn-подсеть и маску: 172.16.10.0/24

Чтобы правила срабытывались и не сбрасывались после перезагрузке, мы запишем их в rc.local

если такого файла нет, то создаем его

cd /etc
touch rc.local

и делаем его исполняемым:

chmod +x rc.local

записываем правила

nano /etc/rc.local
#!/bin/bash

iptables -A FORWARD -o tun0 -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 172.16.10.0/24 -o eth0 -j MASQUERADE

exit 0

10. Создаем конфиг сервера

nano /etc/openvpn/server.conf
# Указываем какой порт будет слушать наш сервер, по умолчанию 1194
port 1194

# Указываем протокол tcp или udp
#proto tcp
proto udp

# На какой устройстве будет работать OpenVPN сервер, tun0 - это устройство создается автоматически
dev tun

# Сертификат удостоверяющего центра
ca /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt

# Сертификат и ключ нашего сервера, а также пути к ним
cert /etc/openvpn/easy-rsa/easyrsa3/pki/issued/openvpn_server.crt
key /etc/openvpn/easy-rsa/easyrsa3/pki/private/openvpn_server.key

# Ключ Диффи-Хельмана используется для защиты передаваемых ключей по открытому каналу
dh /etc/openvpn/easy-rsa/easyrsa3/pki/dh.pem

# Список отозванных сертификатов:
crl-verify /etc/openvpn/easy-rsa/easyrsa3/pki/crl.pem

# Указываем секретный TLS ключ
tls-auth ta.key 0
remote-cert-tls client
# Указыаем тип шифрования AES 256 bit
cipher AES-256-GCM
# Указываем подсеть в которой будут работать клиенты VPN сервера
server 172.16.10.0 255.255.255.0

# Указываем файл куда будут записываться IP адреса выданные клиентам
ifconfig-pool-persist /etc/openvpn/ipp.txt

# Разрешаем подключенным клиентам OpenVPN сервера соединяться друг с другом
client-to-client

# Включаем возможность указания индивидуальных настроек для клиентов OpenVPN сервера
client-config-dir ccd

# Если необходимо разрешить нескольким пользователям подключаться по одному ключу ( необходимо снять комментарий )
#duplicate-cn

# Проверяем состояние клиента, отправляем пакеты каждые 10 сек. если в течении 240 сек. клиент не ответил, то он считаться отключенным
keepalive 10 240

# Используем сжатие трафика (если не нужно то можно закомментировать!)
;comp-lzo

# Максимальное количество подключенных клиентов
max-clients 10



# Записи о состоянии подключенных клиентов и т.п.
status /var/log/openvpn-status.log
log         /var/log/openvpn.log
# Уровень логирования 0 в лог попадают только записи о критических ошибках сервера, если нужно подробнее, то выставляем 9
verb 4
# Количество записей после которых будет производиться запись в лог
mute 20


11. Копирование ключей и сертификатов для клиентов
Вам нужно скопировать следующие файлы на клиенте OpenVPN

/etc/openvpn/ta.key
/etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt
/etc/openvpn/easy-rsa/easyrsa3/pki/private/'client_name'.key
/etc/openvpn/easy-rsa/easyrsa3/pki/issued/'client_name'.crt

и создать рядом конфиг

client 
tls-client 
dev tun 
proto udp
resolv-retry infinite 
nobind 
cipher AES-256-GCM
verb 3
remote 'server_ip_or_name' 1194
remote-cert-tls server
ca ca.crt
cert 'client_name'.crt
key 'client_name'.key
tls-auth ta.key 1
auth SHA1