OpenVPN Server

Настройка собственного OpenVPN сервера #

Регистрация собственного виртуального сервера #

Существует множество хостинговых компаний, предоставляющих в аренду виртуальные серверы за относительно небольшую плату, порядка $5 в месяц. Даже самых простых и дешевых виртуальных серверов обычно достаточно для использования в качестве VPN-сервера.

Одна из таких компаний — «Digital Ocean». Виртуальные серверы в терминологии этой компании называются каплями (Droplets) и могут быть различной производительности. Капли можно создавать как на базе образов популярных операционных систем, так и на базе множества других образов, как доступных прямо в панели управления Digital Ocean так и собственных, которые можно загрузить самостоятельно. Данная инструкция предполагает, что используется чистая операционная система Linux дистрибутива Debian или его производных (например, Ubuntu). Для других дистрибутивов придется использовать другие команды в некоторых местах данной инструкции, так что лучше всего использовать рекомендуемый Debian.

Вместо этого Вы можете развернуть Каплю на основе готового образа OpenVPN, который существует в панели Digital Ocean, но этот способ мной не проверялся и я ничего не могу сказать об удобстве его использования.

Кроме того, Вы можете получить кредит на $100 на два месяца, который Вы можете тратить на любые услуги Digital Ocean, чтобы попробовать всё, что вам хочется. Для этого достаточно зарегистрировать учетную запись в Digital Ocean по специальной реферальной ссылке.

В любом случае, при регистрации в Digital Ocean Вы должны будете подключить банковскую карту (или PayPal) для списаний в будущем, если продолжите пользоваться Digital Ocean. При регистрации Digital Ocean списывает с карты сумму приблизительно $5 для верификации карты и через время возвращает обратно.

Создание капли #

После регистрации создайте каплю (droplet). Для этого находясь в панели по адресу https://cloud.digitalocean.com/ нажмите вверху зеленую кнопку Create и выберите там Droplets. Затем выберите образ (Image): Ubuntu или Debian. Затем выберите план: Basic. CPU-options: Regular Intel with SSD. Самый минимальный дроплет за $5. Листайте ниже. На панели выбора «Choose a datacenter region» выберите регион расположения вашего виртуального сервера: подойдет любой европейский регион. Ниже на панели Аутентификации выберите аутентификацию по RSA-ключу или паролю, как вам удобно. Среди дополнительных опций не нужно выбирать ничего (можно, разве что, выбрать Монторинг, но он Вам все равно не пригодится). По желанию можете указать имя хоста в поле «Choose a hostname».

На этом всё. Нажмите большую зеленую кнопку «Create Droplet».

Через довольно короткое время капля будет создана и появится в панели Droplets, где Вы сможете скопировать ее IP-адрес. Теперь Вы сможете подключиться к ней используя имя пользователя root и пароль или RSA-ключ, смотря какой способ аутентификации выбрали.

Если на Вашем компьютере установлен Windows, то используйте приложение PuTTY для подключения по протоколу SSH к серверу. Если установлен Linux, то просто введите команду:

ssh root@droplet_ip-addr

Базовая настройка капли #

Первым делом Вам нужно создать пользователя, от имени которого вы будете подключаться по SSH в дальнейшем (использовать для этого пользователя root небезопасно). Вместо user_name укажите желаемое имя пользователя. После выполнения второй команды нужно будет дважды ввести пароль.

useradd --create-home --user-group --groups sudo --shell /bin/bash user_name
passwd user_name

Если Вы используете Ubuntu, то всё, что необходимо, уже скорее всего установлено.

Если Вы используете Debian, то, скорее всего, нужно будет установить утилиту sudo чтобы иметь возможность выполнять команды от имени суперпользователя.

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

Установка #

OpenVPN #

sudo apt update && sudo apt full-upgrade -y
sudo apt install openvpn -y

EasyRSA-3 #

Ссылка на репозиторий.

cd ~
wget -O easyrsa.tgz https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz
tar xf easyrsa.tgz
rm easyrsa.tgz
mv EasyRSA-3.0.8 easyrsa
cd easyrsa

Каталог easyrsa должен быть текущим на всей протяженности данной инструкции.

EasyTLS #

Обратите внимание, что RouterOS (оборудование MikroTik) не поддерживает TLS-аутентификацию и, если планируется использовать MikroTik в качестве клиента, устанавливать EasyTLS не нужно.

Ссылка на репозиторий.

wget -O easytls https://raw.githubusercontent.com/TinCanTech/easy-tls/master/easytls
chmod a+x easytls

Инфраструктура открытых ключей (PKI) #

Что такое EasyRSA #

EasyRSA — это инструмент для управления инфраструктурой открытых ключей (X.509 PKI), которая основана на понятии доверия к конкретному органу для аутентификации удаленного клиента.

Основные понятия #

  • PKI — Public Key Infrastructure (инфраструктурой открытых ключей). Описывает коллекцию файлов и ассоциации между ЦС, парами ключей, запросами и сертификатами.
  • CA — Certificate Authority (центр сертификации, ЦС). Это «главный сертификат» в корне PKI. Является сердцем PKI и наиболее чувствительным к безопасности. Закрытый ключ ЦС используется для подписания всех выпущенных сертификатов, поэтому его безопасность критически важна для обеспечения безопасности всей PKI. Рекомендуется хранить CA на максимально безопасной системе, а не на той, где генерируются и используются сертификаты конечных объектов. (Но для простого VPN сервера, используемого для удаленного доступа в интернет, это правило можно мягко игнорировать).
  • cert — Certificate (сертификат) — это запрос, подписанный центром сертификации. Сертификат содержит открытый ключ, некоторые детали, описывающие сам сертификат, и цифровую подпись ЦС.
  • request — Certificate Request (запрос сертификата), иногда просто «req» (просто «запрос»). Запрос на сертификат, который после создания отправляется в центр сертификации для подписания. Запрос содержит требуемую информацию о сертификате вместе с цифровой подписью закрытого ключа. Запрос не чувствителен к безопасности и может быть передан любыми открытыми каналами. Чтобы удостовериться в аутентичности запроса, можно, например, использовать проверку его контрольной суммы.
  • keypair(пара ключей) — это асимметричная криптографическая пара ключей. Эти ключи делятся на две части: открытый и закрытый ключи. Открытый ключ содержится в запросе и сертификате.

Обратите внимание!

Так как эта статья посвещена настройке простого VPN-сервера для удаленного доступа в Интернет и не предполагает никаких сложных настроек безопасности, то и Центр Сертификации и сертификаты сервера и клиента будут созданы на одном и том же хосте — на том, где установлен OpenVPN сервер, без использования запросов сертификатов (поскольку сертификаты будут генерироваться и подписываться сразу же в PKI). Абсолютно то же самое можно сделать и на своем домашнем компьютере.

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

Предварительная конфигурация #

Если есть необходимость изменения базовых переменных, необходимо сделать копию файла 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      "me@example.net"
#set_var EASYRSA_REQ_OU         "My Organizational Unit"

Также может быть необходимо изменить количество дней действия сертификата ЦС и конечных сертификатов:

#set_var EASYRSA_CA_EXPIRE      3650
#set_var EASYRSA_CERT_EXPIRE    825

Но для персонального VPN-сервера для удаленного доступа в интернет в этих действиях нет необходимости.

Инициализация PKI и создание CA #

Предполагается, что текущий каталог easyrsa, в который был осуществлен переход в разделе установки EasyRSA-3. Выполните:

./easyrsa init-pki
./easyrsa build-ca nopass

Здесь для создания CA указан параметр nopass, означающий, что закрытый ключ будет создан без пароля. Это очень небезопасный способ создания ЦС, однако, учитывая поставленную цель, более удобный, т.к. не придется далее вводить каждый раз пароль закрытого ключа. Если считаете это неприемлемым в вашем случае, не используйте параметр nopass.

При создании сертификата будет предложено указать Common Name либо оставить значение по умолчанию.

В результате будет создан подкаталог pki, содержащий необходимые файлы, а также файлы сертификата ЦС pki/ca.crt и закрытого ключа pki/private/ca.key.

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

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

./easyrsa build-server-full server nopass

Будет создан сертификат сервера pki/issued/server.crt и приватный ключ pki/private/server.key.

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

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

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

./easyrsa build-client-full client nopass

Будет создан сертификат сервера pki/issued/client.crt и приватный ключ pki/private/client.key.

Инициализация и создание TLS-ключа #

Обратите внимание, что RouterOS (оборудование MikroTik) не поддерживает TLS-аутентификацию и, если планируется использовать MikroTik в качестве клиента, создавать TLS-ключ не нужно.

./easytls init-tls
./easytls build-tls-crypt

Будет создан файл ключа pki/easytls/tls-crypt.key.

Сервер #

Конфигурация OpenVPN сервера #

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

Создайте файл /etc/openvpn/server.conf с конфигурацией сервера:

sudo tee /etc/openvpn/server.conf <<EOT
dev-type tun
dev tun1
user nobody
group nogroup
topology subnet
persist-key
persist-tun
remote-cert-tls client
dh none
ncp-ciphers AES-256-GCM
cipher AES-256-GCM
reneg-sec 36000
server 10.100.0.0 255.255.255.0
max-clients 128
script-security 2
port 1194
proto tcp
local ::
explicit-exit-notify 0
tcp-nodelay
tls-version-min 1.2
tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384
log /dev/null
;log /var/log/openvpn/openvpn-debug.log
push "redirect-gateway def1 block-local"
push "block-outside-dns"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 1.1.1.1"
EOT

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

echo "<ca>" | sudo tee -a /etc/openvpn/server.conf
cat pki/ca.crt | sudo tee -a /etc/openvpn/server.conf
echo "</ca>" | sudo tee -a /etc/openvpn/server.conf

echo "<cert>" | sudo tee -a /etc/openvpn/server.conf
cat pki/issued/server.crt | sudo tee -a /etc/openvpn/server.conf
echo "</cert>" | sudo tee -a /etc/openvpn/server.conf

echo "<key>" | sudo tee -a /etc/openvpn/server.conf
cat pki/private/server.key | sudo tee -a /etc/openvpn/server.conf
echo "</key>" | sudo tee -a /etc/openvpn/server.conf

echo "<tls-crypt>" | sudo tee -a /etc/openvpn/server.conf
cat pki/easytls/tls-crypt.key | sudo tee -a /etc/openvpn/server.conf
echo "</tls-crypt>" | sudo tee -a /etc/openvpn/server.conf

Настройка сети сервера #

IP Forwarding уровня ядра #

Необходимо разрешить IP-пакетам ходить между интерфейсами сервера. Для этого выполните:

sudo tee -a /etc/sysctl.conf <<EOT
net.ipv4.ip_forward=1
EOT
sudo sysctl -p

Фаервол #

IP-пакетам, отправляемым из VPN-сети через шлюз, необходимо выполнять процедуру трансляции адресов. Это связано с тем, что IP-адреса VPN клиентов «серые» и не могут быть маршрутированы из интернет напряму. Точно так же, как это происходит в обычном домашнем маршрутизаторе. За это отвечает модуль фаервола — NAT.

UFW #

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

sudo apt install -y ufw

Далее нужно будет включить фаервол, а перед тем, как это сделать, нужно сначала добавить правило, разрешающее подключение к порту 22 (SSH) и уже после этого активировать фаервол. Обратите внимание! Если вы изменяли порт для SSH, то вместо указания имени application нужно будет указать порт и протокол. Оба варианта представлены ниже:

# Если используется порт SSH по умолчанию
sudo ufw allow OpenSSH
# Если используется какой-то другой порт для SSH, например 2255
sudo ufw allow 2255/tcp

Также добавьте правило, разрешающее подключение к OpenVPN серверу:

sudo ufw allow 1194/tcp

Теперь нужно в разрешить фаерволу прохождение пакетов между интерфейсами (форвардинг на уровне фаервола). Для этого выполните:

sudo sed -i 's@DEFAULT_FORWARD_POLICY="DROP"@DEFAULT_FORWARD_POLICY="ACCEPT"@' /etc/default/ufw

Активируем фаервол:

sudo ufw enable

Отвечаем y на просьбу подтвердить включение и убеждаемся, что после включения связь с сервером не потерялась. Убеждаемся, что подключение по необходимым портам разрешено:

sudo ufw status
NAT #

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

ip route | grep default

В выводе будет нечто подобное:

default via 1.2.3.4 dev eth0 onlink

Значит интересующий нас интерфейс называется eth0 — позже он пригодится для правила NAT фаервола.

Редактируем файл sudo nano /etc/ufw/before.rules.

sudo nano sudo nano /etc/ufw/before.rules

Сразу после шапки файла (заголовка с комментариями) перед блоком с правилами *filter добавляем блок с настройками NAT, предварительно убедившись в корректности имени интерфейса -o eth0:

# 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.100.0.0/24 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

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

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

sudo ufw disable
sudo ufw enable

Запуск OpenVPN сервера #

sudo systemctl start openvpn@server

Проверьте состояние сервера:

sudo systemctl status openvpn@server

Проверить интерфейс, на котором сервер держит подключенных клиентов:

ip addr show tun1

Если все в порядке и не требует исправлений, добавить службу openvpn@server в автозагрузку:

sudo systemctl enable openvpn@server

Клиент #

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

Создайте файл в своей домашней директории с конфигурацией клиента. В параметре remote укажите IP адрес вашего сервера (к которому будет подключаться клиент):

tee ~/client.conf <<EOT
dev tun
client
nobind
remote-cert-tls server
verb 3
server-poll-timeout 10
ncp-ciphers AES-256-GCM
cipher AES-256-GCM
reneg-sec 0
tls-version-min 1.2
tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384
remote 1.2.3.4 1194 tcp
EOT

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

echo "<ca>" | tee -a ~/client.conf
cat pki/ca.crt | tee -a ~/client.conf
echo "</ca>" | tee -a ~/client.conf

echo "<cert>" | tee -a ~/client.conf
cat pki/issued/client.crt | tee -a ~/client.conf
echo "</cert>" | tee -a ~/client.conf

echo "<key>" | tee -a ~/client.conf
cat pki/private/client.key | tee -a ~/client.conf
echo "</key>" | tee -a ~/client.conf

echo "<tls-crypt>" | tee -a ~/client.conf
cat pki/easytls/tls-crypt.key | tee -a ~/client.conf
echo "</tls-crypt>" | tee -a ~/client.conf

RouterOS и MikroTik #

Операционная система RouterOs в оборудовании MikroTik не поддерживает TLS аутентификацию, поэтому вместо шифра (cipher) AES-256-GCM нужно использовать AES-256-CBC. Разница между GCM и CBC, помимо прочего, заключается во встроенном алгоритме аутентификации.

Также в конфигурации сервера необходимо закомментировать или удалить целиком блок с TLS-ключем, начинающийся с <tls-crypt> и заканчивающийся </tls-crypt>.

Создание подключения на MikroTik #

  1. Загрузите файл client.ovpn в маршрутизатор
  2. В меню Winbox перейдите в System » Certificates и импортируйте файл client.ovpn задав ему понятное имя сертификата, например «digitalocean-vpn». В результате будет импортирован СЦ (ca.crt) с именем digitalocean-vpn и клиентский сертификат с приватным ключем с именем digitalocean-vpn_1, который лучше переименовать, например, в digitalocean-vpn_client.
  3. В меню PPP создайте OVPN Client, где нужно будет указать: IP-адрес сервера, порт (по умолчанию 1194), Mode: ip, User: none, Certificate: digitalocean-vpn_client, Cipher: aes 256
comments powered by Disqus