Красноярск, ул. Алексеева, 49
ДЦ "Вертикали", оф. 7-15 (7 этаж)

Режим работы:
9:00 - 18:00
обед 13:00 - 14:00

Многоканальный телефон:
(391) 989-78-00

Установка и настройка OpenVPN на сервере Ubuntu 18.04

Содержание материала

Предварительные условия

Статья является переводом на русский язык мануала от Digital Ocean со вставками, которые автор посчитал полезными. Источник

OpenVPN - это полнофункциональное решение VPN с открытым исходным кодом и реализацией PKI, которое поддерживает широкий спектр конфигураций. Мы настроим OpenVPN на сервере Ubuntu 18.04, а затем настроим доступ к нему с Windows, Linux, и Android.

Нам понадобится второй отдельный сервер Ubuntu 18.04, который будет служить Центром Сертификации (CA - Certificate Authority). Хотя технически возможно использовать один сервер OpenVPN или любой локальный компьютер в качестве CA, делать так не рекомендуется. Согласно официальной документации, CA должен быть размещен на автономной машине, предназначенной для импорта и подписи запросов на сертификаты. Итак, предполагаем, что у нас развернуты два сервера с Ubuntu 18.04, установлены последние обновления, настроен межсетевой экран. В качестве инструмента для управления межсетевым экраном мы будем использовать UFW (Uncomplicated firewall). Включим UFW:

sudo ufw enable

Дефолтные политики UFW – весь входящий трафик запрещен, исходящий трафик разрешен. Включаем доступ по SSH для удаленного управления серверами:

sudo ufw allow OpenSSH

1. Устанавливаем OpenVPN и EasyRSA

Установим OpenVPN. OpenVPN доступен в репозиториях Ubuntu по умолчанию, поэтому используем apt для установки:

sudo apt update
sudo apt install openvpn

OpenVPN основан на протоколах TLS/SSL и использует сертификаты для шифрования трафика между сервером и клиентами. Чтобы выдавать доверенные сертификаты создадим свой собственный простой Центр Сертификации (CA). Для этого загрузим последнюю версию EasyRSA (на момент написания статьи – версия 3.0.5), которую мы будем использовать для создания нашей инфраструктуры открытых ключей (PKI) из официального репозитория GitHub проекта.

Как уже упоминалось в предварительных условиях, мы создадим CA на автономном сервере. Причиной такого подхода является то, что если злоумышленник сможет проникнуть на сервер CA, он сможет получить доступ к закрытому ключу CA и использовать его для подписания новых сертификатов, получая доступ к сети VPN. Управление CA с помощью автономной машины помогает предотвратить доступ неавторизованных пользователей к VPN. Кроме того, в качестве дополнительной меры предосторожности при эксплуатации рекомендуется отключать сервер CA, когда он не используется для подписи ключей.

Чтобы начать создание инфраструктуры CA и PKI, установим последнюю версию EasyRSA из официального проекта GitHub как на сервере CA, так и на сервере OpenVPN с помощью следующей команды:

wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.5/EasyRSA-nix-3.0.5.tgz

Извлекаем скачанный архив в домашнюю папку пользователя:

cd ~
tar xvf EasyRSA-nix-3.0.5.tgz

Мы успешно установили все необходимое программное обеспечение на своих серверах и машине CA. Далее продолжим настраивать переменные, используемые EasyRSA, а также каталог CA, из которого будем генерировать ключи и сертификаты, необходимые серверу и клиентам для доступа к VPN.

2. Настраиваем переменные EasyRSA и поднимаем CA

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

cd ~/EasyRSA-3.0.5/

В этой директории находится файл vars.example. Сделаем копию этого файла под именем vars без расширения:

cp vars.example vars

Откроем файл для редактирования:

nano vars

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

. . .
#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            "Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра."
#set_var EASYRSA_REQ_OU                   "My Organizational Unit"
. . .

Раскомментируем эти строки и заполним нужными значениями:

set_var EASYRSA_REQ_COUNTRY     "RU"
set_var EASYRSA_REQ_PROVINCE    "Krasnoyarskiy kray"
set_var EASYRSA_REQ_CITY               "Krasnoyarsk"
set_var EASYRSA_REQ_ORG                "PIK Bezopasnosti"
set_var EASYRSA_REQ_EMAIL            "Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра."
set_var EASYRSA_REQ_OU                   "Otdel TZI"

После этого нужно сохранить и закрыть файл.

В каталоге EasyRSA есть скрипт под названием easyrsa, который выполняет множество задач, связанных с созданием и управлением CA. Запускаем этот скрипт с помощью параметра init-pki, чтобы инициировать инфраструктуру открытых ключей на сервере CA:

./easyrsa init-pki

Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.0g 2 Nov 2017
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/pik-b/EasyRSA-3.0.5/pki

После этого снова вызовем сценарий easyrsa с опцией build-ca. Эта опция поднимает ЦС и создает два важных файла - ca.crt и ca.key.

ca.crt - это открытый файл корневого сертификата CA, который сервер и клиент используют для информирования друг друга о том, что они являются частью одной сети доверия. По этой причине серверу и всем клиентам потребуется копия файла ca.crt.

ca.key - это закрытый ключ, который использует компьютер CA для подписи ключей и сертификатов для серверов и клиентов. Если злоумышленник получает доступ к ЦС и, в свою очередь, к файлу ca.key, он сможет подписывать запросы на сертификаты и получать доступ к VPN. Вот почему файл ca.key должен находиться только на сервере CA и почему в идеале сервер CA должен оставаться автономным.

При создании CA придумываем надежный пароль. Также, при создании ЦС, будет задан вопрос о подтверждении Общего имени (common name) - это имя, используемое для ссылки на этот сервер в контексте центра сертификации. Для простоты нажимаем ENTER и оставляем имя по умолчанию:

./easyrsa build-ca

Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.0g 2 Nov 2017
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Generating RSA private key, 2048 bit long modulus
...................+++
.................................................................+++
e is 65537 (0x010001)
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]:

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/pik-b/EasyRSA-3.0.5/pki/ca.crt

Центр Сертификации готов и может начать подписывать запросы на сертификаты.

3. Создаем сертификаты, ключи и файлы шифрования для Сервера

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

Переходим в каталог EasyRSA на сервере OpenVPN:

cd EasyRSA-3.0.5/

Отсюда запустим сценарий easyrsa с параметром init-pki. Хотя мы уже выполнили эту команду на машине CA, необходимо запустить ее и здесь, потому что сервер OpenVPN и CA будут иметь отдельные каталоги PKI:

./easyrsa init-pki

Затем снова вызовем сценарий easyrsa, на этот раз с опцией gen-req, за которой следует общее имя для машины. Имя может быть любым, но желательно, чтобы имя указывало на функционал узла, поэтому задаем имя server. Включаем опцию nopass.

./easyrsa gen-req server nopass

Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.0g 2 Nov 2017
Generating a 2048 bit RSA private key
.............................+++
............................................................................................................................+++
writing new private key to '/home/pik-b/EasyRSA-3.0.5/pki/private/server.key.x3IkFN8yq6'
-----
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,
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]:server

Keypair and certificate request completed. Your files are:
req: /home/pik-b/EasyRSA-3.0.5/pki/reqs/server.req
key: /home/pik-b/EasyRSA-3.0.5/pki/private/server.key

Мы создали закрытый ключ для сервера и файл запроса на сертификат server.req. Скопируем ключ сервера в каталог /etc/openvpn/:

sudo cp ~/EasyRSA-3.0.5/pki/private/server.key /etc/openvpn/

Используя безопасный метод (например, SCP), передайте файл server.req на ваш компьютер CA:

scp ~/EasyRSA-3.0.5/pki/reqs/server.req имя_пользователя@ip_сервера_CA:/tmp

The authenticity of host '192.168.1.46 (192.168.1.46)' can't be established.
ECDSA key fingerprint is SHA256:Zt/0eXivx5g3/lCymP+JY1FmvNW4bvhM7C1mkyNin2Q.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.46' (ECDSA) to the list of known hosts.
Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.'s password:
server.req                   100% 887 616.6KB/s 00:00

На сервере CA заходим в директорию EasyRSA:

cd EasyRSA-3.0.5/

Снова используем скрипт easyrsa и импортируем файл server.req, указав его общее имя:

./easyrsa import-req /tmp/server.req server

Затем подписываем запрос, запустив сценарий easyrsa с опцией sign-req, указываем также тип запроса и общее имя. Тип запроса может быть client или server, поэтому для запроса сертификата сервера OpenVPN обязательно используйте тип запроса server:

./easyrsa sign-req server server

Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.0g 2 Nov 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 1080 days:
subject=
    commonName       = server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Using configuration from ./safessl-easyrsa.cnf
Enter pass phrase for /home/pik-b/EasyRSA-3.0.5/pki/private/ca.key:
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 Oct 18 17:14:28 2021 GMT (1080 days)
Write out database with 1 new entries
Data Base Updated
Certificate created at: /home/pik-b/EasyRSA-3.0.5/pki/issued/server.crt

В процессе подписания вводим пароль на закрытый ключ CA. Обратите внимание, срок действия сертификатов по умолчанию – 1080 дней (почти 3 года).
Далее переносим безопасным методом подписанный сертификат обратно на сервер OpenVPN:

scp pki/issued/server.crt имя_пользователя@ip_сервера_OpenVPN:/tmp

Не забываем также скопировать корневой сертификат ca.crt на сервер OpenVPN:

scp pki/ca.crt имя_пользователя@ip_сервера_OpenVPN:/tmp

Затем вернемся на сервер OpenVPN и скопируем файлы server.crt и ca.crt в каталог /etc/openvpn/:

sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/

Переходим в папку с EasyRSA:

cd EasyRSA-3.0.5/

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

./easyrsa gen-dh

Создание ключа Диффи-Хеллмана может занять несколько минут. Для обеспечения дополнительного уровня аутентификации, создаем ключ TLS:

openvpn --genkey --secret ta.key

Копируем оба файла в директорию /etc/openvpn/

sudo cp ~/EasyRSA-3.0.5/ta.key /etc/openvpn/
sudo cp ~/EasyRSA-3.0.5/pki/dh.pem /etc/openvpn/

На этом все файлы сертификатов и ключей, необходимые серверу OpenVPN, готовы. Перейдем к созданию сертификатов и ключей для доступа к серверу OpenVPN клиентских устройств.

4. Создаем пару сертификат/ключ для Клиента

Как и на прошлом шаге, мы можем сгенерировать закрытый ключ и запрос на сертификат на своей клиентской машине, а затем отправить его в ЦС для подписания. Но мы создадим запрос на сертификат на сервере OpenVPN. Преимущество этого способа заключается в том, что позже мы сможем создать скрипт, который будет автоматически генерировать файлы конфигурации клиента, содержащие все необходимые ключи и сертификаты. Это позволит избежать передачи ключей, сертификатов и файлов конфигурации клиентам по отдельности и упростит дальнейший процесс присоединения к VPN.

Сейчас мы создадим одну ключевую пару клиента. Если у вас несколько клиентов, повторяем этот процесс для каждого из них. При этом нужно будет передать скрипту уникальное значение имени для каждого клиента. В этом руководстве первая пара сертификат/ключ называется client1.

Начнем с создания директории в нашем домашнем каталоге для хранения сертификата клиента и файлов ключей:

mkdir -p ~/client-configs/keys

Затем вернемся в каталог EasyRSA и запустим сценарий easyrsa с параметрами gen-req и nopass с указанием общего имени для клиента:

cd ~/EasyRSA-3.0.5/
./easyrsa gen-req client1 nopass/

Нажимаем ENTER, чтобы подтвердить общее имя. Затем копируем файл client1.key в каталог /client-configs/keys/, который мы создали ранее:

cp pki/private/client1.key ~/client-configs/keys/

Далее, переносим файл запроса client1.req на сервер CA:

scp pki/reqs/client1.req имя_пользователя@ip_сервера_CA:/tmp

На сервере CA заходим в директорию EasyRSA, импортируем запрос на сертификат:

cd ~/EasyRSA-3.0.5/
./easyrsa import-req /tmp/client1.req client1

Затем подпишем запрос, как и для сервера на предыдущем шаге. Только на этот раз укажем тип запроса client, на вопрос о намерении подписать сертификат вводим «yes». Вводим пароль для закрытого ключа CA:

./easyrsa sign-req client client1

Мы создали файл сертификата client1.crt. Передаем его на сервер OpenVPN:

scp pki/issued/client1.crt имя_пользователя@ip_сервера_OpenVPN:/tmp

На сервере OpenVPN копируем сертификат клиента в директорию /client-configs/keys/:

cp /tmp/client1.crt ~/client-configs/keys/

В директорию /client-configs/keys/ также копируем файлы ca.crt и ta.key:

cp EasyRSA-3.0.5/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/

На этом шаге все серверные и клиентские сертификаты и ключи сгенерированы и хранятся в соответствующих каталогах на сервере. Позже мы выполним с этими файлами еще некоторые действия, а пока мы можем перейти к настройке сервиса OpenVPN на сервере.

5. Настраиваем сервис OpenVPN

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

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
sudo gzip -d /etc/openvpn/server.conf.gz

Откроем конфигурационный файл сервера для редактирования:

sudo nano /etc/openvpn/server.conf

Найдем параметр tls-auth. Строка уже должна быть раскомментирована, в противном случае удаляем знак «;», чтобы раскомментировать этот параметр. Ниже добавим параметр key-direction со значением «0»:

tls-auth ta.key 0 # This file is secret
key-direction 0

Затем находим раздел настройки криптографических шифров. Шифр AES-256-CBC обеспечивает хороший уровень шифрования и определен по умолчанию. Опять же, эта строка уже должна быть раскомментирована, иначе убираем знак «;» перед ней:

cipher AES-256-CBC

Ниже, добавим директиву auth для выбора алгоритма хеширования. SHA256 - хороший выбор:

auth SHA256

Найдем строку, содержащую параметр dh, который определяет параметры Диффи-Хеллмана. Из-за недавних изменений, внесенных в EasyRSA, имя файла для ключа Диффи-Хеллмана отличается от того, что указано в примере файла конфигурации сервера. Меняем имя файла, удалив 2048, чтобы он совпал с ключом, сгенерированным на предыдущем шаге:

dh dh.pem

И наконец, находим в настройки пользователя и группы и удаляем знак «;» в начале каждой строки:

user nobody
group nogroup

Изменения, которые мы внесли в пример файла server.conf, необходимы для того, чтобы OpenVPN функционировал. Изменения, описанные ниже, являются необязательными, хотя они необходимы для многих распространенных случаев использования.

(Опционально) Вносим изменения в DNS для перенаправления всего трафика через VPN

Приведенные выше настройки обеспечат VPN-соединение между двумя машинами, но не включат принудительное использование туннеля для всех подключений. Если мы хотим использовать VPN для маршрутизации всего трафика клиентских устройств, нужно пробросить на них настройки DNS.

В файле server.conf есть несколько параметров, которые нужно изменить, чтобы включить эту функцию. Находим параметр redirect-gateway и удаляем знак «;» в начале строки, чтобы раскомментировать его:

push "redirect-gateway def1 bypass-dhcp"

Прямо под этим параметром видим параметр dhcp-option, также раскомментируем его:

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

Клиенты переконфигурируют свои настройки DNS и станут использовать туннель VPN в качестве шлюза по умолчанию.

(Опционально) Настройка порта и протокола

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

port 443

Кроме того, мы можем задать протокол TCP для подключений:

proto tcp

При переключении протокола на TCP, нужно изменить значение параметра explicit-exit-notify с 1 на 0, так как этот параметр используется только для UDP. Иначе, при использовании TCP этот параметр вызовет ошибки при запуске службы OpenVPN:

explicit-exit-notify 0

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

(Опционально) Указываем недефолтные учетные данные

Если ранее, при генерации сертификата и закрытого ключа для сервера были указаны недефолтные общие имена, нужно также изменить эти параметры в конфигурационном файле. Мы использовали имя по умолчанию «server», поэтому параметры установлены в верное значение:

cert server.crt
key server.key

(Опционально) Разрешаем подключение клиентов сети VPN друг к другу

По умолчанию клиенты сети VPN могут «общаться» только с сервером OpenVPN. Для того, чтобы клиенты могли взаимодействовать друг с другом через сеть VPN необходимо в конфигурационном файле раскомментировать соответствующий параметр:

client-to-client

(Опционально) Увеличиваем пропускную способность OpenVPN

Встречаются темы на форумах, где пользователи сталкиваются с проблемой урезания ширины канала. В нашем случае скорость через OpenVPN падала в два раза по сравнению с открытым (незашифрованным) каналом. Проблема решается запретом для OpenVPN на изменение значений буферов сокета (Источник 1, Источник 2). Для этого в конфигурационный файл сервера необходимо добавить следующие параметры:

sndbuf
rcvbuf 0
push "sndbuf 524288"
push "rcvbuf 524288"

После внесения необходимых изменений в конфигурационный файл server.conf сохраняем и закрываем файл.

6. Сетевые настройки сервера

Чтобы OpenVPN правильно маршрутизировал трафик, необходимо настроить некоторые сетевые параметры. Чтобы включить IP-форвардинг, отредактируем файл /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

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

net.ipv4.ip_forward=1

Сохраним и закроем файл. Чтобы применить внесенные изменения вводим команду:

sudo sysctl -p

net.ipv4.ip_forward = 1

Ранее мы включили межсетевой экран UFW. Некоторые правила межсетевого экрана нужно изменить для включения трансляции адресов NAT.

Прежде чем редактировать файл конфигурации межсетевого экрана, чтобы добавить правила NAT, необходимо определить публичный сетевой интерфейс сервера. Для этого вводим:

ip route | grep default

Публичный интерфейс - это строка в результатах вывода этой команды, которая следует за словом «dev». Например, наш результат указывает на интерфейс с именем enp0s3:

default via 192.168.1.1 dev enp0s3 proto dhcp src 192.168.1.42 metric 100

Теперь откроем файл /etc/ufw/before.rules:

sudo nano /etc/ufw/before.rules

Правила UFW обычно добавляются с помощью команд ufw. Однако правила, перечисленные в файле before.rules, считываются и вводятся в действие до того, как будут загружены обычные правила UFW. В верхней части файла добавим выделенные строки. Это задаст политику по умолчанию для цепочки POSTROUTING в таблице nat и позволит маскировать любой трафик, поступающий из VPN. Не забудьте заменить значение enp0s3 в строке -A POSTROUTING интерфейсом, который был найден в приведенной выше команде:

#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
# ufw-before-input
# ufw-before-output
# ufw-before-forward
#

# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to enp0s3
(Изменить на свой интерфейс!)
-A POSTROUTING -s 10.8.0.0/8 -o wlp11s0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

# Don't delete these required lines, otherwise there will be errorsv *filter
. . .

Сохраним и закроем файл. Дальше нам нужно «сказать» UFW пропускать транзитные пакеты по умолчанию. Чтобы сделать это откроем файл /etc/default/ufw:

sudo nano /etc/default/ufw

Находим параметр DEFAULT_FORWARD_POLICY и меняем значение с DROP на ACCEPT:

DEFAULT_FORWARD_POLICY="ACCEPT"

Сохраняем изменения и выходим.Затем настроим сам межсетевой экран, чтобы разрешить трафик для OpenVPN. Мы не меняли порт и протокол по умолчанию в файле /etc/openvpn/server.conf, поэтому нам нужно будет открыть UDP-трафик на порт 1194:

sudo ufw allow 1194/udp

После внесения этих изменений, применим их, отключив и заново включив UFW:

sudo ufw disable
sudo ufw enable

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

7. Запускаем сервис OpenVPN

Наконец, мы готовы запустить сервис OpenVPN на сервере. Сделаем это с помощью утилиты systemctl.
Запускаем сервис OpenVPN, указав имя файла конфигурации в качестве переменной после названия процесса systemd. Конфигурационный файл для нашего сервера называется /etc/openvpn/server.conf, поэтому мы добавляем @server:

sudo systemctl start openvpn@server

Перепроверим, что сервис стартовал корректно:

sudo systemctl status openvpn@server

Если все хорошо, вывод команды должен быть примерно таким:

Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. - OpenVPN connection to server
  Loaded: loaded (/lib/systemd/system/openvpn@.service; disabled; vendor preset: enabled)
  Active: active (running) since Sun 2018-11-04 18:08:59 UTC; 20s ago
   Docs: man:openvpn(8)
      https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
      https://community.openvpn.net/openvpn/wiki/HOWTO
  Main PID: 2855 (openvpn)
  Status: "Initialization Sequence Completed"
  Tasks: 1 (limit: 1110)
  CGroup: /system.slice/system-openvpn.slice/Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
     └─2855 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 –

Проверим также, что интерфейс OpenVPN tun0 доступен:

ip addr show tun0

Вывод должен быть примерно таким:

3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none
    inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
      valid_lft forever preferred_lft forever
    inet6 fe80::bed2:daf9:6884:3118/64 scope link stable-privacy
      valid_lft forever preferred_lft forever

После первого успешного запуска службы включим ее запуск по умолчанию:

sudo systemctl enable openvpn@server

Теперь сервис OpenVPN запущен и работает. Прежде чем мы сможем начать его использование, нужно создать файл конфигурации для клиентской машины. В этом руководстве уже обсуждалось, как создавать пары сертификат/ключ для клиентов, на следующем шаге мы продемонстрируем, как легко сгенерировать файлы конфигурации клиента.

8. Поднимаем инфраструктуру для конфигурирования клиентов

Создание конфигурационных файлов для клиентов OpenVPN может быть трудозатратно, так как каждый клиент должен иметь собственный файл конфигурации, и каждая из конфигураций должна совпадать с настройками, указанными в файле конфигурации сервера. Вместо того, чтобы создавать для каждого клиента свой файл конфигурации, создадим «базовый» конфигурационный файл, а затем скрипт, который позволит нам генерировать уникальные конфигурационные файлы клиентов на основе «базового». Скрипт также поместит в один конфигурационный файл все необходимые сертификаты и ключи.

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

mkdir -p ~/client-configs/files

Далее скопируем пример конфигурационного файла клиента в директорию client-configs, чтобы использовать его в качестве «базового» конфигурационного файла:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

Откроем этот файл в текстовом редакторе:

nano ~/client-configs/base.conf

Находим параметр remote. Он указывает клиенту на публичный адрес доступа сервера OpenVPN:

remote ip_вашего_сервера 1194

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

proto udp

Далее, раскомментируем параметры user и group:

# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup

Находим параметры ca, cert и key. Закокомментируем эти параметры, так как вскоре мы добавим сертификаты и ключи в файл:

# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
#ca ca.crt
#cert client.crt
#key client.key

Параметры cipher и auth в конфигурационном файле клиента должны совпадать с конфигурацией сервера:

cipher AES-256-CBC
auth SHA256

Далее, добавим параметр key-direction в любое место конфигурационного файла. Установим его значение – 1, для того, чтобы VPN корректно работал на клиентской машине:

key-direction 1

И наконец, добавим несколько закомментированных параметров. Мы включим эти параметры в каждый отдельный файл конфигурации клиента, а потом нам понадобиться лишь включить эти параметры в случае необходимости. Это нужно для клиентов Linux, в которых используется файл /etc/openvpn/update-resolv-conf – этот скрипт используется для обновления DNS на Linux-клиентах.

# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf

Если клиент работает под управлением Linux и имеет файл /etc/openvpn/update-resolv-conf, раскомментируйте эти строки из файла конфигурации клиента после его создания.

Сохраняем и закрываем файл.

Затем создаем простой скрипт, который будет компилировать нашу базовую конфигурацию с соответствующими сертификатами и ключами, а затем поместит сгенерированную конфигурацию в каталог ~ / client-configs / files. Создадим новый файл с именем make_config.sh в каталоге ~ / client-configs:

nano ~/client-configs/make_config.sh

Добавляем следующее содержимое:

#!/bin/bash

# First argument: Client identifier

KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf

cat ${BASE_CONFIG} \
<(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 700 ~/client-configs/make_config.sh

Этот скрипт сделает копию файла base.conf, соберет все файлы сертификатов и ключей, которые мы создали для своего клиента, извлечёт их содержимое, добавит их в копию базового файла конфигурации и экспортирует все это содержимое в единый файл конфигурации клиента. Это означает, что вместо того, чтобы отдельно управлять конфигурацией клиента, сертификатом и ключевыми файлами, вся необходимая информация будет хранится в одном файле. Преимущество такого подхода в том, что при необходимости добавления клиента, мы можем просто запустить этот скрипт, чтобы быстро создать файл конфигурации и быть уверенными, что вся важная информация хранится в одном удобном для пользователя месте.

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

9. Генерируем конфигурационный файл для клиента

На 4 шаге мы создали пару сертификат/ключ для клиента с именем client1.crt и client1.key. Мы можем создать файл конфигурации для этих учетных данных, перейдя в каталог ~ / client-configs и запустив скрипт, который мы сделали в конце предыдущего шага:

cd ~/client-configs
sudo ./make_config.sh client1

в результате выполнения скрипта будет создан файл client1.ovpn в директории ~/client-configs/files:

ls ~/client-configs/files

client1.ovpn

Необходимо перенести этот файл на устройство, которое мы планируем использовать в качестве клиента. Например, это может быть локальный компьютер или мобильное устройство.

Выбор конкретного приложения для передачи файла .ovpn на клиентское устройство будет зависеть от операционной системы устройства и личных предпочтений. Надежным и безопасным методом является использование SFTP (протокол передачи файлов SSH) или SCP (Secure Copy). Эти методы позволят передать файл по зашифрованному соединению. Для Windows можно использовать приложение WinSCP.

Ниже приведен пример команды SFTP с использованием примера client1.ovpn, который можно запустить с локального компьютера (macOS или Linux). Он помещает файл .ovpn в ваш домашний каталог:

sftp имя_пользователя@ip_сервера_OpenVPN:client-configs/files/client1.ovpn ~/

10. Устанавливаем клиентскую конфигурацию OpenVPN

В этом разделе описывается, как установить клиентскую конфигурацию VPN в Windows, Linux, и Android. Соединение OpenVPN будет иметь то же имя, что и имя файла .ovpn. Что касается этого руководства, это означает, что соединение называется client1.ovpn, по имени первого созданного нами клиентского файла.

Windows

Скачиваем клиентское приложение OpenVPN под Windows c официальной страницы. Установка требует прав Администратора на компьютере. После установки копируем файл .ovpn по следующему пути:

C:\Program Files\OpenVPN\config

После запуска клиент OpenVPN, он автоматически увидит профиль и применит его.

OpenVPN каждый раз должен запускаться с правами Администратора. Чтобы каждый раз не кликать правой кнопкой мыши на ярлыке и выбирать «Запуск от имени администратора», нужно настроить запуск клиентского приложения с административными привилегиями. Это означает, что стандартным учетным записям потребуется ввести пароль Администратора, чтобы запустить OpenVPN. Таким образом, пользователь не сможет корректно подключиться к серверу OpenVPN без прав Администратора.

OpenVPN каждый раз должен запускаться с правами Администратора. Чтобы каждый раз не кликать правой кнопкой мыши на ярлыке и выбирать «Запуск от имени администратора», нужно настроить запуск клиентского приложения с административными привилегиями. Это означает, что стандартным учетным записям потребуется ввести пароль Администратора, чтобы запустить OpenVPN. Таким образом, пользователь не сможет корректно подключиться к серверу OpenVPN без прав Администратора.

Каждый раз, когда мы запускаем GUI OpenVPN, Windows будет спрашивать разрешения на внесение изменений. Запуск клиентского приложения размещает апплет в системный трей для удобства управления, фактического подключения при этом не происходит. После запуска инициируем соединение, щелкнув правой кнопкой мыши по значку апплета в трее. В контекстном меню выберем «Подключиться». Мы увидим окно, содержащее лог подключения, в результате успешного подключения к серверу будет показано уведомление:

Успешное подключение клиента OpenVPN

Для отключения от сервера нажимаем правой кнопкой мыши на апплет в трее и выбираем «Отключиться».

Linux

При использовании Linux существует множество инструментов, которые можно использовать для подключения, в зависимости от конкретного дистрибутива. Среда рабочего стола или оконный менеджер могут включать в себя инструменты для подключения. Однако самым универсальным способом является использование клиента OpenVPN. На Ubuntu или Debian его можно установить так:

sudo apt update
sudo apt install openvpn

На CentOS можно активировать репозиторий EPEL (Extra Packages for Enterprise Linux), а затем установить клиент:

sudo yum install epel-release
sudo yum install openvpn

Далее проверяем, включен ли в клиентское приложение скрипт /etc/openvpn/update-resolv-conf:

ls /etc/openvpn

update-resolv-conf

После этого необходимо отредактировать файл конфигурации OpenVPN:

nano client1.ovpn

если в директории /etc/openvpn мы нашли файл update-resolv-conf, раскомментируем следующие три строки в конфигурационном файле:

script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

В случае CentOS, меняем значение параметра group с nogroup на nobody:

group nobody

Сохраняем и закрываем конфигурационный файл. Теперь, чтобы инициировать соединение, вводим команду:

sudo openvpn --config client1.ovpn

Android

Откроем Google Play Store. Найдем и установим Android OpenVPN Connect, - официальное клиентское приложение.

Передать профиль .ovpn можно, подключив устройство Android к компьютеру с помощью USB и скопировав файл. В качестве альтернативы, если у вас есть устройство для чтения SD-карт, можно вынуть SD-карту из устройства, скопировать профиль на нее и затем вставить карту обратно в Android устройство.

Далее запустим приложение OpenVPN и нажмем кнопку меню «OVPN Profile», чтобы импортировать профиль:

Android OpenVPN Connect

Выбираем файл профиля .ovpn, жмем кнопку «Import»:

Импорт профиля .OVPN в Android OpenVPN Connect

Видим сообщение о том, что профиль успешно импортирован, нажимаем кнопку «ADD»:

Импорт профиля .OVPN в Android OpenVPN Connect

Нажимаем переключатель, для того чтобы инициировать соединение с сервером. Есть возможность импортировать несколько профилей. В приложении также есть возможность создать ярлык выбранного профиля для быстрого соединения с сервером.

11. Тестируем соединение на анонимность (Опционально)

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

Для начала нужно без VPN соединения зайти на сайт DNSLeakTest. На главной странице сайт возвращает белый IP адрес нашего провайдера. Также можно запустить расширенный тест, чтобы увидеть IP адреса используемых DNS серверов.

После этого подключаемся к VPN и обновляем страницу. Мы должны увидеть другой IP-адрес (тот адрес, через который сервер OpenVPN выходит во всемирную сеть). Также и адреса DNS серверов должны поменяться.

В качестве альтернативы можно использовать ресурс 2ip. Если на главной странице нажать на кнопку «Проверка анонимности», тест покажет, есть ли утечки реальных адресов клиента.

12. Отзыв сертификатов

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

Для этого перейдем в каталог EasyRSA на сервере CA:

cd EasyRSA-3.0.5/

Запускаем скрипт easyrsa с опцией отзыва и указанием имени клиента, сертификат которого мы хотим отозвать:

./easyrsa revoke client1

Подтверждаем отзыв:

Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.0g 2 Nov 2017
Please confirm you wish to revoke the certificate with the following subject:
subject=
       commonName       = client1
Type the word 'yes' to continue, or any other input to abort.
     Continue with revocation: yes

При необходимости вводим пароль и видим сообщение о том, что сертификат успешно отозван и нужно сгенерировать список отозванных сертификатов (CRL), а после залить его на сервер:

Using configuration from ./safessl-easyrsa.cnf
Enter pass phrase for /home/pik-b/EasyRSA-3.0.5/pki/private/ca.key:
Revoking Certificate E800D4E8877A6A50E78407A0C7D42534.
Data Base Updated

IMPORTANT!!!
Revocation was successful. You must run gen-crl and upload a CRL to your
infrastructure in order to prevent the revoked cert from being accepted.

Создаем CRL:

./easyrsa gen-crl

Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.0g 2 Nov 2017
Using configuration from ./safessl-easyrsa.cnf
Enter pass phrase for /home/pik-b/EasyRSA-3.0.5/pki/private/ca.key:
An updated CRL has been created.
CRL file: /home/pik-b/EasyRSA-3.0.5/pki/crl.pem

Передаем файл crl.pem на сервер:

scp ~/EasyRSA-3.0.5/pki/crl.pem имя_пользователя@ip_сервера_OpenVPN:/tmp

На сервере копируем crl в каталог OpenVPN:

sudo cp /tmp/crl.pem /etc/openvpn

Редактируем конфигурационный файл сервера:

sudo nano /etc/openvpn/server.conf

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

crl-verify crl.pem

Сохраним и закроем файл конфигурации. Перезапустим сервис:

sudo systemctl restart openvpn@server

С этого момента клиент с отозванным сертификатом не сможет подключиться к серверу. Если клиент на момент отзыва был подключен к серверу, он будет отключен с момента перезапуска сервиса.

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

1. Отзываем сертификат командой ./easyrsa revoke имя_клиента;
2. Генерируем новый список отозванных сертификатов (CRL);
3. Переносим CRL файл на сервер OpenVPN в папку /etc/openvpn, перезаписываем старый CRL;
4. Перезапускаем сервис OpenVPN.

Заключение

Инфраструктура полностью готова к работе, мы организовали надежные защищенные каналы связи с удаленными рабочими местами. Используя OpenVPN сервер в качестве шлюза по умолчанию мы защищены от перехвата паролей и любой конфиденциальной информации, находясь в сетях с низким уровнем доверия. В случае необходимости мы можем арендовать сервер, находящийся в другой точке нашей планеты и успешно решить с помощью OpenVPN задачу анонимизации реальных IP адресов клиентского устройства. Для чего использовать описанную технологию – решать Вам!

Если подключения дополнительных клиентов к VPN не происходит, сервер с Центром сертификации (CA) должен быть выключен, пока вновь не потребуется добавлять или отзывать сертификаты. Это поможет предотвратить доступ злоумышленников к VPN.

Чтобы добавить больше клиентов, нужно только выполнить шаги 4 и 9-10 для каждого дополнительного устройства. Чтобы отменить доступ клиентам, просто выполняем шаг 12.