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

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

Сервер

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

Поставить OpenVPN и создать одноименного пользователя, под которым будет работать демон:

apt install openvpn
adduser --system --no-create-home --disabled-login --group openvpn

Создать конфиг сервера openvpn со следующим содержимым:

mcedit /etc/openvpn/server.conf

port 1194
proto udp
dev tun0
#user openvpn
#group openvpn
dh /etc/openvpn/keys/dh.pem
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/vpn-server.crt
key /etc/openvpn/keys/vpn-server.key
tls-auth /etc/openvpn/keys/ta.key 0
#crl-verify  /etc/openvpn/keys/crl.pem
script-security 2
cipher AES-256-CBC
tls-server
comp-lzo
mute 10
persist-key
persist-tun
max-clients 50
keepalive 10 900
client-config-dir /etc/openvpn/ccd
ifconfig-pool-persist /etc/openvpn/ccd/ipp.txt
server 10.15.0.0 255.255.255.0
### Эти параметры требуют пояснений.
# Пушить (передавать клиенту) свой DNS север
push "dhcp-option DNS 192.168.0.1"
# Пушить название домена
push "dhcp-option DOMAIN mydomain.com"
# Пушить маршрут локальной подсети. Для того, чтобы у клиентов был доступ до нее
push "route 192.168.0.0 255.255.254.0"
###
status /var/log/openvpn/openvpn-status.log 1
status-version 3
log-append /var/log/openvpn/openvpn-server.log
verb 5

Создать каталоги для логов и хранения IP адресов клиентов:

mkdir /var/log/openvpn/
mkdir /etc/openvpn/ccd

Центр авторизации и ключи

Перейти в домашний каталог, скачать и распаковать easyrsa 3 версии:

cd
wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
unzip master.zip

Перейти в каталог easyrsa3 и объявить для него переменные:

cd ~/easy-rsa-master/easyrsa3
cp ~/easy-rsa-master/easyrsa3/vars.example ~/easy-rsa-master/easyrsa3/vars

Инициализировать PKI (Public Key Infrastructure — Инфраструктура открытых ключей):

./easyrsa init-pki

Создать корневой сертификат. Обязательно ввести сложный пароль и Common Name сервера, например my vpn server:

./easyrsa build-ca

Создать ключи Диффи-Хелмана:

./easyrsa gen-dh

Создать запрос на сертификат для сервера OVPN. Обращаю внимание, что сертификат будет незапаролен (параметр nopass), иначе при каждом старте OpenVPN будет запрашивать этот пароль:

./easyrsa gen-req vpn-server nopass

Создать сам сертификат сервера OVPN:

./easyrsa sign-req server vpn-server

Скопировать полученные ключи в рабочий каталог openvpn:

mkdir -p /etc/openvpn/keys
cp ~/easy-rsa-master/easyrsa3/pki/ca.crt /etc/openvpn/keys
cp ~/easy-rsa-master/easyrsa3/pki/issued/vpn-server.crt /etc/openvpn/keys
cp ~/easy-rsa-master/easyrsa3/pki/private/vpn-server.key /etc/openvpn/keys
cp ~/easy-rsa-master/easyrsa3/pki/dh.pem /etc/openvpn/keys

Создать «HMAC firewall» для защиты от DoS аттак и флуда UDP порта:

cd /etc/openvpn/keys/
openvpn --genkey --secret ta.key

Запустить openvpn:

/etc/init.d/openvpn start

Клиент

Ключи

Создание запроса запароленного ключа для клиента (потребуется вводить при каждом подключении) с именем User:

cd ~/easy-rsa-master/easyrsa3
./easyrsa gen-req User

Если авторизация будет внешней (например ADшная), то пароль не потребуется. Создание запроса без парольного ключа для клиента:

./easyrsa gen-req User nopass

Создание ключа пользователя (по дефолту из vars сроком на 10 лет):

./easyrsa sign-req client User

Или с ограничением действия сертификата в 90 дней (после истечения срока можно только перевыпустить):

./easyrsa sign-req client User -days 90

Клиенту передать эти файлы:

~/easy-rsa-master/easyrsa3/pki/issued/User.crt
~/easy-rsa-master/easyrsa3/pki/private/User.key
~/easy-rsa-master/easyrsa3/pki/ca.crt
/etc/openvpn/keys/ta.key

Конфиг

client
dev tun
proto udp
remote xxx.xxx.xxx.xxx 1194
cipher AES-256-CBC
tls-client
ca "ca.crt"
tls-auth "ta.key" 1
cert "User.crt"
key "User.key"
remote-cert-tls server
comp-lzo
tun-mtu 1500
mssfix 1450
verb 3
nobind
resolv-retry infinite

Для удобства все пять клиентских можно объединить в один

Отзыв сертификатов

Генерация файла отозванных ключей:

cd ~/easy-rsa-master/easyrsa3
./easyrsa gen-crl

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

ln -s ~/easy-rsa-master/easyrsa3/pki/crl.pem /etc/openvpn/keys

В /etc/openvpn/server.conf добавить строку

crl-verify /etc/openvpn/keys/crl.pem

Отзыв сертификата пользователя User:

./easyrsa revoke User

Каждый раз при отзыве сертификата необходимо обновлять crl.pem, чтобы внести в него изменения:

./easyrsa gen-crl

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

failed to update database
Easy-RSA error:
signing failed (openssl output above may have more detail)

Минимальная настройка Iptables для доступа OpenVPN клиентов к локальной сети

# Включить форвард в ядре
echo "1" > /proc/sys/net/ipv4/ip_forward
# Разрешить входящие соединения на порт OVPN
iptables -A INPUT -p UDP --dport 1194 -j ACCEPT
# Разрешить форвард между подсетью OVPN и локальной
# При чем, ставить их в начале цепочки, если правил много
iptables -A FORWARD -s 10.15.0.0/24 -d 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -d 10.15.0.0/24 -s 192.168.0.0/24 -j ACCEPT

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

Наткнулся на тред, поржал и решил дополнить заметку. Если OpenVPN нужен для выхода в интернет — надо сделать, чтобы OpenVPN был шлюзом по умолчанию (default gateway) и подправить правила iptables.
Собственно, конфиг для сервера:

port 1194
proto udp
dev tun0
dh /etc/openvpn/keys/dh.pem
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/vpn-server.crt
key /etc/openvpn/keys/vpn-server.key
tls-auth /etc/openvpn/keys/ta.key 0
crl-verify  /etc/openvpn/keys/crl.pem
script-security 2
cipher AES-256-CBC
tls-server
comp-lzo
mute 10
persist-key
persist-tun
max-clients 50
keepalive 10 900
client-config-dir /etc/openvpn/ccd
ifconfig-pool-persist /etc/openvpn/ccd/ipp.txt
server 10.15.0.0 255.255.255.0
push redirect-gateway def1
status /var/log/openvpn/openvpn-status.log 1
status-version 3
log-append /var/log/openvpn/openvpn-server.log
verb 5

Конфиг для клиента не будет отличаться от приведенного выше.

Минимальная настройка Iptables для выхода OpenVPN клиентов в интернет

Правила iptables:

# Включить форвард в ядре
echo "1" > /proc/sys/net/ipv4/ip_forward
# Разрешить входящие соединения на порт OVPN
iptables -A INPUT -p UDP --dport 1194 -j ACCEPT
# Разрешить ходить транзитным пакетам для подсети OpenVPN 
iptables -A FORWARD -s 10.15.0.0/24 -j ACCEPT
iptables -A FORWARD -d 10.15.0.0/24 -j ACCEPT
# x.x.x.x - внешний IP сервера, если он статический
iptables -t nat -A POSTROUTING -s 10.15.0.0/24 -j SNAT --to-source x.x.x.x
# Если внешний IP сервера динамический, то вместо предыдущего правила использовать это
# iptables -t nat -A POSTROUTING -s 10.15.0.0/24 -j MASQUERADE

Некоторые замечания

Для исключения возможности mitm атаки, ошибка которого так выглядит в логах клиента:

WARNING: No server certificate verification method has been enabled. See http://openvpn.net/howto.html#mitm for more info.

Служит параметр remote-cert-tls server, который уже присутствует в конфиге клиента.

Список валидных и отозванных сертификатов

Список валидных и отозванных сертификатов можно посмотреть в файле ~/easy-rsa-master/easyrsa3/pki/index.txt. Начало строки оисания каждого сертификата начинается с букв V или R, что значит Valid и Revoked, например:

V       241019110411Z                   01      unknown /CN=vpn-server
R       241019110842Z   141202085241Z   02      unknown /CN=User1
R       241020105823Z   141201103442Z   03      unknown /CN=test
R       150301095139Z   141202085814Z   04      unknown /CN=User2
V       141203091049Z                   05      unknown /CN=User3

Как видно, первый и пятый сертификаты валидны, 2-4 отозваны.

Если клиент на Windows

Поставить OpenVPN GUI, скачав отсюда. Скопировать клиентские ключи в C:\Program Files\OpenVPN\config\. Скопировать конфиг клиента и вставить в файл client.ovpn, положить туда же. Всего в этом каталоге должно получиться пять файлов — User.crt, User.key, ca.crt, ta.key, client.ovpn.
Обязательно запустить OpenVPN GUI от имени администратора, иначе в сиситеме не проднимутся маршруты, и произвести подключение двойным кликом по иконке в трее (такая область около часов, обычно в правом нижнем углу).