Когда у нас появились сотрудники, работающие удаленно, пришлось думать над тем, как обеспечить им защищенный доступ к нашим хостинговым серверам, виртуальным выделенным серверам разработчиков Virtual Dedicated Server (VDS), сайтам обеспечения и сопровождения разработки и к другим ресурсам.
По соображениям безопасности доступ к этим ресурсам ограничен при помощи межсетевого экрана (файервола) по портам и адресам IP. Ежедневную перенастройку доступа при изменении динамических IP сотрудников едва ли можно назвать разумным решением.
Выход нашелся довольно быстро — это использование технологии виртуальных частных сетей Virtual Private Network (VPN) и ее свободной реализации OpenVPN. Эта реализация доступна практически для всех распространенных платформ, в том числе для планшетов и смартфонов. История развития OpenVPN насчитывает уже 12 лет (компания OpenVPN Technologies, Inc. была создана Francis Dinha и James Yona в 2002 году), так что это надежное и проверенное временем решение.
В нашей компании сеть VPN позволила предоставить защищенный доступ сотрудников к VDS, играющей роль сервера OpenVPN. И уже для фиксированного IP этого сервера был разрешен доступ к другим ресурсам компании. Попутно на сервере OpenVPN был установлен прокси Squid, что решило все проблемы доступа сотрудников с динамическими IP к защищенным ресурсам компании.
Теме OpenVPN посвящены многочисленные статьи и сообщения на форумах. Тем не менее, нужную информацию мне пришлось собирать по частям из разных мест. Попутно приходилось разбираться с многочисленными терминами и технологиями. В качестве серверов OpenVPN были использованы VDS на базе FreeBSD и Debian Linux, в качестве клиентов — рабочие станции FreeBSD, Debian Linux, Ubuntu и Microsoft Windows.
Надеюсь, что эта статья будет полезна тем, кто впервые столкнулся с необходимостью создания сети VPN или уже использует ее для решения тех или задач, а также тем, кто ищет замену коммерческим реализациям VPN.
С благодарностью приму замечания и предложения по содержимому статьи.
Оглавление
- Немного теории
- Компоненты сети OpenVPN
- Готовим оборудование для установки OpenVPN
- Создание удостоверяющего центра CA
- Установка утилиты Easy-RSA
- Создание сервера OpenVPN
- Установка и запуск ПО клиента OpenVPN
- Установка прокси-сервера Squid
- Особенности установки на FreeBSD
- Особенности установки клиента OpenVPN в Microsoft Windows
- Полезные ссылки
Немного теории
Если раньше для создания безопасного канала передачи данных крупным компаниям и организациям приходилось прокладывать (либо арендовать) кабели и защищать их от физического доступа злоумышленников, то теперь в этом нет необходимости. С помощью VPN можно создавать защищенные виртуальные каналы, работающие через безопасный «туннель» в Интернете. Такое решение может позволить себе любая, даже очень небольшая компания.
Конечно, если предъявляются повышенные требования к защите данных, необходимо применять сертифицированные средства и обращаться к специалистам. Однако уровень защиты, обеспечиваемый OpenVPN, позволяет использовать эту технологию для многих коммерческих приложений.
Почему сеть VPN называется виртуальной и частной?
Виртуальная она потому, что узлы сети объединяются не физическими линиями, а виртуальными соединениями, которые создаются программным обеспечением (ПО) VPN.
Сеть VPN частная, так как к ней могут подключаться только узлы компании, создавшей эту сеть, а не все желающие. На каждом узле сети VPN должно работать ПО VPN. Еще там должны находиться ключи и сертификаты, обеспечивающие узлам доступ к сети VPN и криптографическую защиту передаваемых данных.
Таким образом, сеть VPN может объединять ресурсы (серверы и рабочие станции) компании в единую безопасную виртуальную сеть, созданную на базе Интернета. И теперь сотрудники, работающие удаленно (из дома или из другой страны) будут находиться как бы в общей сети своей компании. Сеть VPN подходит и для консолидации территориально разделенных офисов компании.
Обмен данными по сети
ПО OpenVPN передает данные по сети с помощью протоколов UDP или TCP с применением драйвера TUN/TAP. Протокол UDP и драйвер TUN позволяет подключаться к серверу OpenVPN клиентам, расположенным за NAT.
Для OpenVPN можно выбрать произвольный порт, что позволяет преодолевать ограничения файервола, через который осуществляется доступ из локальной сети в Интернет (если такие ограничения установлены).
Безопасность и шифрование
Безопасность и шифрование в OpenVPN обеспечивается библиотекой OpenSSL и протоколом транспортного уровня Transport Layer Security (TLS). Вместо OpenSSL в новых версиях OpenVPN можно использовать библиотеку PolarSSL. Протокол TLS представляет собой усовершенствование протокола защищенной передачи данных уровня защищенных сокетов Secure Socket Layers (SSL).
В OpenSSL может использоваться симметричная и ассиметричная криптография.
В первом случае перед началом передачи данных на все узлы сети необходимо поместить одинаковый секретный ключ. При этом возникает проблема безопасной передачи этого ключа через небезопасный Интернет.
Во втором случае у каждого участника обмена данными есть два ключа — публичный (открытый) и приватный (секретный).
Публичный ключ используется для зашифрования данных, а приватный — для расшифрования. В основе шифрования лежит довольно сложная математика. Выбранный в SSL/TLS алгоритм зашифрования публичным ключом обеспечивает возможность расшифрования только с помощью приватного ключа.
Приватный ключ секретный, и должен оставаться в пределах узла, на котором он создан. Публичный ключ должен передаваться участникам обмена данными.
Для безопасной передачи данных необходимо идентифицировать стороны, принимающие участие в обмене данными. В противном случае можно стать жертвой так называемой «атаки посредника» (Man in the Middle, MITM). В ходе такой атаки злоумышленник подключается к каналу передачи данных и прослушивает его. Он также может вмешиваться, удалять или изменять данные.
Чтобы обеспечить аутентификацию (проверку подлинности пользователя) протокол TLS использует инфраструктуру публичных ключей (Public Key Infrastructure, PKI) и асимметричную криптографию.
Нужно осознавать, что расшифрование данных без наличия приватного ключа тоже возможно, например, методом последовательного перебора. Хотя такой метод и требует больших вычислительных ресурсов, это только вопрос времени, когда данные смогут быть расшифрованы.
Хотя размер ключа влияет на сложность расшифрования, никакой ключ не дает гарантии полной безопасности данных. Кроме того, существует возможность похищения уже расшифрованных данных и ключей за счет уязвимостей и закладок в операционной системе или прикладном ПО, а также в аппаратном обеспечении серверов и рабочих станций.
Шифрование данных увеличивает трафик и замедляет обмен данными. Чем больше длина ключа, применяемого для шифрования данных, тем труднее будет его подобрать, но и тем заметнее получится замедление обмена данными.
Сертификаты и удостоверяющий центр CA
Как мы уже сказали, при ассиметричной криптографии открытый ключ используется для зашифрования данных, а закрытый — для расшифрования. Чтобы избежать подделки открытого ключа, какая-то третья сторона должна его заверить. В результате этой процедуры создается так называемый сертификат открытого ключа.
Сертификат должна заверить организация, которой доверяют. Эта организация играет роль удостоверяющего центра (Certification authority, CA).
Если создается открытый ключ для публичного использования, в качестве удостоверяющего центра должна выступать коммерческая или государственная организация с неоспоримой репутацией. Эта организация публикует собственный открытый ключ, доступный всем.
Существует немало коммерческих организаций, выпускающих сертификаты, пригодные, например, для создания HTTPS-сайтов, для цифровой подписи сообщений электронной почты или документов, для систем мгновенного обмена сообщениями, такими как Jabber. Эти сертификаты выдаются на ограниченный срок и стоят денег.
Но для сети VPN, создаваемой для своей компании, вы можете самостоятельно создать свой удостоверяющий центр CA и выпускать так называемые самоподписанные сертификаты. Конечно, доверие к таким сертификатам не будет выходить за рамки вашей компании, но во-первых, этого будет вполне достаточно, а во-вторых, самоподписанные сертификаты совершенно бесплатны.
Самоподписанные сертификаты и будут играть роль публичных ключей, с помощью которых узлы вашей сети OpenVPN будут зашифровывать данные. Для расшифрования данных будут использованы приватные ключи.
Сертификаты создаются в соответствии со стандартом X.509. Этот стандарт определяет форматы данных и процедуры распределения открытых ключей с помощью сертификатов, снабженных электронными подписями.
Сертификат X.509 — это публичный ключ, содержащий такие данные, как субъект, владеющий сертификатом, имя узла, период действия, алгоритм и значение подписи сертификата, и т.д. Сертификат должен быть подписан приватным ключом удостоверяющего центра (Certification authority, CA).
Когда наш узел рабочей станции подключается к удаленному узлу (серверу) с использованием протокола TLS, сервер отправляет ему сертификат X.509. На нашем узле есть публичный ключ удостоверяющего центра CA, который подписал этот сертификат. Этот ключ используется для проверки подписи.
Таким образом, имеется способ проверки удаленного узла (сервера), к которому наш узел собирается подключиться, чтобы исключить «атаки посредника» MITM.
Список отзыва сертификатов
Иногда требуется блокировать доступ отдельных узлов к сети VPN компании, например, заблокировать доступ рабочей станции уволенного сотрудника.
Для упрощения этой процедуры в OpenVPN предусмотрен список отзыва сертификатов (Сertificate Revocation List, CRL) и простые средства для управления этим списком.
Список CRL создается в удостоверяющем центре CA и потом копируется на сервер OpenVPN. После внесения изменений в список CRL его необходимо повторно скопировать на сервер OpenVPN.
Файл Диффи-Хелмана
Файл Диффи-Хелмана (Diffie-Hellman) необходим для реализации одноименного протокола, позволяющего использовать небезопасный канал для получения общего секретного ключа. Этот ключ будет в дальнейшем использоваться для защищенного обмена данными с помощью алгоритмов симметричного шифрования.
В применении к OpenVPN файл Диффи-Хелмана нужен для обеспечения защиты трафика от расшифровки, если ключи были похищены. Здесь имеется в виду тот трафик, который был записан и сохранен еще до похищения ключей.
Файл Диффи-Хелмана создается на сервере OpenVPN.
Статический ключ HMAC
Статический ключ (хэш-код) аутентификации сообщений (Hash-based Message Authentication Code, HMAC) обеспечивает проверку подлинности информации, передаваемой между сторонами. Этот ключ создается на сервере OpenVPN с целью дополнительной защиты от DoS-атак и флуда.
Компоненты сети OpenVPN
Прежде чем мы перейдем от теории к практике, перечислим основные компоненты сети OpenVPN и объекты, с которыми нам придется иметь дело.
Удостоверяющий центр CA
Выдает сертификаты по запросу узлов сети VPN, подписанные сертификатом удостоверяющего центра. Предоставляет узлам сети VPN свой собственный сертификат для проверки удостоверяющей стороны. Управляет списком отзыва сертификатов CRL.
Сервер OpenVPN
ПО сервера OpenVPN создает туннель внутри незащищенной сети, например, Интернета. Этот туннель обеспечивает безопасный зашифрованный трафик между узлами — участниками обмена данными в сети OpenVPN.
Клиент OpenVPN
ПО клиента OpenVPN устанавливается на все узлы, которым необходим защищенный канал передачи данный с сервером OpenVPN. При соответствующей настройке сервера OpenVPN возможна защищенная передача данных между клиентами OpenVPN, а не только между клиентами и сервером OpenVPN.
Сертификаты (публичные ключи) X.509
Сертификаты X.509 представляют собой публичные ключи, заверенные удостоверяющим центром CA. Они используются для зашифровывания данных. Факт заверения сертификата удостоверяющим центром CA позволяет идентифицировать сторону, передающую зашифрованные данные.
Файл запроса на сертификат создается на узлах сети, затем он переносится на узел удостоверяющего центра и там подписывается. Созданный в результате подписанный сертификат переносится обратно на запросивший его узел сети OpenVPN.
Приватные ключи
Приватные ключи секретные. Они должны создаваться и храниться на каждом узле сети OpenVPN, предназначены для расшифрования данных и никогда не должны передаваться по сети.
Приватные ключи создаются на узлах сети OpenVPN одновременно с файлом запроса на получение сертификата.
Список отзыва сертификатов CRL
Содержит список сертификатов, утративших доверие. Он создается и редактируется на узле удостоверяющего центра CA. Чтобы отключить узел от сети, достаточно занести его сертификат в список CRL.
После создания и каждого изменения список CRL переносится на серверы OpenVPN.
Файл Диффи-Хелмана
Используется, чтобы в случае похищения ключей исключить расшифрование трафика, записанного еще до этого похищения. Создается на сервере OpenVPN.
Статический ключ HMAC
Служит для проверки подлинности передаваемой информации. Обеспечивает защиту от DoS-атак и флуда. Создается на сервере OpenVPN.
Готовим оборудование для установки OpenVPN
Если вы впервые настраиваете сеть VPN, лучше всего экспериментировать на виртуальных машинах VDS. Это могут быть VDS, созданные локально на вашем компьютере или на сервере в вашей сети, либо арендованные у провайдера. Перед арендой VDS поинтересуйтесь, поддерживается ли драйвер TUN/TAP. Некоторые провайдеры требуют дополнительной оплаты для подключения TUN/TAP.
На рис. 1. мы показали схему стенда, на котором будем устанавливать компоненты и узлы OpenVPN (имена и адреса IP хостов могут быть другими).
Рис. 1. Стенд для изучения OpenVPN.
Здесь изображены три узла (хоста), для каждого из которых потребуется отдельный VDS:
- сервер OpenVPN (vpnsrv, 192.168.0.54);
- клиент OpenVPN (vpnclient, 192.168.0.55);
- удостоверяющий центр CA (ca, 192.168.0.53)
Хосты клиента и сервера VPN соединены обычным, небезопасным каналом. В случае макета это может быть локальная сеть, в реальной жизни — канал сети Интернет. ПО OpenVPN создает в этой сети канал, обозначенный на рис. 1 красным цветом, внутри которого устанавливается безопасный шифрованный канал (обозначен зеленым цветом).
В макете хост удостоверяющего центра CA можно подключить к вашей локальной сети. Для реальной работы хост CA нужно отсоединить от сети, а обмен сертификатами и ключами осуществлять с помощью, например, USB флэш-диска.
Если к безопасности предъявляются повышенные требования, хост CA необходимо поместить в охраняемое помещение — расположенная на этой машине информация позволяет создавать ключи доступа к вашей сети VPN.
Мы проводили установку серверов OpenVPN в среде ОС Debian Linux и FreeBSD, клиентов OpenVPN в ОС Debian Linux, FreeBSD и Microsoft Windows.
Основная часть статьи посвящена установке компонентов OpenVPN для Debian Linux. Далее мы рассмотрим особенности установки для FreeBSD и Microsoft Windows.
По возможности на узлах сети OpenVPN используйте новые версии ОС. Перед тем как приступить к работе с OpenVPN, обновите пакеты Linux:
# apt-get update
# apt-get upgrade
Установите на всех узлах пакет пакет zip, если он не был установлен ранее:
# aptitude install zip
Этот пакет будет нужен для распаковки архива утилиты Easy-RSA, с помощью которой мы будем создавать ключи и сертификаты.
На всех узлах настройте обновление и синхронизацию времени.
# apt-get install ntpdate
# apt-get install -y ntp
# /etc/init.d/ntp stop
# ntpdate pool.ntp.org
# /etc/init.d/ntp start
Синхронизация времени необходима, т.к. сертификаты имеют период действия. Если часы, например, на хосте удостоверяющего центра CA и сервера OpenVPN не синхронны, может получиться так, что выданный удостоверяющим центром сертификат не будет действителен на узлах сети OpenVPN из-за ограничений по дате или времени.
Дальнейшие работы мы начнем с подготовки хоста удостоверяющего центра CA. Затем установим хосты сервера и клиента OpenVPN.
Создание удостоверяющего центра CA
Как мы уже говорили, задача удостоверяющего центра CA — выдача подписанных сертификатов для сервера и клиентов OpenVPN.
Чтобы получить сертификат, сервер или клиент на своем хосте генерирует файл запроса на сертификат. Этот файл запроса передается на хост CA, который создает сертификат и подписывает его. Далее подписанный сертификат передается на запросивший хост.
Одновременно с запросом сертификата создается приватный ключ. Приватные ключи создаются для всех узлов сети OpenVPN: для удостоверяющего центра CA, для сервера и всех клиентов OpenVPN.
Для безопасности файлы ключей никогда не должны покидать узлы, где они были созданы. Обмениваться можно только запросами на сертификаты и сертификатами, приватными ключами обмениваться нельзя и незачем.
На рис. 2 показан процесс получения подписанного сертификата для сервера OpenVPN.
Рис. 2. Получение сертификата для сервера OpenVPN
Сервер OpenVPN создает свой приватный ключ и файл запроса на получение сертификата. Файл запроса передается в удостоверяющий центр, например, на USB флеш-диске.
Удостоверяющий центр на основе запроса создает подписанный сертификат, который затем требуется перенести на сервер OpenVPN, также на USB флэш-диске.
Если к безопасности не предъявляется особых требований или вы только изучаете OpenVPN, можно подключить машину удостоверяющего центра к сети и передавать запросы и сертификаты, например, с помощью утилит SFTP или SCP. Можно даже совместить функции CA и, например, сервера OpenVPN в одном хосте.
Аналогичным образом необходимо получить сертификаты для всех клиентских узлов (рис. 3).
Рис. 3. Получение сертификата для клиента OpenVPN
Установка утилиты Easy-RSA
Все операции по созданию ключей и сертификатов можно выполнить с помощью утилиты openssl. Однако проще воспользоваться специально созданной для этого программой Easy-RSA, которая использует openssl для выполнения действий с ключами и сертификатами.
Ранее утилита Easy-RSA поставлялась вместе с OpenVPN, но теперь это отдельный проект.
Все операции с удостоверяющим центром и сертификатами можно (и нужно) проводить от имени непривилегированного пользователя.
Создайте пользователя с именем, например, ca и перейдите в его домашний каталог:
# adduser ca
# su ca
$ cd
Загрузите дистрибутив программы утилитой wget.
$ wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
После загрузки распакуйте архив master.zip:
$ unzip master.zip
В табл. 1 перечислены файлы и каталоги, входящие в дистрибутив Easy-RSA.
Таблица 1. Состав дистрибутива Easy-RSA.
Мы рекомендуем ознакомиться с файлом README.quickstart.md, а также с файлами из папки Doc. Для создания ключей и сертификатов нужно перейти в каталог easyrsa3, где находится исполнимый файл программы Easy-RSA.
Создание инфраструктуры публичных ключей PKI
На первом шаге создайте инфраструктуру публичных ключей (Public Key Infrastructure, PKI):
$ cd /home/ca/easy-rsa-master/easyrsa3
$ ./easyrsa init-pki
Вы увидите сообщение:
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/ca/easy-rsa-master/easyrsa3/pki
В результате выполнения команды init-pki был создан каталог /home/ca/easy-rsa-master/easyrsa3/pki, где и находится инфраструктура публичных ключей PKI.
На втором шаге с помощью команды build-ca создайте удостоверяющий центр CA:
$ ./easyrsa build-ca
В ответ на эту команду вам будет предложено ввести пароль и так называемое имя Common Name:
Generating a 2048 bit RSA private key
.....+++
................................................................+++
writing new private key to '/home/ca/easy-rsa-master/easyrsa3/pki/private/ca.key'
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]:ca.mydomain.ru>
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/ca/easy-rsa-master/easyrsa3/pki/ca.crt
Пароль будет защищать приватный ключ удостоверяющего центра, созданный в формате PEM (Privacy Enhancement for Internet Electronic Mail). Этот пароль потребуется каждый раз, когда вы будете подписывать в удостоверяющем центре сертификаты для серверов и клиентов OpenVPN.
Чтобы избавиться от необходимости ввода пароля, можно при запуске команды build-ca задать опцию nopass:
$ ./easyrsa build-ca nopass
Учтите, что злоумышленник сможет легко воспользоваться украденным ключом, созданным без пароля.
В качестве Common Name задайте, например, доменное имя, выделенное для удостоверяющего центра CA, имя пользователя или хоста сервера CA.
Для удостоверяющего центра команда build-ca создаст два файла:
/home/ca/easy-rsa-master/easyrsa3/pki/private/ca.key
/home/ca/easy-rsa-master/easyrsa3/pki/ca.crt
Файл ca.key представляет собой приватный ключ центра CA, он секретный, и его нельзя переносить на другие узлы вашей сети.
Файл сертификата удостоверяющего центра ca.crt, напротив, открытый, и он будет нужен на узлах серверов и клиентов OpenVPN. Запишите файл ca.crt на USB флэш-диск, чтобы перенести на другие узлы.
Смонтировать USB флэш-диск, можно, например, так:
# fdisk -l
# mkdir /mnt/flash
# mount -t vfat /dev/sdb1 /mnt/flash
Здесь мы предполагаем, что USB флэш-диск стал устройством /dev/sdb1, а его файловая система — FAT32.
Копируем файл сертификата CA:
# cp /home/ca/easy-rsa-master/easyrsa3/pki/ca.crt /mnt/flash/ca.crt
Для работы с USB флэш-диском с файловой системой NTFS сначала установите пакет ntfs-3g:
# aptitude install ntfs-3g
Смонтируйте диск следующим образом:
# mount -t ntfs-3g /dev/sdb1 /mnt/flash
После окончания копирования размонтируйте USB диск:
# umount /mnt/flash
Создание списка отзывов сертификатов
Если сотрудник уволился, необходимо заблокировать его доступ в сеть VPN компании. Специально для этой цели в OpenVPN предусмотрен список отзыва сертификатов CRL. Создайте его такой командой:
$ cd /home/ca/easy-rsa-master/easyrsa3
$ ./easyrsa gen-crl
У вас будет запрошен пароль доступа к приватному ключу ca.key удостоверяющего центра. Список отзыва сертификатов будет создан в файле /home/ca/easy-rsa-master/easyrsa3/pki/crl.pem.
Скопируйте этот файл на USB флэш-диск:
# cp /home/ca/easy-rsa-master/easyrsa3/pki/crl.pem /mnt/flash
Если нужно заблокировать выданный ранее сертификат, воспользуйтесь следующей командой:
$ ./easyrsa revoke developer5
Здесь мы отозвали сертификат для клиента developer5. Далее нужно скопировать новый файл CRL на сервер OpenVPN и перезапустить демон OpenVPN.
Созданные файлы и каталоги PKI
В табл. 2 мы привели краткое описание некоторых файлов и каталогов PKI, созданных в результате наших действий.
Таблица 2. Структура каталога PKI.
Справка по утилите Easy-RSA
Запустите утилиту Easy-RSA без параметров:
$ ./easyrsa
На экране появится список всех команд утилиты, а также полный путь к программе и к PKI.
Для того чтобы получить справку по нужной команде, добавьте опцию help. Например, так можно получить справку по команде build-ca:
$ ./easyrsa help build-ca
Создание сервера OpenVPN
Процесс создания сервера OpenVPN включает в себя установку пакета openvpn, подготовку файлов конфигурации, ключей и сертификатов.
Установка пакета openvpn
Установите пакет сервера OpenVPN следующим образом:
# apt-get install openvpn
Подготовка файлов конфигурации
Файлы конфигурации, сертификаты и ключи нужно поместить в каталог /etc/openvpn, который будет создан автоматически в процессе установки пакета openvpn.
Прежде всего, подготовим файлы конфигурации openssl.cnf и server.conf. Первый из этих файлов определяет конфигурацию OpenSSL, второй — конфигурацию сервера OpenVPN.
В комплекте с утилитой Easy-RSA поставляется пример файла конфигурации OpenSSL (предполагается, что мы установили утилиту в домашний каталог пользователя ca):
/home/ca/easy-rsa-master/easyrsa3/openssl-1.0.cnf
Мы, однако, рекомендуем использовать для начала упрощенную версию этого файла из нашей статьи.
В файле openssl.cnf указан абсолютный путь к каталогу с ключами и сертификатами, который вы только что создали.
Содержимое файла openssl.cnf
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /etc/openvpn
crl_dir = $dir
database = $dir/index.txt
new_certs_dir = $dir
certificate = $dir/ca.crt
serial = $dir
crl = $dir/crl.pem
private_key = $dir/server.key
RANDFILE = $dir/.rand
default_days = 3650
default_crl_days = 365
default_md = md5
unique_subject = yes
policy = policy_any
x509_extensions = user_extensions
[ policy_any ]
organizationName = match
organizationalUnitName = optional
commonName = supplied
[ req ]
default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
x509_extensions = CA_extensions
[ req_distinguished_name ]
organizationName = Organization Name (must match CA)
organizationName_default = Company
organizationalUnitName = Location Name
commonName = Common User or Org Name
commonName_max = 64
[ user_extensions ]
basicConstraints = CA:FALSE
[ CA_extensions ]
basicConstraints = CA:TRUE
default_days = 3650
[ server ]
basicConstraints = CA:FALSE
nsCertType = server
Пример файла openvpn.conf конфигурации сервера OpenVPN есть на сайте проекта по адресу openvpn.net/index.php/open-source/documentation/howto.html#server. Мы предлагаем начать с сокращенной версии этого файла из нашей статьи.
Содержимое файла server.conf
port 1194
proto udp
dev tun
user openvpn
group openvpn
cd /etc/openvpn
persist-key
persist-tun
tls-server
tls-timeout 120
dh /etc/openvpn/dh.pem
ca /etc/openvpn/ca.crt
cert /etc/openvpn/vpn-server.crt
key /etc/openvpn/server.key
crl-verify /etc/openvpn/crl.pem
tls-auth /etc/openvpn/ta.key 0
server 10.15.0.0 255.255.255.0
client-config-dir /etc/openvpn/ccd
client-to-client
topology subnet
max-clients 5
push "dhcp-option DNS 10.15.0.1"
route 10.15.0.0 255.255.255.0
comp-lzo
keepalive 10 120
status /var/log/openvpn/openvpn-status.log 1
status-version 3
log-append /var/log/openvpn/openvpn-server.log
verb 3
mute 20
Чтобы запуск сервера OpenVPN произошел успешно, необходимо создать каталоги, сертификаты и ключи, на которые есть ссылки в файлах openssl.cnf и server.conf, а также пользователя openvpn.
Создайте каталог для журнала сервера OpenVPN:
# mkdir /var/log/openvpn/
Создайте каталог для конфигураций клиентов (пока не используем):
# mkdir /etc/openvpn/ccd
Подготовка сертификата и ключа для сервера OpenVPN
Помимо openssl.cnf и openvpn.conf в каталоге /etc/openvpn/ нам потребуются файлы, перечисленные в табл. 3.
Таблица 3. Файлы для сервера OpenVPN.
Прежде всего мы создадим приватный ключ и файл запроса на сертификат для сервера OpenVPN, а также получим по созданному запросу в удостоверяющем центре CA подписанный сертификат. В результате у нас появятся файлы server.crt и server.key. Далее займемся остальными файлами, перечисленными в табл. 3.
Чтобы создать для сервера OpenVPN запрос на сертификат и приватный ключ, нам потребуется установить на сервер OpenVPN программу Easy-RSA, аналогично тому, как мы это делали для удостоверяющего центра CA.
Установку Easy-RSA, генерацию приватного ключа сервера OpenVPN и запроса на сертификат мы будем делать от имени пользователя vpnoperator, не имеющего привилегий администратора. Добавьте этого пользователя перед началом работ:
# adduser vpnoperator
Прежде всего, устанавливаем на сервере OpenVPN утилиту Easy-RSA и запускаем инициализацию инфраструктуры публичных ключей PKI:
$ cd /home/vpnoperator
$ wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
$ unzip master.zip
$ cd /home/vpnoperator/easy-rsa-master/easyrsa3
$ ./easyrsa init-pki
После успешной инициализации PKI в консоли появится сообщение:
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/vpnoperator/easy-rsa-master/easyrsa3/pki
Так как наш сервер OpenVPN не будет играть роль удостоверяющего центра, то после инициализации PKI мы не будем создавать CA командой build-ca.
Инфраструктура PKI будет создана в каталоге /home/vpnoperator/easy-rsa-master/easyrsa3/pki.
На следующем этапе получим запрос на сертификат и приватный ключ сервера OpenVPN:
$ ./easyrsa gen-req server
Этой командой будет создан файл запроса server.req и приватного ключа server.key. В процессе генерации у вас будет запрошен пароль, а также имя Common Name для сервера OpenVPN:
Generating a 2048 bit RSA private key
...............................................................................................................+++
....................................+++
writing new private key to '/home/vpnoperator/easy-rsa-master/easyrsa3/pki/private/server.key'
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) [server]: vpn-server
Keypair and certificate request completed. Your files are:
req: /home/vpnoperator/easy-rsa-master/easyrsa3/pki/reqs/server.req
key: /home/vpnoperator/easy-rsa-master/easyrsa3/pki/private/server.key
Первый из этих файлов нам нужно передать на сервер удостоверяющего центра CA, он не секретный. Второй файл — секретный, и он не должен покидать пределы сервера OpenVPN.
Как мы уже говорили, безопаснее всего передавать запрос на сертификат через USB флеш-диск, чтобы не подключать сервер CA к сети:
# fdisk -l
# mkdir /mnt/flash
# mount -t vfat /dev/sdb1 /mnt/flash
# cp /home/vpnoperator/easy-rsa-master/easyrsa3/pki/reqs/server.req /mnt/flash/server.req
# umount /mnt/flash
Заметим, что при генерации приватного ключа был запрошен пароль. Этот пароль обеспечивает защиту, если приватный ключ будет скомпрометирован (украден злоумышленником). Пароль приватного ключа OpenVPN будет запрашиваться с консоли каждый раз при загрузке сервера и запуске OpenVPN.
Но что делать, если у вас нет доступа к консоли сервера OpenVPN или этот доступ затруднен? Такое может случиться, например, если вы создали сервер OpenVPN на базе VDS, арендованного у провайдера, не предоставляющего консольный доступ.
В этой ситуации можно создать приватный ключ без пароля с помощью опции nopass:
$ ./easyrsa gen-req server nopass
Итак, вы создали приватный ключ сервера OpenVPN и запрос на сертификат.
Смонтируйте USB флэш-диск на хосте удостоверяющего центра CA, а затем импортируйте от имени пользователя ca запрос в PKI:
# mount -t vfat /dev/sdb1 /mnt/flash
# su ca
$ cd /home/ca/easy-rsa-master/easyrsa3
$ ./easyrsa import-req /mnt/flash/server.req vpn-server
Здесь мы указали сокращенное имя запроса на сертификат как «vpn-server». Это сокращенное имя будет использовано в дальнейших операциях с сертификатом.
После удачного импорта запроса вы увидите следующее сообщение:
The request has been successfully imported with a short name of: vpn-server
You may now use this name to perform signing operations on this request.
Если ошибок нет, подписываем запрос на получение сертификата:
./easyrsa sign-req server vpn-server
В процессе создания подписанного сертификата будет запрошено подтверждение (ответьте на него «yes»), а также пароль приватного ключа удостоверяющего центра CA:
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 3650 days:
subject=
commonName = server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Using configuration from /home/ca/easy-rsa-master/easyrsa3/openssl-1.0.cnf
Enter pass phrase for /home/ca/easy-rsa-master/easyrsa3/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 Jun 26 15:48:25 2024 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
Certificate created at: /home/ca/easy-rsa-master/easyrsa3/pki/issued/vpn-server.crt
Теперь сертификат получен, и он находится на сервере удостоверяющего центра в файле home/ca/easy-rsa-master/easyrsa3/pki/issued/vpn-server.crt. Этот файл нам нужно передать на сервер OpenVPN.
Скопируйте через USB флеш-диск файл сертификата /ca/easy-rsa-master/easyrsa3/pki/issued/vpn-server.crt с сервера удостоверяющего центра в файл на сервере OpenVPN /home/vpnoperator/vpn-server.crt:
# cp /home/ca/easy-rsa-master/easyrsa3/pki/issued/vpn-server.crt /mnt/flash/
Затем смонтируйте USB диск на VDS OpenVPN и скопируйте файлы ca.crt сертификата CA, список отзыва сертификатов crl.pem и сертификат vpn-server.crt сервера OpenVPN в каталог /etc/openvpn:
# mount -t vfat /dev/sdb1 /mnt/flash
# cp /mnt/flash/ca.crt /etc/openvpn
# cp /mnt/flash/crl.pem /etc/openvpn
# cp /mnt/flash/vpn-server.crt /etc/openvpn
# umount /mnt/flash
Файл приватного ключа скопируйте из каталога usr/home/vpnoperator/easy-rsa-master/easyrsa3/pki/private/ в каталог /etc/openvpn/:
# cp /home/vpnoperator/easy-rsa-master/easyrsa3/pki/private/server.key /etc/openvpn
Генерация файла Диффи-Хелмана
Создайте ключи Диффи-Хелмана следующей командой:
$ cd /home/vpnoperator/easy-rsa-master/easyrsa3
$ ./easyrsa gen-dh
Команда gen-dh работает довольно долго. По завершении вы увидите сообщение:
DH parameters of size 2048 created at /home/vpnoperator/easy-rsa-master/easyrsa3/pki/dh.pem
Скопируйте файл/home/vpnoperator/easy-rsa-master/easyrsa3/pki/dh.pem в каталог /etc/openvpn/ :
# cp /home/vpnoperator/easy-rsa-master/easyrsa3/pki/dh.pem /etc/openvpn
Создание статического ключа HMAC
Для создания ключа HMAC используйте команду openvpn с опциями —genkey и —secret:
# cd /etc/openvpn
# openvpn --genkey --secret ta.key
Запишите файл ta.key на USB диск:
# cp /etc/openvpn/ta.key /mnt/flash
Ревизия файлов перед запуском OpenVPN
Итак, мы получили из удостоверяющего центра подписанный сертификат сервера OpenVPN, сертификат самого удостоверяющего центра CA, список отзыва сертификатов, создали файл Диффи-Хелмана и ключ HMAC.
Перед тем как запустить демон OpenVPN, нам нужны в каталоге /etc/openvpn/ для Linux или /usr/local/etc/openvpn/ для FreeBSD следующие файлы:
- openssl.cnf — файл конфигурации OpenSSL;
- server.conf — файл конфигурации сервера OpenVPN;
- ca.crt — cертификат удостоверяющего центра;
- vpn-server.crt — cертификат сервера OpenVPN;
- server.key — приватный ключ сервера OpenVPN, секретный;
- crl.pem — cписок отзыва сертификатов;
- dh.pem — файл Диффи-Хелмана для обеспечения защиты трафика от расшифровки;
- ta.key — ключ HMAC для дополнительной защиты от DoS-атак и флуда
Добавление пользователя openvpn
Добавьте непривилегированного пользователя и группу openvpn, от имени которого будет работать демон сервера OpenVPN:
# adduser --system --no-create-home --home /nonexistent --disabled-login --group openvpn
Запуск демона OpenVPN
Запустите демон OpenVPN следующей командой:
# /etc/init.d/openvpn start
Проверка результата запуска демона OpenVPN
Если сервер OpenVPN стартовал без ошибок, убедитесь с помощью команды ifconfig в том, что появился интерфейс TUN:
# ifconfig
...
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.15.0.1 P-t-P:10.15.0.1 Mask:255.255.255.0
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Как мы уже говорили, использование TUN/TAP на арендованных VDS может потребовать дополнительной оплаты.
Если все хорошо, то в интерфейсе tun появился адрес IP 10.15.0.1. Это адрес сервера OpenVPN в нашем защищенном туннеле, заданный в файле конфигурации server.conf.
После проверки наличия интерфейса TUN убедитесь, что OpenVPN занял порт 1194:
# netstat -ltupn | grep 1194
Если демон запустился нормально и порт 1194 занят сервером OpenVPN, можно переходить к установке клиента OpenVPN, описанной в следующем разделе статьи. При возникновении ошибок проанализируйте журнал /var/log/openvpn/openvpn-server.log.
При установке OpenVPN на Linux с новыми ядрами, начиная с 2.6, интерфейс TUN может не появится. При этом в логах появляется ошибка:
Loading kernel module for a network device with CAP_SYS_MODULE (deprecated). Use CAP_NET_ADMIN and alias netdev-tun instead
Чтобы избавиться от проблемы, добавьте в файл /etc/modprobe.d/dist.conf строку:
alias netdev-tun tun
Если такого файла нет, его следует создать. После внесения изменений в файл /etc/modprobe.d/dist.conf перезагрузите ОС.
Степень детализации журнала зависит от параметра verb файла конфигурации server.conf. Параметр verb может принимать значения от 0 до 11, при этом 11 соответствует максимальной детализации, а значение по умолчанию равно 1. Если значение параметра verb равно 0, то в журнал будут записываться сообщения только о наиболее серьезных, фатальных ошибках.
Для отладки установите значение этого параметра, равным 5 или выше.
Установка и запуск ПО клиента OpenVPN
Процедура установки клиента OpenVPN аналогична процедуре установки сервера OpenVPN. Основные отличия в файлах конфигурации. Перед установкой не забудьте обновить пакеты и порты.
# apt-get install openvpn
Подготовка файлов конфигурации
Файлы конфигурации, ключи и сертификаты должны находится в каталоге /etc/openvpn.
Далее подготовьте файлы конфигурации openssl.cnf и server.conf.
Файл openssl.cnf, определяющий конфигурацию OpenSSL, используйте точно такой же, как и для сервера OpenVPN. Что касается файла server.conf для клиента OpenVPN, то для начала возьмите его из нашей статьи.
Содержимое файла server.conf для клиента OpenVPN
dev tun
proto udp
remote 192.168.0.54 1194
client
resolv-retry infinite
ca "/etc/openvpn/ca.crt"
cert "/etc/openvpn/developer1.crt"
key "/etc/openvpn/client.key"
tls-auth "/etc/openvpn/ta.key" 1
remote-cert-tls server
persist-key
persist-tun
comp-lzo
verb 3
status /var/log/openvpn/openvpn-status.log 1
status-version 3
log-append /var/log/openvpn/openvpn-client.log
Обратите внимание на параметр remote, в котором указан адрес IP сервера OpenVPN:
remote 192.168.0.54 1194
Вы должны указать здесь реальный адрес IP вашего сервера OpenVPN, чтобы клиент OpenVPN смог к нему подключиться.
Создайте каталог для журнала клиента OpenVPN:
# mkdir /var/log/openvpn/
Создание инфраструктуры публичных ключей PKI
Подключитесь к хосту клиента OpenVPN (в нашем случае это хост разработчика ПО) с правами обычного пользователя developer1 и скачайте утилиту Easy-RSA с сайта github.com/OpenVPN/easy-rsa.
$ cd /home/developer1
$ wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
$ unzip master.zip
Запустите инициализацию инфраструктуры публичных ключей PKI:
$ cd /home/developer1/easy-rsa-master/easyrsa3
$ ./easyrsa init-pki
В результате будет подготовлен каталог PKI:
/home/developer1/easy-rsa-master/easyrsa3/pki
Подготовка сертификата и ключа для клиента OpenVPN
Создайте запрос на сертификат и приватный ключ рабочей станции разработчика developer1:
$ ./easyrsa gen-req client nopass
Вам потребуется ввести имя Common Name для создания запроса на сертификат и приватного ключа рабочей станции:
Generating a 2048 bit RSA private key
..............................................................................................+sftp++
................................+++
writing new private key to '/home/developer1/easy-rsa-master/easyrsa3/pki/private/client.key'
-----
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) [client]:developer1
Keypair and certificate request completed. Your files are:
req: /home/developer1/easy-rsa-master/easyrsa3/pki/reqs/client.req
key: /home/developer1/easy-rsa-master/easyrsa3/pki/private/client.key
Если к защите данных предъявляются повышенные требования, создавайте приватный ключ с паролем, без использования опции nopass:
$ ./easyrsa gen-req client
В этом случае, однако, пароль приватного ключа будет запрашиваться каждый раз при загрузке хоста и запуске клиента OpenVPN.
Теперь вам потребуется перенести созданный запрос сертификата /home/developer1/easy-rsa-master/easyrsa3/pki/reqs/client.req на хост удостоверяющего центра CA и записать в файл /home/ca/client.req.
Сделайте это с помощью USB флэш-диска, если хост CA не подключен к сети.
Запишите запрос на USB диск:
# mkdir /mnt/flash
# mount -t vfat /dev/sdb1 /mnt/flash
# cp /home/developer1/easy-rsa-master/easyrsa3/pki/reqs/client.req /mnt/flash
# umount /mnt/flash
Импортируйте запрос в PKI, используя в качестве короткого имени developer1:
$ cd /home/ca/easy-rsa-master/easyrsa3
$ ./easyrsa import-req /mnt/flash/client.req developer1
Далее подпишите запрос на получение сертификата:
$ ./easyrsa sign-req client developer1
После ввода подтверждения и пароля приватного ключа CA будет создан сертификат:
/home/ca/easy-rsa-master/easyrsa3/pki/issued/developer1.crt
Запишите файл developer1.crt на USB флэш-диск, чтобы перенести его на хост клиента OpenVPN.
# cp /home/ca/easy-rsa-master/easyrsa3/pki/issued/developer1.crt /mnt/flash
# umount /mnt/flash
Скопируйте файл сертификата в каталог /etc/openvpn:
# mount -t vfat /dev/sdb1 /mnt/flash
# cp /mnt/flash/developer1.crt /etc/openvpn
Итак, теперь у нас есть файл приватного ключа рабочей станции client.key и файл сертификата developer1.crt, подписанного удостоверяющим центром CA.
Скопируйте файл ключа в каталог /etc/openvpn:
# cp /home/developer1/easy-rsa-master/easyrsa3/pki/private/client.key /etc/openvpn
Скопируйте в каталог /etc/openvpn клиента VPN следующие файлы, подготовленные на USB диске:
# cp /mnt/flash/ca.crt /etc/openvpn
# cp /mnt/flash/ta.key /etc/openvpn
Напомним, что файлы ca.crt и crl.pem были созданы на хосте удостоверяющего центра CA, а файл ta.key — на хосте сервера OpenVPN.
Запуск клиента OpenVPN
Запустите демон следующей командой:
# /etc/init.d/openvpn start
Если возникла проблема с запуском клиента, проверьте содержимое журнала /var/log/openvpn/openvpn-client.log
В том случае, когда демон клиента запустился без ошибок, проверьте наличие интерфейса TUN, аналогично тому, как мы это делали при запуске демона сервера OpenVPN.
# ifconfig
...
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.15.0.2 P-t-P:10.15.0.2 Mask:255.255.255.0
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Проверьте также, что сервер OpenVPN откликается на команду ping по адресу 10.15.0.1:
# ping 10.15.0.1
Установка прокси-сервера Squid
Итак, у нас есть сеть VPN, и сотрудники, работающие удаленно, могут подключаться к VDS сервера OpenVPN с помощью безопасного туннеля. Теперь нам нужно организовать доступ сотрудников к защищенным ресурсам компании через прокси-сервер, установленный на сервер OpenVPN. В этом случае рабочие станции сотрудников с динамическими адресами IP смогут подключаться к ресурсам компании, для которых разрешен доступ с фиксированного адреса IP сервера OpenVPN.
В качестве прокси-сервера мы выбрали ПО с открытым исходным кодом Squid, который часто применяется, в частности, для кэширования Web-страниц в высоконагруженных проектах. Нам, однако, сейчас пригодится только его функция проксирования.
Установку Squid проще всего выполнить из пакета:
# apt-get install squid3
После завершения установки в каталоге /etc/squid3 будет создан файл конфигурации squid.conf внушительных размеров, который необходимо отредактировать. Впрочем, в нашем случае требуется внести лишь очень небольшие изменения.
Прежде всего, отыщите в файле squid.conf следующую строку:
http_access deny all
Перед этой строкой добавьте:
acl allowed_hosts src 10.15.0.0/24
http_access allow allowed_hosts
http_access deny manager
Первая из этих строк разрешает доступ к Squid из вашей сети OpenVPN.
Если требуется проксировать доступ к каким-либо нестандартным портам SSL, добавьте их к строке:
acl SSL_ports port 443
Например, здесь мы добавили нестандартный порт 7195:
acl SSL_ports port 443 7195
Убедитесь, что в файле squid.conf разрешен доступ из сети 10.0.0.0/8. По умолчанию там есть такая строка:
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
После завершения редактирования файла конфигурации перезапустите Squid:
# /etc/init.d/squid3 restart
Журналы Squid помогут при отладке, если что-то пойдет не так. Они находятся в каталоге /var/log/squid3. Это файлы access.log и cache.log.
После установки и запуска Squid пропишите в браузере прокси 10.15.0.1, порт 3128. Если все настроено правильно, браузер будет ходить в Интернет через ваш сервер OpenVPN. В этом можно убедиться, например, посетив сайт 2ip.ru, myip.ru или аналогичный, показывающий IP-адрес посетителя.
Особенности установки на FreeBSD
Перед началом работ обновите порты FreeBSD:
# portsnap fetch
# portsnap extract
Также позаботьтесь о настройке синхронизации времени на узлах сети OpenVPN. Однократная синхронизация выполняется так:
# ntpdate 1.pool.ntp.org
Вы можете добавить эту команду в задание cron. Также для синхронизации можно установить демон ntpd.
Установка утилиты Easy-RSA
Для загрузки дистрибутива используйте команду fetch:
$ fetch --no-verify-peer https://github.com/OpenVPN/easy-rsa/archive/master.zip
Опция —no-verify-peer позволяет избавиться от ошибки, которая возникает при проверке сертификата digicert.com в FreeBSD версии 10.0. FreeBSD версии 9.2 проверяет данный сертификат успешно, там эта опция не нужна.
В остальном приемы работы с утилитой Easy-RSA в среде FreeBSD ничем не отличаются от приемов работы в среде Debian Linux.
Установка сервера и клиента OpenVPN
Запустите установку OpenVPN на хосте сервера и клиентов OpenVPN из портов следующем образом:
# сd /usr/ports/security/openvpn
# make install clean
Файлы конфигурации OpenVPN
Файлы конфигурации сервера OpenVPN при его установке в ОС FreeBSD необходимо размещать в каталоге /usr/local/etc/openvpn.
Создайте этот каталог:
# mkdir /usr/local/etc/openvpn
Файлы конфигурации openssl.cnf и server.conf содержат путь к каталогу /usr/local/etc/openvpn.
Файл openssl.cnf
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /usr/local/etc/openvpn
crl_dir = $dir2
database = $dir/index.txt
new_certs_dir = $dir
certificate = $dir/ca.crt
serial = $dir
crl = $dir/crl.pem
private_key = $dir/server.key
RANDFILE = $dir/.rand
default_days = 3650
default_crl_days = 365
default_md = md5
unique_subject = yes
policy = policy_any
x509_extensions = user_extensions
[ policy_any ]
organizationName = match
organizationalUnitName = optional
commonName = supplied
[ req ]
default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
x509_extensions = CA_extensions
[ req_distinguished_name ]
organizationName = Organization Name (must match CA)
organizationName_default = Company
organizationalUnitName = Location Name
commonName = Common User or Org Name
commonName_max = 64
[ user_extensions ]
basicConstraints = CA:FALSE
[ CA_extensions ]
basicConstraints = CA:TRUE
default_days = 3650
[ server ]
basicConstraints = CA:FALSE
nsCertType = server
Содержимое файла server.conf для сервера OpenVPN
port 1194
proto udp
dev tun
user openvpn
group openvpn
cd /usr/local/etc/openvpn
persist-key
persist-tun
tls-server
tls-timeout 120
dh /usr/local/etc/openvpn/dh.pem
ca /usr/local/etc/openvpn/ca.crt
cert /usr/local/etc/openvpn/server.crt
key /usr/local/etc/openvpn/server.key
crl-verify /usr/local/etc/openvpn/crl.pem
tls-auth /usr/local/etc/openvpn/ta.key 0
server 10.15.0.0 255.255.255.0
client-config-dir /usr/local/etc/openvpn/ccd
client-to-client
topology subnet
max-clients 5
push "dhcp-option DNS 10.15.0.1"
route 10.15.0.0 255.255.255.0
comp-lzo
keepalive 10 120
status /var/log/openvpn/openvpn-status.log 1
status-version 3
log-append /var/log/openvpn/openvpn-server.log
verb 3
mute 20
Содержимое файла server.conf для клиента OpenVPN
dev tun
proto udp
remote 192.168.0.54 1194
client
resolv-retry infinite
ca "/usr/local/etc/openvpn/ca.crt"
cert "/usr/local/etc/openvpn/developer1.crt"
key "/usr/local/etc/openvpn/client.key"
tls-auth "/usr/local/etc/openvpn/ta.key" 1
#ns-cert-type server
remote-cert-tls server
#ifconfig 10.15.0.0 255.255.255.0
persist-key
persist-tun
comp-lzo
verb 3
status /var/log/openvpn/openvpn-status.log 1
status-version 3
log-append /var/log/openvpn/openvpn-client.log
Создайте каталог для конфигураций клиентов:
# mkdir /usr/local/etc/openvpn/ccd
Работа с инфраструктурой PKI
Установите на сервере OpenVPN утилиту Easy-RSA и запустите инициализацию инфраструктуры публичных ключей PKI:
$ cd /home/vpnoperator
$ fetch https://github.com/OpenVPN/easy-rsa/archive/master.zip
$ unzip master.zip
$ cd /home/vpnoperator/easy-rsa-master/easyrsa3
$ ./easyrsa init-pki
В процессе передачи файлов запроса на сертификаты и подписанные сертификаты вы можете использовать USB флэш-диск. Ниже приведены команды для монтирования и размонтирования диска:
# ls /dev/da*
# mount_msdosfs /dev/da1s1 /mnt
# umount /mnt
Здесь предполагается, что для USB флэш-диска выделено устройство /dev/da1s1.
Добавление пользователя openvpn
С помощью команды adduser добавьте пользователя openvpn. В качестве Shell для этого пользователя укажите nologin.
Запуск демона OpenVPN
Создайте каталог для записи журнала демона OpenVPN:
# mkdir /var/log/openvpn
Добавьте в файл /etc/rc.conf строки:
openvpn_enable="YES"
openvpn_configfile="/usr/local/etc/openvpn/server.conf"
Здесь указан путь к рабочему файлу конфигурации демона OpenVPN.
Запустите демон OpenVPN:
# /usr/local/etc/rc.d/openvpn start
При успешном запуске на сервере и клиенте OpenVPN должен появится интерфейс TUN. Убедитесь в этом с помощью команды ifconfig:
# ifconfig
...
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
options=80000<LINKSTATE>
inet6 fe80::20c:29ff:fe28:d4be%tun0 prefixlen 64 scopeid 0x3
inet 10.15.0.1 --> 10.15.0.1 netmask 0xffffff00
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
Opened by PID 493
Проверьте, что демон сервера OpenVPN занял порт 1194:
# sockstat | grep 1194
Если при запуске возникли ошибки, изучите журнал. Путь к файлу журнала задан в файле конфигурации демона OpenVPN.
Установка SQUID
В среде ОС FreeBSD мы выполнили установку Squid из портов:
# cd /usr/ports/www/squid33
# make install clean
Файл конфигурации Squid находится в каталоге /usr/local/etc/squid/ и называется squid.conf. В него надо внести такие же изменения, что и в случае установки для Debian Linux.
Для запуска добавьте в файл /etc/rc.conf строку:
squid_enable="YES"
Чтобы запустить Squid, используйте следующую команду:
/usr/local/etc/rc.d/squid start
Особенности установки клиента OpenVPN в Microsoft Windows
Для тех сотрудников, кто использует на своих рабочих станциях ОС Microsoft Windows, мы настроили доступ к серверу OpenVPN с помощью ПО OpenVPN-GUI. Дистрибутив OpenVPN-GUI можно скачать здесь.
Установка OpenVPN-GUI
Выберите вариант загрузки Windows Installer (64-bit) или Windows Installer (32-bit) в зависимости от разрядности вашей версии ОС Microsoft Windows. Далее запустите полученный файл и выполните установку по умолчанию. Файлы конфигурации, сертификаты и ключи необходимо записать в папку C:\Program Files\OpenVPN\config.
В папку C:\Program Files\OpenVPN\easy-rsa устанавливается версия программы Easy-RSA для Windows.
Краткую инструкцию по использованию Easy-RSA для Windows вы найдете в файле C:\Program Files\OpenVPN\easy-rsa\README.txt
Мы рассмотрим вариант, при котором запрос на сертификат создается на хосте Microsoft Windows, а затем передается через USB флэш-диск на хост удостоверяющего центра CA. Там на основании запроса создается подписанный файл сертификата и, опять же, через USB флэш-диск, передается на хост Microsoft Windows.
Создание запроса на сертификат
Перейдем к процедуре создания запроса на сертификат.
Прежде всего, запустите консоль с правами администратора. Для удобства вместо стандартной консоли Microsoft Windows мы использовали бесплатный эмулятор консоли ConEmu-Maximus5.
Запустив консоль, перейдите в каталог Easy-RSA и выполните команды:
cd C:\Program Files\OpenVPN\easy-rsa
init-config.bat
clean-all
В результате будет создан каталог C:\Program Files\OpenVPN\easy-rsa\keys и файл vars.bat.
Отредактируйте в файле vars.bat строки по примеру, приведенному ниже, указав код своей страны KEY_COUNTRY и региона KEY_PROVINCE, название города KEY_CITY, компании KEY_ORG, адрес электронной почты KEY_EMAIL и название отдела KEY_OU:
set KEY_COUNTRY=RU
set KEY_PROVINCE=RU
set KEY_CITY=Moscow
set KEY_ORG=IT-Company
set KEY_EMAIL=develop@itcompany.ru
set KEY_CN=changeme
set KEY_NAME=changeme
set KEY_OU=IT
Создайте приватный ключ хоста и запрос на сертификат:
vars
build-ca
build-key client
Ответьте на вопросы, аналогичные тем, что задаются при создании ключей и сертификатов для узлов OpenVPN в Debian Linux или FreeBSD.
После этого в каталоге C:\Program Files\OpenVPN\easy-rsa\keys будет создан файл запроса сертификата client.csr, сертификат client.crt и файл приватного ключа клиента client.key.
Из этих файлов нам потребуются только два — запрос сертификата client.csr и приватный ключ client.key. Сертификат client.crt подписан приватным ключом хоста Microsoft Windows, созданным командой build-ca, и не подойдет для работы с нашим сервером OpenVPN. Тут необходим сертификат, созданный нашим удостоверяющим центром CA.
Получение сертификата от удостоверяющего центра CA
Скопируйте файл запроса сертификата client.csr через USB флэш-диск на хост удостоверяющего центра и создайте запрос, аналогично тому, как мы это делали для клиента OpenVPN на базе Debian Linux. Запишите полученный сертификат на USB флэш-диск, чтобы перенести его на хост Microsoft Windows.
Создание файла конфигурации клиента OpenVPN
Создайте файл конфигурации клиента OpenVPN в каталоге C:\Program Files\OpenVPN\config. Расширение имени этого файла должно быть ovpn. Вот пример нашего файла:
client
dev tun
proto udp
remote 192.168.0.54 1194
tls-client
ca "key/ca.crt"
cert "key/developer-w1.crt"
key "key/client.key"
tls-auth "key/ta.key" 1
comp-lzo
tun-mtu 1500
mssfix 1450
verb 3
Здесь предполагается, что мы скопировали в каталог C:\Program Files\OpenVPN\config\key следующие файлы:
- ca.crt — сертификат удостоверяющего центра CA;
- developer-w1.crt — сертификат хоста Microsoft Windows, подписанный удостоверяющим центром CA;
- client.key — приватный ключ хоста Microsoft Windows;
- ta.key — ключ HMAC для дополнительной защиты от DoS-атак и флуда, скопированный с сервера OpenVPN
Запуск OpenVPN-GUI
Запустите OpenVPN-GUI как обычное приложение Windows с помощью кнопки Пуск (существует также возможность запуска OpenVPN-GUI в качестве службы). В панели системных задач (в системном «трее», или в панели System Tray) появится значок OpenVPN-GUI в виде небольшого окна с замком.
Щелкните этот значок правой клавишей мыши и выберите имя файла конфигурации, который вы создали в каталоге C:\Program Files\OpenVPN\config. Если все настроено правильно, на экране появится окно соединения, в котором будут отображаться сообщения.
После успешного соединения изображение окна с замком станет зеленого цвета. Это означает, что канал VPN установлен. В случае возникновения проблем читайте сообщения в окне подключения, а также журнал сервера OpenVPN. В большинстве случаев проблемы связаны с ошибками при подготовке сертификатов и ключей.
Чтобы разъединить канал OpenVPN, щелкните значок OpenVPN-GUI правой клавишей мыши и выберите из меню строку Отключиться.
Полезные ссылки
Протокол Диффи — Хеллмана
HMAC
Шифрование
X.509
OpenVPN: создание сервера на Windows
Центр сертификации или удостоверяющий центр (Certification authority, CA)
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Пошаговая инструкция по настройке OpenVPN GUI в Windows 10. The OpenVPN GUI это бесплатная программа с открытым кодом, доступная для всех версий Windows.
Содержание
- Установка OpenVPN GUI
- Настройка OpenVPN GUI
- Подключение к VPN-серверу
Установка OpenVPN GUI
Зайдите на оффициальный сайт OpenVPN https://openvpn.net/index.php/open-source/downloads.html. Скачайте установочный файл .exe себе на компьютер.
Или скачайте установочный файл для вашей версии Windows по следующим ссылкам:
- Скачать для Windows 7, 8, 8.1
- Скачать для Windows 10
Запустите скачанный установочный файл openvpn-install-2.4.8-I602-Win*.exe.
Windows спросит, «Do you want to allow the following program to make changes to this computer?» Нажмите Yes.
Установщик запущен. Нажмите Next для начала установки!
Далее вы увидите лицензионное солашение. Прочитайте его, если хотите, и нажмите I Agree.
На экране выбора компонентов нажмите Next.
На экране выбора места установки нажмите Install.
Windows спросит: «Would you like to install this device software?» Нажмите Install.
Когда появится экран завершения установки (Installation Complete) нажмите Next.
Далее вы увидите сообщение о том, что OpenVPN успешно установлен. Уберите галочку «Show Readme» и нажмите Finish.
Настройка OpenVPN GUI
В процессе установки, ярлык OpenVPN GUI будет добавлен на рабочий стол Windows. Нажмите правой кнопкой мыши по нему OpenVPN GUI и выберите в меню пункт «Открыть разположение файла».
Откроется папка C:\Program Files\OpenVPN\bin. Вам нужно перейти на уровень выше — C:\Program Files\OpenVPN.
Теперь нужно перейти в папку C:\Program Files\OpenVPN\config.
Теперь нужно перенасти конфигурационный файл OpenVPN в папку C:\Program Files\OpenVPN\config. Перетащите файл SnowdenVPN.ovpn из папки Загрузки, в папку, которая была открыта ранее.
После этого вы увидите предупреждение «Destination Folder Access Denied». Windows попросит вас предоставить права администратора для перемещения файла. Согласитесь.
Отлично! Ваш конфигурационный файл SnowdenVPN.ovpn находится в C:\Program Files\OpenVPN\config и теперь вы можете подключиться к серверу.
Подключение в VPN-серверу
Дважды нажмите мышью на ярлык OpenVPN GUI на рабочем столе.
Когда OpenVPN GUI запустится, на панеле уведомлений появится его значок.
Нажмите правой кнопкой мыши по значку OpenVPN GUI на панеле уведомлений.
В выпадающем меню выбирите пункт Подключиться.
После этого появится окно подключения.
Когда OpenVPN GUI подключится в серверу, значок станет зеленого цвета.
Создать VPN-сервер бесплатно
Обновлено:
Опубликовано:
Тематические термины: OpenVPN, VPN, Windows, Linux, CentOS, Ubuntu
В данной инструкции подробно описан процесс настройки клиента OpenVPN на примере операционных систем Windows и Linux. Также, с ее помощью можно настроить скиента на Android.
Установка
Настройка
Пример конфигурационного файла
Ключи
Сертификаты
Запуск
Несколько конфигураций
Сертификаты внутри ovpn файла
Отзыв сертификата
Читайте также
Установка
Windows
Заходим на официальную страницу загрузки openvpn и скачиваем клиента для нужной Windows:
Запускаем скачанный файл и устанавливаем программу, нажимая «Далее».
Linux CentOS
Устанавливаем репозиторий EPEL:
yum install epel-release
Устанавливаем openvpn:
yum install openvpn
Linux Ubuntu
apt update
apt install openvpn
Android
Установка выполняется из Google Play. Набираем в поиске OpenVPN Connect — нажимаем установить и принимаем условия.
Настройка
После установки программы конфигурационный файл не создается автоматически и его нужно создать вручную.
В системах Windows создаем файл config.ovpn в папке %programfiles%\OpenVPN\config.
* имя файла может быть любым, расширение должно быть .ovpn.
Для создания конфигурационного файла в Linux выполняем команду:
vi /etc/openvpn/client.conf
* чтобы служба openvpn автоматически выполняла соединение, необходимо, чтобы конфигурационный файл назывался client.conf.
Пример конфигурационного файла
client
dev tun
proto udp
remote 192.168.0.15 443
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
dh dh2048.pem
tls-client
tls-auth ta.key 1
float
keepalive 10 120
comp-lzo
verb 0
Параметры конфигурационного файла
| Параметр | Значения | Описание |
|---|---|---|
| client | Строка говорит о том, что конфигурационный файл описывает клиентское подключение (программа сама устанавливает соединение, а не ждет, как сервер). | |
| dev | tap или tun | Выбор виртуального сетевого драйвера. TUN — сетевой уровень модели OSI, оперирует IP-пакетами. TAP — эмулирует Ethernet устройство и работает на канальном уровне модели OSI, оперируя кадрами Ethernet. Настраивая OpenVPN клиента, в большинстве случаев, необходимо выбирать tun. TAP необходимо использовать для работы определенных сервисов, например DHCP. |
| dev-node | любая строка | Параметр используется в системах Windows в случаях, если имеется несколько сетевых интерфейсов. Значение этого параметра должно содержать название сетевого подключения, через который должен работать OpenVPN. |
| proto | udp или tcp | Указывает, какой протокол использовать для передачи данных. В большинстве случаев, лучше использовать UDP, так как данный протокол создает меньше нагрузки на сеть. |
| remote | VPN-сервер и порт | Задает сервер, к которому должен подключаться клиент, а также сетевой порт (по умолчанию 1194), на котором OpenVPN принимает запросы. Можно указать несколько строк. |
| remote-random | Если указано несколько строк remote, данный параметр говорит, что необходимо подключаться к удаленным серверам в случайном порядке. | |
| resolv-retry | количество секунд или infinite | Используется в тех случаях, когда в качестве сервера указано доменное имя. Параметр задает время в секундах для повторного переподключения, если не удалось узнать имя сервера. infinite — держать связь с сервером постоянно. |
| nobind | Клиент использует динамический порт для подключения. | |
| user | учетная запись | Задает определенного пользователя для работы клиента (только для UNIX-систем). |
| group | группа | Задает определенную группу для работы клиента (только для UNIX-систем). |
| persist-key | Не перечитывает ключи при перезагрузке сервиса OpenVPN. | |
| persist-tun | Не перечитывает параметры туннеля при перезагрузке сервиса OpenVPN. | |
| http-proxy | сервер прокси и порт | Использовать прокси-сервер для подключения. |
| http-proxy-retry | Переподключаться к прокси-серверу, если связь была разорвана. | |
| http-proxy-timeout | количество секунд | Время, через которое выполнять попытки переподключения к прокси-серверу. |
| mute-replay-warnings | Параметр стоит задавать при использовании беспроводного соединения. Он отключит дублирование предупреждений пакетов. | |
| ca | пут к сертификату | Корневой сертификат удостоверяющего центра. Генерируем на сервере. |
| cert | пут к сертификату | Открытый ключ клиента. Генерируем на сервере. |
| key | пут к сертификату | Закрытый ключ клиента. Генерируем на сервере. |
| dh | пут к сертификату | Ключ с алгоритмом Diffie-Hellman (Диффи-Хеллмана). |
| remote-cert-tls | сервер | Исключает возможность mitm атаки, включая верификацию сертификата сервера. |
| tls-client | Указание на то, что это клиент TLS. | |
| tls-auth | ta.key 1 | Дополнительный уровень аутентификации посредством ключа TLS. |
| float | Удаленный хост может менять IP-адрес в процессе соединения, при этом последнее не будет разорвано. | |
| keepalive | секунд1 секунд2 | Пинговать каждые секунд1 сервер и если в течение секунд2 не будут получены ответные пакеты, перезапустить подключение. |
| cipher | алгоритм | Указывает алгоритм шифрования. Примеры: AES-256-CBC, AES-128-CBC, BF-CBC, DES-EDE3-CBC. |
| comp-lzo | Использовать сжатие. | |
| verb | число от 0 до 9 | Уровень детализации лога. 0 отключает отладочную информацию. |
| mute | число | Указывает сколько лог-сообщений может отображаться для каждой категории события. |
| auth-user-pass | ничего или путь к файлу | Говорит клиенту, что необходима аутентификация. Если не указан путь к файлу, клиент выкинет окно для авторизации, иначе прочитает данные из файла. |
| ipchange | команда или путь к скрипту | Выполняет команду при смене IP. |
| connect-retry | секунд | Переподключиться к серверу через указанное количество секунд, если соединение было разорвано. |
| connect-retry-max | число | Сколько раз повторять соединение, если оно было разорвано. |
| shaper | байт | Задает максимальную скорость передачи данных для исходящего трафика. |
| tun-mtu | число | Задает MTU. |
| status | путь к файлу | Путь к фалу хранения статуса. |
| log | путь к файлу | Путь к лог-файлу. |
| askpass | путь к файлу | Путь к файлу с паролем для приватного ключа (private key password). |
Наиболее полный и актуальный список параметров для OpenVPN можно получить командой openvpn —help (в Linux и Windows).
Сертификаты
Клиентские сертификаты генерируются на стороне сервера. Процедура следующая.
Для Linux:
cd /etc/openvpn/easy-rsa
. ./vars
./build-key client
Для Windows:
cd %ProgramFiles%\OpenVPN\easy-rsa
vars.bat
build-key.bat client
* в выше приведенных примерах был сгенерирован клиентский сертификат client.
Сгенерированные ключи появятся в каталоге keys. Их необходимо скопировать на клиентский компьютер вместе с сертификатами сервера и разместить по каталогам, указанным в конфигурационном файле. В нашем примере они должны быть скопированы в ту же папку, в которой находится сам файл конфигурации.
В итоге мы получаем, примерно, следующее.
Для Windows:
Для Linux:
ls /etc/openvpn/client/
ca.crt client.crt client.key client.conf dh2048.pem ta.key
Запуск
Для проверки можно запустить клиента вручную. Но для повседневного использования стоит настроить автоматический запуск.
Вручную
На Windows:
Запускаем OpenVPN GUI от имени администратора — в правом нижнем углу появится иконка программы:
Кликаем по ней правой кнопкой мыши и выбираем Подключиться:
На Linux:
Переходим в каталог с конфигурационным файлом:
cd /etc/openvpn
Вводим команду:
openvpn —config /etc/openvpn/client.conf
или:
systemctl start openvpn@client
* также служба может называться openvpn.
Автоматически
На Windows:
Выполняем 2 действия.
1. Наш конфигурационный файл с сертификатами переносим из каталога config в каталог config-auto:
* в старых версиях клиента каталога config-auto нет — тогда оставляем файлы в config.
2. Открываем службы и находим OpenVPNService. Переводим его в режим автозапуска:
На Linux:
Разрешаем автозапуск службы:
systemctl enable openvpn@client
или для старых версий.
CentOS / Red Hat / Fedora:
chkconfig openvpn on
Ubuntu / Debian:
update-rc.d openvpn defaults
Несколько конфигурационных файлов
Позволит держать несколько конфигураций для подключения к различным VPN-серверам. Между последними можно переключаться из клиентской программы.
Для Windows:
В каталоге config создаем для каждого сервера свою папку и помещаем в нее рабочие файлы (файл конфигурации, сертификаты и так далее). В каждой папке называем конфигурационные файлы ovpn своими именами (даже если файлы будут находиться в разных папках, но с одинаковыми именами, клиент OpenVPN будет воспринимать их как один конфиг).
Пример каталога config:
Пример файлов в одном из каталогов:
Теперь при подключении клиентом к можно выбрать конкретный VPN-сервер:
Для Linux:
Также как для Windows, создаем для каждого сервера свой каталог, куда скопируем рабочие файлы:
mkdir /etc/openvpn/server1
А в каталоге /etc/openvpn создаем для каждого подключения свой конфиг:
vi /etc/openvpn/client1.conf
* в конфигурационном файле все пути до файлов должны вести в соответствующий каталог (в нашем примере, /etc/openvpn/server1).
Запускаем OpenVPN:
openvpn —config /etc/openvpn/server1/client.conf
Для автоматического запуска мы уже ранее применяли команду:
systemctl enable openvpn@client
… где @client — указатель на использование конфигурационного файла client внутри папки openvpn (/etc/openvpn). Таким образом, если мы создали 2 файла client1.conf и client2.conf, команды для разрешения автозапуска бelen такие:
systemctl enable openvpn@client1
systemctl enable openvpn@client2
Сертификаты внутри конфигурационного файла
Ключи сертификатов можно хранить не в отдельных файлах, а внутри конфигурационного файла ovpn.
<ca>
——BEGIN CERTIFICATE——
…
——END CERTIFICATE——
</ca>
<tls-auth>
——BEGIN OpenVPN Static key V1——
…
——END OpenVPN Static key V1——
</tls-auth>
<cert>
——BEGIN CERTIFICATE——
…
——END CERTIFICATE——
</cert>
<key>
——BEGIN PRIVATE KEY——
…
——END PRIVATE KEY——
</key>
<dh>
——BEGIN DH PARAMETERS——
…
——END DH PARAMETERS——
</dh>
* key-direction 1 — необходим для tls-auth, в противном случае, работать не будет; ca — ключ центра сертификации (ca.crt); tls-auth — ta.key; cert — открытый сертификат клиента (clients.crt); key — закрытый сертификат клиента (clients.key); dh — сертификат, созданный на базе протокола Диффи Хеллмана.
Отзыв сертификата
Для Linux:
cd /etc/openvpn/easy-rsa
. ./vars
./revoke-full client
Для Windows:
cd %ProgramFiles%\OpenVPN\easy-rsa
vars.bat
revoke-full.bat client
* с помощью данных манипуляций мы отзываем сертификат client.
Читайте также
Настройка OpenVPN сервера с включением аутентификации через LDAP (Active Directory)
Настройка доступа к локальной сети клиентам OpenVPN в CentOS 7
Интернет в современном обществе так же широко распространен как и любое коммунальное сооружение. Когда кто-то покупает дом или переезжает в новую квартиру, или бизнес переезжает в новое место, интернет является первой услугой в списке, за которой следует электричество, тепло, мусор и, возможно (но маловероятно) наземная линия или телефонная служба. Вы можете даже возразить, что современный квалификатор даже не нужен. С помощью таких программ, как One Laptop per Child, в сочетании с усилиями таких компаний как Facebook и Google, так называемые страны третьего мира, где нет водопроводов, канализации или даже телефонной связи, имеют Интернет.
Когда у вас есть развитая служба с большим количеством людей настанет момент, когда необходимо будет обеспечить безопасность и защиту данных, передаваемых по этой сети. В большинстве толп и больших скоплений людей есть более гнусный элемент, стремящийся воспользоваться теми, у кого меньше знаний. Виртуальные частные сети (VPN) были созданы из-за большой потребности в защищенной связи через незащищенную инфраструктуру. Первоначальная крупномасштабная сеть ARPANET имела очень низкую (если вообще имела) защиту и аутентификацию, а все остальные узлы были изначально доверенными. Сетевые ландшафты сегодня очень разные, и даже многие случайные, нетехнические пользователи осознают отсутствие безопасности своих соединений.
Правительственные учреждения уже давно стали мишенями для разведки. На протяжении тысячелетий методы и процедуры медленно совершенствовались и настраивались для защиты конфиденциальной информации от врагов и других любопытных глаз. Первоначально запечатанные воском письма, которые носили доверенные лица, означали, что вы и получатель можете быть уверены в том, что сообщение прибыло безопасно и беспрепятственно. С течением времени и развитием технологий стало легче перехватывать эти сообщения, читать или изменять их и отправлять далее по пути.
Вторая мировая война дала развитие многим величайшим достижениям в криптографии и защищенной связи. От таких устройств, как немецкая машина “Энигма” до Кодовых говорунов Навахо, надежная связь между войсками и командованием была бесконечной гонкой вооружений. Сегодня правительства и военные — не единственные группы, которые стремятся к уединению. Корпорации хотят поддерживать целостность данных и защиту стандартов индустрии платежных карт (PCI) для защиты потребителей. Члены семьи хотят обсуждать семейные дела по частным каналам, где сообщество в целом не может подслушивать. Другие хотят прорваться через национальные брандмауэры, предназначенные для наблюдения за населением и ограничения контента, считающегося спорным или противоречащим политике партии.
Каждый день большинство людей используют VPN или имеют возможность использовать VPN независимо от того, осознают они это или нет. Существует множество различных технологий VPN как от коммерческих поставщиков, так и в виде проектов с открытым исходным кодом. Одним из самых популярных программных проектов для VPN с открытым исходным кодом является OpenVPN. Цель этой книги — сделать вас мастером OpenVPN; вы узнаете не только технологию, лежащую в ее основе, но и рассуждения, логику и логистику всего, что связано с этим. В то время как эта книга будет упоминать и касаться коммерческого предложения от OpenVPN Technologies Inc., Access Server, основной акцент будет сделан на open source/community версию OpenVPN.
Что такое VPN?
Проще говоря, VPN позволяет администратору создавать “локальную” сеть между несколькими компьютерами в разных сегментах сети. В некоторых случаях эти машины могут находиться в одной и той же локальной сети, они могут быть удалены друг от друга через общедоступный Интернет или даже могут быть подключены через множество соединительных сред, таких как беспроводные восходящие каналы, спутниковая связь, коммутируемая сеть, и так далее. P в VPN происходит от дополнительной защиты (private), чтобы сделать эту виртуальную сеть приватной. Сетевой трафик, проходящий через VPN, часто называют внутри туннеля (VPN) по сравнению со всем другим трафиком за пределами туннеля.
На следующем рисунке показан сетевой трафик, который традиционно проходит через несколько сегментов сети и общий Интернет. Здесь этот трафик относительно открыт для проверки и анализа. Хотя защищенные протоколы, такие как HTTPS и SSH, менее уязвимы, их все же можно идентифицировать; если злоумышленник отслеживает сетевой трафик, он все еще может видеть, какой тип соединения установлен, с какого компьютера к какому серверу.
Когда используется VPN, трафик внутри туннеля больше не может быть идентифицирован.
Трафик внутри VPN может быть любым, какой бы вы не отправили через локальную или глобальную сеть: веб-трафик, электронная почта, текст, графика и т.д. Примеры некоторых приложений включают следующее:
- Банкоматы: банкоматы могут использовать VPN для более безопасного подключения к банковским системам.
- Открытый/бесплатный Wi-Fi: С распространением бесплатных или публичных беспроводных сетей обычные пользователи могут использовать VPN для защиты своего интернет-серфинга.
- Корпоративные сети: корпорации и другие организации могут использовать VPN для подключения нескольких офисов или даже целых центров обработки данных.
- Сервисы GeoIP / Геолокации: некоторые веб-сайты предоставляют данные, основанные на географическом местоположении, используя базы данных GeoIP и другие записи. VPN может позволить вам “прыгать” через другую машину в месте, ближе к контенту, который вы действительно хотите. Интернет-видеосервисы, такие как Hulu, YouTube и Netflix, являются типичными примерами этого.
- Обход цензуры / политической свободы: некоторые режимы, такие как в Северной Корее или Китае, имеют чрезвычайно ограничительные правила цензуры. “Великий брандмауэр Китая” — один из крайних примеров. Запрет доступа к Интернету во время политических восстаний, таких как «Арабская весна», пытается сдерживать и контролировать сообщения вне конфликта. Виртуальные частные сети могут помочь выйти за пределы этих ограничительных правил в более широкий Интернет.
Вот пример трафика внутри VPN. В то время как сама VPN маршрутизируется через Интернет, как на предыдущем рисунке, устройства по сетевому пути видят только трафик VPN; эти устройства совершенно не знают о том, что передается внутри частного туннеля. Защищенные протоколы, такие как HTTPS и SSH, по-прежнему будут защищены внутри туннеля от других пользователей VPN, но будут дополнительно неопознаваемы извне туннеля. VPN не только шифрует трафик внутри, но и скрывает и защищает отдельные потоки данных от потоков вне туннеля.
Следует отметить, что на предыдущем рисунке показаны как сильные стороны, так и одна из величайших угроз технологии VPN. VPN-туннель пустили через маршрутизаторы и межсетевые экраны с обеих сторон. Таким образом, весь сетевой трафик, проходящий через VPN-туннель, обходит обычную сетевую защиту, если не приняты специальные меры для контроля VPN-трафика.
В большинстве реализаций VPN используется некоторая форма шифрования и, кроме того, аутентификация. Шифрование VPN гарантирует что другие стороны, которые могут отслеживать трафик между системами, не смогут декодировать и дополнительно анализировать конфиденциальные данные. Аутентификация состоит из двух компонентов, каждый в своем контексте.
Во-первых, существует аутентификация пользователя или системы, которая обеспечивает авторизацию тех, кто подключается к сервису. Этот тип аутентификации может быть в форме сертификатов для каждого пользователя или комбинации имени пользователя и пароля. Кроме того, могут быть согласованы правила, специфичные для данного пользователя, такие как конкретные маршруты, правила брандмауэра или другие сценарии и утилиты. Как правило, они уникальны для каждого экземпляра, хотя даже это можно настроить (когда используется OpenVPN, см. --duplicate-cn).
Вторым компонентом аутентификации является дополнительная защита потока связи. В этом случае устанавливается метод подписи каждого отправленного пакета. Каждая система проверяет, что полученные VPN-пакеты правильно подписаны, прежде чем расшифровывать полезную нагрузку. За счет аутентификации пакетов, которые уже зашифрованы, система может сэкономить время обработки, даже не расшифровывая пакеты, которые не соответствуют правилам аутентификации. В конце концов, это серьезно мешает потенциальной атаке Отказ в обслуживании (Denial of Service — DoS), а также срыве Атаки посредника (Man in the middle — MITM), предполагая что ключи подписи хранятся в безопасности!
Типы VPN
Есть множество продуктов VPN, доступных на рынке, как коммерческих, так и с открытым исходным кодом. Почти всех их можно разделить на следующие четыре категории:
- протокол PPTP на основе VPN
- протокол IPSec на основе VPN
- SSL на основе VPN
- OpenVPN
Некоторые люди утверждают что OpenVPN — это также VPN на основе SSL, поскольку он использует протокол SSL или TLS для установления безопасного соединения. Тем не менее, мы сделали отдельную категорию для OpenVPN, так как она отличается от любого другого SSL-решения VPN.
Теперь мы рассмотрим более подробно каждый из четырех типов VPN:
PPTP
Одним из самых старых протоколов VPN является Туннельный протокол типа точка-точка (Point-to-Point Tunneling Protoco — PPTP), разработанный Microsoft и Ascend в 1999 году. Он официально зарегистрирован как RFC2637 (полный стандарт см. https://www.ietf.org/rfc/rfc2637.txt). Клиент PPTP был включен в Windows с 1995 года и до сих пор входит в большинство операционных систем.
В настоящее время протокол PPTP считается принципиально небезопасным, так как степень безопасности соединения напрямую связана с силой выбранного механизма аутентификации (например, пароля). Таким образом, небезопасный пароль приводит к небезопасному VPN-соединению. Большинство настроек PPTP используют протокол MS-CHAPv2 для шифрования паролей и именно этот протокол существенно небезопасен. Безопасность протокола PPTP, включая расширения Microsoft MS-CHAPv2, обсуждалась в статье, доступной по адресу https://www.schneier.com/paper-pptpv2.html.
Также можно использовать сертификаты X.509 для защиты соединения PPTP, что приводит к довольно безопасному соединению. Однако не все клиенты PPTP поддерживают EAP-TLS, что необходимо для использования сертификатов X.509.
PPTP использует два канала: канал управления для настройки соединения и другой канал для передачи данных. Канал управления инициируется через TCP-порт 1723. Канал данных использует протокол General Routing Encapsulation (GRE), который является IP-протоколом 47. Для сравнения, «обычный» трафик TCP/IP передается с использованием IP-протокола 6 (TCP) и 17 (UDP).
Клиенты PPTP доступны практически во всех операционных системах от Windows до Linux и производных Unix, для устройств iOS и Android.
IPSec
Стандарт IPSec является официальным стандартом IEEE/IETF для защиты IP. Он официально зарегистрирован как RFC2411 (полный стандарт см. https://www.ietf.org/rfc/rfc2411.txt). IPSec также встроен в стандарт IPv6.
IPSec работает на уровне 2 и 3 сетевого стека модели OSI. Он вводит концепцию политик безопасности, что делает его чрезвычайно гибким и мощным, а также чрезвычайно сложным в настройке и устранении неполадок. Политики безопасности позволяют администратору шифровать трафик между двумя конечными точками на основе многих параметров, таких как IP-адрес источника и назначения, а также TCP и UDP-порты источника и назначения.
IPSec может быть настроен на использование предустановленных общих ключей или сертификатов X.509 для защиты VPN-подключения. Кроме того, для аутентификации VPN-подключения используются сертификаты X.509, одноразовые пароли или протоколы имени_пользователя/пароля.
В IPSec есть два режима работы: туннельный и транспортный режим. Транспортный режим чаще всего используется в сочетании с протоколом туннелирования 2 уровня (Layer 2 Tunneling Protocol — L2TP). Этот протокол L2TP выполняет аутентификацию пользователя, как описано в предыдущем разделе. Клиенты IPSec, встроенные в большинство операционных систем, обычно выполняют IPSec + L2TP, хотя также возможно установить соединение только для IPSec. VPN-клиент IPSec, встроенный в Microsoft Windows, по умолчанию использует IPSec + L2TP, но его можно отключить или обойти. Тем не менее он включает в себя команды шифрования и изменения политики безопасности.
Как и PPTP, IPSec также использует два канала: канал управления для настройки соединения и канал для передачи данных. Канал управления инициируется через UDP-порт 500 или 4500. Канал данных использует протокол Encapsulated Security Payload (ESP), который является IP-протоколом 50. Для сравнения, «обычный» трафик TCP/IP передается с использованием IP-протокола 6 (TCP) и 17 (UDP). Целостность пакетов IPSec обеспечивается с помощью кода аутентификации сообщений на основе хэша (Hash-based Message Authentication Code — HMAC), который является тем же методом, который используется в OpenVPN.
Одним из основных недостатков IPSec является то, что многие производители оборудования внедрили собственные расширения в стандарт, что затрудняет (если не делает невозможным) подключение двух конечных точек IPSec от разных производителей.
Программное обеспечение IPSec включено практически во все операционные системы, а также в микропрограммы межсетевого экрана, маршрутизатора и коммутатора.
VPN на основе SSL
В настоящее время наиболее часто используемый VPN — это VPN на основе SSL, основанный на протоколе SSL/TLS. VPN на основе SSL часто называют VPN без клиентского доступа или VPN на основе Интернета, хотя есть некоторые поставщики, которые предоставляют отдельное клиентское программное обеспечение, например Cisco AnyConnect и Microsoft SSTP. Большинство VPN на основе SSL используют тот же сетевой протокол, который используется для безопасности веб-сайтов (HTTPS), тогда как OpenVPN использует собственный формат для шифрования и подписи трафика данных. Это основная причина почему OpenVPN указан как отдельная категория VPN.
Не существует четко определенного стандарта для VPN на основе SSL, но большинство используют протокол SSL/TLS для настройки и защиты соединения. В большинстве случаев соединение защищено с помощью сертификатов X.509 с одноразовым паролем или протоколами имени_пользователя/пароля для аутентификации соединения. VPN на основе SSL очень похожи на соединения, используемые для защиты веб-сайтов (HTTPS) и часто используется один и тот же протокол и канал (TCP и порт 443).
Несмотря на то, что VPN на основе SSL часто называют веб-интерфейсом или бесклиенским, существует довольно много производителей, которые используют плагин для браузера или элемент управления ActiveX для «улучшения» VPN-соединения. Это делает VPN несовместимым с неподдерживаемыми браузерами или операционными системами.
OpenVPN
OpenVPN часто называют VPN на основе SSL, так как он использует протокол SSL/TLS для защиты соединения. Однако OpenVPN также использует HMAC в сочетании с алгоритмом дайджеста (или хеширования) для обеспечения целостности доставляемых пакетов. Он может быть настроен на использование предустановленных ключей, а также сертификатов X.509. Эти функции обычно не предлагаются другими VPN на основе SSL.
Кроме того, OpenVPN использует виртуальный сетевой адаптер (устройство tun или tap) в качестве интерфейса между программным обеспечением OpenVPN пользовательского уровня и операционной системой. В общем, любая операционная система, поддерживающая устройство tun/tap, может запускать OpenVPN. В настоящее время это ОС на основе Linux, Free/Open/NetBSD, Solaris, AIX, Windows и Mac OS, а также устройства iOS/Android. Для всех этих платформ необходимо установить клиентское программное обеспечение, которое отличает OpenVPN от клиентских или веб-сетей VPN.
Протокол OpenVPN не определен в стандарте RFC, но протокол общедоступен, поскольку OpenVPN является частью программного обеспечения с открытым исходным кодом. Тот факт что это открытый исходный код, на самом деле делает OpenVPN более безопасным, чем VPN с закрытым исходным кодом, так как код постоянно проверяется разными людьми. Кроме того, очень мало шансов что секретные бэкдоры будут встроены в OpenVPN.
OpenVPN имеет понятие канала управления и канала данных, которые зашифрованы и защищены по-разному. Однако весь трафик проходит через одно соединение UDP или TCP. Канал управления зашифрован и защищен с использованием SSL/TLS, канал данных зашифрован с использованием специального протокола шифрования.
Протокол и порт по умолчанию для OpenVPN — это UDP и порт 1194. Прежде чем IANA предоставила OpenVPN официальное назначение порта, старые клиенты (2.0-beta16 и старше) по умолчанию использовали порт 5000.
Сравнение VPN
Каждая из различных технологий VPN имеет свои особенности, преимущества и недостатки. Несмотря на то, что эта книга посвящена OpenVPN, существуют случаи, когда, например, VPN на основе IPSec подходит больше, в зависимости от требований пользователей.
Преимущества и недостатки PPTP
Основным преимуществом VPN на основе PPTP является встроенность программного обеспечения VPN-клиента в большинство операционных систем. Кроме того, время запуска для настройки и инициализации PPTP VPN-соединения довольно мало.
Недостатками VPN на основе PPTP являются отсутствие безопасности и параметров конфигурации как на стороне клиента, так и на стороне сервера. Кроме того, расширение EAP-TLS, которое позволяет использовать сертификаты X.509, полностью поддерживается только в Microsoft Windows, хотя существует патч для пакета pppd с открытым исходным кодом для включения поддержки EAP-TLS. Пакет pppd входит почти в каждый дистрибутив Linux. Кроме того, если нужно использовать EAP-TLS, то простота настройки PPTP VPN значительно уменьшается. Это связано с тем, что EAP-TLS требует настройки инфраструктуры открытого ключа, как IPSec и OpenVPN.
Другим существенным недостатком PPTP является использование протокола GRE, который плохо интегрируется с устройствами NAT.
Преимущества и недостатки IPSec
Преимуществами протокола IPSec являются его высокая безопасность, хорошая поддержка от различных производителей и платформ, включая маршрутизаторы xDSL и Wi-Fi, а также возможность использовать детализированные политики безопасности для управления потоком трафика.
Недостатки IPSec заключаются в том, что его общеизвестно сложно настраивать и устранять неисправности, разные реализации IPSec от разных поставщиков оборудования плохо работают вместе, а IPSec плохо интегрируется с сетями с NAT. В частности, не рекомендуется, а иногда даже невозможно, запустить сервер IPSec, который находится в сети с NAT.
Преимущества и недостатки VPN на основе SSL
Преимущество VPN на основе SSL или веб-интерфейса заключается в том, что клиентское программное обеспечение не задействовано или почти не используется. Это делает установку и инициализацию на стороне клиента очень простой.
Недостаток веб-сети VPN заключается в том, что она часто не является полноценной VPN и обеспечивает доступ к одному серверу или набору серверов. Также сложнее обмениваться локальными данными с удаленными точками или сервером.
Преимущества и недостатки OpenVPN
Преимуществами OpenVPN являются простота развертывания, его конфигурируемость и возможность развертывания OpenVPN в сетях с ограниченным доступом, включая сети с поддержкой NAT. Кроме того, OpenVPN включает функции безопасности, которые столь же сильны, как и решения на основе IPSec, в том числе безопасность аппаратного токена и поддержка различных механизмов аутентификации пользователей.
Недостатками OpenVPN являются отсутствие масштабируемости и зависимость от установки клиентского программного обеспечения. Еще одним недостатком является отсутствие графического интерфейса для настройки и управления. В частности, драйвер интерфейса tap для Microsoft Windows часто вызывал проблемы развертывания при выпуске новой версии Windows.
История OpenVPN
OpenVPN был первоначально написан Джеймсом Йонаном с первоначальным выпуском, версией 0.90 в 2001 году под лицензией GPL. Первоначальный выпуск позволял пользователям создавать простые VPN типа «точка-точка» по UDP с использованием шифра Blowfish и, опционально, подписи HAAC SHA1. С версией 1.0, проверка подлинности на основе TLS и обмен ключами были добавлены вместе со страницей man.
Улучшения для OpenVPN 1.x включали улучшенную поддержку TLS, защиту от повторов и перенос на другие операционные системы. Некоторые порты были включены для OpenBSD, Mac OS и улучшены пакеты для RedHat. До версии 1.1.1 устройство tun должно было настраиваться вручную вне OpenVPN. В этом выпуске добавлена опция --ifconfig, которая автоматически настраивала устройство tun, значительно упрощая общую настройку.
Серия 1.x была относительно сырой по сравнению с текущей версией OpenVPN 2.3.8, как и следовало ожидать от нового проекта. Одним из основных препятствий была интеграция OpenSSL. Поскольку OpenSSL был известен своей плохой или полностью отсутствующей документацией, разработчик должен был перейти непосредственно к исходному коду, чтобы интегрировать проект с OpenVPN. Так же на ранних этапах требовались изменения лицензии, чтобы позволить более специфичному общедоступному лицензионному коду GNU связываться с библиотекой OpenSSL не-GPL. Эти проблемы были проработаны, и в журнале изменений на протяжении серии 1.x были добавлены новые функции.
Некоторые заметные обновления в серии 1.x включают в себя:
- 2001.05.13 (0.90): это был первый выпуск
- 2002.03.23 (1.0): позволил TLS-аутентификацию и обмен ключами
- 2002.04.09 (1.1.0): появился порт OpenBSD и соединение OpenSSL
- 2002.04.22 (1.1.1): появилась опция
--ifconfig - 2002.05.22 (1.2.0): здесь появились файлы конфигурации (вместо просто параметров командной строки, поддержка
pthreadи порт Solaris) - 2002.07.10 (1.3.0): улучшена поддержка FreeBSD и улучшена регистрация
- 2002.10.23 (1.3.2): начальная поддержка IPv6 и больше улучшений для FreeBSD
- 2003.05.07 (1.4.0): включены функции MTU
- 2003.07.24 (1.5-beta1): поддержка TCP
- 2003.11.03 (1.5-beta13): в нем появилась поддержка параметров конфигурации
--http-proxy,--redirect-gatewayи--crl-verify - 2004.02.01 (1.6-beta5): прокси SOCKS5 и IPv6 на FreeBSD
- 2004.05.09 (1.6.0): это финальная версия 1.x
OpenVPN 2.0 видел большие успехи от выпусков 1.x. В версии 2.0 были предприняты усилия для обеспечения многоклиентных экземпляров сервера, улучшенной работы с потоками и улучшенного tun/tap адаптера Windows. Разработка для 2.0 пересекалась с 1.x более года, с начальными тестовыми выпусками для 2.0, датируемыми ноябрем 2003 года и финальной версией 1.x не выходившей до 9 мая 2004 года. Пока она была окончательно выпущена, 2.0 увидела 29 тестовых выпусков, 20 бета-релизов и 21 релиз-кандидат за полтора года усилий (с ноября 2003 года по апрель 2005 года).
Некоторые ключевые особенности релиза 2.0 по сравнению с 1.6.0 следующие:
- Позволяет серверу принимать соединения от нескольких клиентов
- Включает опцию
configна стороне сервераpushдля клиентов (--push/--pull) - Позволяет аутентификацию по имени_пользователя/паролю
- Поддерживает
chrootи понижение привилегий демона (--user/--group/--chroot) - Поддерживает сценарии подключения клиента
- Имеет интерфейс управления
- Появление Easy-RSA
Разработка с 2.0 до 2.0.9 в основном состояла из исправлений ошибок и исправлений для нескольких уязвимостей безопасности. Помимо некоторых случайных вкладов от сторонних разработчиков, OpenVPN был разработан Джеймсом до выпуска 2.1. 2.0.9 оставался неизменным официальным выпуском с октября 2006 года до версии 2.1.0 в декабре 2009 года.
OpenVPN 2.1 был первым крупным выпуском с заметным количеством кода, написанного кем-то кроме Джеймса Йонана. Алон Бар-Лев внес значительный вклад, начиная с 2.1-beta3 со многими исправлениями для поддержки криптографии и поправками. Рассматривая первый реальный выпуск сообщества, 2.1 увидел большую работу в базовом ядре кода, включая интерфейс управления и сетевую адресацию. Некоторые заметные примечания к выпуску включают следующее:
- 2005.11.12 (2.1-beta7): файлы
ca,cert,keyиdhмогут быть указаны в файле конфигурации. - 2006.01.03 (2.1-beta8): добавлена подсеть
--topology. - 2006.02.16 (2.1-beta9): было разрешено совместное использование портов, чтобы OpenVPN и HTTPS могли совместно использовать порт.
- 2008.09.10 (2.1_rc10): предупреждает если используется общая подсеть 192.168.0.0/24 или 192.168.1.0/24.
--server-bridgeбыл добавлен для поддержки DHCP-прокси. - 2010.08.09 (2.1.2): у него была система сборки Windows на основе Python с улучшенной обработкой AUTH_FAIL для интерфейса управления.
- 2010.11.09 (2.1.4): это был последний выпуск серии 2.1.
В августе 2008 года официального релиза с 2.0.9 не было. Кроме того, было мало поддержки со стороны сообщества, кроме списка рассылки. Был интерес к созданию сообщества и Кризе Кинг и Эрик Крист подталкивали к созданию сообщества вокруг проекта. Изначально все усилия были направлены на поддержку пользователей.
Поскольку группа людей, поддерживающих OpenVPN, росла, это привлекало людей, которые могли писать хороший код. Был установлен контакт с OpenVPN Inc. с целью не только обеспечить более высокий уровень поддержки OpenVPN, но также создать и расширить программное обеспечение, которое написал Джеймс, но попытки сотрудничества были отвергнуты.
Начались переговоры по Internet Relay Chat (IRC), который является средством коммуникации, предпочитаемым многими разработчиками, для переноса проекта, чтобы можно было добиться прогресса. Разработка началась; некоторые участники управляли IRC и помогали в списках рассылки. Другие создали репозиторий, вики и веб-форум. Среднее использование было примерно 2 сообщения в день на форуме и около 8 пользователей в IRC.
В начале 2009 года OpenVPN Technologies наняли Самули Сеппанена чтобы помочь создать сообщество с открытым исходным кодом и взаимодействовать с ним. Самули способствовал установлению прочных отношений между корпорацией, энтузиастами и волонтерами. Было построено сильное сообщество вокруг проекта. Сегодня на форуме в среднем 16 сообщений в день (всего более 35 000 сообщений), а IRC колеблется от 150 до 250 пользователей в любой день.
OpenVPN 2.2 был первым выпуском после перехода к более ориентированной на сообщество модели разработки. После выяснения модели развития и направления, сообщество решило двигаться с проектом, и сразу же началась работа.
Первоначально для OpenVPN 2.2 Джеймс по-прежнему полностью контролировал то, что было объединено с основным исходным деревом, так как дерево все еще управлялось с использованием подверсий у OpenVPN Technologies. Позже дерево исходных текстов было перенесено в GIT, а роли поменялись местами, где изменения Джеймса были приняты и объединены в дерево проектов с открытым исходным кодом.
Заметные изменения в OpenVPN 2.2:
- открытый текст аутентификации SOCKS
- Улучшена поддержка платформы для подсети
--topology - Режим tap для Solaris
- Сборка Windows скомпилирована с включением
ENABLE_PASSWORD_SAVE - Поддержка Windows IPv6 tun
- Клиентские сертификаты могут быть опущены с поведением, аналогичным веб-браузеру (
--client-cert-not-required) - Клиентские сертификаты теперь могут указывать отдельное имя пользователя вместо использования общего имени сертификата (
--x509-username-field) - Была удалена поддержка для Windows 2000 и более ранних выпусков
- 2011.04.26 была выпущена версия 2.2.0
- 2011.07.06 версия 2.2.1 была выпущена с небольшими изменениями, в основном связанными со сборкой/установкой
- 2011.12.22 версия 2.2.2 была выпущена с изменениями tap-драйвера Windows
OpenVPN 2.3 — начало серьезного поворота в структуре сборки OpenVPN. Вкратце, конечная цель — создать более расширяемый и удобный источник для плагинов. Поскольку сборка для мобильных платформ, таких как Android и iOS, уже требует переписывания с нуля, Джеймс и другие разработчики почистили старый код в пользу более компактных и нормализованных функций. Эти переписывания сделаны на C++, в отличие от используемого языка C.
Хотя они и перечислены в журнале изменений предыдущих версий, поддержка IPv6, как полезной нагрузки, так и транзита в OpenVPN, действительно не достигла зрелости до выпуска 2.3. Подавляющее большинство вкладов в поддержку IPv6 было результатом тяжелой работы Герт Деринг.
Еще одной важной особенностью выпуска 2.3 было добавление поддержки PolarSSL. PolarSSL — это альтернативная криптографическая библиотека для OpenSSL, и теперь OpenVPN может быть создан на основе любой библиотеки. Эта тема более подробно обсуждается далее в этой главе.
Список улучшений и дополнений для выпуска 2.3 огромен, но основные моменты заключаются в следующем (полный журнал изменений находится по адресу https://community.openvpn.net/openvpn/wiki/ChangesInOpenvpn23):
- Кроссплатформенная поддержка IPv6 (транзит и полезная нагрузка)
- API нового плагина
- Поддержка создания PolarSSL и подготовка других потенциальных альтернатив
- Теперь клиенты могут информировать сервер о поддержке LZO и сервер может автоматически отключить LZO для этого клиента
- Обходной путь для локальных конфликтов маршрутизации (
--client-nat) - Новый режим каталога
--crl-verify, файлы с одинаковыми именами отключают сертификаты, как если бы они были отозваны - Поддержка сертификатами UTF-8 для полей сертификата
- Разделение проекта по различным подпроектам:
- Основной проект OpenVPN
- tap-Windows
- Easy-RSA
- Система сборки OpenVPN
- Завершение клиентских соединений из интерфейса управления
Версия 2.3.8 была самой последней версией на момент написания.
Пакеты OpenVPN
В Интернете доступно несколько пакетов OpenVPN:
- Версия OpenVPN с открытым исходным кодом или версия сообщества
- OpenVPN Access Server, коммерческое предложение с закрытым исходным кодом от OpenVPN Inc.
- Версии OpenVPN для мобильных платформ Android и iOS (часть кода с закрыта по требованию Apple)
Версия с открытым исходным кодом (сообщество)
Версии OpenVPN с открытым исходным кодом становятся доступными после публикации каждого выпуска. Сообщество располагает ресурсами для создания бинарных пакетов для нескольких платформ, включая как 32-х, так и 64-разрядных клиентов Windows. Доступные в настоящее время варианты загрузки находятся по адресу http://openvpn.net/index.php/download/community-downloads.html.
Некоторые сопровождающие пакетов операционной системы отслеживают разработку и делают доступными выпуски моментальных снимков. FreeBSD, например, имеет порт security/openvpn-devel, который отслеживает еженедельные снимки тарболла из разработки OpenVPN. Если вы хотите запустить последнюю и самую передовую версию OpenVPN — сначала посмотрите на сопровождающего вашего пакета. В противном случае вы всегда можете собрать напрямую из исходников.
Версия OpenVPN от сообщества может выступать как в качестве VPN-сервера, так и в качестве VPN-клиента. Нет отдельной только клиентской версии.
Закрытые исходники (коммерческий) Access Server
OpenVPN Technologies Inc. предлагает коммерческую версию OpenVPN под названием Access Server. По сравнению с проектом с открытым исходным кодом, Access Server предлагает множество функций и вариантов развертывания, которые могут понравиться некоторым организациям. Access Server является платным продуктом, но на сайте доступна пробная версия с двумя лицензионными ключами.
Пакеты программ, виртуальные устройства и облачные сервисы все доступны от OpenVPN Technologies Inc. на https://openvpn.net/index.php/access-server/overview.html.
OpenVPN Access Server включает в себя собственный клиент OpenVPN — OpenVPN Connect для Windows и Mac OS. Это клиентское программное обеспечение обычно работает только с OpenVPN Access Server. Также можно использовать версию сообщества в качестве клиента для OpenVPN Access Server.
Мобильная платформа (смешанная) OpenVPN/OpenVPN Connect
Для мобильных устройств, таких как iPhone/iPad и Android, OpenVPN Technologies Inc. предоставляет специальный OpenVPN Connect Client. OpenVPN Technologies Inc. и Джеймс специально приложили немало усилий и юридически спорили с такими компаниями как Google и Apple, чтобы получить доступ к используемому VPN API на каждой платформе.
Из-за особенностей NDA Apple, в настоящее время исходные коды OpenVPN Connect недоступны и не могут быть открыты для общего доступа. Клиент iOS OpenVPN Connection можно загрузить из Apple App Store по адресу https://itunes.apple.com/us/app/openvpn-connect/id590379981?mt=8.
Есть Android-клиенты, написанные несколькими разработчиками, но официально поддерживается только версия OpenVPN for Android, написанная Арне Швабе, которую можно найти по адресу https://play.google.com/store/apps/details?id=de.blinkt.openvpn&hl=ru.
OpenVPN Connect, написанный OpenVPN Technologies Inc. также доступен. Вы можете загрузить клиент Android OpenVPN Connect по адресу https://play.google.com/store/apps/details?id=net.openvpn.openvpn&hl=ru.
Одним из серьезных преимуществ OpenVPN Connect является то, что он поддерживает/поддерживается как общедоступной версией OpenVPN, так и OpenVPN Access Server с закрытым исходным кодом. Если вам нужен доступ к обоим типам серверов — рекомендуется OpenVPN Connect.
Другие платформы
Некоторые производители оборудования пытаются интегрировать поддержку OpenVPN в свои устройства. Некоторые предлагают версии прошивки для VoIP-телефонов, которые включают более старую версию OpenVPN. Другие проекты микропрограмм, такие как DD-WRT для маршрутизаторов Linksys, а также проекты FreeNAS, pfSense и другие также интегрируют OpenVPN.
Внутренности OpenVPN
Конструкция OpenVPN не документирована, но большинство внутренних возможностей OpenVPN можно обнаружить взглянув на исходный код.
Драйвер tun/tap
Одним из основных составных блоков OpenVPN является драйвер tun/tap. Концепция драйвера tun/tap происходит из мира Unix/Linux, где он часто доступен как часть операционной системы. Это виртуальный сетевой адаптер, который обрабатывается операционной системой как двухточечный адаптер (в стиле tun) для трафика только по IP или как полноценный виртуальный адаптер Ethernet для всех типов трафика (в стиле tap). В основе этого адаптера находится приложение, такое как OpenVPN, для обработки входящего и исходящего трафика. Linux, Free/Open/NetBSD, Solaris и Mac OS включают в себя драйвер ядра tun, который может работать как в стиле tun, так и в стиле tap. Недавно аналогичный драйвер был добавлен в AIX — производную Unix от IBM.
Для Microsoft Windows Джеймс Йонан написал специальный драйвер NDIS, называемый адаптером TAP-WIN32. На данный момент доступны версии драйверов NDIS5 и NDIS6, поддерживающие Windows XP через Windows 8.1. Разработка этого адаптера теперь официально отделена от основной разработки OpenVPN, но OpenVPN по-прежнему сильно зависит от него.
Поток трафика из пользовательского приложения через OpenVPN изображен на предыдущей диаграмме. На схеме приложение отправляет трафик на адрес, доступный через туннель OpenVPN. Шаги следующие:
- Приложение передает пакет операционной системе.
- ОС решает, используя обычные правила маршрутизации, что пакет должен маршрутизироваться через VPN.
- Пакет затем пересылается на устройство ядра — tun.
- Устройство ядра tun пересылает пакет в процесс OpenVPN (в пользовательском пространстве).
- Процесс OpenVPN шифрует и подписывает пакет, фрагментирует его при необходимости, а затем снова передает его ядру, чтобы отправить на адрес удаленной конечной точки VPN.
- Ядро забирает зашифрованный пакет и перенаправляет его на удаленную конечную точку VPN, где происходит обратный процесс.
На этой диаграмме также видно, что производительность OpenVPN всегда будет ниже, чем у обычного сетевого подключения. Для большинства приложений потеря производительности минимальна и/или приемлема. Однако для скоростей, превышающих 1 Гбит/с, существует узкое место в производительности как с точки зрения пропускной способности, так и с точки зрения задержки.
Следует отметить, что производительность драйвера Windows намного ниже, чем производительность встроенных адаптеров tun/tap в других операционных системах. Это верно даже для самой последней реализации драйвера TAP-Win32 в NDIS6. Для одного клиента OpenVPN влияние довольно мало, но для крупномасштабного сервера OpenVPN, обслуживающего множество клиентов, легко может вызвать проблемы с производительностью. Это одна из основных причин того, почему сообщество разработчиков исходного кода обычно рекомендует использовать хост на основе Unix или Linux в качестве сервера OpenVPN.
Режимы UDP и TCP
OpenVPN в настоящее время поддерживает два способа обмена данными между конечными точками: использование пакетов UDP или TCP. UDP — это протокол без установления соединения или с потерями; если пакет отбрасывается при передаче, то сетевой стек не может прозрачно исправить это. TCP-пакеты — это протокол, ориентированный на соединение; пакеты отправляются и доставляются с использованием протокола квитирования, обеспечивая доставку каждого пакета на другую сторону.
Оба способа общения имеют свои преимущества и недостатки. На самом деле это зависит от типа трафика, который отправляется через VPN-туннель, для определения более подходящего режима связи. Использование приложения на основе TCP через VPN на основе TCP может привести к двойной потере производительности, особенно если основное сетевое соединение не работает. В этом случае повторная передача потерянных пакетов выполняется для пакетов, потерянных как внутри, так и вне туннеля, что приводит к удвоению нагрузки. Это хорошо объясняется в статье «Почему TCP через TCP — плохая идея» на http://sites.inka.de/~W1011/devel/tcp-tcp.html.
Однако аналогичным образом можно утверждать, что отправка UDP через UDP также не является хорошей идеей. Если приложение, использующее UDP для своего трафика, подвержено атакам удаления сообщений или переупорядочения пакетов, то основное зашифрованное TCP-соединение повысит безопасность таких приложений даже в большей степени, чем базовая VPN на основе UDP. Если большая часть трафика через VPN основана на UDP, то иногда лучше использовать TCP-соединение между конечными точками VPN.
При выборе между транспортным протоколом UDP или TCP общее практическое правило следующее: если UDP (режим udp) работает для вас, используйте его; если нет, то попробуйте TCP (режим tcp-server и режим tcp-client). Некоторые коммутаторы и маршрутизаторы неправильно перенаправляют трафик UDP, что может быть проблемой, особенно если к одному коммутатору или маршрутизатору подключено несколько клиентов OpenVPN. Точно так же на производительность OpenVPN через TCP может сильно повлиять выбор интернет-провайдеров (ISP): некоторые интернет-провайдеры используют нечетные размеры MTU или правила фрагментации пакетов, что приводит к крайне низкой производительности OpenVPN через TCP по сравнению с незашифрованным TCP-трафиком.
Протокол шифрования
Было сказано, что OpenVPN реализует TLS через UDP. Это более или менее верно, но то, как OpenVPN использует TLS, отличается от того, как его использует веб-браузер. Таким образом, когда OpenVPN запускается по протоколу TCP (использование порта 443 является распространенным методом для защиты межсетевых экранов), трафик можно отличить от обычного трафика TLS. Брандмауэр, использующий Deep Packet Inspection (DPI), может легко отфильтровать трафик OpenVPN.
Основное различие между OpenVPN-TLS и браузер-TLS заключается в способе подписи пакетов. OpenVPN предлагает функции для защиты от DoS-атак, подписывая пакеты канала управления с помощью специального статического ключа (--tls-auth ta.key 0|1). Пакеты канала данных, отправляемые через одно и то же соединение UDP или TCP, подписываются совершенно по-разному и очень легко отличаются от трафика HTTPS. На сайте OpenVPN (http://openvpn.net) показано, как зашифрованы пакеты для транспорта UDP, что показано ниже.
Тот же механизм используется для транспорта TCP (http://openvpn.net/index.php/open-source/documentation/security-overview.html).
Это также основная причина, по которой совместное использование портов, когда OpenVPN и защищенный веб-сервер используют один и тот же IP-адрес и номер порта, может работать.
Каналы управления и передачи данных
OpenVPN использует два виртуальных канала для связи между клиентом и сервером:
- Канал управления TLS для обмена информацией о конфигурации и шифрованием между клиентом и сервером. Этот канал используется в основном при запуске VPN-подключения, а также для обмена новыми материалами ключей шифрования. Этот материал обновляется через определенный период (на основе параметров
--reneg-sec,--reneg-bytesили--reneg-pkts). - Канал данных, по которому осуществляется обмен зашифрованной полезной нагрузкой.
Исключением является старый двухточечный режим с общим ключом, в котором используется только канал данных.
Шифрование и аутентификация (подпись) для канала управления и канала данных определяются по-разному. Канал управления инициируется с использованием протокола в стиле TLS, аналогично тому, как инициируется безопасное подключение к веб-сайту. Во время инициализации канала управления шифрование и алгоритм хеширования согласовываются между клиентом и сервером.
Алгоритмы шифрования и аутентификации для канала данных не подлежат обсуждению, но они устанавливаются в файлах конфигурации клиента и сервера для OpenVPN. Текущими настройками по умолчанию являются Blowfish в качестве алгоритма шифрования и SHA1 в качестве алгоритма хеширования. Возможность согласования алгоритмов шифрования и хеширования для канала данных занимает важное место в списке пожеланий группы разработчиков, но требует значительных изменений в коде.
Алгоритмы шифрования и хеширования
OpenVPN поддерживает широкий спектр алгоритмов шифрования и хеширования. Они используются для шифрования полезной нагрузки, а функция HMAC использует алгоритм дайджеста или хеширования для аутентификации входящих пакетов. Поскольку OpenVPN использует канал управления и канал данных, существует два набора алгоритмов шифрования и хеширования, которые можно настроить.
Алгоритмы шифрования канала управления и хеширования обычно согласовываются при запуске. Список доступных комбинаций шифрования и хеширования можно отобразить с помощью следующей команды:
Доступные варианты шифрования TLS перечислены в порядке предпочтения:
TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384
TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA384
TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA384
TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA
TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA
TLS-DHE-DSS-WITH-AES-256-GCM-SHA384
TLS-DHE-RSA-WITH-AES-256-GCM-SHA384
TLS-DHE-RSA-WITH-AES-256-CBC-SHA256
TLS-DHE-DSS-WITH-AES-256-CBC-SHA256
TLS-DHE-RSA-WITH-AES-256-CBC-SHA
TLS-DHE-DSS-WITH-AES-256-CBC-SHA
TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA
TLS-DHE-DSS-WITH-CAMELLIA-256-CBC-SHA
TLS-ECDH-RSA-WITH-AES-256-GCM-SHA384
[…]
Этот вывод был получен на хосте CentOS 6 с использованием библиотеки OpenSSL 1.0.1e.
Доступные комбинации во многом зависят от конкретной версии используемой библиотеки SSL. Вы можете указать список tls-шифров в файле конфигурации OpenVPN способом, очень похожим на настройку модуля Apache mod_ssl:
tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-ECDSAWITH-AES-256-CBC-SHA384
:TLS-ECDH-RSA-WITH-AES-256-GCM-SHA384
Перечислите все шифры в одну строку; предыдущий вывод был изменен для удобства чтения.
Для канала данных алгоритмы шифрования и хеширования управляются с помощью параметров --cipher и --auth. Если алгоритмы шифрования и аутентификации не указаны, то используются значения по умолчанию bf-cbc и sha1, соответственно.
Чтобы получить список доступных алгоритмов шифрования используйте следующую команду:
Следующие алгоритмы и режимы шифрования доступны для использования с OpenVPN. Каждый показанный здесь шифр может использоваться в качестве параметра опции --cipher. Размер ключа по умолчанию отображается независимо от того, может ли он быть изменен с помощью директивы --keysize. Рекомендуется использовать режим CBC. В режиме статического ключа допускается только режим CBC:
[…]
BF-CBC 128 bit default key (variable)
BF-CFB 128 bit default key (variable) (TLS client/server mode)
BF-OFB 128 bit default key (variable) (TLS client/server mode)
[…]
AES-128-CBC 128 bit default key (fixed)
AES-128-OFB 128 bit default key (fixed) (TLS client/server mode)
AES-128-CFB 128 bit default key (fixed) (TLS client/server mode)
AES-192-CBC 192 bit default key (fixed)
AES-192-OFB 192 bit default key (fixed) (TLS client/server mode)
AES-192-CFB 192 bit default key (fixed) (TLS client/server mode)
AES-256-CBC 256 bit default key (fixed)
AES-256-OFB 256 bit default key (fixed) (TLS client/server mode)
AES-256-CFB 256 bit default key (fixed) (TLS client/server mode)
[…]
В этом выводе показаны только наиболее часто используемые шифры. Список доступных шифров снова зависит от точной версии базовой библиотеки шифрования. Однако в большинстве случаев должны быть доступны шифры Blowfish (BF-*) и AES (AES-*).
Точно так же для алгоритмов аутентификации (HMAC-подписи) мы используем следующую команду, чтобы перечислить все доступные параметры:
Следующие дайджесты сообщений доступны для использования с OpenVPN. Дайджест сообщения используется вместе с функцией HMAC для аутентификации полученных пакетов. Вы можете указать дайджест сообщения в качестве параметра опции --auth:
[…]
SHA 160 bit digest size
SHA1 160 bit digest size
[…]
ecdsa-with-SHA1 160 bit digest size
[…]
SHA256 256 bit digest size
SHA384 384 bit digest size
SHA512 512 bit digest size
SHA224 224 bit digest size
В этом выводе показаны только наиболее часто используемые дайджесты или алгоритмы хеширования. Список доступных дайджестов зависит от точной версии базовой библиотеки шифрования. В большинстве случаев должны быть доступны алгоритмы хэширования семейства SHA-1 и SHA-2.
Начиная с OpenVPN 2.3, добавлена поддержка новой библиотеки SSL. Библиотека PolarSSL (http://polarssl.org) может быть скомпилирована вместо библиотеки OpenSSL по умолчанию. Основная причина добавления второй библиотеки состояла в том, чтобы обеспечить независимость лежащих в основе библиотек шифрования и гарантировать, что никаких проблем с авторским правом не возникнет, поскольку лицензия на авторские права OpenSSL отличается от той, которую использует OpenVPN.
Резюме
В этой главе мы начали с объяснения что такое VPN. Затем обсудили некоторые примеры различных типов протоколов VPN, включая PPTP, IPSec и OpenVPN. После краткого обзора истории OpenVPN мы приступили к более глубокому погружению в методы, используемые в OpenVPN. Эти методы включают адаптер tun/tap и используемые алгоритмы шифрования и подписывания пакетов.
После этого знакомства с VPN и самим OpenVPN пришло время узнать больше об OpenVPN. В следующей главе мы начнем с самого простого метода использования OpenVPN — режима «точка-точка» с использованием предустановленных общих ключей. По мере продвижения по этой книге вы получите более глубокие знания о том, как использовать OpenVPN в самых разных конфигурациях.
OpenVPN — это свободная реализация технолгии частной сети (VPN) с открытым исходым кодом, созданная, Джеймсом Йонаном. Она позволяет устанавливать защищённые соединения между компьютерами, находящимися за NAT и сетевыми экранами, без необходимости изменения их настроек. OpenVPN использует шифрование и аутентификацию для обеспечения конфиденциальности и целостности данных. Программа доступна для различных операционных систем, включая Android, iOS, Linux, macOS, Windows и другие.
Установка OpenVPN и Easy-RSA
Easy-RSA — это набор скриптов и утилит, предназначенных для управления инфраструктурой открытых ключей (PKI) и центрами сертификации (CA) в контексте настройки виртуальных частных сетей (VPN), в частности, OpenVPN. Он используется для генерации, управления и отзыва сертификатов серверов и клиентов VPN. Easy-RSA облегчает процесс создания и управления сертификатами, делая его более автоматизированным и безопасным.
Создадим новую директорию
Далее создадим символическую ссылку
Также можно скопировать файлы пакета
Создание PKI
Для инициализации PKI директории с помощью утилиты easyrsa выполним следующий шаги:
Перейдем в созданную дерикторию easy-rsa
Выполним команду для инициализации PKI директории
Далее переходим в каталог /etc/openvpn/easy-rsa/pki/ и создаем файл vars
В открытый файл добавляем следующие строки:
set_var EASYRSA "$PWD"
set_var EASYRSA_PKI "$EASYRSA/pki"
set_var EASYRSA_DN "cn_only"
set_var EASYRSA_REQ_COUNTRY "RU"
set_var EASYRSA_REQ_PROVINCE "Moscow"
set_var EASYRSA_REQ_CITY "Moscow"
set_var EASYRSA_REQ_ORG "MyOrg"
set_var EASYRSA_REQ_EMAIL "openvpn@mydomain.net"
set_var EASYRSA_REQ_OU "CA"
set_var EASYRSA_KEY_SIZE 2048
set_var EASYRSA_ALGO rsa
set_var EASYRSA_CA_EXPIRE 7500
set_var EASYRSA_CERT_EXPIRE 365
set_var EASYRSA_NS_SUPPORT "no"
set_var EASYRSA_NS_COMMENT "CERTIFICATE AUTHORITY"
set_var EASYRSA_EXT_DIR "$EASYRSA/x509-types"
set_var EASYRSA_SSL_CONF "$EASYRSA/openss-easyrsa.cnf"
set_var EASYRSA_DIGEST "sha256"
Cоздадим сертификаты CA и сервера
Перейдем в директорию /etc/openvpn/easy-rsa
И создадим CA сертификат
Важно! При создании CA-сертификата скрипт запросит ввод пароля минимум из 4 символов. Введенный пароль нужно запомнить.
Теперь создадим ключ сертификата сервера
Скопируем полученый ключ в /etc/openvpn/
И подпишем его
Cкрипт поинтересуется в нашей уверенности, отвечаем “Yes”. Затем запросит пароль, который был указан при создании CA-сертификата.
Проверим, подписался ли сертификат:
Скопируем подписанный сертификат
Создадим сертификат Диффи-Хеллман.
Протокол Диффи — Хеллмана — это криптографический метод, который позволяет двум или более сторонам создать общий секретный ключ, обмениваясь информацией по незащищённому каналу связи. Этот ключ может быть использован для шифрования и расшифровки сообщений с помощью симметричных алгоритмов.
В основе протокола лежит идея неполного обмена ключами, предложенная Ральфом Мерклом и реализованная Диффи и Хеллманом. Каждый участник генерирует свой закрытый ключ и использует его вместе с открытыми параметрами для вычисления открытого ключа. Затем участники обмениваются открытыми ключами и используют их вместе со своими закрытыми ключами и общими параметрами для вычисления общего секретного ключа.
Протокол Диффи — Хеллмана применяется в различных областях, включая VPN, SSH, TLS и другие протоколы защищённой коммуникации. Он обеспечивает безопасный обмен ключами между сторонами, не требуя предварительного обмена ключами или доверенной третьей стороны.#
Cоздан файл dh.pem, а нам нужен dh2048.pem. Переименуем его при копировании
В качестве дополнительного уровня безопасности мы добавим дополнительный общий секретный ключ, который будет использовать сервер и все клиенты
Создадим дополнительный ключ сервера ta.key:
Скопируем дополнительный ключ
Создание пользовательского сертификата
Создадим каталог client
Процесс создания пользовательского сертификата идентичен созданию сертификата сервера
Можно создать пользовательский сертификат с паролем
Далее подпишем пользовательский сертификат
ВАЖНО! При подписании пользовательских сертификатов необходимо убедиться, что CommonName уникален для каждого сертификата. В противном случае, при подключении клиента с сертификатом с неуникальным CommonName другие клиенты могут потерять доступ к сети Интернет.
Проверим подпись сертификата
Скопируем CA сертификат (ca.crt), пользовательский сертификат (ligtech.crt), пользовательский ключ (ligtech.key) и дополнительный ключ сервера ta.key в каталог client (ca.crt скопируем еще в /etc/openvpn/)
Cкопируем файл server.conf
Отредактируем файл server.conf, в большинстве случаев вам придется раскомментировать нужные строки или убедиться в их наличии. Опции указаны в порядке их следования в файле:
;local a.b.c.d
port 1194
;proto tcp
proto udp
;dev tap
dev tun
;dev-node MyTap
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
dh dh2048.pem
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
;server-bridge
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
;learn-address ./script
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 1.1.1.1"
;client-to-client
;duplicate-cn
keepalive 10 120
tls-auth ta.key 0 # This file is secret
cipher AES-256-CBC
;compress lz4-v2
;push "compress lz4-v2"
comp-lzo
;max-clients 100
user openvpn
group openvpn
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
log-append /var/log/openvpn/openvpn.log
verb 4
;mute 20
explicit-exit-notify 1
Настраиваем маршрутизацию
Чтобы настроить параметры IP-передачи сервера OpenVPN, отличные от стандартных, вам потребуется открыть файл и добавить следующую строку в конец файла:
/etc/sysctl.conf.
net.ipv4.ip_forward = 1
Сохраните файл и закройте его после завершения.
Чтобы прочитать файл и загрузить значения для текущей сессии, введите:
Output
net.ipv4.ip_forward = 1
Ваш сервер OpenVPN теперь способен перенаправлять входящий трафик с одного сетевого устройства на другое. Это означает, что сервер может направлять трафик от клиентов, подключённых к виртуальному интерфейсу VPN, на другие физические сетевые устройства.
Благодаря этой конфигурации весь ваш веб-трафик будет проходить через IP-адрес вашего сервера, при этом открытый IP-адрес вашего клиента будет скрыт.
Далее необходимо настроить правила брандмауэра для обеспечения корректной передачи входящего и исходящего трафика на вашем сервере OpenVPN.
Настройка брандмауэра
Строка после слова «dev» в этой команде — это ваш публичный интерфейс. Например, в этом результате показан интерфейс с именем eth0
Разрешим UFW перенаправление пакетов по умолчанию. Для этого откройте файл /etc/default/ufw
Найдите в файле строку DEFAULT_FORWARD_POLICY и измените значение с DROP на ACCEPT:
Далее добавляем конфигурацию в /etc/ufw/before.rules
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0 (change to the interface you discovered!)
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES
Перечисленные в файле
before.rules, считываются и активируются до загрузки обычных правил UFW. Добавьте в верхнюю часть файла выделенные ниже строки. После этого будет задана политика по умолчанию
Откроем трафик UDP на порту 1194
После добавления правил отключите и заново включите UFW, чтобы загрузить изменения из всех измененных файлов:
Запуск OpenVPN
Активируем службу
Запустим службу
Проверим, что служба работает
