OpenVPN#

Описание#

OpenVPN — реализация технологии виртуальной частной сети, которая имеет открытый исходный код с целью формирования зашифрованных каналов по схеме «точка-точка» и «сервер-клиент» между различными компьютерными устройствами.

OpenVPN работает на большом количестве платформ: Windows, macOS, iOS, Android, Linux, FreeBSD, OpenBSD, NetBSD и даже Solaris.

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

Общие технические характеристики:

  • Для обеспечения безопасности управляющего канала и потока данных OpenVPN использует библиотеку OpenSSL. Для достижения более высокого уровня безопасности соединения OpenVPN может использовать шифры AES, Camellia, 3DES, CAST-128 или Blowfish.

  • Хотя OpenVPN не поддерживает L2TP, IPSec и PPTP, в нём используется собственный протокол на базе TLS и SSL.

  • OpenVPN позволяет усовершенствовать процедуру авторизации и аутентификации за счёт привлечения сторонних плагинов и скриптов.

  • Клиенты могут подключаться к серверам за пределами сервера OpenVPN, так как он поддерживает настройку частной подсети.

  • Чтобы защитить пользователей от переполнения буфера в реализациях TLS/SSL, DoS-атак, сканирования портов и наводнения портов, OpenVPN использует tls-auth для верификации подписи HMAC. Структура OpenVPN позволяет сбросить привилегии при необходимости, а также использовать изоляцию chroot для CRL.

  • OpenVPN работает в пространстве пользователя, а не ядра.

OpenVPN предлагает пользователю несколько видов аутентификации:

  • Предустановленный ключ — самый простой метод.

  • Аутентификация по сертификатам x.509 — наиболее гибкий в настройках метод.

  • С помощью логина и пароля — может использоваться без создания клиентского сертификата (серверный сертификат всё равно нужен).

Для передачи трафика внутри туннеля OpenVPN использует транспортные протоколы TCP и UDP. В общем случае предпочтительным является использование протокола UDP. Через туннель проходит трафик сетевого уровня и выше, если используется TUN-соединение. OpenVPN для клиента выступает протоколом канального или даже физического уровня, а это значит, что надежность передачи данных может обеспечиваться вышестоящими уровнями, если это необходимо. Именно поэтому протокол UDP по своей концепции наиболее близок к OpenVPN, так как он, как и протоколы канального и физического уровней, не обеспечивает надежности соединения, передавая эту задачу более высоким уровням. Если настроить OpenVPN туннель на работу по протоколу ТСР, сервер будет получать ТСР сегменты OpenVPN, которые содержат другие ТСР сегменты от клиента. В результате в цепи получается двойная проверка на целостность информации, что совершенно не имеет смысла, так как надежность не повышается, а скорости соединения снижается.

Настройка#

Пример настройки#

Пример настройки OpenVPN туннеля между двумя площадками.

Пример базовой конфигурацииПример базовой конфигурации

Режим site-to-site поддерживает режим аутентификации с использованием сертификатов x.509, но не требует его и также может работать с статическими ключами pre-shared-key (PSK), что во многих случаях проще. Настроим туннель OpenVPN между сайтами, используя 2048-битный PSK.

Сначала на локальном шлюзе генерирует ключ с помощью о generate openvpn key <имя_файла>. Это приведет к созданию ключа с указанным именем в директории /config/auth/. После генерации нужно будет скопировать этот ключ на удаленный маршрутизатор. В нашем примере мы использовали имя файла openvpn-1.key, на который будем ссылаться ниже.

  • Публичный IP-адрес локальной стороны VPN будет 198.51.100.10.

  • Публичный IP-адрес удаленной стороны VPN будет 203.0.113.11.

  • Туннель будет использовать 10.255.1.1 для локального IP-адреса и 10.255.1.2 для удаленного.

  • Локальный сайт будет иметь подсеть 10.0.0.0/16.

  • Удаленный сайт будет иметь подсеть 10.1.0.0/16.

  • Статическая маршрутизация или другие протоколы динамической маршрутизации могут быть использованы через интерфейс vtun.

  • OpenVPN позволяет использовать TCP или UDP. UDP обеспечивает наименьшую задержку, в то время как TCP лучше работает для соединений с потерями; в целом UDP предпочтительнее, когда это возможно.

  • Официальный порт для OpenVPN - 1194, который мы оставляем для клиентских VPN; мы будем использовать 1195 для VPN между сайтами.

  • Директива persistent-tunnel позволит нам настраивать атрибуты, связанные с туннелем, такие как политика межсетевого экрана, как это делается на любом обычном сетевом интерфейсе.

  • Если IP-адрес удаленного маршрутизатора известен, его можно настроить с помощью директивы remote-host; если неизвестен, ее можно опустить. Мы будем использовать динамический IP для нашего удаленного маршрутизатора.

Конфигурация локального маршрутизатора#

set interfaces openvpn vtun1 mode site-to-site
set interfaces openvpn vtun1 protocol udp
set interfaces openvpn vtun1 persistent-tunnel
set interfaces openvpn vtun1 remote-host '203.0.113.11'
set interfaces openvpn vtun1 local-port '1195'
set interfaces openvpn vtun1 remote-port '1195'
set interfaces openvpn vtun1 shared-secret-key-file '/config/auth/openvpn-1.key'
set interfaces openvpn vtun1 local-address '10.255.1.1'
set interfaces openvpn vtun1 remote-address '10.255.1.2'

Конфигурация удаленного маршрутизатора#

set interfaces openvpn vtun1 mode site-to-site
set interfaces openvpn vtun1 protocol udp
set interfaces openvpn vtun1 persistent-tunnel
set interfaces openvpn vtun1 remote-host '198.51.100.10'
set interfaces openvpn vtun1 local-port '1195'
set interfaces openvpn vtun1 remote-port '1195'
set interfaces openvpn vtun1 shared-secret-key-file '/config/auth/openvpn-1.key'
set interfaces openvpn vtun1 local-address '10.255.1.2'
set interfaces openvpn vtun1 remote-address '10.255.1.1'

Конфигурация межсетевого экрана#

Необходимо создать исключение в межсетевом экране, чтобы разрешить прохождение трафика OpenVPN через WAN-интерфейс.

set firewall name OUTSIDE_LOCAL rule 10 action accept
set firewall name OUTSIDE_LOCAL rule 10 description 'Allow established/related'
set firewall name OUTSIDE_LOCAL rule 10 state established enable
set firewall name OUTSIDE_LOCAL rule 10 state related enable
set firewall name OUTSIDE_LOCAL rule 20 action accept
set firewall name OUTSIDE_LOCAL rule 20 description OpenVPN_IN
set firewall name OUTSIDE_LOCAL rule 20 destination port 1195
set firewall name OUTSIDE_LOCAL rule 20 log enable
set firewall name OUTSIDE_LOCAL rule 20 protocol udp
set firewall name OUTSIDE_LOCAL rule 20 source

Также необходимо убедиться, что группа правил межсетевого экрана OUTISDE_LOCAL применяется к интерфейсу WAN и направлению (локальный).

set interfaces ethernet eth0 firewall local name 'OUTSIDE-LOCAL'

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

Статические маршруты могут быть настроены с учетом интерфейса туннеля. Локальный маршрутизатор будет использовать сеть 10.0.0.0/16, а удаленный - 10.1.0.0/16:

локальный маршрутизатор:

set protocols static interface-route 10.1.0.0/16 next-hop-interface vtun1

Удаленный маршрутизатор:

set protocols static interface-route 10.0.0.0/16 next-hop-interface vtun1

В приведенных выше конфигурациях по умолчанию используется 256-битный AES в режиме GCM для шифрования (если обе стороны поддерживают NCP) и SHA-1 для аутентификации HMAC. SHA-1 считается слабым, но доступны и другие алгоритмы хэширования, а также алгоритмы шифрования:

Для шифрования:

admin@fakel# set int open vtun0 encryption ncp-ciphers
Possible completions:
  des          DES algorithm
  3des         DES algorithm with triple encryption
  aes128       AES algorithm with 128-bit key CBC
  aes128gcm    AES algorithm with 128-bit key GCM
  aes192       AES algorithm with 192-bit key CBC
  aes192gcm    AES algorithm with 192-bit key GCM
  aes256       AES algorithm with 256-bit key CBC
  aes256gcm    AES algorithm with 256-bit key GCM

Для хэширования:

admin@fakel# set interfaces openvpn vtun1 hash
Possible completions:
  md5          MD5 algorithm
  sha1         SHA-1 algorithm
  sha256       SHA-256 algorithm
  sha512       SHA-512 algorithm

Если вы измените стандартные алгоритмы шифрования и хэширования, убедитесь, что на локальном и удаленном концах установлены одинаковые конфигурации, иначе туннель не заработает.

Политика межсетевого экрана также может быть применена к интерфейсу туннеля для локального, входящего и исходящего направлений и функционирует идентично интерфейсам ethernet.

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

Статус OpenVPN можно проверить с помощью команды show openvpn operational. Полный список опций см. во встроенной справке.

Сервер OpenVPN#

Многоклиентский сервер - самый популярный режим OpenVPN на маршрутизаторах. Он всегда использует аутентификацию x.509 и поэтому требует настройки PKI. Обратитесь к разделу Генерация сертификатов и ключей X.509, чтобы сгенерировать сертификат ЦС, сертификат и ключ сервера, список отзыва сертификатов, файл параметров обмена ключами Диффи-Хеллмана. Для настройки сервера клиентские сертификаты и ключи не нужны.

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

Предположим, вы хотите использовать сеть 10.23.1.0/24 для конечных точек клиентского туннеля, а все клиентские подсети принадлежат 10.23.0.0/20. Всем клиентам необходим доступ к сети 192.168.0.0/16.

Сначала нам нужно указать основные настройки. По умолчанию используется протокол 1194/UDP. Рекомендуется использовать опцию persistent-tunnel, она предотвращает закрытие TUN/TAP-устройства при сбросе соединения или перезагрузке демона.

Примечание

Использование openvpn-опции -reneg-sec может быть сложным. Эта опция используется для пересогласования канала передачи данных через <n> секунд. При использовании как на сервере, так и на клиенте, меньшее значение будет инициировать пересогласование. Если вы установите значение 0 на одной стороне соединения (чтобы отключить его), выбранное значение на другой стороне будет определять, когда произойдет пересогласование.

set interfaces openvpn vtun10 mode server
set interfaces openvpn vtun10 local-port 1194
set interfaces openvpn vtun10 persistent-tunnel
set interfaces openvpn vtun10 protocol udp

Затем нам нужно указать местоположение криптографических материалов. В примере будем использовать /config/auth/openvpn.

set interfaces openvpn vtun10 tls ca-cert-file /config/auth/openvpn/ca.crt
set interfaces openvpn vtun10 tls cert-file /config/auth/openvpn/server.crt
set interfaces openvpn vtun10 tls key-file /config/auth/openvpn/server.key
set interfaces openvpn vtun10 tls crl-file /config/auth/openvpn/crl.pem
set interfaces openvpn vtun10 tls dh-file /config/auth/openvpn/dh2048.pem

Теперь нам нужно указать сетевые настройки сервера. Во всех случаях нам нужно указать подсеть для конечных точек клиентского туннеля. Поскольку мы хотим, чтобы клиенты получали доступ к определенной сети за внешним маршрутизатором, мы будем использовать опцию push-route для установки этого маршрута на клиентах.

set interfaces openvpn vtun10 server push-route 192.168.0.0/16
set interfaces openvpn vtun10 server subnet 10.23.1.0/24

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

Примечание

Клиенты идентифицируются по полю CN в их сертификатах x.509, в данном примере CN - client0:

set interfaces openvpn vtun10 server client client0 ip 10.23.1.10
set interfaces openvpn vtun10 server client client0 subnet 10.23.2.0/25

OpenVPN не будет автоматически создавать маршруты в ядре для клиентских подсетей при подключении и будет использовать ассоциацию клиент-подсеть только внутри сети, поэтому нам нужно создать маршрут к сети 10.23.0.0/20 самостоятельно:


set protocols static interface-route 10.23.0.0/20 next-hop-interface vtun10

Генерация сертификата и ключей X.509#

OpenVPN поставляется с набором скриптов под названием Easy-RSA, которые могут генерировать соответствующие файлы, необходимые для настройки OpenVPN с использованием сертификатов X.509. Easy-RSA устанавливается по умолчанию.

Скопируйте скрипты Easy-RSA в новый каталог, чтобы изменить значения.

cp -r /usr/share/easy-rsa/ /config/my-easy-rsa-config
cd /config/my-easy-rsa-config

Чтобы обеспечить последовательное использование значений при генерации, задайте значения по умолчанию, которые будут использоваться скриптами генерации. Переименуйте имя файла vars.example в vars

mv vars.example vars

Ниже приведен экземпляр файла после редактирования. Вы также можете изменить другие значения в файле по своему усмотрению, хотя для большинства случаев значения по умолчанию ,должны быть в самый раз (не оставляйте ни один из этих параметров пустым).

set_var EASYRSA_DN      "ru"
set_var EASYRSA_REQ_COUNTRY     "RU"
set_var EASYRSA_REQ_PROVINCE    "Moscow"
set_var EASYRSA_REQ_CITY        "Moscow"
set_var EASYRSA_REQ_ORG "IT Route LLC"
set_var EASYRSA_REQ_EMAIL       "pki@it-route.ru"
set_var EASYRSA_REQ_OU          "VPN"
set_var EASYRSA_KEY_SIZE        2048

Опция init-pki создаст новый каталог или удалит все ранее созданные сертификаты, хранящиеся в этом каталоге. Термин «центральный» используется для обозначения сервера, а «филиал» - для клиента.

Примечание

Запомните «Ключевую фразу CA», введенную в команде build-ca,

поскольку она будет запрошена при подписании сертификата сервера/клиента.

admin@fakel:/config/my-easy-rsa-config$./easyrsa init-pki admin@fakel:/config/my-easy-rsa-config$./easyrsa build-ca admin@fakel:/config/my-easy-rsa-config$./easyrsa gen-req central nopass admin@fakel:/config/my-easy-rsa-config$./easyrsa sign-req server central admin@fakel:/config/my-easy-rsa-config$./easyrsa gen-dh admin@fakel:/config/my-easy-rsa-config$./easyrsa build-client-full branch1 nopass

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

admin@fakel:/config/my-easy-rsa-config$./easyrsa revoke client1
admin@fakel:/config/my-easy-rsa-config$ ./easyrsa gen-crl

Скопируйте файлы в /config/auth/openvpn/, чтобы использовать их при создании туннеля OpenVPN

admin@fakel:/config/my-easy-rsa-config$ sudo mkdir /config/auth/openvpn
admin@fakel:/config/my-easy-rsa-config$ sudo cp pki/ca.crt /config/auth/openvpn
admin@fakel:/config/my-easy-rsa-config$ sudo cp pki/dh.pem  /config/auth/openvpn
admin@fakel:/config/my-easy-rsa-config$ sudo cp pki/private/central.key /config/auth/openvpn
admin@fakel:/config/my-easy-rsa-config$ sudo cp pki/issued/central.crt  /config/auth/openvpn
admin@fakel:/config/my-easy-rsa-config$ sudo cp pki/crl.pem /config/auth/openvpn

Кроме того, каждому клиенту нужна копия ca.crt и собственные файлы клиентских ключей и сертификатов. Эти файлы являются открытым текстом, поэтому их можно скопировать либо вручную, либо с помощью инструмента удаленной передачи файлов, например scp. Какой бы метод вы ни использовали, файлы должны оказаться в нужном месте на каждом маршрутизаторе. Например, на маршрутизаторе филиала 1 могут быть следующие файлы:

admin@fakel:$ ls /config/auth/openvpn
ca.crt branch1.crt branch1.key

Клиент OpenVPN#

ПО Факел может выступать не только в качестве сервера для нескольких клиентов. Вы также можете настроить любой интерфейс в качестве клиента OpenVPN, подключающегося к серверу OpenVPN или любому другому серверу OpenVPN.

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

Сервер OpenVPN#

set interfaces openvpn vtun10 encryption cipher 'aes256'
set interfaces openvpn vtun10 hash 'sha512'
set interfaces openvpn vtun10 local-host '10.11.2.1'
set interfaces openvpn vtun10 local-port '1194'
set interfaces openvpn vtun10 mode 'server'
set interfaces openvpn vtun10 persistent-tunnel
set interfaces openvpn vtun10 protocol 'udp'
set interfaces openvpn vtun10 server client client1 ip '10.10.0.10'
set interfaces openvpn vtun10 server domain-name 'example.org'
set interfaces openvpn vtun10 server max-connections '250'
set interfaces openvpn vtun10 server name-server '172.16.254.30'
set interfaces openvpn vtun10 server subnet '10.10.0.0/24'
set interfaces openvpn vtun10 server topology 'subnet'
set interfaces openvpn vtun10 tls ca-cert-file '/config/auth/ca.crt'
set interfaces openvpn vtun10 tls cert-file '/config/auth/server.crt'
set interfaces openvpn vtun10 tls dh-file '/config/auth/dh.pem'
set interfaces openvpn vtun10 tls key-file '/config/auth/server.key'
set interfaces openvpn vtun10 use-lzo-compression

Клиент OpenVPN#

set interfaces openvpn vtun10 encryption cipher 'aes256'
set interfaces openvpn vtun10 hash 'sha512'
set interfaces openvpn vtun10 mode 'client'
set interfaces openvpn vtun10 persistent-tunnel
set interfaces openvpn vtun10 protocol 'udp'
set interfaces openvpn vtun10 remote-host '10.11.2.1'
set interfaces openvpn vtun10 remote-port '1194'
set interfaces openvpn vtun10 tls ca-cert-file '/config/auth/ca.crt'
set interfaces openvpn vtun10 tls cert-file '/config/auth/client1.crt'
set interfaces openvpn vtun10 tls key-file '/config/auth/client1.key'
set interfaces openvpn vtun10 use-lzo-compression