Установка OpenVPN на Ubuntu 18.04 LTS. Часть 1 из 12
27.06.2020
Теги: Linux • SSL • Ubuntu • VPN • Клиент • Ключ • Конфигурация • Настройка • Сервер • Установка
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/
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 и уже есть центр серификации. Будет неправильно, если для каждого клиента на его компьютере мы будем создавать центр сертификации только для того, чтобы сгенерировать закрытый ключ.
Создаем закрытый ключ и запрос на подпись сертификата для пользователя Сергей Иванов:
$ ./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
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
Но сейчас копировать не будем, а вернемся к этому, когда будем настраивать клиента.
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 12 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 11 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 10 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 9 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 8 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 7 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 6 из 12
Поиск: Linux • SSL • Ubuntu • VPN • Клиент • Ключ • Конфигурация • Настройка • Сервер • Сертификат • EasyRSA • Установка • Локальная сеть