Как настроить OpenVPN в системе Ubuntu 20.04

OpenVPN — это многофункциональная VPN с открытым исходным кодом Secure Socket Layer (SSL). VPN позволяет безопасно подключать ненадежные сети, такие как сеть WI-Fi в отелях, аэропортах или торговых центрах. Также VPN позволяет обеспечить безопасное подключение к корпоративной сети для доступа к ресурсам. Туннели защищены с помощью учетных данных и сертификатов SSL/TLS.

В этой статье я покажу как настроить сервер VPN с помощью OpenVPN на Ubuntu 20.04.

Как настроить OpenVPN в системе Ubuntu 20.04
Как настроить OpenVPN в системе Ubuntu 20.04

Требования для настройки:

Мы будем использовать два сервера Ubuntu работающих на версии 20.04:

  • Сервер Центра Сертификации (ЦС), который будет проверять запрос и подписывать сертификаты клиентов.
  • Сервер OpenVPN, на котором мы установим VPN.

Настройка сервера центра сертификации Ubuntu

Рекомендую сохранить автономный сервер в качестве центра сертификации (certificate authority). Делается это из соображений безопасности. Давайте перейдем к настройке сервера центра сертификации.

Сначала убедитесь, что система обновлена. Выполните следующую команду:

$ sudo apt update

Вам нужно будет создать некорневого пользователя для конфигураций сервера центра сертификации.

$ sudo adduser malain

Теперь дайте пользователю привилегии sudo:

$ sudo usermod -aG sudo malain

Далее выйдите из системы, а затем снова войдите в систему.

Установка EasyRSA на сервер центра сертификации

Easy-rsa — это утилита CLI для создания и управления центром сертификации PKI. Easy-RSA будет использоваться сервером ЦС для генерации закрытого ключа и открытого корневого сертификата. Которые будут использоваться для подписи запросов от клиентов и серверов, а так же будет полагаться на наш сервер центра сертификации.

Чтобы установить easy-rsa, загрузите инструмент управления PKI с github. Это можно сделать с помощью wget команды:

$ wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz

Затем распакуйте файл tgz:

$ tar xvf EasyRSA-3.0.8.tgz

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

$ chmod 700 EasyRSA-3.0.8

Теперь переместите EasyRSA в каталог opt

$ sudo mv EasyRSA-3.0.8 /opt/

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

Создание сервера центра сертификации с помощью EasyRSA

Первое что требуется сделать это создать файл с именем vars для хранения информации об организации. Для этого мы можем использовать пример файла, доступного в каталоге EasyRSA-3.0.8.

Чтобы перечислить файлы в каталоге EasyRSA, используйте команду:

$ cd EasyRSA-3.0.8/ && ls -l

В терминале вы увидите следующий ответ:

-rw-rw-r-- 1 malain malain 1305 Sep 9 2020 COPYING.md
-rw-rw-r-- 1 malain malain 5056 Sep 9 2020 ChangeLog
-rw-rw-r-- 1 malain malain 2049 Sep 9 2020 README.md
-rw-rw-r-- 1 malain malain 3335 Sep 9 2020 README.quickstart.md
drwxrwxr-x 2 malain malain 4096 Sep 9 2020 doc
-rwxrwxr-x 1 malain malain 76946 Sep 9 2020 easyrsa
-rw-rw-r-- 1 malain malain 18093 Sep 9 2020 gpl-2.0.txt
-rw-rw-r-- 1 malain malain 1036 Sep 9 2020 mktemp.txt
-rw-rw-r-- 1 malain malain 4616 Sep 9 2020 openssl-easyrsa.cnf
-rw-rw-r-- 1 malain malain 8925 Sep 9 2020 vars.example
drwxrwxr-x 2 malain malain 4096 Mar 28 14:14 x509-types

Сделайте копию файла vars.example как vars:

$ cp vars.example vars

Теперь откройте файл vars и добавьте информацию об организации в конец файла:

$ vim vars
set_var EASYRSA_REQ_COUNTRY "CM"
set_var EASYRSA_REQ_PROVINCE "Littoral"
set_var EASYRSA_REQ_CITY "Douala"
set_var EASYRSA_REQ_ORG "OPEN-SHARE"
set_var EASYRSA_REQ_EMAIL "admin@open-share.com"
set_var EASYRSA_REQ_OU "Com"
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

Теперь инициализируйте PKI на сервере центра сертификации. После инициализации сервер создаст папку pki.

$ ./easyrsa init-pki

Теперь мы можем создать корневую пару открытых и закрытых ключей для нашего ЦС. Во время этого процесса вас попросят ввести кодовую фразу для пары ключей. А так же она потребуется, когда вам нужно будет подписать или отозвать сертификат. Но в нашем случае мы будем использовать команду так, чтобы нам кодовая фраза не предлагалась. Вам также будет предложено указать Общее имя (CN), но мы оставим его по умолчанию, нажав клавишу Enter.

$ ./easyrsa build-ca nopass

Note: using Easy-RSA configuration from: /opt/EasyRSA-3.0.8/vars
Using SSL: openssl OpenSSL 1.1.1f 31 Mar 2020
read EC key
writing EC key
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
——
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/opt/EasyRSA-3.0.8/pki/ca.crt

Это создаст корневой сертификат с именем ca.crt в каталоге pki и приватным ключом ca.key в каталоге pki/private.

$ ls -l pki/
total 52
-rw------- 1 malain malain 749 Mar 28 14:30 ca.crt
drwx------ 2 malain malain 4096 Mar 28 14:29 certs_by_serial
drwx------ 2 malain malain 4096 Mar 28 14:29 ecparams
-rw------- 1 malain malain 0 Mar 28 14:29 index.txt
-rw------- 1 malain malain 0 Mar 28 14:29 index.txt.attr
drwx------ 2 malain malain 4096 Mar 28 14:29 issued
-rw------- 1 malain malain 4616 Mar 28 14:24 openssl-easyrsa.cnf
drwx------ 2 malain malain 4096 Mar 28 14:30 private
drwx------ 5 malain malain 4096 Mar 28 14:29 renewed
drwx------ 2 malain malain 4096 Mar 28 14:24 reqs
drwx------ 5 malain malain 4096 Mar 28 14:29 revoked
-rw------- 1 malain malain 4575 Mar 28 14:24 safessl-easyrsa.cnf
-rw------- 1 malain malain 3 Mar 28 14:29 serial

$ ls -l pki/private/
total 4
-rw------- 1 malain malain 288 Mar 28 14:29 ca.key

Вот и все наш сервер центра сертификации готов!

Установка и настройка сервера Openvpn

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

Чтобы установить openvpn на ubuntu, выполните следующие команды:

$ sudo apt update
$ sudo apt install openvpn

На сервере openvpn утилита easyrsa будет использоваться для генерации запроса сертификата, который будет проверен и подписан сервером центра сертификации (ЦА). Выполните те же действия, что и в предыдущем разделе, чтобы установить Easyrsa.

$ wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz

Теперь распакуйте загруженный файл tgz:

$ tar xvf EasyRSA-3.0.8.tgz

Ограничьте доступ только пользователю:

$ chmod 700 EasyRSA-3.0.8

Переместите EasyRSA-3.0.8 в opt каталог:

$ sudo mv EasyRSA-3.0.8 /opt/

Создание PKI на сервере OpenVPN Ubuntu

Теперь нам нужно создать PKI, который поможет запрашивать и управлять сертификатами TLS для клиентов и других серверов, которые будут подключаться к нашей VPN сети.

Эта команда позволяет создать файл vars мы описывали это выше:

$ cp vars.example vars

Теперь отредактируйте файл vars с помощью утилиты VIM, добавив следующие строки в конце файла:

$ vim vars
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

Чтобы создать папку PKI на сервере openvpn, запустите файл easyrsa сценария:

$ ./easyrsa init-pki

Вы увидите следующий ответ в терминале:

Note: using Easy-RSA configuration from: /opt/EasyRSA-3.0.8/vars init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /opt/EasyRSA-3.0.8/pki

Создайте запрос сертификата сервера и сгенерируйте закрытый ключ

Теперь мы сгенерируем закрытый ключ и запросим сертификат на сервере OpenVPN. Далее мы передадим файл запроса сертификата на сервер центра сертификации (ЦА). который будет подписан, чтобы создать необходимый сертификат

Находясь в той же папке, мы можем сгенерировать запрос nopass . Следующая команда создает файл закрытого ключа с именем openvpn-server.key и файл запроса сертификата с именем openvpn-server.req.

$ ./easyrsa gen-req openvpn-server nopass

Вывод в терминале:

Note: using Easy-RSA configuration from: /opt/EasyRSA-3.0.8/vars
Using SSL: openssl OpenSSL 1.1.1f 31 Mar 2020
Generating an EC private key
writing new private key to '/opt/EasyRSA-3.0.8/pki/easy-rsa-4737.CGhQHN/tmp.UGQ9wi'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [openvpn-server]:
Keypair and certificate request completed. Your files are:
req: /opt/EasyRSA-3.0.8/pki/reqs/openvpn-server.req
key: /opt/EasyRSA-3.0.8/pki/private/openvpn-server.key

Теперь скопируйте файл ключа сервера с именем openvpn-server.key в каталог с именем /etc/openvpn/server.

$ sudo cp /opt/EasyRSA-3.0.8/pki/private/openvpn-server.key /etc/openvpn/server

Затем скопируйте файл запроса сертификата на сервер ЦА (центра сертификации):

$ scp /opt/EasyRSA-3.0.8/pki/reqs/openvpn-server.req malain@192.168.216.108:/tmp

На сервере ЦА перейдите в каталог easyrsa,

$ cd /opt/EasyRSA-3.0.8/

Чтобы импортировать запрос, выполните следующую команду:

$ ./easyrsa import-req /tmp/openvpn-server.req openvpn-server

Ответ в терминале:

Note: using Easy-RSA configuration from: /opt/EasyRSA-3.0.8/vars
Using SSL: openssl OpenSSL 1.1.1f 31 Mar 2020


The request has been successfully imported with a short name of: openvpn-server
You may now use this name to perform signing operations on this request.

А теперь подпишите запрос. Поскольку мы подписываем запрос сервера, мы должны использовать директиву server перед общим именем нашего сервера openvpn. Если бы это был запрос клиента, мы должны были бы использовать директиву client вместо server.

Подписать запрос:

$ ./easyrsa sign-req server openvpn-server

Ответ в терминале:

Note: using Easy-RSA configuration from: /opt/EasyRSA-3.0.8/vars
Using SSL: openssl OpenSSL 1.1.1f 31 Mar 2020

You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 825 days:
subject=
commonName = openvpn-server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Using configuration from /opt/EasyRSA-3.0.8/pki/easy-rsa-4100.IbygpP/tmp.hJY2T5
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'openvpn-server'
Certificate is to be certified until Jul 1 19:50:36 2023 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /opt/EasyRSA-3.0.8/pki/issued/openvpn-server.crt

Теперь запрос сертификата сервера OpenVPN подписан сервером ЦА, нам нужно передать подписанный запрос и открытый сертификат на сервер OpenVPN.

$ scp pki/{ca.crt,issued/openvpn-server.crt} franck@192.168.224.3:/tmp

$ sudo cp /tmp/{ca.crt,openvpn-server.crt} /etc/openvpn/server

Теперь мы сгенерируем предварительный общий ключ tls-crypt. Это гарантирует что наш OpenVPN-сервер способен справляться с не аутентифицированным трафиком, сканированием портов и некоторыми атаками, которые могут использовать много ресурсов сервера.

$ ./easyrsa gen-dh

Ответ в терминале:

Note: using Easy-RSA configuration from: /opt/EasyRSA-3.0.8/vars Using SSL: openssl OpenSSL 1.1.1f 31 Mar 2020 Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time ....................................+.......................... ............................................................... ............................................................... ...........................................+.......+.......+... .....+.......................................................... ...............................++*++*++*++*

DH parameters of size 2048 created at /opt/EasyRSA-3.0.8/pki/dh.pem

Далее вводим команду

$ openvpn --genkey --secret ta.key

Теперь скопируйте ключ и pem файлы в каталог /etc/openvpn/server:

$ sudo cp ta.key pki/dh.pem /etc/openvpn/server

Создание сертификата клиента и пары ключей

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

$ sudo mkdir -p /opt/client-configs/keys
$ sudo chown franck:franck -R /opt/client-configs
$ sudo chmod 700 -R /opt/client-configs

Сгенерируйте запрос на сертификат клиента:

$ cd /opt/EasyRSA-3.0.8
$ ./easyrsa gen-req my-pc nopass

Ответ в терминале:

Note: using Easy-RSA configuration from: /opt/EasyRSA-3.0.8/vars Using SSL: openssl OpenSSL 1.1.1f 31 Mar 2020 Generating an EC private key writing new private key to ‘/opt/EasyRSA-3.0.8/pki/easy-rsa-6961.m7fBMu/tmp.dkqaZI’ —— You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter ‘.’, the field will be left blank. —— Common Name (eg: your user, host, or server name) [my-pc]: Keypair and certificate request completed. Your files are: req: /opt/EasyRSA-3.0.8/pki/reqs/my-pc.req key: /opt/EasyRSA-3.0.8/pki/private/my-pc.key

Теперь скопируйте клиентский ключ в каталог client-configs:

$ cp pki/private/my-pc.key /opt/client-configs/keys/

Скопируйте файл запроса сертификата клиента на сервер центра сертификации:

$ scp pki/reqs/my-pc.req malain@192.168.216.108:/tmp

На сервере центра сертификации импортируйте CSR:

$ cd /opt/EasyRSA-3.0.8
$ ./easyrsa import-req /tmp/my-pc.req my-pc


Note: using Easy-RSA configuration from: /opt/EasyRSA-3.0.8/vars
Using SSL: openssl OpenSSL 1.1.1f 31 Mar 2020


The request has been successfully imported with a short name of: my-pc
You may now use this name to perform signing operations on this request.

Теперь мы должны подписать запрос для клиента, набрав:

$ ./easyrsa sign-req client my-pc

Ответ в терминале:

Note: using Easy-RSA configuration from: /opt/EasyRSA-3.0.8/vars
Using SSL: openssl OpenSSL 1.1.1f 31 Mar 2020


You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a client certificate for 825 days:

subject=
commonName = my-pc

Type the word ‘yes’ to continue, or any other input to abort.
Confirm request details: yes
Using configuration from /opt/EasyRSA-3.0.8/pki/easy-rsa-5511.IwDcbS/tmp.doUbCv
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
commonName :ASN.1 12:’my-pc’
Certificate is to be certified until Jul 1 21:33:52 2023 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /opt/EasyRSA-3.0.8/pki/issued/my-pc.crt

Скопируйте сертификат клиента на сервер openvpn:

$ scp pki/issued/my-pc.crt franck@192.168.224.3:/tmp

Теперь на сервере openvpn нам нужно скопировать все клиентские файлы в каталог клиента, который мы создали ранее.

$ sudo cp /tmp/my-pc.crt /opt/client-configs/keys/

$ sudo cp /etc/openvpn/server/ca.crt /opt/client-configs/keys/

$ cp /opt/EasyRSA-3.0.8/ta.key /opt/client-configs/keys/

Убедитесь в том, что пользователь не является root и имеет разрешения на файлы.

$ sudo chown franck:franck /opt/client-configs/keys/*

Настройка VPN-сервиса

Для настройки VPN сервиса мы должны  сделать копию шаблонов

$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/server/

Затем распакуйте файл

$ sudo gzip -d /etc/openvpn/server/server.conf.gz

Далее войдите в папку

$ cd /etc/openvpn/server

Некоторые линии будут заменены, чтобы соответствовать нашей конфигурации::

  • Криптографические шифры будут установлены на AES-256-CBC
  • Алгоритм дайджеста сообщений HMAC будет sha256
  • Поскольку мы также используем параметр Diffie-Hellman, мы установим его равным dh.pem
  • После запуска openvpn мы будем использовать пользователя nobody и группу nogroup  без привилегий.
  • Мы будем проталкивать изменения dns, чтобы перенаправить весь трафик через vpn со значениями push redirect-gateway def1 bypass-dhcp,push dhcp-option DNS 208.67.222.222push dhcp-option DNS 208.67.220.220
  • Так же мы сохраним порт по умолчанию 1194
  • Далее мы будем использовать udp протокол
  • Мы должны указать ключ openvpn-server.key и сертификат openvpn-server.crt которые будут использоваться в качестве учетных данных

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

$ sudo vim /etc/openvpn/server/server.conf
tls-crypt ta.key
cipher AES-256-CBC
auth SHA256
dh dh.pem
user nobody
group nogroup
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
port 1194
proto udp
explicit-exit-notify 1
cert openvpn-server.crt
key openvpn-server.key

Вы должны активировать переадресацию ip-адресов, отредактировав значение net.ipv4.ip_forward в файле /etc/sysctl.conf.

$ sudo vim /etc/sysctl.conf
net.ipv4.ip_forward=1

Чтобы изменения, внесенные в файл /etc/sysctl.conf, вступили в силу, выполните команду:

$ sudo sysctl -p
net.ipv4.ip_forward = 1

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

$ ip route | grep default
default via X.X.X.X dev eth0 proto static

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

$ sudo vim /etc/ufw/before.rules
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to the public server interface eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

Теперь давайте отредактируем ufw, чтобы разрешить пересылку пакетов по умолчанию.

$ sudo vim /etc/default/ufw
DEFAULT_FORWARD_POLICY="ACCEPT"

Откройте порт openvpn на брандмауэре:

$ sudo ufw allow '1194/udp'

Чтобы перезапустить службу ufw, введите:

$ sudo ufw disable && sudo ufw enable

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

$ sudo systemctl enable openvpn-server@server

Чтобы запустить openvpn, введите:

$ sudo systemctl start openvpn-server@server

Вы можете проверить статус openvpn с помощью:

$ sudo systemctl status openvpn-server@server

Ответ терминала:

● openvpn-server@server.service - OpenVPN service for server
Loaded: loaded (/lib/systemd/system/openvpn-server@.service; disabled; vendor preset: enabled)
Active: active (running) since Sun 2021-03-28 23:30:57 UTC; 8s ago
Docs: man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Main PID: 78132 (openvpn)
Status: "Initialization Sequence Completed"
Tasks: 1 (limit: 1073)
Memory: 1.0M
CGroup: /system.slice/system-openvpnx2dserver.slice/openvpn-server@server.service
└─78132 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --config server.conf
Mar 28 23:30:57 localhost systemd[1]: Starting OpenVPN service for server...
Mar 28 23:30:57 localhost systemd[1]: Started OpenVPN service for server.

Чтобы проверить туннельный интерфейс, введите:

$ ip addr show tun0

Ответ терминала:

3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
link/none
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::c3d9:85d1:e2a9:6b2c/64 scope link stable-privacy
valid_lft forever preferred_lft forever

Настройка vpn-файлов для клиентов

$ sudo mkdir -p /opt/client-configs/files

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

$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /opt/client-configs/base.conf

Дайте разрешение не корневому пользователю

$ sudo chown franck:franck -R /opt/client-configs/

Отредактируйте файл base.conf

$ vim /opt/client-configs/base.conf
remote your_server_ip 1194

proto udp
# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup
#ca ca.crt
#cert client.crt
#key client.key
#tls-auth ta.key 1
cipher AES-256-CBC
auth SHA256
key-direction 1
# For the clients using resolvconf for DNS resolution, uncomment the lines below on the client computer

; script-security 2
; up /etc/openvpn/update-resolv-conf
; down /etc/openvpn/update-resolv-conf
# Instead for the clients using systemd-resolved for DNS resolution, uncomment the lines below on the client computer

; script-security 2
; up /etc/openvpn/update-systemd-resolved
; down /etc/openvpn/update-systemd-resolved
; down-pre
; dhcp-option DOMAIN-ROUTE .

Теперь мы создадим скрипт для генерации сертификатов и зашифрованных файлов на клиенте. Скрипт также сделает копию файла base.conf и соберет все ключи и сертификаты, созданные для клиентов. Для каждого клиента нам потребуется сгенерировать сертификат и ключ перед запуском скрипта

$ vim /opt/client-configs/make_config.sh
#!/bin/bash

# First argument: Client identifier

KEY_DIR=/opt/client-configs/keys
OUTPUT_DIR=/opt/client-configs/files
BASE_CONFIG=/opt/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

Убедитесь, что сценарий может быть запущен пользователем, не являющимся пользователем root.

$ chmod 700 /opt/client-configs/make_config.sh

Теперь вы можете сгенерировать файл подключения клиента на основе конфигурации ключа клиента и сертификата (my-pc.crt и my-pc.key)

$ cd /opt/client-configs

Теперь запустите скрипт за которым следует общее имя используемое для клиента. Он создаст клиентский vpn-файл для использования.

$ ./make_config.sh my-pc

Вы можете проверить результат:

$ ls -l files/
total 12
-rw-rw-r-- 1 franck franck 8598 Mar 30 11:12 my-pc.ovpn

Подключение клиента к OpenVPN-соединению

Установите openvpn клиент. Он будет использоваться для установки vpn-соединения с сервером

$ sudo apt update && sudo apt install openvpn -y

Теперь скопируйте клиентский файл OpenVPN, который находится на сервере. Копировать надо на клиентский компьютер. После этого на клиентском компьютере выполните следующую команду:

$ rsync -av franck@X.X.X.X:/opt/client-configs/files/my-pc.ovpn .

Перед редактированием конфигурационного файла клиента OpenVPN мы должны проверить, используем ли мы resolvconf или systemd-resolved для разрешения DNS

$ cat /etc/resolv.conf
OUTPUT:
# This file is managed by man:systemd-resolved(8). Do not edit.
. . .

nameserver 127.0.0.53
options edns0

С этим значением nameserver 127.0.0.53он показывает, что вы используете systemd-resolved. Далее установите пакет, который поможет systemd-resolved использовать VPN для разрешения DNS при подключении.

$ sudo apt install openvpn-systemd-resolved

Теперь мы можем отредактировать файл vpn-клиента, раскомментировав строки, необходимые для systemd-resolved

$ vim my-pc.ovpn
script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
down-pre
dhcp-option DOMAIN-ROUTE .

Для системы, использующей update-resolv-conf раскомментируйте строки

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

Теперь попробуем подключиться к VPN с помощью команды openvpn:

$ sudo openvpn --config my-pc.ovpn

Вы можете проверить информацию ip для туннельного интерфейса

$ ip a

Эта команда покажет IP-адрес туннеля, и мы можем пингануть сервер OpenVPN. С помощью пинга вы поймете подключились вы на сервер или нет.

Заключение

При использовании OpenVPN легко настроить VPN-соединение. Это хорошее решение, если вы хотите настроить VPN на своем облачном сервере без использования какого-либо специализированного ПО.

Nazario

Я — Nazario, создатель и автор сайта linuxwin.ru, специализируюсь на информационных технологиях с акцентом на системное администрирование Linux и Windows, веб-разработку и настройку различных систем.

Linux и Windows
Выскажите своё мнение или присоединяйтесь к обсуждению:

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

  1. Николай

    Добрый день. Спасибо за очень актуальную статью.
    1) Если не затруднит, не можете ли дать совет по использованию вместо отдельного сервера ЦА встроенные средства EasyRSA-3.0.8 с помощью билд СА для генерации ключей и сертификатов сервера и клиентов, как это сделано в статье «How to Set Up an PoenVPN Server on Ubuntu 14.04» от 28.01.2015 на портале DigitalOcean ссылка: https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-14-04. Это позволило бы оплачивать один экземпляр виртуального сервера у поставщика VPS вместо двух.
    2) Правильно ли я понял, что вместо команд apt-get update, apt-get upgrade, и apt-get install easy-rsa ( у меня Ubuntu 16.04) для EasyRSA лучше использовать явную закачку с Github именно релиза 3.0.8?
    3) Вообще, следует ли мне перейти на Ubuntu 20.04, если мой VPS используется только для поддержки VPN только на моём домашнем ПК?
    Очень был бы вам благодарен за советы, спасибо.
    С уважением, Николай

    Ответить
  2. Антон

    Плохая инструкция, непоследовательно с повторениями того, что было….

    Ответить
    1. Антон

      Оказался не прав… Приношу свои извинения.

      Молодей автор.

      Ответить
      1. Nazario автор

        🙂 Главное чтоб все у вас получилось.

        Ответить