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 или MacOS, то просто введите команду:

ssh root@droplet_ip-addr

Вместо droplet_ip-addr укажите IP-адрес вашей капли.

Установка #

Вам необходимо установить OpenVPN, EasyRSA и EasyTLS (если не планируется использовать MikroTik в качестве клиентов).

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.1.0/EasyRSA-3.1.0.tgz
tar xf easyrsa.tgz
rm easyrsa.tgz
mv EasyRSA-3.1.0 easyrsa
cd easyrsa
Важно! Каталог easyrsa является текущим каталогом на всей протяженности данной инструкции.

EasyTLS #

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

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

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 сервер с управлением доступом к нему на уровне сертификатов с достаточно высоким уровнем безопасности, обратитесь, пожалуйста, к соответствующей документации и статьям в интернете. В таком случае крейне рекомендую начать с более углубленного изучения основ, чтобы четко понимать, как это работает, что Вы делаете и для чего.

Инициализация PKI #

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

./easyrsa init-pki

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

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

Если есть необходимость изменения базовых переменных (для простого доступа в интернет через VPN в этом нет необходимости), отредактируйте файл vars в только что созданном каталоге pki:

nano pki/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

Создание главного сертификата — CA #

Для создания главного сертификата выполните:

./easyrsa build-ca nopass

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

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

После этого действия будет создан файл сертификата ЦС 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
port 1194
proto tcp
local ::
dev-type tun
dev tun1

user nobody
group nogroup
topology subnet
persist-key
persist-tun
server 10.100.0.0 255.255.255.0

remote-cert-tls client
tls-version-min 1.2
tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384

; Если TLS не используется, то заменить шифр AES-256-GCM на AES-256-CBC
ncp-ciphers AES-256-GCM
cipher AES-256-GCM
; Если среди клиентов есть RouterOS, то раскомментировать следующую строку
;auth sha1

dh none

reneg-sec 36000
max-clients 128
keepalive 10 120
script-security 2
explicit-exit-notify 0
tcp-nodelay

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"

log /dev/null
;log /var/log/openvpn/openvpn-debug.log
;log-append /var/log/openvpn/openvpn-debug.log
status /var/log/openvpn/openvpn-status.log
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

# Блок tls-crypt добавлять только если все клиенты поддерживают TLS
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 фаервола.

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

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 вместо 1.2.3.4 укажите IP адрес вашего сервера (к которому будет подключаться клиент) и порт, если вы его изменили для сервера:

tee ~/client.ovpn <<EOT
dev tun
client
remote 1.2.3.4 1194 tcp
nobind
verb 3
server-poll-timeout 10
; Если TLS не используется, то заменить шифр AES-256-GCM на AES-256-CBC
ncp-ciphers AES-256-GCM
cipher AES-256-GCM
; Если используется RouterOS, то раскомментировать следующую строку
;auth sha1
reneg-sec 0
remote-cert-tls server
tls-version-min 1.2
tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384
; Для LINUX клиента раскомментировать три следующие строки
;script-security 2
;up /etc/openvpn/update-resolv-conf
;down /etc/openvpn/update-resolv-conf
EOT

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

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

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

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

# Если TLS-ключ не был создан - следующие строки не выполнять
echo "<tls-crypt>" | tee -a ~/client.ovpn
cat pki/easytls/tls-crypt.key | tee -a ~/client.ovpn
echo "</tls-crypt>" | tee -a ~/client.ovpn

Настройка клиента #

Скопируйте файл client.ovpn на ваш компьютер и/или смартфон, установите OpenVPN клиент и просто откройте в нем файл client.ovpn.

Linux #

Скопируйте файл client.ovpn в каталог /etc/openvpn. Затем раскомментируйте в нем строки:

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

И запустите службу openvpn:

sudo systemctl start openvpn@client

RouterOS и MikroTik #

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

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

Создание подключения на 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