В этой статье хочу поделиться своим опытом настройки сервера OpenVPN на основе Ubuntu 18.04 Server.
Для удобства статья будет разбита на 4 части:
- Настройка сетевой структуры сервера;
- Настройка центра сертификации EasyRSA;
- Настройка серверной части OpenVPN;
- Настройка клиентской части сервера OpenVPN;
Часть 1 — Настройка сетевой структуры сервера
В первую очередь разрешим нашему серверу пересылку пакетов на уровне ядра:
- sudo vi /etc/sysctl.conf
Найдите и раскоментируйте следующий параметр:
- net.ipv4.ip_forward=1
Затем применим сделанные изменения:
- sudo sysctl -p
Далее настроим брандмауэр для правильной маршрутизации и маскарадинга трафика:
В первую очередь разрешим подключения к нашему серверу по протоколу SSH:
- sudo ufw allow 22
или
- sudo ufw allow OpenSSH
Далее разрешим входящие соединения на порт OpenVPN, в нашей конфигурации это будет стандартный порт 1194 и протокол udp:
- sudo ufw allow 1194/udp
В параметрах UFW разрешим пересылку пакетов по умолчанию
- sudo vi /etc/default/ufw
- Заменим строчку DEFAULT_FORWAD_POLICY=»DROP» на DEFAULT_FORWAD_POLICY=»ACCEPT«
Добавим правила маскарадинга в таблицу NAT что-бы клиенты могли выходит в интернет используя наш сервер как шлюз по умолчанию:
- sudo vi /etc/ufw/before.rules
Добавим после последнего знака «#» таблицу nat и правила к нашей openvpn сети (имеющиеся правила НЕ УДАЛЯТЬ), вместо eth0 нужно подставить название вашей сетевой карты. узнать можно выполнив команду ip route | grep default
- *nat
- :POSTROUTING ACCEPT [0:0]
- -A POSTROUTING -s 172.20.0.0/24 -o eth0 -j MASQUERADE
- COMMIT
- Сохраните и закройте файл
Запустим наш брандмауэр (возможно потребуется подтверждение запуска, нажать «y»):
- sudo ufw enable
На этом часть — 1 закончена, переходим к следующей.
Часть — 2. Настройка центра сертификации EasyRSA
Сервер и клиенты OpenVPN используют сертификаты для установления и соединений и шифрования трафика, поэтому нам потребуется собственный центр сертификации. В рекомендациях OpenVPN указано что центр сертификации должен находиться на отдельном физическом сервере, но мы установим его вместе с серером OpenVPN.
Скачаем последнюю версию EasyRSA с GitHub проекта:
- wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
Распакуем скачанный архив и перейдем в полученную директорию:
- tar xvf EasyRSA-unix-v3.0.6.tgz
- sudo chmod -R 700 EasyRSA-v3.0.6
- cd EasyRSA-v3.0.6
Создадим файл с настройками переменных:
- cp vars.example vars
Раскоментируем значения переменных, при желании их можно изменить, но нельзя оставлять незаполненными:
- vi 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 init-pki
- touch pki/.rnd
- ./easyrsa build-ca nopass
- ./easyrsa gen-dh
*выполнение займет некоторое время
Центр сертификации настроен и готов подписывать сертификаты сервера и клиента, а следовательно Часть — 2 закончена, идем дальше.
Часть — 3. Настройка серверной части OpenVPN
Установим OpenVPN на наш сервер:
- sudo apt install openvpn
Сгенерируем и подпишем сертификат сервера:
- cd ~/EasyRSA-v.3.0.6
- openvpn —genkey —secret ta.key
- ./easyrsa gen-req server nopass
- ./easyrsa sign-req server server
*необходимо набрать «yes» и нажать Enter
Скопируем сертификаты сервера и центра сертификации в каталог нашего OpenVPN сервера:
- sudo cp ~/EasyRSA-v.3.0.6/pki/ca.crt /etc/openvpn
- sudo cp ~/EasyRSA-v.3.0.6/private/ca.key /etc/openvpn
- sudo cp ~/EasyRSA-v.3.0.6/ta.key /etc/openvpn
- sudo cp ~/EasyRSA-v.3.0.6/pki/dh.pem /etc/openvpn
- sudo cp ~/EasyRSA-v.3.0.6/pki/issued/server.crt /etc/openvpn
- sudo cp ~/EasyRSA-v.3.0.6/pki/private/server.key /etc/openvpn
- sudo touch /etc/openvpn/ipp.txt
Создадим конфигурационный файл нашего OpenVPN сервера:
- sudo vi /etc/openvpn/server.conf
Добавим в него следующие параметры:
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
dh dh.pem
topology subnet
server 172.20.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt 0
push «redirect-gateway def1 bypass-dhcp»
push «dhcp-option DNS 8.8.8.8»
push «dhcp-option DNS 8.8.4.4»
;client-to-client
;duplicate-cn
keepalive 10 120
tls-auth ta.key 0 # This file is secret
key-direction 0
cipher AES-256-CBC
auth SHA256
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
verb 3
explicit-exit-notify 1
Сервер будет принимать клиентские соединения на порту 1194 по протоколу UDP, использоваться как основной шлюз для клиентов и использовтаь DNS от Google. IP адрес нашего сервера в openvpn сети будет 172.20.0.1.
Если необходимо чтобы клиенты соединлись между собой с помощью сервера, раскоментируйте строку ;client-to-client.
Eсли хотите использовать 1 сертификат на нескольких устройствах, раскоментируйте строку ;duplicate-cn.
Самое время запустить наш, только-что сконфигурированный сервер OpenVPN:
- sudo systemctl enable openvpn@server
- sudo systemctl start openvpn@server
На это настройка серверной части, а следовательно Часть — 3 завершена. Переходим к финальной стадии настройки сервера OpenVPN.
Часть — 4. Настройка клиентской части сервера OpenVPN
Финальная часть посвящена настройки конфигурации, созданию и отзыву клиентских сертификатов нашего сервера OpenVPN.
Создадим директорию-хранилище клиентских сертификатов, содержащую в себе базовую конфигурацию для всех клиентов:
- cd
- mkdir -p client-configs/files
- mkdir -p client-configs/keys
- chmod 700 -R client-configs/
Создадим файл базовой конфигурации всех клиентских сертификатов:
- cd ~/client-configs
- vi base.conf
*скопируйте в него селдующие параметры, заменив 12.34.56.78 на внешний IP адрес Вашего OpenVPN сервера:
client
dev tun
proto udp
remote 12.34.56.78 1194
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
#ca ca.crt
##cert client.crt
##key client.key
remote-cert-tls server
#tls-auth ta.key 1
cipher AES-256-CBC
auth SHA256
key-direction 1
verb 3
# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
Скопируем необходимые файлы в директорию клиентских ключей:
- cp ~/EasyRSA-v.3.0.6/pki/ca.crt ~/client-configs/keys
- cp ~/EasyRSA-v.3.0.6/private/ca.key ~/client-configs/keys
- cp ~/EasyRSA-v.3.0.6/ta.key ~/client-configs/keys
Сгенерируем и подпишем наш первый пользовательский сертифика под названием cl1:
- cd ~/EasyRSA-v3.0.6
- ./easyrsa gen-req cl1 nopass
- ./easyrsa sign-req client cl1
Скопируем полученные сертификат и ключ в клиентскую директорию:
- cp ~/EasyRSA-v.3.0.6/pki/issued/cl1.crt ~/client-configs/keys
- cp ~/EasyRSA-v.3.0.6/pki/private/cl1.key ~/client-configs/keys
Создадим простой скрипт генерации файлов .ovpn на основе созданных нами сертификатов
- touch ~/client-configs/ovpn.sh
- vi ovpn.sh
Добавим в этот файл слудеющий сценарий:
#!/bin/bash
# First argument: Client identifier
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/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 +x ~/client-configs/ovpn.sh
Создадим наш клиентский .ovpn файл который содаржит все данные для подклчения к серверу:\
- cd ~/client-configs
- sudo ./ovpn.sh cl1
Если все выпонено верно, в директории ~/client-cinfigs/files появится файлв cl1.ovpn. Нужно скопировать его на клиентское устройство, установить OpenVPN Client и подключиться к наему серверу.
Для того что-бы отозвать клиентский сертификать необходимо перейти в директориею ~/EasyRSA-v3.0.6 и выполнить слудеющие команды:
- cd ~/EasyRSA-v.3.0.6
- ./easyrsa revoke cl1
*необходимо набрать «yes» и нажать Enter
- ./easyrsa gen-crl
- sudo cp pki/crl.pem /etc/openvpn
В конфигурационный файл /etc/openvpn/server.conf добавте слудующий параметр: crl-verify crl.pem
Перезагрузите сервер: sudo systemctl restart openvpn@server
После этого сервер не сможет принимать запрос на подключение от клиента cl1.ovpn
На этом все, наш сервер работает, клиенты подключаются и при необходимости видят друг-друга. В случае необходимости клиентский сертификат может быть отозван и перевыпущен снова. Конечно есть более тонкие и детальные настройки, но этого мануала достаточно чтобы соединять офисы филиалов, или шифровать трафик в публичном Wi-Fi.