OpenVPN-Server на Centos 7

Устанавливаем репозиторий EPEL (если нет)

# yum install epel-release

Устанавливаем NET-Tools (если нет)

# yum install net-tools

Установка OpenVPN-Server и Easy-RSA

# yum install openvpn easy-rsa

Создаем директорию для генерации сертификатов и копируем туда Easy-RSA

# mkdir /etc/openvpn/easy-rsa
# cp -rf /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa

Переходим в директорию и создаем файл vars

# cd /etc/openvpn/easy-rsa
# vi vars

Записываем в файл vars

set_var EASYRSA                 "$PWD"
set_var EASYRSA_PKI             "$EASYRSA/pki"
set_var EASYRSA_DN              "cn_only"
set_var EASYRSA_REQ_COUNTRY     "RU"
set_var EASYRSA_REQ_PROVINCE    "Moscow"
set_var EASYRSA_REQ_CITY        "Moscow"
set_var EASYRSA_REQ_ORG         "My Organisation"
set_var EASYRSA_REQ_EMAIL       "admin@itdraft.ru"
set_var EASYRSA_REQ_OU          "IT department"
set_var EASYRSA_KEY_SIZE        4096
set_var EASYRSA_ALGO            rsa
set_var EASYRSA_CA_EXPIRE       7500
set_var EASYRSA_CERT_EXPIRE     3650
set_var EASYRSA_NS_SUPPORT      "no"
set_var EASYRSA_NS_COMMENT      "CERTIFICATE AUTHORITY"
set_var EASYRSA_EXT_DIR         "$EASYRSA/x509-types"
set_var EASYRSA_SSL_CONF        "$EASYRSA/openssl-1.0.cnf"
set_var EASYRSA_DIGEST          "sha512"
set_var EASYRSA_CRL_DAYS        720

Делаем файл исполняемым

# chmod +x vars

 

Создание ключа и сертификата для OpenVPN Сервера

Инициализация каталог PKI

# ./easyrsa init-pki
Note: using Easy-RSA configuration from: ./vars

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/easy-rsa/pki

Создать ключ CA

# ./easyrsa build-ca

будет запрошен пароль, его будет запрашивать в дальнейшем при создании сертификатов

Создадим ключ сервера (название сервера srv-openvpn)

# ./easyrsa gen-req srv-openvpn nopass

опция nopass — отключение пароля для srv-openvpn

Подпишем ключ srv-openvpn используя наш CA-сертификат

# ./easyrsa sign-req server srv-openvpn

на вопрос: Confirm request details: — ответить: yes
в процессе у нас спросят пароль, который мы задавали CA

Проверим файлы сертификата, что бы убедится, что сертификаты сгенерировались без ошибок

# openssl verify -CAfile pki/ca.crt pki/issued/srv-openvpn.crt
pki/issued/srv-openvpn.crt: OK

 

Создание ключа клиента

# cd /etc/openvpn/easy-rsa

Сгенерируем ключ клиента client-01

# ./easyrsa gen-req client-01 nopass

Подпишем ключ client-01, используя наш CA сертификат

# ./easyrsa sign-req client client-01

на вопрос: Confirm request details: — ответить: yes
в процессе у нас спросят пароль, который мы задавали CA

Проверим файлы сертификата

# openssl verify -CAfile pki/ca.crt pki/issued/client-01.crt
pki/issued/client-01.crt: OK

 

Дополнительная настройка OpenVPN сервера

Сгенерируем ключ Диффи-Хеллмана

# ./easyrsa gen-dh

Сгенерируем CRL ключ необходимый для отзыва клиентских сертификатов

# ./easyrsa gen-crl

Для того, что бы отозвать сертификат надо выполнить команду (НА БУДУЩЕЕ)

# ./easyrsa revoke client-02

после каждого отозванного сертификата необходимо обновлять CRL ключ

Копируем сертификаты сервера

# cp pki/ca.crt /etc/openvpn/server/
# cp pki/issued/srv-openvpn.crt /etc/openvpn/server/
# cp pki/private/srv-openvpn.key /etc/openvpn/server/
# cp pki/dh.pem /etc/openvpn/server/
# cp pki/crl.pem /etc/openvpn/server/

Копируем сертификаты клиента

# cp pki/ca.crt /etc/openvpn/client/
# cp pki/issued/client-01.crt /etc/openvpn/client/
# cp pki/private/client-01.key /etc/openvpn/client/

 

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

Создадим файл конфигурации server.conf

# cd /etc/openvpn
# vi server.conf

Записываем в файл server.conf

# OpenVPN Port, Protocol and the Tun
port 1194
#proto udp
proto tcp
dev tun

# OpenVPN Server Certificate - CA, server key and certificate
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/srv-openvpn.crt
key /etc/openvpn/server/srv-openvpn.key

# DH and CRL key
dh /etc/openvpn/server/dh.pem
crl-verify /etc/openvpn/server/crl.pem

# Network Configuration - Internal network
# Redirect all Connection through OpenVPN Server
server 10.0.10.0 255.255.255.0
push "redirect-gateway def1"
#push "route 82.146.59.16 255.255.255.255"

# Using the DNS from https://dns.watch
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

# Enable multiple client to connect with same Certificate key
duplicate-cn

# TLS Security
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA512
auth-nocache

# Other Configuration
keepalive 20 60
persist-key
persist-tun
comp-lzo yes
daemon
user nobody
group nobody

# Статус подключения списка клиентов
status /etc/openvpn/openvpn-status.log

# Разрешить клиентам видеть друг-друга
client-to-client

# OpenVPN Log
log-append /var/log/openvpn.log
verb 3

 

Настройка Firewalld

Отредактировать файл /etc/sysctl.conf:
Добавить:

net.ipv4.ip_forward = 1

Выполняем команду

# sysctl -p

 

Настройка для firewalld

firewall-cmd --permanent --add-masquerade
firewall-cmd --zone=public --add-port=1194/tcp --permanent
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p gre -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.0.10.0/24 -o eth0 -j MASQUERADE
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -s 10.0.10.0/24 -o eth0 -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i eth0 -d 10.0.10.0/24 -m state --state RELATED,ESTABLISHED -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -p tcp --tcp-flags SYN,RST SYN -s 10.0.10.0/24 -j TCPMSS --clamp-mss-to-pmtu
firewall-cmd --reload

настройка для iptables

открыть пот 1194 для подключения клиентов

iptables -I INPUT -i eth0 -m state --state NEW -p tcp --dport 1194 -j ACCEPT

разрешим интерфейсу tun коммуникацию с другими интерфейсами в системе

iptables -I FORWARD -i tun+ -j ACCEPT
iptables -I FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT

включить nat

iptables -t nat -A POSTROUTING -s 10.0.10.0/24 -o eth0 -j MASQUERADE

разрешить исходящий трафик на tun-инмерфейсе

iptables -A OUTPUT -o tun+ -j ACCEPT

сохранить правила iptables

service iptables save

 

Запустим OpenVPN и добавим его в автозагрузку

# systemctl start openvpn@server
# systemctl enable openvpn@server

Проверим

# systemctl status openvpn@server

 

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

Создадим файл конфигурации client-01.ovpn

# cd /etc/openvpn/client
# vi client-01.ovpn

Записываем в файл client-01.ovpn

client
dev tun
proto tcp

remote xx.xx.xx.xx 1194
remote-cert-tls server

ca ca.crt
cert client-01.crt
key client-01.key

cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256

resolv-retry infinite
compress lzo
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3

в строке ‘remote xx.xx.xx.xx 1194‘ надо прописать IP-адрес вместо ‘xx.xx.xx.xx‘

 

Чтобы через соединение работала только определенная подсеть, к примеру локалка, а интернет текущий:

route-nopull
route 10.0.10.0 255.255.255.0
route 192.168.0.0 255.255.255.0

 

Теперь для надо заархивировать сертификаты (ca.crt, client-01.crt), ключ клиента (client-01.key), файл конфигурации (client-01.ovpn), и передать их на ПК, который будет подключаться к OpenVPN серверу

Для подключения с iPhone, iPad, Mac: Passepartout, OpenVPN Client

Для подключения с андройда лучше использовать: OpenVPN for Android

https://openvpn.net/community-downloads/

Скачать APK OpenVPN for Android v-0.7.15

Скачать OpenVPN for Windows 7, 8

Скачать OpenVPN for Windows 10

Ярлык для автозапуска с подключением:

"C:\Program Files\OpenVPN\bin\openvpn-gui.exe" --connect client-01.ovpn --silent_connection 1

Расположение ярлыка для автозапуска:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

 

Выделение статических ip адресов клиентам

создать директорию /etc/openvpn/ccd:

mkdir /etc/openvpn/ccd

добавить строку в конфиг сервера /etc/openvpn/server.conf:

...
client-config-dir /etc/openvpn/ccd

для созданных сертификатов создавать конфигурационные файлы (к примеру для client-01):

создать файл /etc/openvpn/ccd/client-01 и заполнить:

ifconfig-push 10.0.10.200 10.0.10.1

пользователь подключающийся при помощи сертификата client-01 будет выдан ip: 10.0.10.200

 

Ошибка при подключении на Windows

В моем случае ошибка появилась на Windows 7:

OpenVPN Error: All TAP-Windows adapters on this system are currently in use

Решение:

Перейти в папку: C:\Program Files\TAP-Windows
От администратора запустить Uninstall.exe

Пройти все жтапы для удаления драйвера

Скачать TAP-драйвер: tap-windows-9.21.2.exe

Запустить tap-windows-9.21.2.exe от администратора и установить драйвер

В моем случае ошибка не появлялась после данных манипуляций


 

Клиент на Linux:

поместить файлы ca.crt, client-01.crt, client-01.key, client-01.ovpn в /etc/openvpn и выполнить:

# openvpn --config /etc/openvpn/client-01.ovpn

 

Ошибка при подключении клиента:

...
Mon Jul 06 18:59:29 2020 open_tun
Mon Jul 06 18:59:29 2020 TAP-WIN32 device [Подключение по локальной сети] opened: \\.\Global\{84AD4B1B-C918-4BC8-A992-8ED12C53F793}.tap
Mon Jul 06 18:59:29 2020 TAP-Windows Driver Version 9.24 
Mon Jul 06 18:59:29 2020 Notified TAP-Windows driver to set a DHCP IP/netmask of 10.0.10.6/255.255.255.252 on interface {84AD4B1B-C918-4BC8-A992-8ED12C53F793} [DHCP-serv: 10.0.10.5, lease-time: 31536000]
Mon Jul 06 18:59:29 2020 Successful ARP Flush on interface [30] {84AD4B1B-C918-4BC8-A992-8ED12C53F793}
Mon Jul 06 18:59:29 2020 MANAGEMENT: >STATE:1594051169,ASSIGN_IP,,10.0.10.6,,,,
Mon Jul 06 18:59:34 2020 TEST ROUTES: 0/0 succeeded len=-1 ret=0 a=0 u/d=down
Mon Jul 06 18:59:34 2020 Route: Waiting for TUN/TAP interface to come up...
Mon Jul 06 18:59:39 2020 TEST ROUTES: 0/0 succeeded len=-1 ret=0 a=0 u/d=down
Mon Jul 06 18:59:39 2020 Route: Waiting for TUN/TAP interface to come up...
Mon Jul 06 18:59:40 2020 TEST ROUTES: 0/0 succeeded len=-1 ret=0 a=0 u/d=down
Mon Jul 06 18:59:40 2020 Route: Waiting for TUN/TAP interface to come up...
Mon Jul 06 18:59:42 2020 TEST ROUTES: 0/0 succeeded len=-1 ret=0 a=0 u/d=down
Mon Jul 06 18:59:42 2020 Route: Waiting for TUN/TAP interface to come up...
Mon Jul 06 18:59:43 2020 TEST ROUTES: 0/0 succeeded len=-1 ret=0 a=0 u/d=down
Mon Jul 06 18:59:43 2020 Route: Waiting for TUN/TAP interface to come up...
Mon Jul 06 18:59:44 2020 TEST ROUTES: 0/0 succeeded len=-1 ret=0 a=0 u/d=down
Mon Jul 06 18:59:44 2020 Route: Waiting for TUN/TAP interface to come up...
...

Решение:

Нажимаем WIN+X выбираем Панель управления, в открывшемся окне кликаем Программы и затем Включение и отключение компонентов Windows.
Ищем там Пакет администрирования диспетчера RAS-подключений (CMAK) и убеждаемся, что напротив него стоит галочка. Если не стоит ее нужно поставить.
Если пакет не установлен то он установится после того как вы поставите галочку.
Если пакет установлен закрываем все нажатием ОК.

Нажимаем WIN+R вводим services.msc и жмем Выполнить.
Откроется окно Службы.
Ищем службу Сетевые подключения, делаем двойной клик мышью на ней.
Вам откроется Свойства: Сетевые подключения выставляем Тип запуска: Автоматически. Если служба не запущена(Состояние: Выключена) то запускаем ее нажатием на кнопку Запустить. Если служба уже запущена можно по желанию перезапустить ее (Остановить|Запустить).
Закрываем это окно нажатием ОК.


Ошибка в логах подключения

Mon Aug 01 10:29:35 2022 WARNING: No server certificate verification method has been enabled.  See http://openvpn.net/howto.html#mitm for more info.

Решение:

добавить в конфиг клиента:

...
remote-cert-tls server
...

Не подключается клиент. появляется ошибка:

...
Mon Aug 01 10:29:36 2022 Connection reset, restarting [0]

на сервере в логах появляется:

...
Mon Aug  1 11:01:49 2022 1.2.3.4:2183 WARNING: Failed to stat CRL file, not (re)loading CRL.
Mon Aug  1 11:01:49 2022 1.2.3.4:2183 VERIFY ERROR: depth=0, error=CRL has expired: CN=client-01, serial=289809041961108508093849536526172910990
Mon Aug  1 11:01:49 2022 1.2.3.4:2183 OpenSSL: error:14089086:SSL routines:ssl3_get_client_certificate:certificate verify failed
Mon Aug  1 11:01:49 2022 1.2.3.4:2183 TLS_ERROR: BIO read tls_read_plaintext error
Mon Aug  1 11:01:49 2022 1.2.3.4:2183 TLS Error: TLS object -> incoming plaintext read error
Mon Aug  1 11:01:49 2022 1.2.3.4:2183 TLS Error: TLS handshake failed
Mon Aug  1 11:01:49 2022 1.2.3.4:2183 Fatal TLS error (check_tls_errors_co), restarting
Mon Aug  1 11:01:49 2022 1.2.3.4:2183 SIGUSR1[soft,tls-error] received, client-instance restarting
...

Решение (данное решение подходит к данной статье, т.к. директории соответствуют):

проверка файла crl.pem

openssl crl -inform PEM -in /etc/openvpn/server/crl.pem -text -noout

в результате найти строки по которым станет понятна причина, что CRL ключ просрочен

...
        Issuer: /CN=Easy-RSA CA
        Last Update: Jan 31 09:51:50 2022 GMT
        Next Update: Jul 30 09:51:50 2022 GMT
        CRL extensions:
...

удаляем предыдущие

rm -rf /etc/openvpn/server/crl.pem
rm -rf /etc/openvpn/easy-rsa/pki/crl.pem

переходим в /etc/openvpn/easy-rsa

cd /etc/openvpn/easy-rsa

Сгенерируем CRL ключ необходимый для отзыва клиентских сертификатов

./easyrsa gen-crl

Копируем в папку с конфигурацией

cp pki/crl.pem /etc/openvpn/server/

Перезапускаем сервер:

systemctl restart openvpn@server

для увеличения срока генерации сертификата CRL добавить в файл vars параметр

set_var EASYRSA_CRL_DAYS 720

 

Поместить сертификаты в файл конфигурации

client
dev tun
proto tcp

remote xx.xx.xx.xx 1194

cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256

resolv-retry infinite
compress lzo
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3
<ca>
-----BEGIN CERTIFICATE-----
XXX CA XXX
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
XXX CLIENT XXX
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
XXX CLIENT PRIVATE XXX
-----END PRIVATE KEY-----
</key>

Если нужно соединение использовать только для одной подсети

К примеру 192.168.0. *:

route-nopull 
route 10.0.10.0 255.255.255.0
route 192.168.0.0 255.255.255.0

Только для одного IP (192.168.0.1):

route-nopull 
route 10.0.10.0 255.255.255.0
route 192.168.0.1 255.255.255.255

 

Пример конфигурации с подсетью 192.168.0.*:

client
dev tun
proto tcp

remote 88.88.88.88 1194

route-nopull
route 10.0.10.0 255.255.255.0
route 192.168.0.0 255.255.255.0

cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256

resolv-retry infinite
compress lzo
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3

<ca>
-----BEGIN CERTIFICATE-----

-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----

-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----

-----END PRIVATE KEY-----
</key>