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

Данная инструкция, в большей части, является переводом статей по установке OpenVPN на сайте digitalocean. В процессе установки сервера, были замечены некоторые моменты, которые дополнены в данной статье.

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

Установка OpenVPN

Для начала обновите индекс пакетов вашего VPN-сервера и установите OpenVPN. OpenVPN доступен в репозиториях Debian по умолчанию, поэтому вы можете использовать apt для установки:

sudo apt update
sudo apt install openvpn

Создание центра сертификации

Создаем директории и CA директорию специальной командой для EasyRSA

cd /home/user
mkdir openvpnkey
cd openvpnkey/
make-cadir CA
cd CA/

В созданной таким образом директории содержится симлинка на easyrsa (-> /usr/share/easy-rsa/easyrsa). Файл конфигурации 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      "me@example.net"
#set_var EASYRSA_REQ_OU         "My Organizational Unit"

. . .

Раскомментируйте эти строки и измените выделенные значения на нужные, но не оставляйте их пустыми.

В каталоге EasyRSA есть скрипт easyrsa, который вызывается для выполнения различных задач, связанных с созданием и управлением ЦС.

Запустите этот сценарий с параметром init-pki, чтобы инициировать инфраструктуру открытого ключа на сервере ЦС:

./easyrsa init-pki
Output
. . .
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/user/openvpnkey/CA/pki

После этого снова вызовите скрипт easyrsa с опцией build-ca. Это построит ЦС и создаст два важных файла — ca.crt и ca.key — которые составляют общедоступную и частную стороны SSL-сертификата.

ca.crt — это общедоступный файл сертификата ЦС, который в контексте OpenVPN сервер и клиент используют для информирования друг друга о том, что они являются частью одной и той же сети доверия, а не кем-то, кто выполняет атаку «человек посередине». По этой причине вашему серверу и всем вашим клиентам потребуется копия файла ca.crt.

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

Если вы не хотите, чтобы вас запрашивали пароль каждый раз, когда вы взаимодействуете с вашим ЦС, вы можете запустить команду build-ca с параметром nopass, например:

./easyrsa build-ca nopass

В выводе вам будет предложено подтвердить общее имя для вашего ЦС:

Output
. . .
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

Общее имя — это имя, используемое для ссылки на этот компьютер в контексте центра сертификации. Вы можете ввести любую строку символов для общего имени CA, но для простоты нажмите ENTER, чтобы принять имя по умолчанию.

После этого ваш ЦС готов и готов начать подписывать запросы на сертификаты.

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

Создадим директории для ключей и сертификатов отдельно от CA.

cd /home/user/openvpnkey/
make-cadir certs
cd certs/

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

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

./easyrsa init-pki

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

./easyrsa gen-req server nopass

Сценарий предложит вам ввести общее имя, которое вы хотите отобразить в запросе на подпись сертификата (CSR). По умолчанию будет отображаться любое имя, которое вы передали в ./easyrsa gen-req (например, server). Введите ENTER, чтобы принять имя по умолчанию, или введите другое.

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

sudo cp ~/easy-rsa/pki/private/server.key /etc/openvpn/

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

scp ~/easy-rsa/pki/reqs/server.req sammy@your_CA_ip:/tmp

Переходим в директорию CA

cd /home/user/openvpnkey/CA

Используя сценарий easyrsa, импортируйте файл server.req, следуя пути к файлу с общим именем, которое вы ввели при создании CSR:

./easyrsa import-req /home/user/openvpnkey/CA/tmp/server.req server

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

./easyrsa sign-req server server

В выводе вам будет предложено убедиться, что запрос исходит из надежного источника. Введите yes и нажмите ENTER, чтобы подтвердить это:

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

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

Затем передайте подписанный сертификат обратно на ваш VPN-сервер, используя безопасный метод:

scp pki/issued/server.crt sammy@your_server_ip:/tmp

Также перенесите файл ca.crt на свой VPN-сервер:

scp pki/ca.crt sammy@your_server_ip:/tmp

Вашему серверу OpenVPN требуется ca.crt, чтобы он знал, что может доверять объекту, подписавшему server.crt.

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

cp /home/user/openvpnkey/certs/tmp/{server.crt,ca.crt} /etc/openvpn/

Затем перейдите в каталог ~/easy-rsa:

cd /home/user/openvpnkey/certs/

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

./easyrsa gen-dh

Это может занять несколько минут. Как только это произойдет, сгенерируйте подпись HMAC, чтобы усилить возможности проверки целостности TLS сервера:

sudo openvpn --genkey secret ta.key

Когда команда завершится, скопируйте два новых файла в каталог /etc/openvpn/:

cp /home/user/openvpnkey/certs/ta.key /etc/openvpn/
cp /home/user/openvpnkey/certs/pki/dh.pem /etc/openvpn/

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

Генерация сертификата клиента

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

mkdir -p /home/user/client-configs/keys

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

chmod -R 700 /home/user/client-configs

Затем вернитесь в каталог ~/easy-rsa и запустите сценарий easyrsa с параметрами gen-req и nopass вместе с общим именем клиента:

cd /home/user/openvpnkey/certs/
./easyrsa gen-req client1 nopass

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

cp /home/user/openvpnkey/certs/pki/private/client1.key /home/user/client-configs/keys/

Затем перенесите файл client1.req на свой компьютер CA безопасным способом:

cp /home/user/openvpnkey/certs/pki/reqs/client1.req /home/user/openvpnkey/CA/tmp/

На компьютере CA перейдите в каталог ~/easy-rsa и импортируйте запрос сертификата:

cd /home/user/openvpnkey/CA/
./easyrsa import-req ./tmp/client1.req client1

Затем подпишите запрос, как вы сделали это для сервера на предыдущем шаге. Однако на этот раз обязательно укажите тип запроса клиента:

./easyrsa sign-req client client1

В командной строке введите «yes», чтобы подтвердить, что вы намерены подписать запрос на сертификат и что он поступил из надежного источника:

Output
Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes

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

Это создаст файл сертификата клиента с именем client1.crt. Перенесите этот файл обратно на сервер:

scp pki/issued/client1.crt sammy@your_server_ip:/tmp

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

cp /home/user/openvpnkey/certs/tmp/client1.crt /home/user/client-configs/keys/

Затем скопируйте файлы ca.crt и ta.key в каталог /client-configs/keys/:

cp /home/user/openvpnkey/certs/ta.key /home/user/client-configs/keys/
cp /etc/openvpn/ca.crt /home/user/client-configs/keys/

Все сертификаты и ключи вашего сервера и клиента были сгенерированы и сохранены в соответствующих каталогах на вашем сервере.

Настройка службы OpenVPN

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

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

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

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

sudo nano /etc/openvpn/server.conf

Найдите раздел HMAC, найдя директиву tls-auth. Эта строка уже должна быть раскомментирована, но если нет, то удалите «;» чтобы раскомментировать его.

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

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

cipher AES-256-CBC

Ниже этого добавьте директиву auth для выбора алгоритма дайджеста сообщения HMAC. Для этого SHA256 — хороший выбор:

auth SHA256

Затем найдите строку, содержащую директиву dh, определяющую параметры Диффи-Хеллмана.

Из-за некоторых недавних изменений, внесенных в Easy-RSA, имя файла для ключа Диффи-Хеллмана может отличаться от того, что указано в примере файла конфигурации сервера. При необходимости измените имя файла, указанное здесь, удалив 2048, чтобы оно совпадало с созданным ключом.

#dh dh2048.pem
dh dh.pem

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

user nobody
group nogroup

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

Настройка DNS

Приведенные выше настройки создадут VPN-соединение между двумя машинами, но не заставят никакие соединения использовать туннель.

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

В файле server.conf есть несколько директив, которые вы должны изменить, чтобы включить эту функцию.

Найдите раздел redirect-gateway и удалите точку с запятой «;» с начала строки 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 на гугловские, получилось так

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

Это поможет клиентам перенастроить свои настройки DNS, чтобы использовать туннель VPN в качестве шлюза по умолчанию.

Укажите сертификат и ключ не по умолчанию

Если вы выбрали другое имя во время команды ./easyrsa gen-req для сертификата сервера, измените видимые строки сертификата и ключа, чтобы они указывали на соответствующие файлы .crt и .key.

Если вы использовали имя по умолчанию «сервер», оно уже задано правильно:

cert server.crt
key server.key

Настройка сети и фаервола UFW

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

Настройте параметры переадресации IP вашего сервера по умолчанию, изменив файл /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

Внутри найдите закомментированную строку, которая устанавливает net.ipv4.ip_forward. Удалите символ «#» в начале строки, чтобы раскомментировать этот параметр:

net.ipv4.ip_forward=1

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

sudo sysctl -p

Откройте файл /etc/ufw/before.rules, чтобы добавить конфигурацию:

sudo nano /etc/ufw/before.rules

Правила UFW обычно добавляются с помощью команды ufw. Однако правила, перечисленные в файле before.rules, считываются и применяются до загрузки обычных правил UFW.

В верхней части файла добавьте выделенные ниже строки. Это установит политику по умолчанию для цепочки POSTROUTING в таблице nat и замаскирует любой трафик, исходящий из VPN.

Не забудьте заменить eth0 в строке -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 eth0 (change to the interface you discovered!)
-A POSTROUTING -s 10.18.10.0/24 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

# Don't delete these required lines, otherwise there will be errors
*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. Если вы изменили порт и/или протокол, замените выбранные здесь значения.

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

sudo ufw allow 1194/udp
sudo ufw allow OpenSSH

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

sudo ufw disable
sudo ufw enable

Запуск и включение службы OpenVPN

Наконец-то вы готовы запустить службу OpenVPN на своем сервере. Делается это с помощью утилиты systemd systemctl:

sudo systemctl start openvpn@server

Это запустит службу openvpn, используя /etc/openvpn/server.conf в качестве файла конфигурации.

Например, если бы вместо этого вы указали openvpn@server2, systemd использовала бы имя файла /etc/openvpn/server2.conf при запуске службы.

Проверьте, успешно ли запущена служба, набрав:

sudo systemctl status openvpn@server

Вы также можете проверить, доступен ли интерфейс OpenVPN tun0, набрав:

ip addr show tun0

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

sudo systemctl enable openvpn@server

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

Скрипт генерации конфига клиента

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

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

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

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

mkdir -p ~/client-configs/files

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

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

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

nano ~/client-configs/base.conf

Внутри найдите удаленную директиву. Это указывает клиенту на адрес вашего сервера OpenVPN — общедоступный IP-адрес вашего сервера OpenVPN.

Если вы решили изменить порт, который прослушивает сервер OpenVPN, вам также потребуется изменить 1194 на выбранный вами порт:

. . .
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote your_server_ip 1194
. . .

Изменить remote my-server-1 1194

remote 5.6.7.8 1194

Например на ip своего сервера

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

proto udp

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

# 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

Точно так же закомментируйте директиву tls-auth, так как вы добавите ta.key непосредственно в файл конфигурации клиента:

# If a tls-auth key is used on the server
# then every client must also have the key.
#tls-auth ta.key 1

Отразите параметры шифрования и аутентификации, которые вы установили в файле /etc/openvpn/server.conf:

cipher AES-256-CBC
auth SHA256

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

Затем добавьте директиву key-direction где-нибудь в файле. Вы должны установить это значение на «1», чтобы VPN работал правильно на клиентской машине:

key-direction 1

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

# 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

Внутри добавьте следующий контент, убедившись, что sammy изменен на учетную запись пользователя без полномочий root на вашем сервере:

#!/bin/bash

# First argument: Client identifier

KEY_DIR=/home/user/client-configs/keys
OUTPUT_DIR=/home/user/client-configs/files
BASE_CONFIG=/home/user/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 созданного вами файла, соберет все файлы сертификатов и ключей, которые вы создали для своего клиента, извлечет их содержимое, добавит их к копии базового файла конфигурации и экспортирует все это содержимое в новый файл конфигурации клиента.

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

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

Создание конфигураций клиента

Если вы следовали руководству, вы создали клиентский сертификат и ключ с именем client1.crtи client1.key, соответственно, на шаге 3.

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

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

Это создаст файл с именем client1.ovpnв вашем ~/client-configs/files каталоге:

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

Установка конфигурации клиента

В windows достаточно поставить "OpenVPN Connect" и в нем добавить конфиг.