К основному контенту

Делаем VPN сервер на Ubuntu 20.04 с помощью программ OpenVPN и EasyRSA

 В своей предыдущей статье я писал как создать бесплатный облачный сервер в AWS и использовать его в качестве VPN сервера. Инструкции по настройке VPN стали неактуальны из-за обновлений в операционной системе Ubuntu. Однако, шаги создания сервера в AWS всё те же.

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

Создание удостоверяющего центра и сертфикатов

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

Попав на сервер, первое что нам необходимо, это установить необходимое ПО для VPN и для генерации сертификатов безопасности - мы будем использовать OpenVPN и easy-rsa. Итак, инсталлируем указанные пакеты:

$> sudo su

$> apt-get install openvpn

$> apt-get install easy-rsa

Далее, создадим папку сертификатов безопасности:

$> make-cadir /etc/openvpn/easy-rsa/

Создадим локальную версию папки с easy-rsa, чтобы сертификаты безопасности удостоверяющего центра и нашего сервера не перетирались разными обновлениями:

$> mkdir -p ~/pki

$> cp -R /usr/share/easy-rsa/* ~/pki

Cоздадим и заполним файл с шаблонами ~/pki/vars в любом текстовом редакторе:

$> touch ~/pki/vars

$> vim ~/pki/vars

set_var EASYRSA_REQ_COUNTRY    "Montenegro"
set_var EASYRSA_REQ_PROVINCE   "Tivat"
set_var EASYRSA_REQ_CITY       "Tivat"
set_var EASYRSA_REQ_ORG        "Our Company Name"
set_var EASYRSA_REQ_EMAIL      "sysadmin@company.ru"
set_var EASYRSA_REQ_OU         "LLC"
set_var EASYRSA_ALGO           "ec"
set_var EASYRSA_DIGEST         "sha512"

 

Произведём инициализацию PKI (это удалит все уже созданные в нём сертификаты, включая корневой):

$> ./easyrsa init-pki



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

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

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

$> ./easyrsa build-ca

 



В Common Name используем своё имя сервера, например myvpnsrv

По окончании работы будет создан и подписан локальный УЦ в виде файлов ~/.../ca.crt (сертификат) и ~/.../ca.key (закрытый ключ).

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

Теперь нам нужно создать сертификат для сервера. Сначала сформируем запрос на получение сертификата:

$> ./easyrsa gen-req myvpnsrv


 

Вместо myvpnsrv здесь и далее в статье следует указывать внутреннее название сервера.

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

Подпишем созданный сертификат:

$> ./easyrsa sign-req server myvpnsrv



Внимательно проверив все данные, напечатаем на клавиатуре yes и нажмём Enter, после чего введём пароль секретного ключа корневого сертификата для подписи.

На этом создание сертификата сервера было успешно завершено. Он может быть найден в ~/pki/pki/issued/mysrv.crt, а его ключ — ~/pki/pki/private/mysrv.key.

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

Для каждого клиента должен быть создан свой собственный сертификат! Выполним запрос на получение сертификата для первого клиента:

$> ./easyrsa gen-req client1

Ответим на вопросы по своему усмотрению (они могут и не совпадать с указанными для сервера и УЦ), укажем пароль для защиты секретного ключа данного сертификата, затем нажмём Enter.

Подпишем созданный сертификат:

$> ./easyrsa sign-req client client1

Как и в варианте для подписи ключа сервера, внимательно проверив все данные, напечатаем на клавиатуре yes и нажмём Enter, после чего введём пароль секретного ключа корневого сертификата для подписи.

Итоговый сертификат может быть найден в ~/pki/pki/issued/client1.crt, а его ключ — ~/pki/pki/private/client1.key.

! ВАЖНО ! По умолчанию сертификаты создаются на 1 год. По истечении этого срока их необходимо перевыпустить.

Теперь можно передать любым способом на клиент или сервер обновлённый файл сертификата CRT из каталога ~/pki/pki/issued (читай передача файла с Linux сервера на Windows машину). 

Обновление сертификатов клиентво раз в год

Сначала обновим базу easy-rsa, чтобы обнаружить и отметить сертификаты, требующие обновления:

$> ./easyrsa update-db

Теперь подпишем нужный сертификат по старому CSR запросу:

$> ./easyrsa sign-req client client1

Снова передаем любым способом на клиент или сервер обновлённый файл сертификата CRT из каталога ~/pki/pki/issued. Повторно копировать закрытый ключ при этом не требуется.

Настройка безопасного TLS подключения и БД УЦ

 В обязательном порядке сгенерируем файл с параметрами для механизма обмена эфемерными ключами Диффи-Хеллмана (подробнее об этом здесь):

$> ./easyrsa gen-dh

Через некоторое время результат будет сохранён в файле ~/pki/pki/dh.pem.

 


Для корректной работы нашего удостоверяющего центра, необходимо создать базу данных отозванных сертификатов (CRL) в формате PEM:

$> ./easyrsa gen-crl

По запросу введём пароль защиты секретного ключа нашего корневого сертификата.

! Внимание ! База отозванных сертификатов должна обновляться на сервере каждые 180 суток, в противном случае клиенты будут получать ошибку «CRL has expired».

Сгенерируем статический ключ TLS:

$> openvpn --genkey --secret ta.key

Отзыв клиентских сертификатов

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

$> ./easyrsa revoke client1

Это действие отзовёт сертификат клиента с внутренним названием client1. Нас также попросят ввести с клавиатуры yes и нажать Enter.

По окончании необходимо обязательно выполнить обновление базы отозванных сертификатов таким же способом, как и её создание.

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

Все настройки сервера хранятся в каталоге /etc/openvpn/server/, который доступен как для записи, так и для чтения только для суперпользователя. Скопируем в данный каталог следующие файлы (возможно, потребуется переименовать существующие файлы для соответствия настройкам в файле конфигурации):

$> cp ~/pki/pki/issued/myvpnsrv.crt /etc/openvpn/server/ (сертификат сервера);

$> cp ~/pki/pki/ca.crt /etc/openvpn/server/ (корневой сертификат УЦ);

$> cp ~/pki/pki/dh.pem /etc/openvpn/server/ (файл с параметрами Диффи-Хеллмана);

$> cp ~/pki/pki/crl.pem /etc/openvpn/server/ (база отозванных сертификатов);

$> cp ~/pki/ta.key /etc/openvpn/server/ (файл общего статического ключа).

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

$> sudo openssl rsa -in ~/pki/pki/private/myvpnsrv.key -out /etc/openvpn/server/ myvpnsrv.key

По запросу введём пароль для расшифровки закрытого ключа данного сертификата.

Создадим и откроем в текстовом редакторе с правами суперпользователя файл /etc/openvpn/server/myvpnsrv.conf:

$> sudo touch /etc/openvpn/server/ubuntu.conf

$> sudo chmod 0600 /etc/openvpn/server/ubuntu.conf

$> sudo vim /etc/openvpn/server/ubuntu.conf

 
port 1194
proto udp
dev tun

ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/ubuntu.crt
key /etc/openvpn/server/ubuntu.key
dh /etc/openvpn/server/dh.pem
crl-verify /etc/openvpn/server/crl.pem

server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt

push "dhcp-option DNS 8.8.8.8"
push "redirect-gateway def1 bypass-dhcp"

keepalive 10 120

tls-server
tls-crypt /etc/openvpn/server/ta.key 0
tls-timeout 120
auth SHA512
cipher AES-256-GCM

max-clients 3

persist-key
persist-tun

status /var/log/openvpn-status.log
log /var/log/openvpn.log

verb 4

Описание всех параметров можно найти тут: https://github.com/OpenVPN/openvpn/blob/master/sample/sample-config-files/server.conf. IP адрес рекомендуется именно такой.

 Теперь на все файлы в каталоге /etc/openvpn/server/ установим chmod 0600:

$> sudo find /etc/openvpn/server -maxdepth 1 -type f -exec chmod 0600 "{}" \;

 

Проверочный запуск

Попробуем запустить OpenVPN. При запуске от вас будет требоваться ввести пароль.

$> service openvpn start

Проверяем:

$> netstat -tuwpan

Сервер должен слушать порт 1194. Если это не так, курим /var/log/syslog.

$> cat /var/log/syslog

или

$> /var/log/openvpn-status.log 

или

$> systemctl status openvpn-server@myvpnsrv.service

В логах обычно можно найти конкретные ошибки, к примеру, какой-то параметр ошибочен, или нет доступа к какому-то ресурсу. Например, вы могли указать user или group, которых не существуте. Или, например, TUN интерфейс для VPN не поднимается:

Note: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory

Это означает, что нам не включили tun модуль (обратитесь в техподдержку). 

А если всё хорошо, мы увидим запущенную службу OpenVPN, но интернета ещё не будет, для этого нам нужно настроить NAT:

 

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

В своей предыущей инструкции, я показывал магию через IP Tables. С тех пор многое поменялось. Сделаем через службу управления сетью:

$> sudo nano /etc/sysctl.conf

Добавим строчку

net.ipv4.ip_forward = 1

Выйти из nano можно нажав Ctrl+X, выбрав "y" (Yes- чтобы сохранить) и нажав Enter в поле выбора файла для сохранения.

Применим настройку рестартанув сервис:

$> sudo sysctl -p

Файервол (сервис UFW) настраивается добавлением правил маскарадинга (NAT трансляции) в начале файла

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

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

Имейте ввиду, что IP адрес 10.8.0.0 взят такой же как в myvpnsrv.config выше.

Разрешаем IP-форвардинг в системе заменой значения ключа с "DROP" на "ACCEPT":

$> sudo nano /etc/default/ufw

DEFAULT_FORWARD_POLICY = "ACCEPT"

Открываем трафик на порту OpenVPN и OpenSSH:

$> sudo ufw allow 1194/udp

 $>sudo ufw allow OpenSSH

Перезагружаем файервол:

$> sudo ufw disable

$> sudo ufw enable

 

Стартуем сервер

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

$> sudo systemctl start openvpn-server@myvpnsrv

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

$> sudo systemctl -f enable openvpn-server@myvpnsrv

Для отключения автозапуска:

 $> sudo systemctl disable openvpn-server@myvpnsrv

Проверить статус запуска:

 $> sudo systemctl status openvpn-server@server.service

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

$> exit


Подключаемся к VPN серверу с Windows

На свой компьютер скачиваем и устанавливаем OpenVPN клиент.

В папке C:/Program Files/OpenVpn/ создаём файл client.ovpn и любым редактором вставляем текст конфигурации клиента, созданный по примеру выше.

Этот файл можно разместить в папке профиля пользователя C:/Users/[YOUR_NAME]/OpenVPN/Client. Тогда рядом в папке C:/Users/[YOUR_NAME]/OpenVPN/logs будут логи запуска клиента, на случай проблем.

На своей клиентской машине, не важно с какой ОС, необходимо создать текстовый файл для конфигурирования клиента OpenVpn, вида:

client  
dev tun
proto udp
remote XX.XX.XX.XX 1194
resolv-retry infinite
nobind
persist-key
persist-tun
auth SHA512
cipher AES-256-GCM
key-direction 0
ca ca.crt
cert client1.crt
key client1.key
tls-crypt ta.key

verb 3

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

Запускаем OpenVPN клиента, после чего возле часиков появится иконка серого или белого мониторчика. Правой кнопкой на иконку мониторчика и выбираем Connect (если у вас только один файл конфигурации клиента, если больше – то там будет список доступных клиентов). Надо чуть-чуть подождать и когда мониторчик загорится зелёным цветом — это означает успешное подключение. В обратном случае он может гореть жёлтым или серым, в этом случае нужно смотреть в логи и проверять там наличие ошибок.

После успешного соединения идём в браузер и проверяем, что недоступное вновь нам доступно :).

Полезные материалы

Делаем себе бесплатный VPN на Amazon EC2 (мой предыдущий мануал)

Поднимаем OpenVPN сервер на Fedora (то же, но для Fedora)

Как настроить OpenVPN Server на Ubuntu 20.04 (то же, но чуть сложнее и без Диффи Хеллмана, что фе)

 


Комментарии

Популярные сообщения из этого блога

Делаем себе бесплатный VPN на Amazon EC2

Читать этот пост в Telegraph. Другие посты в канале в Telegram. Кто только не расписывал уже пошаговые инструкции по этой теме. Однако, время идёт, ПО меняется, инструкции нуждаются в обновлении, а люди в современной России всё больше нуждаются в применении VPN. Я собираюсь описать все шаги для создания бесплатного сервера на Amazon EC2 с операционной системой Linux и необходимые команды для настройки VPN сервера на нём. Чтобы не повторяться о деталях, которые были много раз описаны на русскоязычных и англоязычных ресурсах, по ходу статьи я просто приведу целую кипу ссылок, где можно почерпнуть необходимую информацию, а где информация устарела - опишу подробнее что нужно сдеать. В итоге, сервер будет доступен для вас из любой точки планеты, с любой операционной системы, и бесплатно (с определёнными ограничениями по трафику). Шаг первый - Регистрируемся на Amazon AWS Нужно зайти на сайт https://aws.amazon.com/ru и сразу перейти к Регистрации, нажав одноимённую кнопку. При р

В помощь программисту: инструкции по работе с Ubuntu сервером

Программистам чаще приходится писать код и заботиться о его чистоте, правильных абстракциях в коде, корректных зависимостях и прочих сложностях профессии. При этом, настройка и обслуживание серверов, хоть и связанная область - это отдельный навык, необходимый не каждому, и помнить о котором в деталях сложно. Поэтому, я делаю ряд микро-инструкций, которыми буду пользоваться и сам, когда необходимо. Это не статьи, а пошаговые помощники, которые я буду дополнять и наполнять по мере надобности. Делаем бесплатный VPN на Amazon EC2 Создание ключей SSH Подключение к серверу через SSH Передача файла с Linux сервера наWindows машину Делаем VPN сервер на Ubuntu 20.04 используя OpenVPN и EasyRSA  Отображение GUI с Linux сервера на Windows машине

Выбираем все плюсы из трех парадигм Entity Framework

Между парадигмами разработки с Entity Framework (Code First, Model First, Database First) я выбрал промежуточную, потому что ни одна меня не устраивала полностью. В Code First меня радуют чистые POCO классы, но не устраивает невозможность моделирования базы. В Database First и Model First мне не нравится генерация EDMX и другого всего лишнего. Таким образом, я нашел для себя такое решение: 1. Я моделирую схему в любой удобной программе (тут любая внешняя программа моделирования, генерирующая SQL Server-совместимые скрипты генерации базы) Рис. Смоделированная схема БД. 2. Создаю базу в SQL Management Studio 3. Делаю Reverse Engineering базы в POCO классы (как в Code First) с помощью плагина Entity Framework Power Tools Рис. Установленный плагин для Reverse Engineer. Рис. Вот так делается Reverse Engineer базы данных в POCO классы. Рис. Результат генерации POCO классов на основе базы данных: папочка Models с готовым контекстом, классами объектов и маппинг-классами.