OpenVPN

Обновлено 7 февраля 2023

OpenVPN

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

Важно

Обратите внимание, что для правильной работы время на всех машинах должно совпадать.

Генерация PKI-сертификатов для OpenVPN

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

Установите пакет для работы с сертификатами:

emerge easy-rsa

После установки будет создана директория /usr/share/easy-rsa. В этой директории вы найдёте скрипт easyrsa для работы с сертификатами. В ней же будут создаваться ключи и сертификаты. Перенесите её в /var/calculate/easy-rsa и для продолжения работы перейдите в эту директорию:

cp -a /usr/share/easy-rsa /var/calculate

cd /var/calculate/easy-rsa

Обзор

tree

.
├── easyrsa
├── openssl-1.0.cnf
├── vars.example
└── x509-types
    ├── ca
    ├── client
    ├── COMMON
    └── server

1 directory, 7 files

Выполните настройки сертификата. Для этого скопируйте файл с примером:

cp vars.example vars

По желанию отредактируйте исходные данные:

vars

set_var EASYRSA_REQ_COUNTRY     "RU"
set_var EASYRSA_REQ_CITY        "Saint-Petersburg"
set_var EASYRSA_REQ_ORG         "My Company"
set_var EASYRSA_REQ_EMAIL       "my@domain.org"
...

Создайте структуру директорий для сертификатов:

./easyrsa init-pki
Note: using Easy-RSA configuration from: ./vars

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

После выполнения будет создана директория /var/calculate/easy-rsa/pki, в которой будут создаваться ключи и сертификаты.

Обзор

tree

.
├── easyrsa
├── openssl-1.0.cnf
├── pki
│   ├── private
│   └── reqs
├── vars
├── vars.example
└── x509-types
    ├── ca
    ├── client
    ├── COMMON
    └── server

4 directories, 8 files

Корневой сертификат

Создайте корневой сертификат. Понадобится дважды ввести придуманный пароль, а также указать его название:

./easyrsa build-ca
Note: using Easy-RSA configuration from: /var/calculate/easy-rsa/vars
Generating a 2048 bit RSA private key
....................................................+++
......................................................................................................+++
writing new private key to '/var/calculate/easy-rsa/pki/private/ca.key.w3cG6vF0cv'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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]:domain.org

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

Вместо domain.org придумайте свое имя сертификата или укажите свой домен.

Обзор

tree pki

pki
├── ca.crt
├── certs_by_serial
├── index.txt
├── issued
├── private
│   └── ca.key
├── reqs
└── serial

4 directories, 4 files

Были созданы:

  • ./pki/ca.crt - сертификат корневого удостоверяющего центра
  • ./pki/private/ca.key - закрытый ключ корневого удостоверяющего центра (самый важный файл)

Сертификат сервера

Создайте сертификат для OpenVPN-сервера. Для этого выполните:

./easyrsa build-server-full server nopass
Note: using Easy-RSA configuration from: ./vars
Generating a 2048 bit RSA private key
.......+++
.......................+++
writing new private key to '/var/calculate/easy-rsa/pki/private/server.key.mfeee1imNK'
-----
Using configuration from /var/calculate/easy-rsa/openssl-1.0.cnf
Enter pass phrase for /var/calculate/easy-rsa/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server'
Certificate is to be certified until Feb 20 20:00:53 2028 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

Понадобится ввести придуманный вами пароль корневого сертификата. Вместо server укажите свое название сертификата сервера. По умолчанию сертификат создаётся на 10 лет.

После выполнения скрипта были созданы следующие файлы:

  • ./pki/issued/server.crt - сертификат сервера
  • ./pki/private/server.key - приватный ключ сервера

Сертификат клиента

По аналогии с сертификатом OpenVPN сервера создайте сертификат для клиента. Для этого выполните:

./easyrsa build-client-full client nopass
Note: using Easy-RSA configuration from: ./vars
Generating a 2048 bit RSA private key
..................................................+++
................................................................................+++
writing new private key to '/var/calculate/easy-rsa/pki/private/client.key.qfTovtcVDo'
-----
Using configuration from /var/calculate/easy-rsa/openssl-1.0.cnf
Enter pass phrase for /var/calculate/easy-rsa/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'client'
Certificate is to be certified until Feb 20 20:34:40 2028 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

Понадобится ввести придуманный вами пароль корневого сертификата. Вместо client укажите свое название сертификата клиента. По умолчанию сертификат также создаётся на 10 лет.

После выполнения скрипта были созданы следующие файлы:

  • ./pki/issued/client.crt - сертификат клиента
  • ./pki/private/client.key - приватный ключ клиента

Ключ Диффи-Хеллмана

Для создания ключа Диффи-Хеллмана выполните:

./easyrsa gen-dh
Note: using Easy-RSA configuration from: ./vars
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 /var/calculate/easy-rsa/pki/dh.pem

После выполнения скрипта будет создан файл с ключом ./pki/dh.pem.

Дополнительный ключ защиты

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

openvpn --genkey --secret pki/ta.key

После выполнения будет создан файл с ключом ./pki/ta.key.

Настройка сервера

Установка

Для установки OpenVPN-сервера выполните:

emerge openvpn

Подготовка ключей и сертификатов

Создайте директорию сертификатов:

mkdir /etc/openvpn/keys

Скопируйте созданные ранее PKI-ключи и сертификаты. Если сервер OpenVPN находится на той же машине, где создавались ключи, выполните:

cp /var/calculate/easy-rsa/pki/ca.crt /etc/openvpn/keys/

cp /var/calculate/easy-rsa/pki/dh.pem /etc/openvpn/keys/

cp /var/calculate/easy-rsa/pki/issued/server.crt /etc/openvpn/keys/

cp /var/calculate/easy-rsa/pki/private/server.key /etc/openvpn/keys/

cp /var/calculate/easy-rsa/pki/ta.key /etc/openvpn/keys/

Настройка сервера

Отредактируйте файл настроек OpenVPN-сервера следующим образом:

/etc/openvpn/openvpn.conf

# порт, протокол, устройство, метод сжатия
port 1194
proto udp
dev tun
allow-compression no
# ключи и сертификаты
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh.pem
tls-auth keys/ta.key 0
# диапазон выделяемых IP, маршрут по умолчанию, DNS
server 192.168.10.0 255.255.255.0
# топология сети
topology subnet
push "redirect-gateway def1"
push "dhcp-option DNS 8.8.8.8"
# перезапуск туннеля при необходимости
keepalive 10 120
# права демона openvpn
user openvpn
group openvpn
# оставлять без изменений устройство и файлы ключей при перезапуске туннеля
persist-tun
persist-key
# информация о текущих соединениях
status /var/log/openvpn-status.log

При использовании redirect-gateway OpenVPN-клиенты будут направлять DNS-запросы через VPN, а VPN-сервер должны уметь обрабатывать их. Это может быть достигнуто путем передачи подключающимся клиентам адреса DNS-сервера, который заменит их обычные настройки для DNS-сервера, пока VPN будет оставаться активным. В примере конфигурационного файла за это отвечает push "dhcp-option DNS 8.8.8.8", где адрес 8.8.8.8 - DNS Google.

Важно

Многие подсоединенные к Интернет машины с OpenVPN-клиентом будут периодически взаимодействовать с сервером DHCP, чтобы возобновить аренду своих IP-адресов. Опция redirect-gateway может мешать клиенту связаться с локальным DHCP-сервером (потому что DHCP-сообщения будут направляться через VPN), приводя к потере аренды IP-адреса.

Запустите сервер и добавьте в автозапуск:

/etc/init.d/openvpn start

rc-update add openvpn

Настройка маршрутизации

Разрешите пересылку пакетов между сетевыми интерфейсами:

/etc/sysctl.conf

net.ipv4.ip_forward = 1

Для принятия изменений выполните:

sysctl -p /etc/sysctl.conf

Передача клиенту опции redirect-gateway заставит весь IP-трафик, порождаемый на клиентской машине, пройти через сервер OpenVPN. Сервер должен быть настроен на обработку этого трафика - например, путем отправки в Интернет через NAT. Чтобы направить трафик клиента в Интернет через NAT, выполните:

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE

Вместо eth0 укажите локальный сетевой интерфейс сервера.

Сохраните правила маршрутизации и добавьте их в автозапуск:

/etc/init.d/iptables save

rc-update add iptables

Настройка клиента

Установка

Для установки OpenVPN-клиента выполните:

emerge openvpn

Подготовка ключей и сертификатов

Создайте директорию сертификатов:

mkdir /etc/openvpn/keys

Скопируйте созданные ранее PKI-ключи и сертификаты. Если клиент OpenVPN находится на той же машине, где создавались ключи, выполните:

cp /var/calculate/easy-rsa/pki/ca.crt /etc/openvpn/keys/

cp /var/calculate/easy-rsa/pki/issued/client.crt /etc/openvpn/keys/

cp /var/calculate/easy-rsa/pki/private/client.key /etc/openvpn/keys/

cp /var/calculate/easy-rsa/pki/ta.key /etc/openvpn/keys/

Настройка клиента

Отредактируйте файл настроек OpenVPN-клиента следующим образом:

/etc/openvpn/openvpn.conf

client
# протокол, устройство, метод сжатия
proto udp
dev tun
allow-compression no
# удалённый сервер, порт
remote vpn.domain.org 1194
# оставлять без изменений устройство и файлы ключей при перезапуске туннеля
persist-tun
persist-key
remote-cert-tls server
# ключи и сертификаты
ca keys/ca.crt
cert keys/client.crt
key keys/client.key
tls-auth keys/ta.key 1
# лог
status /var/log/openvpn-status.log

Вместо vpn.domain.org впишите сетевое имя вашего VPN-сервера.

Настройка клиента по OVPN-профилю

Подготовка файла профиля

Для подключения некоторых openvpn клиентов может происходить только через профиль настроек. Так даже лучше: вам не нужно куда-то вводить или каким-то образом передавать сертификаты и ключи. Просто создайте ovpn-файл с профилем настроек.

Файл имеет следующую структуру: сначала описываются настройки openvpn-клиента, затем, с выделением тегами, копируются корневой сертификат, ключ защиты, сертификат клиента и ключ клиента. Сделать это можно при помощи следующих действий. Прежде всего создайте файл со следующим содержимым:

client.ovpn

client
proto udp
dev tun
allow-compression no
remote vpn.domain.org 1194
persist-tun
persist-key
key-direction 1
remote-cert-tls server

Вместо vpn.domain.org впишите сетевое имя вашего VPN-сервера или его IP-адрес.

После этого перенесите необходимые ключи и сертификаты в файл профиля, поместив их в теги:

echo '<ca>' >> client.ovpn
cat /var/calculate/easy-rsa/pki/ca.crt >> client.ovpn
echo '</ca>' >> client.ovpn
echo '<cert>' >> client.ovpn
cat /var/calculate/easy-rsa/pki/issued/client.crt >> client.ovpn
echo '</cert>' >> client.ovpn
echo '<key>' >> client.ovpn
cat /var/calculate/easy-rsa/pki/private/client.key >> client.ovpn
echo '</key>' >> client.ovpn
echo '<tls-auth>' >> client.ovpn
cat /var/calculate/easy-rsa/pki/ta.key >> client.ovpn
echo '</tls-auth>' >> client.ovpn

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

Существуют различные клиенты OpenVPN для Android. Самые распространённые - OpenVPN for Android, OpenVPN Connect и OpenVPN Settings. Последний требует root-права доступа.

Для подключения мобильного клиента под Android загрузите файл с профилем на телефон - например, используя Google Drive. После этого откройте openvpn-приложение и выберите OVPN Profile:

OpenVPN Connect