В этой статье мы разберем установку OpenVPN сервера с авторизацией по сертификату по ОС Linux, все команды будут даны для дистрибутива Linux CentOS 7.

Автор: unix-admin

OpenVPN с авторизацией по сертификату

1. Подготовка

Для успешного использования OpenVPN необходима возможность создание tun/tap-устройств в системе, для проверки достаточно проверить наличие tun устройства в папке /dev/net/:

[root@localhost]# ls /dev/net/tun -la
crw-rw-rw- 1 root root 10, 200 May 31 15:50 /dev/net/tun

Если у вас нет такого устройства, проверьте настройки ядра Linux на наличие модулю tun/tap, либо, если вы используете хостинг на OpenVZ, напишите вашему хостеру что вам нужен этот модуль, разные хостеры реагируют на это по-разному, в худшем случае придется менять хостера.

Также, необходимо отключить selinux, если вы его не используете, отредактируйте файл /etc/sysconfig/selinux в соответсвие со следующим содержимым:

# 
# This file controls the state of SELinux on the system. 
# SELINUX= can take one of these three values: 

# enforcing - SELinux security policy is enforced. 
# permissive - SELinux prints warnings instead of enforcing. 
# disabled - No SELinux policy is loaded. SELINUX=disabled 

# SELINUXTYPE= can take one of three two values: 
# targeted - Targeted processes are protected, 
# minimum - Modification of targeted policy. Only selected processes are protected. 
# mls - Multi Level Security protection. 
SELINUXTYPE=targeted

После чего перезагрузите сервер.

[root@localhost]# reboot

 


2. Установка

Для начала подключим репозиторий EPEL и установим OpenVPN.

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

Так же нужно установить пакет Easy-RSA для генерации необходимых SSL-сертификатов.

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

Установим фаерволл iptables, если его нет в системе:

[root@localhost]# yum install iptables iptables-utils -y

 


3. Настройка

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

  • Сертификат CA
  • Сертификат Diffie-Helman
  • Клиентский сертификат и секретный ключ
  • Серверный сертификат и клиентский ключ
[root@localhost]# cp -r /usr/share/easy-rsa/ /etc/openvpn/

В файле /etc/openvpn/easy-rsa/2.0/vars установлены некоторые переменные, при необходимости вы можете поменять их, вот список этих переменных:

export KEY_SIZE=2048
export CA_EXPIRE=3650
export KEY_EXPIRE=3650
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydotyystmain"
export KEY_OU="MyOrganizationalUnit"
export KEY_NAME="EasyRSA"

Перейдем в каталог easy-rsa и внесем установленные переменные в окружение Linux командой

[root@localhost]# cd /etc/openvpn/easy-rsa/2.0/
[root@localhost]# source ./vars

Запустим чистильщик clean-all командой

[root@localhost]# ./clean-all

И приступим к генерации сертификатов. Первым делом сгенерируем главный сертификат CA, нам будут заданы несколько вопросов, менять их или нет — ваше дело.

[root@localhost]# ./build-ca
Generating a 2048 bit RSA private key
.....+++
..........................................+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:
State or Province Name (full name) [CA]:
Locality Name (eg, city) [SanFrancisco]:
Organization Name (eg, company) [Fort-Funston]:
Organizational Unit Name (eg, section) [MyOrganizationalUnit]:
Common Name (eg, your name or your server's hostname) [Fort-Funston CA]:
Name [EasyRSA]:
Email Address [me@myhost.mydomain]:

Сгенеринуем ключ Diffie-Helman’а, это может занять время:

[root@localhost]# ./build-dh

Сгенерируем серверный сертификат с именем server:

[root@localhost]# ./build-key-server server Generating a 2048 bit RSA private key ..................................................+++ ............................................................................................................................................................+++ writing new private key to 'server.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [US]: State or Province Name (full name) [CA]: Locality Name (eg, city) [SanFrancisco]: Organization Name (eg, company) [Fort-Funston]: Organizational Unit Name (eg, section) [MyOrganizationalUnit]: Common Name (eg, your name or your server's hostname) [server]: Name [EasyRSA]: Email Address [me@myhost.mydomain]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'US' stateOrProvinceName :PRINTABLE:'CA' localityName :PRINTABLE:'SanFrancisco' organizationName :PRINTABLE:'Fort-Funston' organizationalUnitName:PRINTABLE:'MyOrganizationalUnit' commonName :PRINTABLE:'server' name :PRINTABLE:'EasyRSA' emailAddress :IA5STRING:'me@myhost.mydomain' Certificate is to be certified until Jun 2 19:59:32 2026 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y 

Сгенерируем клиентский сертификат

[root@localhost]# ./build-key-client client 
Generating a 2048 bit RSA private key .........................................+++ .+++ writing new private key to 'client.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [US]: State or Province Name (full name) [CA]: Locality Name (eg, city) [SanFrancisco]: Organization Name (eg, company) [Fort-Funston]: Organizational Unit Name (eg, section) [MyOrganizationalUnit]: Common Name (eg, your name or your server's hostname) [client]: Name [EasyRSA]: Email Address [me@myhost.mydomain]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'US' stateOrProvinceName :PRINTABLE:'CA' localityName :PRINTABLE:'SanFrancisco' organizationName :PRINTABLE:'Fort-Funston' organizationalUnitName:PRINTABLE:'MyOrganizationalUnit' commonName :PRINTABLE:'client' name :PRINTABLE:'EasyRSA' emailAddress :IA5STRING:'me@myhost.mydomain' Certificate is to be certified until Jun 2 20:02:02 2026 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated 

Скопируем сгенерированные ключи в папку с OpenVPN

[root@localhost]# cd /etc/openvpn/easy-rsa/2.0/
[root@localhost]# cp -r keys/ /etc/openvpn/

После генерации ключей мы можем приступить к настйроке самого сервера VPN. Создаем конфигурационный файл в папке /etc/openvpn/ с расширением .conf, я назвал server.conf. OpenVPN может запускать несколько копий vpn, различаться они будут именно по название .conf-файла.

Привер:

#Указываем порт, который будет слушать openvpn, я бы рекомендовал 
#отказаться от использования стандартного для большей безопасности
port 41393
#Протокол, который будет использовать наш сервер
#tcp - более медленный, но надежный 
#udp - более быстрый, но отсутсвует проверка на ошибки при передаче.
proto udp
#Выбираем виртуальное сетевое устройство
#tun - работает на сетевом уровне модели OSI, оперируя IP пакетами.
#tap - работает на канальном уровне модели OSI, оперируя кадрами Ethernet.
dev tun
#Путь до ca-сертификата
ca /etc/openvpn/keys/ca.crt
#серверный сертификат
cert /etc/openvpn/keys/server.crt
#секретный ключ к серверному сертификату
key /etc/openvpn/keys/server.key
#путь к  Diffie-Helman
dh /etc/openvpn/keys/dh2048.pem
#Указываем сеть и маску для внутренней сети
server 192.168.2.0 255.255.255.0
#Перевод всего трафика через VPN
push "redirect-gateway def1"
#Можете указать какие DNS будет использовать клиент
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
#Включает возможность коннект несколькоих пользователей с одним сертификатом
duplicate-cn
keepalive 20 60
#Сжатие данных
comp-lzo
persist-key
persist-tun
#Указываем уровень логгирования
verb 3
persist-tun
#Запускать как демон
daemon

#Включаем лог
log-append /var/log/openvpn/openvpn.log

Создадим папку для логов:

[root@localhost] mkdir -p /var/log/myvpn/
[root@localhost] touch /var/log/myvpn/openvpn.log

4. Настройка iptables


Теперь нам нужно настроить NAT, а именно маскардинг или MASQUERADE для того чтобы весь трафик шел через наш сервер.


[root@localhost] iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

Обратите внимание, что 192.168.2.0/24 — это сеть и маска подсети, которую мы выделили для OpenVPN, не забудь те поменять, если вы указали другое, так же поменяйте выходной интерфейс eth0, если у вас другой, его можно проверить командой:

[root@localhost] ifconfig -a

в выводе команы смотрите интерфейс которому принадлежит внешний IP-адрес.

Следующим шагом для установки марштуризации следует поменять значение переменной net.ipv4.ip_forward в файле /etc/sysctl.conf на 1, это даст команду ядру обрабатывать транзитные пакеты.

net.ipv4.ip_forward = 1

5. Запуск openvpn

Запускаем наш сервер. @server после openvpn означает, что мы должны запускать openvpn с конфигурационным файлом server[.conf], как уже описывалось ниже, openvpn может работать с несколькими конфигурациями и для управления конкретным сервером, после @, нужно указывть имя конфигурационного файла без расширения.

[root@localhost] systemctl restart openvpn@server.service

Если команда завершилась без ошибок, то мы имеем запущенный и настроенный OpenVPN сервер, если нет — смотрим логи, расположенные в /var/log/openvpn/openvpn.log или командой

[root@localhost] systemctl status openvpn@server.service 

Для блее детального вывода журнала, существует команда

[root@localhost] journalctl -xe

6. Настройка клиентской части:

Для успешной авторизации на нашем OpenVPN сервер, нам нужны следующие файлы:

  • ca.crt — Основной сертификат
  • client.crt — Клиентский сертификат
  • client.key — Секретный ключ для сертификата

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

<REMOTE_IP> — IP-адрес нашего сервера, на котором установлен OpenVPN

<CA_PATH> — путь до ca.crt файла

<CLIENT_PATH> — путь до client.crt файла

<KEY_PATH> -путь до client.key файла

client
dev tun 
proto udp 
remote <REMOTE_IP> 41393 
nobind 
resolv-retry 
infinite 
persist-key 
persist-tun 
mute-replay-warnings 
ca <CA_PATH>
dh dh2048.pem 
cert <CLIENT_PATH>
key <KEY_PATH>
ns-cert-type server 
comp-lzo 

7. Если что-то пошло не так

После настройки клиентского приложения вы можете попробовать соединиться с нашим OpenVPN-сервером, и посмотреть изменился ли ваш IP-адрес на IP-адрес сервера. Сделать это можно на многих сайтах в интернете, достаточно вбить соответствующий запрос в писковик. Если соедение не удалось, в первую очередь проверьте, запущен ли OpenVPN-демон на сервере:

[root@localhost] systemctl status openvpn@server
● openvpn@server.service - OpenVPN Robust And Highly Flexible Tunneling Application On server
   Loaded: loaded (/usr/lib/systemd/system/openvpn@.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2016-06-06 14:12:37 CEST; 50min ago
  Process: 21045 ExecStart=/usr/sbin/openvpn --daemon --writepid /var/run/openvpn/%i.pid --cd /etc/openvpn/ --config %i.conf (code=exited, status=0/SUCCESS)
 Main PID: 21046 (openvpn)
   CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
           └─21046 /usr/sbin/openvpn --daemon --writepid /var/run/openvpn/server.pid --cd /etc/openvpn/ --config server.conf

Jun 06 14:12:37 CentOS-72-64-minimal systemd[1]: Starting OpenVPN Robust And Highly Flexible Tunneling Application On server...
Jun 06 14:12:37 CentOS-72-64-minimal systemd[1]: PID file /var/run/openvpn/server.pid not readable (yet?) after start.
Jun 06 14:12:37 CentOS-72-64-minimal systemd[1]: Started OpenVPN Robust And Highly Flexible Tunneling Application On server.

Если нет, в первую очередь следует перезапустить сервер:

[root@localhost]systemctl restart openvpn@server

Проверьте, прослушивает ли OpenVPN порт который вы указали

[root@localhost] netstat -aunp |grep openvpn 

Далее читать логи в файлах /var/log/openvpn/openvpn.log, а так же с помощью команд

[root@localhost] systemctl status openvpn@server.service 

и

[root@localhost] journalctl -xe

Если по-прежнему OpenVPN не работает или работает, но не так как вы ожидали, вы можете обратиться к нашим специалистам по администрированию и они решат проблему за короткие сроки.

На этом все.