Сервер OpenVPN на основе Ubuntu 18.04

UbuntuVPNМануалыПрограммное обеспечение

В этой статье хочу поделиться своим опытом настройки сервера OpenVPN на основе Ubuntu 18.04 Server.

Для удобства статья будет разбита на 4 части:


Часть 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.