Установка и настройка OpenVPN (клиента и сервера) и Easy-RSA 3 в CentOS 7

Установка и настройка OpenVPN (клиента и сервера) и Easy-RSA 3 в CentOS 7

OpenVPN — свободная реализация технологии виртуальной частной сети с открытым исходным кодом для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами.
Easy-RSA — программа для создания и ведения инфраструктуры открытых ключей (PKI) в openVPN

Установка необходимого софта

Добавляем репозиторий EPEL и обновляемся

[root@localhost ~]# yum install epel-release -y
[root@localhost ~]# yum update -y

Устанавливает OpenVPN 2.4 и Easy-RSA 3

[root@localhost ~]# yum install openvpn easy-rsa -y

Проверим их версии

[root@localhost ~]# openvpn --version
[root@localhost ~]# ls -lah /usr/share/easy-rsa/
Проверка версий OpenVPN и Easy-RSA
Проверка версий OpenVPN и Easy-RSA

Настройка Easy-RSA 3

Скопируем скрипты easy-rsa в каталог /etc/openvpn/

[root@localhost ~]# cp -r /usr/share/easy-rsa /etc/openvpn/

Переходим в каталог /etc/openvpn/easy-rsa/3/ и создаем там файл vars

[root@localhost ~]# cd /etc/openvpn/easy-rsa/3/
[root@localhost ~]# nano 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"

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

[root@localhost ~]# chmod +x vars

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

Прежде чем создавать ключ, нам нужно инициализировать каталог PKI и создать ключ CA.

[root@localhost ~]# cd /etc/openvpn/easy-rsa/3/
root@localhost ~]# ./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/3/pki

[root@localhost ~]# ./easyrsa build-ca

На этом необходимо придумать пароль для своего CA-ключа, чтобы сгенерировались файлы ‘ca.crt’ и ‘ca.key’ в каталоге ‘pki’.
Этот пароль нам потребуется дальше

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

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

[root@localhost ~]# ./easyrsa gen-req srv-openvpn nopass

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

Создаем ключ сервера
Создаем ключ сервера

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

[root@localhost ~]# ./easyrsa sign-req server srv-openvpn

В процессе у нас спросят пароль, который мы задавали ранее

Подписываем ключ, используя CA-сертификат
Подписываем ключ, используя CA-сертификат

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

[root@localhost ~]# openssl verify -CAfile pki/ca.crt pki/issued/srv-openvpn.crt
pki/issued/srv-openvpn.crt: OK

Все сертификата OpenVPN сервера созданы.

  • Корневой сертификат расположен: ‘pki/ca.crt’
  • Закрытый ключ сервера расположен: ‘pki/private/srv-openvpn.key’
  • Сертификат сервера расположен: ‘pki/issued/srv-openvpn.crt’

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

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

[root@localhost ~]# ./easyrsa gen-req client-01 nopass
Генерируем ключ клиента
Генерируем ключ клиента

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

[root@localhost ~]# ./easyrsa sign-req client client-01

В процессе у нас спросят пароль, который мы задавали ранее

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

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

[root@localhost ~]# openssl verify -CAfile pki/ca.crt pki/issued/client-01.crt
pki/issued/client-01.crt: OK

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

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

[root@localhost ~]# ./easyrsa gen-dh
Генерация ключа Диффи-Хеллмана
Генерация ключа Диффи-Хеллмана

Если мы в дальнейшем планируем отзывать клиентские сертификаты, нам необходимо сгенерировать CRL ключ

[root@localhost ~]# ./easyrsa gen-crl

В процессе у нас спросят пароль, который мы задавали ранее

Генерируем CRL-ключ
Генерируем CRL-ключ

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

[root@localhost ~]# ./easyrsa revoke client-02

где client-02 имя сертификата, который мы отзываем

Все необходимые сертификаты созданы, теперь их надо скопировать в директории

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

[root@localhost ~]# cp pki/ca.crt /etc/openvpn/server/
[root@localhost ~]# cp pki/issued/srv-openvpn.crt /etc/openvpn/server/
[root@localhost ~]# cp pki/private/srv-openvpn.key /etc/openvpn/server/

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

[root@localhost ~]# cp pki/ca.crt /etc/openvpn/client/
[root@localhost ~]# cp pki/issued/client-01.crt /etc/openvpn/client/
[root@localhost ~]# cp pki/private/client-01.key /etc/openvpn/client/

Копируем ключи DH и CRL

[root@localhost ~]# cp pki/dh.pem /etc/openvpn/server/
[root@localhost ~]# cp pki/crl.pem /etc/openvpn/server/

!!! Проверить, надо ли перегенерировать CRL и заново копировать его в каталог /etc/openvpn/server/ после отзыва сертификата !!!

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

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

[root@localhost ~]# cd /etc/openvpn/
[root@localhost ~]# nano server.conf

Содержимое файла:

# OpenVPN Port, Protocol and the Tun
port 1194
proto udp
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.10.1.0 255.255.255.0
push "redirect-gateway def1"

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

# 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

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

Настройка Firewalld

Активируем модуль ядра port-forwarding

[root@localhost ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1

Добавим службу openvpn в firewalld, и интерфейс tun0 в доверенную зону

[root@localhost ~]# firewall-cmd --permanent --add-service=openvpn
[root@localhost ~]# firewall-cmd --permanent --zone=trusted --add-interface=tun0

Активируем ‘MASQUERADE’ для доверенной зоны firewalld

[root@localhost ~]# firewall-cmd --permanent --zone=trusted --add-masquerade

Активируем NAT

[root@localhost ~]# SERVERIP=$(ip route get 84.200.69.80 | awk 'NR==1 {print $(NF-2)}')
[root@localhost ~]# firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s  10.10.1.0/24 -o $SERVERIP -j MASQUERADE

Перезапустим firewalld

[root@localhost ~]# firewall-cmd --reload

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

[root@localhost ~]# systemctl start openvpn@server
[root@localhost ~]# systemctl enable openvpn@server

Проверим

[root@localhost ~]# netstat -plntu
[root@localhost ~]# systemctl status openvpn@server
Проверяем, запущен ли OpenVPN
Проверяем, запущен ли OpenVPN

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

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

[root@localhost ~]# cd /etc/openvpn/client
[root@localhost ~]# nano client-01.ovpn

Содержимое файла:

client
dev tun
proto udp

remote xx.xx.xx.xx 1194

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

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

Установим архиватор zip и создадим архив с файлами

[root@localhost ~]# yum install zip unzip -y
[root@localhost ~]# cd /etc/openvpn/
[root@localhost ~]# zip client/client-01.zip client/*

Пробуем подключиться с другого ПК к OpenVPN серверу и смотрим лог:

[root@localhost ~]# tail -f /var/log/openvpn.log
Смотрим log-файл OpenVPN сервера
Смотрим log-файл OpenVPN сервера

Максим Макаров
У блога появился хостинг, его любезно предоставила компания Облакотека.
Облакотека - облачные сервисы для создания и управления виртуальной ИТ-инфраструктурой.
Если вам понравился мой блог и вы хотели бы видеть на нем еще больше полезных статей, большая просьба поддержать этот ресурс. Для этого достаточно кликнуть на контекстную рекламу, расположенную на сайте.
Оцените автора
IT Draft
Добавить комментарий

Нажимая на кнопку "Отправить комментарий", я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.

  1. RomKaz

    Здрвствуйте.
    Подключение проходит, устанавливается, но на келиентской машине пропадает интернет, работает только локалка.

    Ответить
  2. RomKaz

    Извинете, ложная паника. :-) Ошибку нашёл и исправил, она была в роутинге. Ошибка моя, не ваша. Спасибо за статью.

    Ответить
    1. Максим Макаров автор

      Благодарю за отзыв :)

      Ответить
  3. Евгений

    Спасибо Автору! Очень полезная и хорошая статья, а главное актуальная по релизам на день когда я настраивал. По долгу службы, впервые настраиваю OpenVPN сервер, уже 3 дня мучаюсь, а с этой статьей всего за пол часа всё поднял.
    Единственное, что в чистой CentOS 7 не установлен net-tools по умолчанию.

    Ответить
    1. Максим Макаров автор

      Благодарю за отзыв. Рад, что статья оказалась полезной :)
      У себя на работе обычно использую дистрибутив CentOS 7 minimal. Что бы в системе было как можно меньше мусора из не нужного ПО. И доустанавливаю недостающий софт.

      Ответить
  4. Danil

    Спасибо за статью!
    И пара маленьких замечаний, если позволите.
    В файле vars Вы указываете опцию EASYRSA_DN «cn_only».
    В этом случае в поле Subject для сертификатов будет добавлено только значение CN (CommonName).
    Остальные значения Country/Province/City/Org/OU/email добавлены не будут.
    Лучше тогда использовать EASYRSA_DN «org».

    EASYRSA_KEY_SIZE 4096
    Рекомендуемое значение 2048. Пишут, что большие размеры ключей замедляют согласование TLS
    и делают генерацию параметров ключей / DH более длительной.
    Но это нужно проверять.

    Ответить
    1. Максим Макаров автор

      Благодарю за дельные замечания

      Ответить