Настройка OpenVPN-сервера на VPS

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

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Что нужно для создания собственного VPN-сервиса? Прежде всего потребуется VPS (виртуальный выделенный сервер). Для поиска недорогих VPS можно воспользоваться специальными сайтами, такими как Low End Box или бесплатными предложениями от облачных провайдеров. Так у Amazon и Microsoft можно бесплатно получить виртуальную машину на год, а Oracle предлагает две VPS бесплатно и навсегда.

В нашем примере мы будем использовать бесплатный VPS от Oracle с Ubuntu 18.04, но данная инструкция подойдет для любых deb-based систем и с некоторыми поправками для любого другого Linux-дистрибутива.

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

Прежде всего установим OpenVPN и Easy-RSA для управления ключами:

1apt install openvpn easy-rsa

Скопируем файлы easy-rsa в конфигурационную директорию OpenVPN и создадим символическую ссылку на файл настроек OpenSSL:

1cp -r /usr/share/easy-rsa /etc/openvpn
2ln -s /etc/openvpn/easy-rsa/openssl-1.0.0.cnf  /etc/openvpn/easy-rsa/openssl.cnf

Затем откроем файл /etc/openvpn/easy-rsa/vars и изменим в нем следующие строки, указав собственные данные для сертификатов, например, так:

1export KEY_COUNTRY="US"
2export KEY_PROVINCE="Wild West"
3export KEY_CITY="Uncle Tom's Cabins"
4export KEY_ORG="Uncle Tom"
5export KEY_EMAIL="tom@example.com"
6export KEY_OU="Cabin"

Сохраним файл и перейдем к созданию собственного центра сертификации (CA). Для этого перейдем в директорию нашего CA и загрузим переменные:

1cd /etc/openvpn/easy-rsa
2source ./vars

Очистим любые имеющиеся данные и инициализируем центр сертификации:

1./clean-all
2./build-ca

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

После чего в директории**/etc/openvpn/easy-rsa/keys** появится сертификат CA, содержащий публичный ключ, ca.crt, который должен присутствовать на каждом VPN-клиенте, и закрытый ключ центра сертификации ca.key, этот файл является секретным и не должен покидать пределы сервера.

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

1./build-dh

Данная операция, в зависимости от производительности вашего VPS, может занять достаточно много времени.

И, наконец, создадим ключевую пару для сервера:

1./build-key-server server

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

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

1mkdir /etc/openvpn/keys

Теперь скопируем туда необходимые серверу ключи и сертификаты:

1cd /etc/openvpn/easy-rsa/keys
2cp ca.crt dh2048.pem server.crt server.key /etc/openvpn/keys

Распакуем и скопируем в директорию**/etc/openvpn** шаблон серверной конфигурации:

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

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

1port 1194
2proto udp
3dev tun

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

Затем зададим топологию сети:

1topology subnet

Укажем пути к ключам и сертификатам, допускаются относительные пути, в этом случае корнем будет считаться директория /etc/openvpn:

1ca keys/ca.crt
2cert keys/server.crt
3key keys/server.key
4dh keys/dh2048.pem

Зададим диапазон OpenVPN-сети:

1server 10.88.0.0 255.255.255.0

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

1ifconfig-pool-persist /var/log/openvpn/ipp.txt

Автоматически сконфигурируем клиентов на доступ в интернет через OpenVPN-подключение:

1push "redirect-gateway def1 bypass-dhcp"

И передадим им собственные DNS-сервера:

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

Укажем параметры проверки активности:

1keepalive 10 120

Сервер будет проверять клиента каждые 10 секунд и при отсутствии ответа через 120 секунд клиент будет считаться неактивным.

Обязательно закомментируйте строку:

1#tls-auth ta.key 0

Для сценария доступа в интернет дополнительная TLS-аутентификация будет излишней.

В последних версиях OpenVPN включен механизм автоматического согласования протоколов шифрования между клиентом и сервером, по умолчанию будет выбран шифр AES-256-GCM, но так как вычислительные возможности VPS обычно ограничены и большого смысла шифровать канал доступа в интернет сложными шифрами нет, то отключим соглассование и укажем достаточно простой AES-шифр:

1ncp-disable
2cipher AES-128-CBC

Также в новых версиях доступен новый механизм компрессии, для его включения укажем:

1compress lz4-v2
2push "compress lz4-v2"

Данная опция будет автоматически отправлена на клиент, что облегчает его конфигурирование.

Если у вас есть старые версии клиентов (ниже 2.4), то можно использовать простое lzo-сжатие, для этого закомментируйте вышеприведенные строки и добавьте:

1comp-lzo

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

В целях безопасности понизим права запущенного сервера:

1user nobody
2group nogroup

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

1persist-key
2persist-tun

Укажем путь к файлам логов:

1status /var/log/openvpn/openvpn-status.log
2log  /var/log/openvpn/openvpn.log

И укажем его подробность:

1verb 3

Во время отладки можно поднять уровень логов до 5-6.

Настройка брандмауэра и маршрутизации

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

Создадим файл правил:

1touch /etc/nat

и внесем в него следующие строки, обратите внимание на имя сетевого интерфейса вашего VPS, в нашем случае этоens3:

 1#!/bin/sh
 2
 3# Включаем форвардинг пакетов
 4echo 1 > /proc/sys/net/ipv4/ip_forward
 5
 6# Сбрасываем настройки брандмауэра
 7iptables -F
 8iptables -X
 9iptables -t nat -F
10iptables -t nat -X
11
12# Разрешаем инициированные нами подключения извне
13iptables -A INPUT -i ens3 -m state --state ESTABLISHED,RELATED -j ACCEPT
14
15# Разрешаем подключения по SSH
16iptables -A INPUT -i ens3 -p tcp --dport 22 -j ACCEPT
17
18# Разрешаем подключения к OpenVPN
19iptables -A INPUT -i ens3 -p udp --dport 1194 -j ACCEPT
20
21#Запрещаем входящие извне
22iptables -A INPUT -i ens3 -j DROP
23
24# Разрешаем инициированные нами транзитные подключения извне
25iptables -A FORWARD -i ens3 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT
26
27# Запрещаем транзитный трафик извне
28iptables -A FORWARD -i ens3 -o tun0 -j DROP
29
30# Включаем маскарадинг для локальной сети
31iptables -t nat -A POSTROUTING -o ens3 -s 10.88.0.0/24 -j MASQUERADE

Не забудем сделать файл исполняемым:

1chmod +x /etc/nat

Данный файл требуется запускать после создания туннельного интерфейса tun0, поэтому откроем конфигурационный файл сервера OpenVPN /etc/openvpn/server.conf и в его конце добавим опцию:

1up /etc/nat

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

1ip a

Также проверим применение правил брандмауэра:

1iptables -L -vn

Следующий шаг касается только виртуальных машин в облаке Oracle Cloud, вам потребуется дополнительно разрешить входящий трафик на порт OpenVPN. Для этого перейдите в Сети » Виртуальные облачные сети » VirtualCloudNetwork-20191008-0144 » Сведения о списках безопасности, где вместо VirtualCloudNetwork-20191008-0144 будет имя вашей виртуальной сети. Затем добавьте новое правило для входящего трафика:

Укажите: Тип источника - CIDR, Исходный CIDR - 0.0.0.0/0, IP-протокол - UDP, Диапазон исходных портов - Все, Диапазон конечных портов - 1194.

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

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

1cd /etc/openvpn/easy-rsa
2source ./vars

Затем создадим ключевую пару клиента командой:

1./build-key client

где client -имя клиента, мы также рекомендуем давать им осмысленные имена.

Теперь скопируем файлы, которые необходимо передать на компьютер клиента в домашнюю директорию и изменим их владельца (по умолчанию владелец - root), чтобы вы смогли их скопировать с помощью любого FTP или SFTP клиента. В нашем случае имя пользователя ubuntu:

1cd /etc/openvpn/easy-rsa/keys
2cp ca.crt client.crt client.key ~
3cd ~
4chown ubuntu:ubuntu ca.crt client.crt client.key

Помните, что закрытый ключ клиента client.key является секретным и следует избегать его передачи по открытым каналам связи.

Также не будет лишним сразу скопировать шаблон клиентской конфигурации:

1cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client.ovpn

После чего скопируйте все эти файлы на клиент и установите на нем OpenVPN, в Windows системах советуем изменить путь установки OpenVPN на более короткий и без пробелов, скажем, C:\OpenVPN.

Затем откроем файл client.ovpn, который в Windows системах должен быть расположен в C:\OpenVPN\config, а в Linux в /etc/openvpn, и внесем в него следующие изменения:

1client
2dev tun
3proto udp

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

Затем укажем адрес сервера:

1remote 111.222.333.444 1194

Следующая опция предписывает клиенту постоянно разрешать имя OpenVPN-сервера, имеет смысл если мы указываем сервер по FQDN-имени, а не IP-адресу.

1resolv-retry infinite

Для Linux систем обязательно укажите:

1user nobody
2group nogroup

В Windows данные опции следует обязательно закомментировать.

Проконтролируем наличие следующих опций:

1persist-key
2persist-tun

Укажем пути к ключам и сертификатам, для Linux систем подразумеваем их нахождение в /etc/openvpn/keys:

1ca keys/ca.crt
2cert  keys/client.crt
3key  keys/client.key

Для Windows систем предположим их нахождение в C:\OpenVPN\keys:

1ca C:\\OpenVPN\\keys\\ca.crt
2cert C:\\OpenVPN\\keys\\client.crt
3key C:\\OpenVPN\\keys\\client.key

Также обязательно закомментируем опцию:

1#tls-auth ta.key 1

Включим защиту от атак типа "человек посередине":

1remote-cert-tls server

И укажем используемый шифр, он должен совпадать с указанным на сервере:

1cipher AES-128-CBC

Остальные опции можно оставить без изменений. Сохраним файл и запустим OpenVPN-клиент.

Убедиться, что вы выходите в интернет через VPN-канал можно при помощи любого сервиса, показывающего ваш IP-адрес, например, 2ip.ru:

Обращаем внимание на национальную принадлежность адреса, в данном случае мы выходим в интернет из Штатов.

Самое время провести замер скорости доступа, мы будем использовать для этого популярный сервис SpeedTest. Первый замер без VPN:

Второй через OpenVPN-канал:

Сразу обращаем внимание на выросший пинг - это последствия размещения сервера в Штатах, а также скорость скачивания не выше 10 Мбит/с - ограничение бесплатного тарифа Oracle, хотя в большинстве случаев этого вполне достаточно для комфортного серфинга.

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

1route-nopull

После чего клиент будет игнорировать передаваемые с сервера опции маршрутизации и DHCP-опции, такие как DNS-сервера и т.п.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал