OpenVPN
Обновлено 7 февраля 2023
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" ...
Создайте структуру директорий для сертификатов:
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
Корневой сертификат
Создайте корневой сертификат. Понадобится дважды ввести придуманный пароль, а также указать его название:
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-сервера. Для этого выполните:
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 сервера создайте сертификат для клиента. Для этого выполните:
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 - приватный ключ клиента
Ключ Диффи-Хеллмана
Для создания ключа Диффи-Хеллмана выполните:
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: