Установка и настройка OpenVPN сервера для CentOS 7

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

yum -y install epel-release

Обновляем приложения сервера до последних версий:

yum update -y

Устанавливаем OpenVPN-сервер и утилиту wget:

yum install -y openvpn wget

Устанавливаем Easy RSA 3

Идём на Github проекта в раздел релизов и скачиваем свежую версию: https://github.com/OpenVPN/easy-rsa/releases.

Например, ссылка может быть такой: https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.7/EasyRSA-3.0.7.tgz

alt text

Скачиваем:

wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.7/EasyRSA-3.0.7.tgz -O /tmp/EasyRSA-3.0.7.tgz

Распаковываем:

cd /tmp
tar xvzf EasyRSA-3.0.7.tgz

Копируем папку EasyRSA-3.0.7 как /etc/openvpn/easy-rsa:

mkdir -p /etc/openvpn/easy-rsa

cp -r /tmp/EasyRSA-3.0.7/* /etc/openvpn/easy-rsa

Убедиться в том что вы всё правильно скопировали можно вот так:

[root@dfov tmp]# ls -liah /etc/openvpn/easy-rsa
total 140K
 33986276 drwxr-xr-x. 4 root root  214 Aug 29 14:03 .
 33987918 drwxr-xr-x. 5 root root   69 Aug 29 13:52 ..
 33986277 -rw-r--r--. 1 root root 4.5K Aug 29 14:03 ChangeLog
 33986278 -rw-r--r--. 1 root root 1.3K Aug 29 14:03 COPYING.md
 67402124 drwxr-xr-x. 2 root root  131 Aug 29 14:03 doc
 33986279 -rwxr-xr-x. 1 root root  74K Aug 29 14:03 easyrsa
 33986280 -rw-r--r--. 1 root root  18K Aug 29 14:03 gpl-2.0.txt
 33986281 -rw-r--r--. 1 root root 1.1K Aug 29 14:03 mktemp.txt
 33986282 -rw-r--r--. 1 root root 4.6K Aug 29 14:03 openssl-easyrsa.cnf
 33991470 -rw-r--r--. 1 root root 2.1K Aug 29 14:03 README.md
 33992093 -rw-r--r--. 1 root root 3.3K Aug 29 14:03 README.quickstart.md
 33992094 -rw-r--r--. 1 root root 8.8K Aug 29 14:03 vars.example
100678152 drwxr-xr-x. 2 root root  122 Aug 29 14:03 x509-types

Подготавливаем конфигурацию

Редактируем файл /etc/openvpn/server.conf.

Настраиваем маршрутизацию трафика через OpenVPN сервер

Весь трафик от клиента будет проходить через VPN-сервер. Для этого раскоментируем строчку:

push "redirect-gateway def1 bypass-dhcp"

Указываем сервера DNS

Указываем какие DNS-сервера получит клиент после успешного подключения:

push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

Указываем пользователя для запуска OpenVPN

Указываем пользователя nobody:

user nobody
group nobody

Указываем диапазон IP-адресов для VPN-сети

Раскомментируем строчку:

topology subnet

и указываем сеть и маску:

server 10.8.0.0 255.255.255.0

Включаем журналирование

Раскомментируем строчку

log-append  openvpn.log

Настраиваем TLS

Раскомментируем строчку:

tls-auth ta.key 0

Создадим ta.key файл:

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

Генерируем ключи и сертификаты

В данной статей рассматривается случай когда корневой центр сертификации находится на том же сервере где и OpenVPN. Для максимальной безопасности разделяют корневой сервер (CA) размещают отдельно.

Готовим параметры сертифкатов по умолчанию

cd /etc/openvpn/easy-rsa
cp vars.example vars

Открываем файл vars редактором, нас интересуют вот эти строчки:

#set_var EASYRSA_CERT_EXPIRE    825

#set_var EASYRSA_REQ_COUNTRY    "US"
#set_var EASYRSA_REQ_PROVINCE   "California"
#set_var EASYRSA_REQ_CITY       "San Francisco"
#set_var EASYRSA_REQ_ORG        "Copyleft Certificate Co"
#set_var EASYRSA_REQ_EMAIL      "me@example.net"
#set_var EASYRSA_REQ_OU         "My Organizational Unit"

Раскомментируем и впишем значения которые нам актуальны:

Сколько дней будут действительны сертификаты:

По умолчанию 825 дней (~2.2 года).

#set_var EASYRSA_CERT_EXPIRE 825

Страну:

set_var EASYRSA_REQ_COUNTRY    "RU"

Провинцию\Область\Регион:

set_var EASYRSA_REQ_PROVINCE   "Moscow"

Город:

set_var EASYRSA_REQ_CITY       "Moscow"

Название организации: От имени которой мы будем выдавать сертификаты.

set_var EASYRSA_REQ_ORG        "DFOV"

Почтовый адрес по умолчанию:

set_var EASYRSA_REQ_EMAIL      "hello@dfov.ru"

Отдел:

set_var EASYRSA_REQ_OU          "default"

Генерируем ключи и сертификаты для центра сертификации (CA)

cd /etc/openvpn/easy-rsa

$ ./easyrsa init-pki

Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars

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

Затем:

$ ./easyrsa build-ca nopass

Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars
Using SSL: openssl OpenSSL 1.0.2k-fips  26 Jan 2017
Generating RSA private key, 2048 bit long modulus
........................+++
...................................................................................+++
e is 65537 (0x10001)
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.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

Введите имя пользователя, хост или имя сервера. Для примера используем DFOV.

Генерируем сертификат сервера, ключ и файлы шифрования

$ cd /etc/openvpn/easy-rsa
$ ./easyrsa gen-req server nopass

Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars
Using SSL: openssl OpenSSL 1.0.2k-fips  26 Jan 2017
Generating a 2048 bit RSA private key
...+++
..........................+++
writing new private key to '/etc/openvpn/easy-rsa/pki/easy-rsa-5302.LfIZ4s/tmp.CFy2Jx'
-----
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.
-----
Common Name (eg: your user, host, or server name) [server]:

Keypair and certificate request completed. Your files are:
req: /etc/openvpn/easy-rsa/pki/reqs/server.req
key: /etc/openvpn/easy-rsa/pki/private/server.key

Копируем полученный файл:

cp pki/private/server.key /etc/openvpn/

Выпускаем сертификат:

$ ./easyrsa sign-req server server

Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars
Using SSL: openssl OpenSSL 1.0.2k-fips  26 Jan 2017


You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 825 days:

subject=
    commonName                = server


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /etc/openvpn/easy-rsa/pki/easy-rsa-5448.VtsIpt/tmp.XbNtc9
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server'
Certificate is to be certified until Dec  2 14:48:34 2022 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /etc/openvpn/easy-rsa/pki/issued/server.crt

Копируем:

cp pki/ca.key /etc/openvpn/
cp pki/issued/server.key /etc/openvpn/

Генерируем криптостойкий ключ обмена по алгоритму Deffie-Hellman

$ ./easyrsa gen-dh

...
DH parameters of size 2048 created at /etc/openvpn/easy-rsa/pki/dh.pem

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

$ cp pki/dh.pem /etc/openvpn/

Генерируем ключ для TLS:

$ openvpn --genkey --secret /etc/openvpn/ta.key

Обновляем права:

chown -R openvpn: /etc/openvpn

Включаем автозапуск для сервиса OpenVPN

systemctl enable openvpn@server

Настраиваем маршрутизацию

Теперь необходимо настроить доступ и правильную маршрутизацию трафика для OpenVPN.

$ firewall-cmd --zone=public --add-service openvpn --permanent
$ firewall-cmd --permanent --add-masquerade
$ SHARK=$(ip route get 8.8.8.8 | awk 'NR==1 {print $(NF-2)}')
$ firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $SHARK -j MASQUERADE
$ firewall-cmd --reload

Включаем опцию ip_forward в параметрах ядра. Редактируем /etc/sysctl.conf:

net.ipv4.ip_forward = 1

Перезапускаем сеть:

$ systemctl restart network.service

Запускаем сервер

$ systemctl start openvpn@server.service

Если сервер запустился, то команда status покажет примерно такой вывод:

$ systemctl status openvpn@server.service

openvpn@server.service - OpenVPN Robust And Highly Flexible Tunneling Application On server
   Loaded: loaded (/usr/lib/systemd/system/openvpn@.service; enabled; vendor preset: disabled)
   Active: **active (running)** since Wed 2020-08-14 15:20:11 EDT; 7s ago
 Main PID: 1864 (openvpn)
   Status: "Initialization Sequence Completed"
   CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
           └─2824 /usr/sbin/openvpn --cd /etc/openvpn/ --config server.conf

Панель управления для OpenVPN сервера

Теперь вы можете установить Web-интерфейс для управления сервером.