Установка OpenVPN на Ubuntu 18.04 LTS. Часть 1 из 12

27.06.2020

Теги: LinuxSSLUbuntuVPNКлиентКлючКонфигурацияНастройкаСерверУстановка

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

OpenVPN использует сертификаты TLS/SSL для шифрования трафика между сервером и клиентами. Принцип работы TLS/SSL — сначала рукопожатие, потом передача данных. Во время рукопожатия клиент и сервер используют шифрование открытым ключом для того, чтобы определить параметры секретного ключа, используемого клиентом и сервером для шифрования во время передачи данных.

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

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

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

Рукопожатие завершается отправкой finished-сообщений, как только обе стороны готовы начать использование секретного ключа. Начинается передача данных — все сообщения между клиентом и сервером шифруются, каждый пакет имеет подпись HMAC для проверки целостности.

Нам нужно будет решить следующие задачи:

  • Создать центр сертификации
  • Установить пакет OpenVPN на сервер
  • Создать ключи и сертификаты для сервера
  • Скопировать ключи и сертификаты на сервер
  • Создать файл конфигурации для сервера
  • Установить пакет OpenVPN на клиент
  • Создать ключи и сертификаты для клиента
  • Скопировать ключи и сертификаты на клиент
  • Создать файл конфигурации для клиента

Устанавка OpenVPN сервера

OpenVPN доступен в репозиториях Ubuntu по умолчанию, поэтому используем apt для установки:

$ sudo apt install openvpn

Подготовка к работе с сертификатами

OpenVPN использует сертификаты TLS/SSL для шифрования трафика между сервером и клиентами. Для выпуска доверенных сертификатов необходимо создать собственный центр сертификации (CA). Мы загрузим последнюю версию EasyRSA из официального репозитория и создадим инфраструктуру открытых ключей (подробнее здесь).

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

$ cd ~
$ mkdir easy-rsa
$ wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.7/EasyRSA-3.0.7.tgz
$ tar xvf EasyRSA-3.0.7.tgz
$ cp -r EasyRSA-3.0.7/* easy-rsa/
В OpenVPN открытый ключ называется сертификатом и имеет расширение crt, а закрытый ключ так и называется ключом и имеет расширение key.

Создание центра сертификации

Создаем копию файла vars.example — это пример конфигурации. Изменим в нем несколько параметров:

$ cd ~/easy-rsa/
$ cp vars.example vars
$ nano vars
set_var EASYRSA_DN              "org"

set_var EASYRSA_REQ_COUNTRY     "RU"
set_var EASYRSA_REQ_PROVINCE    "Moscow"
set_var EASYRSA_REQ_CITY        "Moscow"
set_var EASYRSA_REQ_ORG         "Some Company"
set_var EASYRSA_REQ_EMAIL       "support@some-company.com"
set_var EASYRSA_REQ_OU          "IT department"

В каталоге ~/easy-rsa/ есть скрипт easyrsa, который предназначен для выполнения разнообразных задач, связанных с построением центра сертификации. Запускаем этот скрипт с опцией init-pki для инициализации инфраструктуры:

$ ./easyrsa init-pki
Note: using Easy-RSA configuration from: /home/evgeniy/easy-rsa/vars

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/evgeniy/easy-rsa/pki

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

$ ./easyrsa build-ca nopass

Note: using Easy-RSA configuration from: /home/evgeniy/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.1  11 Sep 2018
Generating RSA private key, 2048 bit long modulus (2 primes)
......................+++++
.................+++++
e is 65537 (0x010001)
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.
-----
Country Name (2 letter code) [RU]: Enter
State or Province Name (full name) [Moscow]: Enter
Locality Name (eg, city) [Moscow]: Enter
Organization Name (eg, company) [Some Company]: Enter
Organizational Unit Name (eg, section) [IT department]: Enter
Common Name (eg: your user, host, or server name) [Easy-RSA CA]: Some Company Auth Center
Email Address [support@some-company.com]: Enter

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/evgeniy/easy-rsa/pki/ca.crt

Нужно указать семь значений для нового сертификата; для шести из них будет предложено значение по умолчанию. Остается придумать универсальное имя — пусть это будет Some Company Auth Center. Корневой сертификат — это файл pki/ca.crt, а секретный ключ — это файл pki/private/ca.key.

Создание ключей сервера

Теперь нужно создать файл закрытого ключа vpn-server.key и файл открытого ключа (сертификат) vpn-server.crt. Также нужно создать дополнительные файлы, которые будут использоваться в процессе шифрования. Все эти файлы + файл корневого сертификата нужно скопировать в директорию /etc/openvpn/keys/ и прописать пути к ним файле конфигурации OpenVPN-сервера.

Создаем закрытый и открытый ключ для vpn-сервера:

$ ./easyrsa gen-req vpn-server nopass

Note: using Easy-RSA configuration from: /home/evgeniy/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.1  11 Sep 2018
Generating a RSA private key
......................+++++
.................+++++
writing new private key to '/home/evgeniy/easy-rsa/pki/easy-rsa-10544.uHxfDZ/tmp.YE17mI'
-----
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.
-----
Country Name (2 letter code) [RU]: Enter
State or Province Name (full name) [Moscow]: Enter
Locality Name (eg, city) [Moscow]: Enter
Organization Name (eg, company) [Some Company]: Enter
Organizational Unit Name (eg, section) [IT department]:
Common Name (eg: your user, host, or server name) [vpn-server]: Some Company VPN Server
Email Address [support@some-company.com]: Enter

Keypair and certificate request completed. Your files are:
req: /home/evgeniy/easy-rsa/pki/reqs/vpn-server.req
key: /home/evgeniy/easy-rsa/pki/private/vpn-server.key

Здесь мы опять используем все значения по умолчанию, а задаем только универсальное имя — Some Company VPN Server.

При создании закрытого ключа формируется запрос на подпись сертификата — в нашем случае это файл pki/reqs/vpn-server.req. Если бы мы все делали по правилам и центр сертификации был бы на отдельном сервере, нужно было бы передать файл файл vpn-server.req в центр сертификации и выпустить на его основе сертификат. Но в нашем случае все проще, запрос на сертификат уже в центре сертификации и нужно только выпустить (подписать) этот сертфикат.
$ ./easyrsa sign-req server vpn-server

Note: using Easy-RSA configuration from: /home/evgeniy/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.1  11 Sep 2018

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=
    countryName               = RU
    stateOrProvinceName       = Moscow
    localityName              = Moscow
    organizationName          = Some Company
    organizationalUnitName    = IT department
    commonName                = Some Company VPN Server
    emailAddress              = support@some-company.com


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /home/evgeniy/easy-rsa/pki/easy-rsa-10627.5dAbLQ/tmp.k1LXfe
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :ASN.1 12:'Moscow'
localityName          :ASN.1 12:'Moscow'
organizationName      :ASN.1 12:'Some Company'
organizationalUnitName:ASN.1 12:'IT department'
commonName            :ASN.1 12:'Some Company VPN Server'
emailAddress          :IA5STRING:'support@some-company.com'
Certificate is to be certified until Oct  1 07:24:53 2022 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /home/evgeniy/easy-rsa/pki/issued/vpn-server.crt

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

$ ./easyrsa gen-dh

Note: using Easy-RSA configuration from: /home/evgeniy/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.1  11 Sep 2018
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 /home/evgeniy/easy-rsa/pki/dh.pem

Это может занять несколько минут. Для обеспечения дополнительного уровня аутентификации, создаем ключ TLS:

$ openvpn --genkey --secret ta.key

Теперь копируем ключи и сертификаты в директорию /etc/openvpn/keys/:

$ sudo cp /home/evgeniy/easy-rsa/pki/ca.crt /etc/openvpn/keys/ # корневой сертификат
$ sudo cp /home/evgeniy/easy-rsa/pki/private/vpn-server.key /etc/openvpn/keys/ # закрытый ключ сервера
$ sudo cp /home/evgeniy/easy-rsa/pki/issued/vpn-server.crt /etc/openvpn/keys/ # открытый ключ сервера
$ sudo cp /home/evgeniy/easy-rsa/pki/dh.pem /etc/openvpn/keys/ # ключ Диффи-Хеллмана
$ sudo cp /home/evgeniy/easy-rsa/ta.key /etc/openvpn/keys/ # ключ Transport Layer Security

Создание ключей клиента

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

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

Создаем закрытый ключ и запрос на подпись сертификата для пользователя Сергей Иванов:

$ ./easyrsa gen-req sergey-ivanov nopass

Note: using Easy-RSA configuration from: /home/evgeniy/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.1  11 Sep 2018
Generating a RSA private key
......................+++++
.................+++++
writing new private key to '/home/evgeniy/easy-rsa/pki/easy-rsa-10968.4LofZS/tmp.z3a18Q'
-----
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.
-----
Country Name (2 letter code) [RU]: Enter
State or Province Name (full name) [Moscow]: Enter
Locality Name (eg, city) [Moscow]: Enter
Organization Name (eg, company) [Some Company]: Enter
Organizational Unit Name (eg, section) [IT department]: Marketing department
Common Name (eg: your user, host, or server name) [sergey-ivanov]: Enter
Email Address [support@some-company.com]: ivanov.sergey@some-company.com

Keypair and certificate request completed. Your files are:
req: /home/evgeniy/easy-rsa/pki/reqs/sergey-ivanov.req
key: /home/evgeniy/easy-rsa/pki/private/sergey-ivanov.key
Обратите внимание, что в качестве Common Name мы используем предложенное значение sergey-ivanov. Для клиента лучше использовать именно такие имена, потому что может потребоваться использовать директиву файла конфигурации client-config-dir. В этом случае Common Name будет использовано в качестве имени файла — а на имена файлов налагаются некоторые ограничения.

Подписываем сертификат для пользователя Сергея Иванова:

$ ./easyrsa sign-req client sergey-ivanov

Note: using Easy-RSA configuration from: /home/evgeniy/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.1  11 Sep 2018

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=
    countryName               = RU
    stateOrProvinceName       = Moscow
    localityName              = Moscow
    organizationName          = Some Company
    organizationalUnitName    = Marketing department
    commonName                = sergey-ivanov
    emailAddress              = ivanov.sergey@some-company.com


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /home/evgeniy/easy-rsa/pki/easy-rsa-11053.CzXFHp/tmp.rmFnU9
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :ASN.1 12:'Moscow'
localityName          :ASN.1 12:'Moscow'
organizationName      :ASN.1 12:'Some Company'
organizationalUnitName:ASN.1 12:'Marketing department'
commonName            :ASN.1 12:'sergey-ivanov'
emailAddress          :IA5STRING:'ivanov.sergey@some-company.com'
Certificate is to be certified until Oct  1 07:42:36 2022 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /home/evgeniy/easy-rsa/pki/issued/sergey-ivanov.crt

Нам надо скопировать на компьютер Иванова следующие файлы:

  • корневой сертификат /home/evgeniy/easy-rsa/pki/ca.crt
  • закрытый ключ клиента /home/evgeniy/easy-rsa/pki/private/sergey-ivanov.key
  • открытый ключ клиента /home/evgeniy/easy-rsa/pki/issued/sergey-ivanov.crt
  • ключ Transport Layer Security /home/evgeniy/easy-rsa/ta.key

Но сейчас копировать не будем, а вернемся к этому, когда будем настраивать клиента.

Поиск: Linux • SSL • Ubuntu • VPN • Клиент • Ключ • Конфигурация • Настройка • Сервер • Сертификат • EasyRSA • Установка • Локальная сеть

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.