Инструменты пользователя

Инструменты сайта


openvpn

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

openvpn [2018/07/16 10:31]
openvpn [2020/06/13 13:46] (текущий)
Строка 1: Строка 1:
 +====== Настройка и использование сервера OpenVPN ======
 +
 +~~Title: OpenVPN руководство и видео ~~
 +{{htmlmetatags>
 +metatag-description=(Когда лучше использовать OpenVPN сервер. Практические примеры настройки OpenVPN. Описание и использование клиентов OpenVPN. Настройка OpenVPN windows.)
 +}}
 +
 +
 +====== Что такое OpenVPN? ======
 +
 +{{ :openvpn-_pfsense-mikrotik.jpg?nolink&400 |}}
 +
 +
 +  * Homepage: [[http://openvpn.net/index.php/open-source.html|OpenVPN Community Software]]
 +
 +
 +
 +**OpenVPN** — это приложение для создания безопасного IP-туннеля через единый [[UDP]]- или [[TCP]]-порт 1194. Для обеспечения безопасности управляющего канала и потока данных, OpenVPN использует библиотеку OpenSSL (точнее протоколы SSLv3/TLSv1) т.е. доступны все возможности шифрования, аутентификации и сертификации библиотеки OpenSSL (любой шифр, размер ключа). Также может использоваться пакетная авторизация [[HMAC]], для обеспечения большей безопасности, и **аппаратное ускорение** для улучшения производительности шифрования.
 +
 +OpenVPN используется на Solaris, OpenBSD, FreeBSD, NetBSD, GNU/Linux, Apple Mac OS X и Microsoft Windows.
 + 
 +
 +  * **OpenVPN предлагает пользователю несколько видов аутентификации:**
 +  - Предустановленный ключ, — самый простой метод.
 +  - Сертификатная [[аутентификация]], — наиболее гибкий в настройках метод.
 +  - С помощью логина и пароля, — может использоваться без создания клиентского сертификата (серверный сертификат все равно нужен).
 +
 +OpenVPN может использовать статические, предустановленные ключи или обмен динамическими ключами на основе [[TLS]]. Он также поддерживает соединения VPN с динамическими удалёнными узлами (DHCP или клиенты dial-up), туннели поверх [[NAT]] или через полноценный межсетевой экран (например, [[iptables]] в Linux).
 +
 +**Настройки конфигурационного файла клиента идентичны по синтаксису и написанию как для Linux, так и для Windows.**
 +
 +===== Компоненты сети OpenVPN =====
 +
 +{{ :what-is-openvpn.jpg?nolink&400 |}}
 +
 +Основные компоненты сети 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]]**.
 +===== 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) и асимметричную криптографию.
 +
 +Нужно осознавать, что расшифрование данных без наличия приватного ключа тоже возможно, например, методом последовательного перебора. Хотя такой метод и требует больших вычислительных ресурсов, это только вопрос времени, когда данные смогут быть расшифрованы. 
 +
 +Хотя размер ключа влияет на сложность расшифрования, никакой ключ не дает гарантии полной безопасности данных. Кроме того, существует возможность похищения уже расшифрованных данных и ключей за счет уязвимостей и закладок в операционной системе или прикладном ПО, а также в аппаратном обеспечении серверов и рабочих станций.
 +
 +Шифрование данных увеличивает трафик и замедляет обмен данными. Чем больше длина ключа, применяемого для шифрования данных, тем труднее будет его подобрать, но и тем заметнее получится замедление обмена данными.
 +
 +
 +
 +====== ШАГ 0: Постановка задачи структура сетей под управлением OpenVPN ======
 +
 +**Задача:**
 +  - Настроить сервер [[openvpn#chto_takoe_openvpn|OpenVPN]] Ubuntu 18.04.4 LTS в облаке. Выбор Linux сервера для OpenVPN: Облачная технология от  [[digitalocean.com|DigitalOcean]], Цена виртуального сервера 5 долларов в месяц. Колокейшн (дата-центр) выбран Амстердам, прекрасная связь с Украиной в этом центре.
 +  - Создать [[openvpn#instrukcija_po_upravleniju_sertifikatami_kljuchami_klientov_openvpn|простую инструкцию]] для подчиненного сисадмина по управлению сертификатами/ключами: создание, удаление и отзыв сертификатов клиентов OpenVPN
 +Предоставить доступ удаленным сотрудникам к локальным сетям для работы с бухгалтерским программным обеспечением и для просмотра видеокамер наблюдения.
 +**Подключаемые удаленные офисы:**
 +  - Офис Московский: 4 локальных сети со шлюзом под управлением Debian GNU/Linux 7.11 (wheezy)
 +  - Офис Данилевского: 1 локальная сеть шлюз MikroTik
 +  - Офис Гагарина 1: 1 локальная сеть
 +  - Офис Гагарина 2: 1 локальная сеть шлюз [[mikrotik|MikroTik RB2011UiAS-2HnD-IN]]
 +**Клиенты:**
 +  - Мобильные клиенты на Android
 +  - Удаленные клиенты Windows 10
 +===== Инструкция по управлению сертификатами/ключами клиентов OPenVPN =====
 +Создание нового сертификата пользователя, под правами обычного пользователя (не root).
 +
 +  * Шаг 1: создание сертификата пользователя
 +<file bash>
 +cd ~/openvpn-ca
 +source vars
 +./build-key zabbix
 +</file>
 +
 +  * Шаг 2: создания ovpn файла для программы клиента. Этот файл должен быть передан пользователю, для настройки его клиента
 +
 +<file bash>
 +cd ~/client-configs
 +./make_config.sh zabbix
 +</file>
 +  * Шаг 3: При необходимости создаем ccd файл, с дополнительными настройками. Например вы хотите клиенту разрешить доступ к локальным сетям за другим клиентом OpenVPN:
 +<file bash>
 +cp /etc/openvpn/ccd/base.client /etc/openvpn/ccd/zabbix
 +</file>Шаблон base.client содержит комментированные строки такого содержания
 +<file bash base.client>
 +$ cat base.client
 +
 +#ifconfig-push 10.8.0.21 10.8.0.22
 +#push "route 192.168.35.0 255.255.255.0"
 +#push "route 192.168.22.0 255.255.255.0"
 +#push "route 10.90.91.0 255.255.255.0"
 +#iroute 192.168.35.0 255.255.255.0
 +#iroute 192.168.22.0 255.255.255.0
 +#iroute 10.90.91.0 255.255.255.0
 +# all trafic to VPN
 +#push "redirect-gateway def1 bypass-dhcp"
 +#push "dhcp-option DNS 208.67.222.222"
 +#push "dhcp-option DNS 208.67.220.220"
 +</file>
 +
 +**Для отзыва дополнительных сертификатов выполните следующие шаги:**
 +
 +  - Сгенерируйте новый список отозванных сертификатов используя команду source vars в директории ~/openvpn-ca и выполняя команду revoke-full с именем клиента.
 +  - Скопируйте новый список отозванных сертификатов в директорию /etc/openvpn перезаписав тем самым старый список.
 +  - Перезапустите сервис OpenVPN.
 +====== ШАГ 1: ВИДЕО Настройка сетевой конфигурации Linux для OpenVPN: iptables/UFW, ядро Linux ======
 +Настройка сетевой конфигурации Linux - сервера для безопасной работы сервера OpenVPN: iptables/UFW, ядро Linux.
 +
 +
 +Делаем первичную настройку [[https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04|безопасности Ubuntu 18.04]]. Iptables при помощи [[ufw|ufw]] разрешаем только SSH.
 +
 +**Многим удобнее смотреть, чем читать. Ниже видео версия этого руководства. Настоятельно рекомендую руководство прочитать!**
 +
 +{{youtube>EmJ-gaPI8lU?medium}}
 +
 +
 +===== Общие рекомендации по настройки безопасного сервера OpenVPN =====
 +
 +  * Используйте proto udp, потому что он по сравнению с TCP обеспечивает более надежную защиту от DoS-атак и сканирования портов.
 +  * Используйте [[HMAC]]
 +  * Запускайте демон OpenVPN сервера от имени непривилегированного пользователя: user nobody group nobody
 +
 +===== Настройка перенаправления IP пакетов в ядре Linux сервера =====
 +Необходимо настроить сетевую конфигурацию сервера, чтобы OpenVPN мог корректно перенаправлять трафик. Инструкция применима для операционных систем на базе Linux ядра: Debian, Ubuntu, CentOS и т.д..
 +
 +Разрешим серверу перенаправлять трафик, настройка производится в файле /etc/sysctl.conf:<file bash>
 +sudo nano /etc/sysctl.conf
 +</file>
 +Найдите строку настройки net.ipv4.ip_forward. Удалите “#” из начала строки, чтобы раскомментировать её.
 +Для применения настроек к текущей сессии наберите команду:<file bash>
 +sudo sysctl -p
 +</file>
 +
 +
 +
 +===== Настройка фаервола для сервера OpenVPN =====
 +
 +В общем случае для корректной работы сервера OpenVPN вы должны открыть входящий порт для клиентов и включить [[NAT]] Маскарадинг (Masquerading) преобразование, если вы весь трафик клиента, хотите маршрутизировать через VPN.
 +
 +В моей практике, чаще встречается конфигурация, когда клиентам нужно дать доступ только к локальным сетям, а весь основной трафик идет через обычного провайдер. В этом случае NAT настраивать не надо.
 +==== Настройка iptables для OpenVPN ====
 +
 +**Firewall iptables:**
 +Открываем [[UDP]] порт 1194 и разрешаем пакеты приходящие с интерфейса [[tap]] или tun.<file>
 +iptables -A INPUT -p udp --dport 1194 -j ACCEPT
 +iptables -A INPUT -i tap+ -j ACCEPT
 +or
 +iptables -A INPUT -i tun+ -j ACCEPT
 +# для динамического IP
 +iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
 +</file>
 +  * [[iptables#iptables_nat|Настройка iptables и NAT]]
 +
 +==== Настройка UFW (iptables) для OpenVPN ====
 +
 +Если вы используете надстройку над iptables [[UFW|UFW]], выполните нижеприведенные действия.
 +
 +Найдите публичный интерфейс сети (public network interface). Для этого наберите команду:
 +<file bash>
 +ip route | grep default
 +</file>Публичный интерфейс должен следовать за словом "dev".
 +Зная название интерфейса откроем файл /etc/ufw/before.rules и добавим туда соответствующие настройки:
 +<file bash>
 +sudo nano /etc/ufw/before.rules
 +</file>
 +Это файл содержит настройки UFW, которое применяются перед применением правил UFW. Добавьте в начало файла выделенные красным строки. Это настроит правила, применяемые по умолчанию, к цепочке POSTROUTING в таблице nat.
 +<note warning>Не забудьте заменить eth0 в строке -A POSTROUTING на имя интерфейса, найденное нами ранее.</note>
 +
 +<file bash>
 +#
 +# rules.before
 +#
 +# Rules that should be run before the ufw command line added rules. Custom
 +# rules should be added to one of these chains:
 +#   ufw-before-input
 +#   ufw-before-output
 +#   ufw-before-forward
 +#
 +
 +# START OPENVPN RULES
 +# NAT table rules
 +*nat
 +:POSTROUTING ACCEPT [0:0] 
 +# Allow traffic from OpenVPN client to eth0
 +-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
 +COMMIT
 +# END OPENVPN RULES
 +
 +# Don't delete these required lines, otherwise there will be errors
 +*filter
 +. . .
 +</file>
 +
 +Теперь мы должны сообщить UFW, что ему по умолчанию необходимо разрешать перенаправленные пакеты. Для этого откройте файл /etc/default/ufw. Найдите в файле директиву DEFAULT_FORWARD_POLICY. Мы изменим значение с DROP на ACCEPT:
 +<file bash>
 +DEFAULT_FORWARD_POLICY="ACCEPT"
 +</file>
 +
 +Далее настроим сам файрвол для разрешения трафика в OpenVPN.
 +
 +Если вы не меняли порт и протокол в файле /etc/openvpn/server.conf, вам необходимо разрешить трафик UDP для порта 1194. Если вы изменили эти настройки, введите указанные вами значения.
 +<file bash>
 +sudo ufw allow 1194/udp
 +</file>
 +Теперь деактивируем и активируем UFW для применения внесённых изменений:
 +<file bash>
 +sudo ufw disable
 +sudo ufw enable
 +</file>
 +====== Шаг 2: Установка OpenVPN Ubuntu ======
 +
 +Сначала установим OpenVPN на наш сервер. OpenVPN доступен в стандартных репозиториях Ubuntu, мы можем использовать apt для его установки. Также мы установим пакет easy-rsa, который позволит нам настроить наш собственный внутренний центр сертификации (certificate authority, CA) для использования с нашей VPN.
 +
 +Обновим список пакетов сервера и установим необходимые пакеты следующими командами:
 +<file bash>
 +sudo apt update
 +sudo apt full-upgrade
 +sudo apt install openvpn easy-rsa
 +</file>
 +
 +====== Шаг 3: Создание директории центра сертификации ======
 +
 +
 +OpenVPN это виртуальная частная сеть, использующая TLS/SSL. Это означает, что OpenVPN использует сертификаты для шифрования трафика между сервером и клиентами. Для выпуска доверенных сертификатов (trusted certificates) нам потребуется создать наш собственный центр сертификации.
 +
 +**Первый вариант копирования файлов easy-rsa**
 +<file>
 +cp -r /usr/share/easy-rsa  /etc/openvpn/
 +cd /etc/openvpn/easy-rsa
 +</file>
 +Но я буду использовать **второй вариант копирования файлов easy-rsa**
 +Для начала скопируем шаблонную директорию easy-rsa в нашу домашнюю директорию с помощью команды make-cadir:
 +
 +<file bash>
 +make-cadir ~/openvpn-ca
 +</file>
 +
 +
 +====== Шаг 4: Настройка переменных EasyRSA и построение CA ======
 +Откройте на компьютере CA каталог EasyRSA, для этого перейдем в директорию openvpn-ca для начала настройки центра сертификации:
 +
 +<file bash>
 +cd ~/openvpn-ca
 +</file>
 +
 +В этом каталоге есть файл с именем vars, создайте его копию.
 +
 +<file bash>
 +cp vars vars.original
 +</file>
 +
 +Для настройки переменных нашего центра сертификации нам необходимо отредактировать файл vars. Откройте этот файл в вашем текстовом редакторе:
 +
 +<file bash>
 +nano vars
 +</file>
 +Внутри файла вы найдёте переменные, которые можно отредактировать, и которые задают параметры сертификатов при их создании. Нам нужно изменить всего несколько переменных.
 +
 +Чтобы в дальнейшем, при создании сертификатов, не появлялась ошибка про отсутствие файла openssl.cnf, вы можете пойти двумя путями. Первый просто переименовать нужный файл.<file bash>
 +cp openssl-1.0.0.cnf openssl.cnf
 +</file>И  второй путь, отредактировать в файле vars параметр export KEY_CONFIG:<file>
 +# This variable should point to
 +# the openssl.cnf file included
 +# with easy-rsa.
 +#export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
 +export KEY_CONFIG=$EASY_RSA/openssl-1.0.0.cnf
 +
 +</file>
 +
 +
 +Перейдите ближе к концу файла и найдите настройки полей, используемые по умолчанию при создании сертификатов. Они должны выглядеть примерно так:
 +
 +<file bash>
 +~/openvpn-ca/vars
 +. . .
 +
 +export KEY_COUNTRY="US"
 +export KEY_PROVINCE="CA"
 +export KEY_CITY="SanFrancisco"
 +export KEY_ORG="Fort-Funston"
 +export KEY_EMAIL="me@myhost.mydomain"
 +export KEY_OU="MyOrganizationalUnit"
 +
 +. . .
 +</file>
 +Замените значения, на что-нибудь другое, не оставляйте их не заполненными:
 +
 +<file bash>
 +~/openvpn-ca/vars
 +. . .
 +
 +export KEY_COUNTRY="UA"
 +export KEY_PROVINCE="NY"
 +export KEY_CITY="Kharkiv"
 +export KEY_ORG="Mirax"
 +export KEY_EMAIL="darkfire@example.com"
 +export KEY_OU="MyPersonal"
 +
 +. . .
 +</file>
 +
 +Отредактируйте значение KEY_NAME чуть ниже, которое заполняет поле субъекта сертификатов. Проще всего задать ему имя server, потому что в документации примеры конфигов сервера OpenVPN используют это имя:
 +
 +<file bash>
 +~/openvpn-ca/vars
 +export KEY_NAME="server"
 +</file>
 +
 +Сохраните и закройте файл.
 +
 +====== Шаг 5: Создание центра сертификации ======
 +
 +Теперь мы можем использовать заданные нами переменные и утилиты easy-rsa для создания центра сертификации.
 +
 +Убедитесь, что вы находитесь в директории центра сертификации и используйте команду source к файлу vars:
 +
 +<file>
 +cd ~/openvpn-ca
 +source vars
 +</file>
 +Вы должны увидеть следующий вывод:
 +
 +Вывод
 +<file>
 +NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/sammy/openvpn-ca/keys
 +</file>Возможно вам нужно будет переименовать файл:
 +<file bash>
 +cp openssl-1.0.0.cnf openssl.cnf
 +</file>
 +Убедимся, что мы работаем в “чистой среде” выполнив следующую команду:
 +
 +<file>
 +./clean-all
 +</file>
 +Теперь мы можем создать наш корневой центр сертификации командой:
 +
 +<file>
 +./build-ca
 +</file>
 +Эта команда запустит процесс создания ключа и сертификата корневого центра сертификации. Поскольку мы задали все переменные в файле vars, все необходимые значения будут введены автоматически. Нажимайте ENTER для подтверждения выбора:
 +
 +В результате будет создан центр сертификации и два важных файла, ca.crt и ca.key, представляющие открытую и закрытую части сертификата SSL. <note tip>Подробнее о ключах и сертификатах читать здесь: [[openvpn#kakie_ssl_sertifikaty_kljuchi_ispolzuet_openvpn_gde_kljuchi_openvpn_dolzhny_razmeschatsja|Какие SSL сертификаты, ключи использует OpenVPN? Где ключи OpenVPN должны размещаться?]]</note>
 +
 +Теперь у нас есть центр сертификации, который мы сможем использовать для создания всех остальных необходимых нам файлов.
 +
 +Теперь ваш центр сертификации установлен и готов подписывать запросы сертификатов.
 +
 +====== Шаг 6: Создание сертификата сервера, ключа и файлов шифрования ======
 +Далее создадим сертификат, пару ключей и некоторые дополнительные файлы, используемые для осуществления шифрования, для нашего сервера.
 +
 +Начнём с создания сертификата OpenVPN и ключей для сервера. Это можно сделать следующей командой:
 +
 +Внимание: Если ранее вы выбрали имя, отличное от server, вам придётся немного изменить некоторые инструкции. Например, при копировании созданных файлов в директорию /etc/openvpn вам придётся заменить имена на заданные вами. Вам также придётся изменить файл /etc/openvpn/server.conf для того, чтобы он указывал на корректные .crt и .key файлы.
 +
 +<file>
 +./build-key-server server
 +</file>
 +Вывод опять будет содержать значения по умолчанию, переданные этой команде (server), а также значения из файла vars.
 +
 +Согласитесь со всеми значениями по умолчанию, нажимая ENTER. Не задавайте challenge password. В конце процесса два раза введите y для подписи и подтверждения создания сертификата:
 +
 +Вывод
 +<file>
 +. . .
 +
 +Certificate is to be certified until May  1 17:51:16 2026 GMT (3650 days)
 +Sign the certificate? [y/n]:y
 +
 +
 +1 out of 1 certificate requests certified, commit? [y/n]y
 +Write out database with 1 new entries
 +Data Base Updated
 +</file>
 +Далее создадим оставшиеся файлы. Мы можем сгенерировать сильные ключи протокола Диффи-Хеллмана, используемые при обмене ключами, командой:
 +
 +<file>
 +./build-dh
 +</file>
 +Для завершения этой команды может потребоваться несколько минут.
 +
 +Далее мы можем сгенерировать подпись HMAC для усиления способности сервера проверять целостность TSL:
 +
 +<file>
 +openvpn --genkey --secret keys/ta.key
 +</file>
 +
 +====== Шаг 7: Создание сертификата и пары ключей для клиента ======
 +
 +Далее мы можем сгенерировать сертификат и пару ключей для клиента. Вообще это можно сделать и на клиентской машине и затем подписать полученный ключ центром сертификации сервера, но в этой статье для простоты мы сгенерируем подписанный ключ на сервере.
 +
 +В этой статье мы создадим ключ и сертификат только для одного клиента. Если у вас несколько клиентов, вы можете повторять этот процесс сколько угодно раз. Просто каждый раз передавайте уникальное значение скрипту.
 +
 +Поскольку мы можем вернуться к этому шагу позже, мы повторим команду source для файла vars. Мы будем использовать параметр client1 для создания первого сертификата и ключа.
 +
 +Для создания файлов без пароля для облегчения автоматических соединений используйте команду build-key:
 +
 +<file>
 +cd ~/openvpn-ca
 +source vars
 +./build-key client1
 +</file>
 +Для создания файлов, защищённых паролем, используйте команду build-key-pass:
 +
 +<file>
 +cd ~/openvpn-ca
 +source vars
 +./build-key-pass client1
 +</file>
 +В ходе процесса создания файлов все значения по умолчанию будут введены, вы можете нажимать ENTER. **Не задавайте challenge password** и введите y на запросы о подписи и подтверждении создания сертификата.
 +
 +====== Шаг 8: Настройка конфигурационного файла сервера OpenVPN =====
 +
 +Далее настроим конфигурационный файл сервера OpenVPN с использованием созданных ранее файлов.
 +
 +Копирование файлов в директорию OpenVPN. Нам необходимо скопировать нужные нам файлы в директорию /etc/openvpn.
 +
 +Сначала скопируем созданные нами файлы. Они находятся в директории ~/openvpn-ca/keys, в которой они и были созданы. Нам необходимо скопировать сертификат и ключ центра сертификации, сертификат и ключ сервера, подпись HMAC и файл Diffie-Hellman:
 +
 +<file bash>
 +cd ~/openvpn-ca/keys
 +sudo cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn
 +</file>
 +Далее нам необходимо скопировать и распаковать файл-пример конфигурации OpenVPN в конфигурационную директорию, мы будем использовать этот файл в качестве базы для наших настроек:
 +
 +<file bash>
 +gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf
 +</file>
 +
 +Изменения вносимые в скопированный конфигурационный файл /etc/openvpn/server.conf. Приведенные ниже директивы, нужно или добавить или раскомментировать, а директиву cipher заменить.<file>
 +tls-auth ta.key 0
 +key-direction
 +cipher AES-128-CBC
 +auth SHA256
 +user nobody
 +group nogroup
 +</file>
 +
 +**Рабочий конфигурационный файл OpenVPN сервера:**
 +<file bash server.conf>
 +;local a.b.c.d
 +local xxx.xxx.xxx.xxx
 +port 1194
 +proto udp
 +dev tun
 +ca ca.crt
 +cert server.crt
 +key server.key  # This file should be kept secret
 +dh dh2048.pem
 +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.35.0 255.255.255.0"
 +client-config-dir ccd
 +route 192.168.35.0 255.255.255.0
 +route 192.168.22.0 255.255.255.0
 +route 10.90.91.0 255.255.255.0
 +# маршрут передается всем клиентам
 +push "route 192.168.35.0 255.255.255.0"
 +;push "redirect-gateway def1 bypass-dhcp"
 +;push "dhcp-option DNS 208.67.222.222"
 +;push "dhcp-option DNS 208.67.220.220"
 +client-to-client
 +;duplicate-cn
 +keepalive 10 120
 +tls-auth ta.key 0 # This file is secret
 +key-direction 0
 +cipher AES-128-CBC
 +auth SHA256
 +;compress lz4-v2
 +;push "compress lz4-v2"
 +;comp-lzo
 +max-clients 100
 +user nobody
 +group nogroup
 +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 3
 +;mute 20
 +explicit-exit-notify 1
 +</file>
 +
 +====== Шаг 9: Включение и запуск сервиса OpenVPN ======
 +Включим сервис OpenVPN с помощью systemd.
 +
 +При запуске сервера OpenVPN необходимо указать имя нашего файла конфигурации в качестве переменной после имени файла systemd. Файл конфигурации для нашего сервера называется /etc/openvpn/server.conf, поэтому мы добавим @server в конец имени файла при его вызове:
 +
 +<file bash>
 +sudo systemctl start openvpn@server
 +</file>
 +Убедимся, что сервис успешно запущен командой:
 +<file bash>
 +sudo systemctl status openvpn@server
 +</file>
 +Если всё в порядке, настроем сервис на автоматическое включение при загрузке сервера:
 +<file bash>
 +sudo systemctl enable openvpn@server
 +</file>
 +====== Шаг 10: Создание инфраструктуры для конфигурационных файлов клиентов ======
 +Создание структуры директорий для конфигурационных файлов клиентов. В домашней директории создайте структуру директорий для хранения файлов:
 +
 +<file bash>
 +mkdir -p ~/client-configs/files
 +</file>
 +Поскольку наши файлы конфигурации будут содержать клиентские ключи, мы должны настроить права доступа для созданных директорий:
 +
 +<file bash>
 +chmod 700 ~/client-configs/files
 +</file>
 +
 +**Создание базовой конфигурации:**
 +Далее скопируем конфигурацию-пример в нашу директорию для использования в качестве нашей базовой конфигурации:
 +
 +<file bash>
 +cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
 +</file>
 +Откройте этот файл в вашем текстовом редакторе:
 +
 +<file bash>
 +nano ~/client-configs/base.conf
 +</file>
 +Работающий base.conf. Я привел его одинаковым настройкам с сервером, изменил параметры cipher, auth, key-direction. Основное отличие клиентского файла от серверного в директиве client и задании местонахождения сервера OpenVPN, при помощи директивы remote.
 +
 +Если ваш клиент работает на Linux и использует файл /etc/openvpn/update-resolv-conf нужно раскомментировать три нижние строчки. <file>
 +# script-security 2
 +# up /etc/openvpn/update-resolv-conf
 +# down /etc/openvpn/update-resolv-conf
 +</file>
 +
 +<file bash base.conf>
 +client
 +dev tun
 +proto udp
 +;remote xxx.xxx.xxx.xxx 1194
 +remote vpn8.example.net 1194
 +resolv-retry infinite
 +nobind
 +#user nobody
 +#group nogroup
 +persist-key
 +persist-tun
 +#ca ca.crt
 +#cert client.crt
 +#key client.key
 +remote-cert-tls server
 +tls-auth ta.key 1
 +#cipher AES-256-CBC
 +cipher AES-128-CBC
 +auth SHA256
 +#comp-lzo
 +verb 3
 +;mute 20
 +key-direction 1
 +# script-security 2
 +# up /etc/openvpn/update-resolv-conf
 +# down /etc/openvpn/update-resolv-conf
 +</file>
 +====== ШАГ 11: Создание скрипта генерации файлов конфигурации клиента ======
 +
 +Теперь создадим простой скрипт для генерации файлов конфигурации с релевантными сертификатами, ключами и файлами шифрования. Он будет помещать сгенерированные файла конфигурации в директорию ~/client-configs/files.
 +
 +Создайте и откройте файл make_config.sh внутри директории ~/client-configs:
 +
 +<file>
 +nano ~/client-configs/make_config.sh
 +</file>
 +Вставьте следующие текст в этот файл:
 +
 +<file bash make_config.sh>
 +~/client-configs/make_config.sh
 +#!/bin/bash
 +
 +# First argument: Client identifier
 +
 +KEY_DIR=~/openvpn-ca/keys
 +OUTPUT_DIR=~/client-configs/files
 +BASE_CONFIG=~/client-configs/base.conf
 +
 +cat ${BASE_CONFIG} \
 +    <(echo -e '<ca>') \
 +    ${KEY_DIR}/ca.crt \
 +    <(echo -e '</ca>\n<cert>') \
 +    ${KEY_DIR}/${1}.crt \
 +    <(echo -e '</cert>\n<key>') \
 +    ${KEY_DIR}/${1}.key \
 +    <(echo -e '</key>\n<tls-auth>') \
 +    ${KEY_DIR}/ta.key \
 +    <(echo -e '</tls-auth>') \
 +    > ${OUTPUT_DIR}/${1}.ovpn
 +</file>
 +Сохраните и закройте файл.
 +
 +Сделайте его исполняемым файлом командой:
 +
 +<file>
 +chmod 700 ~/client-configs/make_config.sh
 +</file>
 +
 +====== ШАГ 12: Генерация конфигурационных файлов клиентов ======
 +
 +Теперь легко и понятно можно генерировать файлы конфигурации клиентов.
 +
 +Если вы следовали всем шагам этой статьи, вы создали сертификат client1.crt и ключ клиента client1.key командой ./build-key client1 на [[openvpn#shag_7sozdanie_sertifikata_i_pary_kljuchej_dlja_klienta|шаге 7]]. Вы можете сгенерировать конфигурацию для этих файлов перейдя в директорию ~/client-configs и используя только что созданный нами скрипт:
 +
 +<file bash>
 +cd ~/client-configs
 +./make_config.sh client1
 +</file>
 +Если всё прошло успешно, мы должны получить файл client1.ovpn в директории ~/client-configs/files:
 +
 +<file bash>
 +ls ~/client-configs/files
 +
 +client1.ovpn
 +</file>
 +
 +Теперь вы должны скопировать или переместить полученный файл конфигурации на клиентское устройство: на компьютер или смартфон. 
 +====== ШАГ 13: Клиенты OpenVPN для разных ОС Windows, Android, MikroTik, Ubuntu ======
 +
 +  * [[Клиент OpenVPN для Windows]]
 +  * [[mikrotik]]
 +  * [[Клиент OpenVPN для Android]]
 +  * Для Linux проще всего ставить этот же пакет OpenVPN, но настраивать его клиентом.<file bash>
 +aptitude install openvpn
 +</file>Пример рабочего конфига для [[Ubuntu]] 14.04.3 LTS
 +====== ШАГ 14: (Опционально) Директория ccd клиенты OpenVPN ======
 +
 +В директории ccd хранятся индивидуальные настройки для каждого клиента. Имя файла должно соответствовать имени сгенерированного клиентского сертификата. Файлы конфигурации клиентов являются текстовыми файлами и содержат команды, выполняемые сервером при подключении клиентов. Обычно файл клиента содержать команды:
 +  - добавляет клиенту маршрут к локальной подсети центрального офиса(push "route 192.168.1.0 255.255.255.0")
 +  - определяет адрес локальной подсети, находящейся за клиентом (например iroute 192.168.2.0 255.255.255.0)
 +  - привязка к статическому IP (ifconfig-push 192.168.14.21 192.168.14.22), где ifconfig-push <IP-адрес клиента> <IP-адрес сервера>. Выбранные пары IP-адресов, во-первых, должны быть уникальными, во-вторых, должны входить в состав последовательных подсетей, ограниченных маской /30 (255.255.255.252), и, в-третьих, должны находиться в пределах пула IP-адресов, выделенного для виртуальной частной сети (определяется параметром server файла конфигурации сервера OpenVPN). 
 +<file>
 +# mkdir /etc/openvpn/ccd
 +# nano ccd/farm1c
 +push "route 192.168.1.0 255.255.255.0"
 +#push "route 192.168.35.0 255.255.255.0"
 +# static IP
 +ifconfig-push 192.168.14.21 192.168.14.22
 +#iroute 192.168.2.0 255.255.255.0
 +</file>
 +
 +====== Шаг 15: Отзыв клиентских сертификатов ======
 +Сотрудники увольняются и им нужно запретить доступ к VPN. Значит нужно отозвать их сертификат. Команда revoke-full с именем клиента используется для отзыва ssl сертификата OpenVPN.
 +
 +Если нет файла .rnd (это файл генератора псевдослучайных чисел) в каталоге пользователя, от имени которого вы создаете сертификаты, выполните командой: <file>
 +$ cd
 +$ touch .rnd
 +</file>
 +
 +Переходим в директорию центра сертификации и вводим команды:
 +<file bash>
 +$ cd ~/openvpn-ca
 +$ source vars
 +</file>
 +
 +Отзываем сертификат используя команду revoke-full с именем клиента, например client1.
 +
 +<file bash>
 +$ ./revoke-full client1
 +</file>
 +
 +В результате работы будет создан файл crl.pem в директории keys с необходимой для отзыва сертификата информацией.
 +Теперь нужно объяснить серверу OpenvPN, где ему брать информацию об отозванных сертификатах, для этого используется директива crl-verify. Сервер OpenVPN будет проверять список отозванных сертификатов из файла каждый раз crl.pem, когда кто-то устанавливает соединение с сервером. 
 +
 +Копируем crl.pem в каталог. В конце файла /etc/openvpn/server.conf задаем путь через директиву crl-verify
 +<file bash>
 +crl-verify crl.pem
 +</file>
 +Перезапускаем сервер OpenVPN
 +<file>
 +# service openvpn restart
 +</file>Теперь клиент не сможет устанавливать соединение с сервером OpenVPN используя старый сертификат, в логе сервера будет появляться строка о том что сертификат отозван: VERIFY ERROR: depth=0, error=certificate revoked
 +
 +Эта процедуру нужно проделывать для отзыва каждого созданного вами сертификата.
 +
 +
 +
 +====== FAQ OpenVPN ======
 +Frequently Asked Questions OpenVPN. Часто задаваемые вопросы по настройке сервера и клиентов OpenVPN
 +===== Почему OpenVPN не работает через PPPoE  =====
 +
 +**Проблема:** Если сервер подключён к ISP при помощи технологии [[PPPoE]], в этом случае OpenVPN не сможет сделать доступными сети за подключённым клиентом. Не будет отрабатывать команда iroute. Это связано с тем, что PPP прописывает маршрут по умолчанию в таком виде:<file>
 +# netstat -rn
 +Kernel IP routing table              
 +Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
 +0.0.0.0         0.0.0.0         0.0.0.0                 0 0          0 ppp0
 +</file>Т.е. указывается маршрутом по умолчанию интерфейс (ppp0), а не IP адресс, такой записи сервер OpenVPN не понимает, для корректной работы сервера OpenVpn маршрут должен бы вида:<file>
 +# netstat -rn
 +Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
 +0.0.0.0         91.196.96.35    255.255.255.255 UGH       0 0          0 ppp0
 +</file>
 +**Решение:** Исправить маршрут по умолчанию можно командой (соответственно указав нужный вам IP)
 +<file>
 +route add 0/0 gw 91.196.96.35
 +</file>
 +или в скрипте при загрузке системы, но после поднятия интерфейса ppp0
 +<file>
 +route del default
 +route add default gw 91.196.96.35 dev ppp0
 +</file>
 +
 +
 +===== Проблема не работает OpenVPN push dhcp-option + Virtualbox + Dnsmasq =====
 +
 +**Окружение:** Клиент выходит в интернет с [[Ubuntu]] 14.04.3 LTS + [[Dnsmasq]] установленной в [[VirtualBox]]. Сеть установлена в VirtualBox как сетевой мост. IP получается от [[DHCP]] на интернет роутере (Netis WF2419R).
 +
 +**Проблема:** Не работает **push "dhcp-option DNS 10.26.95.254"**. Соответственно все [[DNS]] Dnsmasq отсылает основному DNS серверу. Все бы ничего если бы клиенту не нужны локальные [[DNS]].
 +
 +**Решение:** Был доустановлен основной пакет <file bash>
 +aptitude install dnsmasq
 +</file>добавлены описания наших локальных зон (non-public domains) в конфигурационный файл dnsmasq.conf<file bash>
 +server=/gaga.lan/10.26.95.254
 +server=/m86a.lan/10.26.95.254
 +server=/atlex.lan/10.26.95.254
 +
 +server=/95.26.10.in-addr.arpa/10.26.95.254
 +server=/168.192.in-addr.arpa/10.26.95.254
 +server=/85.161.10.in-addr.arpa/10.26.95.254
 +</file>
 +===== Как настроить ротацию логов OpenVPN =====
 +
 +В файле /etc/logrotate.d/openvpn прописываем настройки для [[logrotate|приложения logrotate]], ключевой параметр **copytruncate** (чтобы не перегружать OpenVPN и заставить его писать данные в тот же лог файл)<file bash openvpn>
 +etc/openvpn/servers/vpnluxor/logs/openvpn.log {
 +        daily
 +        rotate 8
 +        compress
 +        delaycompress
 +        missingok
 +        copytruncate
 +        notifempty
 +        create 640 root
 +}
 +</file>
 +
 +===== Как управлять OpenVPN сертификатами через web интерфейс? =====
 +
 +Для управления сертификатами/клиентами сервера OpenVPN при помощи веб-интерфейса существует не так много программ:
 +
 +  * Модуль на основе Webmin: [[webmin?&#openvpn_admin_module|OpenVpn Admin Module]] + пример настройки OpenVPN Server
 +  * [[https://github.com/deranjer/OpenVPN-PHP-Management-Gui|OpenVPN-PHP-Gui]] MIT License
 +  * [[https://github.com/cyberorg/openvpn-web-gui|Openvpn-web-gui]]
 +  * OpenVPN Access Server платный вариант, требуется покупка лицензии
 +
 +
 +===== Какие SSL сертификаты, ключи использует OpenVPN? Где ключи OpenVPN должны размещаться? =====
 +
 +  * ca.crt — файл открытой части сертификата CA, который используется сервером и клиентом OpenVPN, чтобы информировать друг друга о том, что они входят в единую сеть доверия и что между ними отсутствует потенциальный злоумышленник в качестве посредника. В связи с этим, копия файла ca.crt потребуется для вашего сервера и для всех ваших клиентов.
 +  * ca.key — закрытый ключ CA, используемый для подписания ключей и сертификатов серверов и клиентов. Если злоумышленник получит доступ к CA и файлу ca.key, он сможет подписывать запросы сертификатов и получать доступ к вашей VPN, что нарушит ее безопасность. Поэтому файл ca.key должен храниться только на компьютере CA, и для дополнительной безопасности компьютер CA следует выключать, когда он не используется для подписывания запросов сертификатов.
 +
 +|**Файл** |**Машина** |**Назначение** |**Доступ**|
 +|ca.crt |Сервер и клиенты |Сертификат корневого СА |Публичный|
 +|ca.key |Только на сервере |Необходим для подписи других сертификатов |Секретный|
 +|dh{n}.pem |Только на сервере |Diffie Hellman параметры |Публичный|
 +|vpnspar.crt |Только на сервере |Сертификат сервера |Публичный|
 +|vpnspar.key |Только на сервере |Ключ сервера |Секретный|
 +|darkfire.crt |Только на клиенте |Сертификат клиента |Публичный|
 +|darkfire.key |Только на клиенте |Ключ клиента |Секретный|
 +
 +
 +===== Где взять последнее работающее пошаговое руководство по настройке сервера и клиентов OpenVPN? =====
 +Подборка руководств по настройке сервера и клиентов OpenVPN.
 +
 +В этом разделе приведены как ссылки на мои руководства по настройке OpenVPN, так и на руководства других авторов, которым я доверяю.
 +
 +  * Руководство [[openvpn#shag_0postanovka_zadachi_struktura_setej_pod_upravleniem_openvpn|OpenVPN на Ubuntu 18.04]] актуально на 2020 год
 +  * Руководство [[Настройка сервера OpenVPN на OpenVZ]] - эта связка устарела, купите современный сервер.
 +  * Руководство [[OpenVPN Debian Wheezy]] проверялось в 2018 году.
 +  * Руководство [[https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-16-04|How To Set Up an OpenVPN Server on Ubuntu 16.04]] актуально на 2020 год.
 +===== Как расширить сетевые границ при помощи OpenVPN? Как добавить сети за клиентом OpenVPN? =====
 +Расширение границ VPN для включения дополнительных машин из подсетей на стороне клиента или сервера. Включение нескольких машин на стороне сервера при использовании маршрутизируемого VPN (dev tun)
 +
 +Поскольку VPN действует только в режиме точка-точка, может возникнуть желание расширить границы VPN так, чтобы клиенты могли связываться с другими машинами в сети сервера, а не только с самим сервером.
 +
 +Чтобы проиллюстрировать это примером, предположим, что в локальной сети на стороне сервера используется подсеть 10.66.0.0/24 и для пула VPN-адресов используется 10.8.0.0/24, о чем говорится в директиве server в файле конфигурации OpenVPN-сервера.
 +
 +Во-первых, вы должны сообщить VPN-клиентам, что подсеть 10.66.0.0/24 доступна через VPN. Это легко можно сделать с помощью следующих директив в конфигурационном файле сервера:<file>
 +push "route 10.66.0.0 255.255.255.0"
 +</file>
 +
 +Далее, необходимо настроить на LAN- шлюзе в сети сервера маршрут для маршрутизации пакетов, предназначенных для подсети VPN-клиентов (10.8.0.0/24) через OpenVPN-сервер (это необходимо только тогда, когда сервер OpenVPN и LAN-шлюз -- разные машины).
 +
 +<note warning>Убедитесь, что вы включили [[iptables#nat|пересылку для IP (ip-forwarding)]] (параметр ядра net.ipv4.ip_forward должен быть равен 1) и TUN/TAP на машине OpenVPN-сервера.</note>
 +
 +===== Как настроить VPN соединение для всего своего трафика? =====
 +Проталкивание изменений DNS для перенаправления всего трафика через VPN.
 +
 +Сделанные нами настройки создают VPN соединение между двумя машинами, но они не заставляют эти машины использовать VPN соединение. Если вы хотите использовать VPN соединение для всего своего трафика, вам необходимо протолкнуть (push) настройки DNS на клиентские машины.
 +
 +Для этого вам необходимо раскомментировать несколько директив. Найдите секцию redirect-gateway и удалите “;” из начала строки для расскоментирования redirect-gateway:
 +
 +/etc/openvpn/server.conf
 +<file>
 +push "redirect-gateway def1 bypass-dhcp"
 +</file>
 +Чуть ниже находится секция dhcp-option. Удалите “;” для обеих строк:
 +
 +/etc/openvpn/server.conf
 +<file>
 +push "dhcp-option DNS 208.67.222.222"
 +push "dhcp-option DNS 208.67.220.220"
 +</file>
 +Это позволит клиентам сконфигурировать свои настройки DNS для использования VPN соединения в качестве основного.
 +
 +===== Как настроить автозапуск клиента openvpn windows 10? =====
 +Для автоматическое подключение ovpn, нужно изменить ярлык на рабочем столе:
 +<file>
 +openvpn-gui.exe --connect myprofile.ovpn
 +</file>
 +Для автоматического запуска такого файла поместите его в автозагрузку, в директории для всех пользователей, %ProgramData%\Microsoft\Windows\Start Menu\Programs\Startup; или для конкретного пользователя, %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup.)
 +
 +<note tip>Или используйте руководство [[windows#avtozagruzka_programm_windows_10|Автозагрузка программ Windows 10]].</note>