1. Предварительная подготовка сервера
2. Генерация ключей и сертификатов
3 Перенос готовых сертификатов в /etc/openvpn
4. Настройка и запуск сервера
5. Настройка NAT в Firewalld
6. Генерация сертификата для OpenVPN-клиента
7. Подключение клиента к серверу OpenVPN
8. Отзыв сертификата
OpenVPN используется для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами. OpenVPN позволяет устанавливать соединения между компьютерами, находящимися за NAT и сетевым экраном через один сетевой порт UDP или TCP.
1. Предварительная подготовка сервера
1.1 Переведите selinux в режим уведомлений
На время настройки сервиса переведите selinux в режим уведомлений. Для этого измените содержимое конфигурационного файла:
nano /etc/selinux/config
Заменив текст SELINUX=enforcing
на SELINUX=permissive
Выполните:
setenforce 0
Более подробно см.ссылку
Не забудьте включить selinux после завершения настройки.
1.2 Настройка Firewalld
Если Firewalld активен, то следует открыть порт для OpenVPN. По умолчанию OpenVPN работает на 1194 порту.
firewall-cmd --permanent --add-port=1194/udp firewall-cmd —reload
1.3 Установка OpenVPN и Easy-RSA
Выполните команду:
yum install openvpn easy-rsa
1.4 Создание файла vars
Создадим файл vars, который будет использоваться как шаблон, чтобы упростить и ускорить процесс создания ключей. В нем указаны параметры для создаваемых ключей.
Перейдите в каталог cd /usr/share/easy-rsa/3
Создайте файл с именем vars
, ниже приведен пример содержимого файла:
export KEY_COUNTRY="RU" export KEY_PROVINCE="Moscow" export KEY_CITY="Moscow" export KEY_ORG="MyCompany" export KEY_EMAIL="admin@example.com" export KEY_CN="openvpnserver" export KEY_OU="ITotdel" export KEY_NAME="vpn.example.com" export KEY_ALTNAMES="myopenvpn"
Данную информацию потом можно увидеть в свойствах сертификата ca.crt
Описание параметров:
KEY_COUNTRY
— двух буквенная аббревиатура страны проживания;
KEY_PROVINCE
— штат/область/регион;
KEY_CITY
— город;
KEY_ORG
— название вашей организации;
KEY_EMAIL
— электронная почта, которая будет привязана к сертификату;
KEY_OU
— Organizational Unit – название команды и отдела, для которого предназначен сертификат;
KEY_CN
— название сервера;
KEY_NAME
— адрес, по которому будет выполняться подключение (можно указать полное наименование сервера);
KEY_ALTNAMES
— альтернативный адрес;
Значения данных полей используются при создании самоподписанного сертификата и никак в дальнейшем не повлияют на работу OpenVPN, однако, для удобства, лучше подставить реальные данные.
Для создания защищенного соединения между клиентами и сервером минимальный набор ключей и сертификатов будет состоять из следующего списка:
Сертификат УЦ (CA);
Сертификат сервера;
Закрытый ключ сервера;
Ключевая последовательность Диффи-Хеллмана;
Закрытый ключ УЦ;
Сертификат клиента;
Закрытый ключ клиента.
2 Генерация ключей и сертификатов
2.1 Инициализируем PKI (инфраструктура публичных ключей)
Перейдите в каталог cd /usr/share/easy-rsa/3
и выполните в нем команду:
./easyrsa init-pki
в текущем каталоге появится каталог pki.
2.2 Создание удостоверяющего центра CA
Генерируем корневой сертификат (CA), им должны быть подписаны все сертификаты используемые OpepVPN сервером.
Выполните команду:
./easyrsa build-ca
На запрос "Enter New CA Key Passphrase"
задайте пароль.
На запрос "Re-Enter New CA Key Passphrase"
повторите пароль.
Этот пароль защищает приватный ключ удостоверяющего центра. Также пароль потребуется каждый раз, когда нужно будет подписывать в удостоверяющем центре сертификаты для серверов и клиентов OpenVPN. На запрос ввести "Common Name"
можно просто нажать Enter
.
Кроме этого имеется возможно сформировать CA и без ключа:
./easyrsa build-ca nopass
но это менее безопасно.
В результате выполнения команд будут созданы два ключа в каталоге pki:
./pki/private/ca.key ./pki/ca.crt
ca.key
— приватный(секретный) ключ центра CA, остается на сервере и никому не передается.
ca.crt
— открытый файл сертификата УЦ, он вместе с пользовательскими сертификатами передается клиентам.
2.3 Создание ключа Диффи-Хеллмана
Файл Диффи-Хелмана используется для безопасного получения общего секретного ключа в незащищенных каналах связи, применяется для обеспечения защиты трафика от расшифровки между клиентом и сервером.
./easyrsa gen-dh
при этом будет создан файл /usr/share/easy-rsa/3/pki/dh.pem
2.4 Создание сертификата сервера
Для создания сертификата сервера необходимо сначала создать файл запроса.
Файл запроса для сервера создадим без пароля с помощью опции nopass, иначе придется вводить пароль с консоли при каждом запуске сервера.
Находясь в каталоге cd /usr/share/easy-rsa/3/
выполните команду:
./easyrsa gen-req vpn-server nopass
на запрос ввода Common Name
нажимаем Enter
В результате будет создан файл запроса /usr/share/easy-rsa/3/pki/reqs/vpn-server.req
и файл приватного ключа /usr/share/easy-rsa/3/pki/private/vpn-server.key
Теперь необходимо подписать запрос на получение сертификата у нашего CA:
./easyrsa sign-req server vpn-server
После ввода команды подтверждаем правильность данных, введя yes
Confirm request details: yes
Далее вводим пароль, который указывали при создании корневого сертификата.
В результате сформируется сертификат сервера /usr/share/easy-rsa/3/pki/issued/vpn-server.crt
2.5 Создание TA ключа
Для активации tls-auth необходимо сгенерировать дополнительный секретный ключ.
Сделать это можно с помощью команды:
openvpn --genkey --secret pki/ta.key
Tls-auth добавляет использование еще одной подписи HMAC к handshake-пакетам SSL/TLS, инициируя дополнительную проверку целостности. Теперь пакет, не имеющий такой подписи, будет сразу отбрасываться. Это обеспечит дополнительный уровень безопасности протокола SSL/TLS, защищая систему от таких атак, как:
— Сканирование прослушиваемых VPN-сервером портов
— Инициация SSL/TLS-соединения несанкционированной машиной (tls-auth отсекает их на значительно более раннем этапе, чем при использовании OpenVPN без tls-auth)
— DoS-атаки и флуд на порты OpenVPN
— Переполнение буфера SSL/TLS
3. Перенос готовых сертификатов в /etc/openvpn
Сертификаты сервера готовы и находятся в каталоге pki. В /etc создадим новый каталог, в котором будем хранить сертификаты:
mkdir -p /etc/openvpn/server/keys
Переходим в каталог pki:
cd /usr/share/easy-rsa/3/pki/
Копируем в /etc/openvpn/server/keys
следующие сертификаты:
cp ca.crt issued/vpn-server.crt private/vpn-server.key dh.pem ta.key /etc/openvpn/server/keys/
4 Настройка и запуск сервера
4.1 Создаем конфигурационный файл для сервера openvpn
nano /etc/openvpn/server/server.conf
Содержимое файла server.conf
local 10.10.0.2 # Сетевой порт сервера port 1194 # Работа по протоколу UDP proto udp dev tun ca keys/ca.crt cert keys/vpn-server.crt key keys/vpn-server.key dh keys/dh.pem tls-auth keys/ta.key 0 # Область Ip-адресов виртуальных хостов server 192.168.10.0 255.255.255.0 # Назначение шлюза клиентам push "redirect-gateway def1" push "route-gateway 192.168.10.1" # Указывается DNS push "dhcp-option DNS 1.1.1.1" ifconfig-pool-persist ipp.txt keepalive 10 120 max-clients 15 client-to-client persist-key persist-tun status /var/log/openvpn/openvpn-status.log log-append /var/log/openvpn/openvpn.log verb 0 mute 20 daemon mode server tls-server # Компрессия трафика comp-lzo yes # Алгоритм шифрования трафика cipher BF-CBC
4.2 Запуск сервера
Перед запуском создадим каталог для «лог-файлов» сервера:
mkdir /var/log/openvpn
Разрешаем автоматический старт сервиса OpenVPN:
systemctl enable openvpn-server@server
Запускаем openvpn-server:
systemctl start openvpn-server@server
5. Настройка NAT в Firewalld
Если необходимо, чтобы клиенты могли выходить через vpn в интернет, то для этого настроим NAT
nano /etc/sysctl.conf
добавить строку:
net.ipv4.ip_forward=1
Применяем настройки sysctl:
sysctl -p /etc/sysctl.conf
Добавим правила в firewalld. eth0 — внешний, tun0 — внутренний интерфейс OpenVPN:
firewall-cmd --direct --permanent --add-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i tun0 -o eth0 -j ACCEPT
sudo firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
6. Создание сертификата для OpenVPN-клиента
Для настройки клиента необходимо на сервере создать пользовательские сертификаты, а на клиентском компьютере установить программу OpenVPN и настроить ее. На сервере генерируем сертификаты для клиента.
6.1 Создание клиентского сертификат
Для этого переходим в каталог easy-rsa:
cd /usr/share/easy-rsa/3
Формирование запрос на клиентский сертификат:
./easyrsa gen-req client1 nopass
Подпись запроса:
./easyrsa sign-req client client1
На запрос подтверждение выпустить сертификат — вводим yes
:
Confirm request details: yes
В результате создастся сертификат client1.ca
и закрытый ключ client1.key
Для удобства переноса пользовательских ключей на клиентский компьютер, скопируйте на сервере эти ключи во временную директорию (/tmp/keys), выполнив последовательно 3 команды:
mkdir /tmp/keys
cp pki/issued/client1.crt pki/private/client1.key pki/dh.pem pki/ca.crt pki/ta.key /tmp/keys
chmod -R a+r /tmp/keys
6.2 Сборка единого конфигурационного файла для подключения клиентов к OpenVPN
Единый файл .ovpn содержит в себе настройки клиента для подключения к OpenVPN серверу, а также все необходимые сертификаты. Для подключению к OpenVPN серверу, достаточно импортировать этот файл и подключение к vpn будет настроено.
Создаем каталог:
mkdir /etc/openvpn/keyovpn
переходим в каталог:
cd /etc/openvpn/keyovpn
Создаем файл:
nano /etc/openvpn/keyovpn/base-client.conf
Пример содержимого файла base-client.conf
:
client resolv-retry infinite nobind # Адрес OpenVPN сервера remote 10.10.0.2 1194 proto udp dev tun comp-lzo yes tls-client key-direction 1 float keepalive 10 120 persist-key persist-tun verb 0 # Алгоритм шифрования cipher BF-CBC
Создадим скрипт автоматической сборки файла *.ovpn
nano /etc/openvpn/keyovpn/make_config.sh
Содержимое скрипта:
#!/bin/bash #Каталог где лежать клиентские ключи KEY_DIR=/tmp/keys #каталог в котором будет создан файл *.ovpn OUTPUT_DIR=/etc/openvpn/keyovpn/ #Клиентский конфигурационный файл BASE_CONFIG=./base-client.conf cat ${BASE_CONFIG} \ <(echo ) \ <(echo -e '<ca>') \ ${KEY_DIR}/ca.crt \ <(echo -e '</ca>\n<cert>') \ ${KEY_DIR}/${1}.crt \ <(echo -e '</cert>\n<key>') \ ${KEY_DIR}/${1}.key \ <(echo -e '</key>\n<tls-auth>') \ ${KEY_DIR}/ta.key \ <(echo -e '</tls-auth>') \ > ${OUTPUT_DIR}/${1}.ovpn
chmod +x make_config.sh
Запускаем скрипт:
./make_config.sh client1
client1 — имя клиентского сертификата
На выходе будет создан файл client1.ovpn
, который содержит все необходимые настройки, ключи и сертификаты для подключения.
7. Подключение клиента к серверу OpenVPN
Для подключения клиента к VPN серверу передайте файл client1.ovpn на клиентский ПК. В свойствах сетевого подключения импортируйте файл client1.ovpn, при это будут импортированы настройки подключения к серверу OpenVPN, а также сертификаты и ключи.
8. Отзыв сертификата
В нашем примере мы создали сертификат client1, теперь сделаем отзыв этого сертификата. Переходим в каталог:
cd /usr/share/easy-rsa/3
Отзываем сертификат командой:
./easyrsa revoke client1
Подтверждаем действия: Continue with revocation: yes
и вводим пароль от центра сертификации.
После этого создаем/обновляем файл crl.pem:
./easyrsa gen-crl
во время выполнения команды, необходимо будет ввести пароль центра сертификации.
Копируем файл crl.pem
в каталог openvpn:
cp pki/crl.pem /etc/openvpn/server/keys/
Перезагружаем сервис openvpn:
systemctl restart openvpn-server@server