В интернете много статей как поднять OpenVpn за 5 минут. Да, действительно сервер OpenVPN можно поднять быстро. Но моя статья показывает, сколько всего остается за кадром, если устанавливать OpenVPN без понимания как он в действительности работает. И стремясь все сделать быстро - вы сможете столкнуться как с проблемой безопасности, так и с тем что не сможете подключить все свои устройства к вашему пятиминутному OpenVpn.
Вы после установки по мануалу "пятиминутного" OpenVPN, прочекайте его конфигурационный файл согласно этому руководству, что же Вы в действительности установили.
— Dmytro Yakovenko статья обновлена 2023/09/10
OpenVPN — это приложение для создания безопасного IP-туннеля через единый UDP- или Порты TCP. Что такое TCP / IP порт-порт 1194. Для обеспечения безопасности управляющего канала и потока данных, OpenVPN использует библиотеку OpenSSL (точнее протоколы SSLv3/TLSv1) т.е. доступны все возможности шифрования, аутентификации и сертификации библиотеки OpenSSL (любой шифр, размер ключа). Также может использоваться пакетная авторизация Алгоритм HMAC для OpenVPN, для обеспечения большей безопасности, и аппаратное ускорение для улучшения производительности шифрования.
OpenVPN используется на Solaris, OpenBSD, FreeBSD, NetBSD, GNU/Linux, Apple Mac OS X и Microsoft Windows.
OpenVPN может использовать статические, предустановленные ключи или обмен динамическими ключами на основе TLS. Он также поддерживает соединения VPN с динамическими удалёнными узлами (DHCP или клиенты dial-up), туннели поверх NAT преобразование сетевых адресов или через полноценный межсетевой экран (например, Руководство по iptables: Настройка и оптимизация фаервола Linux в Linux).
Настройки конфигурационного файла клиента идентичны по синтаксису и написанию как для Linux, так и для Windows.
Приложение OpenVPN распространяется бесплатно, благодаря комьюнити.
Скачать сервер и клиент OpenVPN на странице https://openvpn.net/community-downloads/
В первую очередь нужно арендовать виртуальный сервер VPS/VDS c root-доступом к операционной системе, с постоянным IP- адресом. Если вы собираетесь использовать сервер только в качестве VPN сервера, то вам не нужны дополнительные панели управления, типа ISPmanager, Hestia.
Не все хостинг-провайдеры разрешают использование VPN-серверов, поэтому перед заказом услуги предварительно у техподдержки узнайте разрешают ли они использование VPN сервера.
Рекомендация: если вам нужен доступ доступ к российским сайтам (Яндекс.Директ, Яндекс Почта, Wordstat, Вконтакте, Одноклассники, Mail.ru), то на мой взгляд, стоит выбрать российские сервера, например проверенный Perfect Quality Hosting (PQ). Для тех, кому нужен доступ к заблокированным в Российской Федерации сайтам, нужно арендовать сервер за пределами России, например Список абузоустойчивых хостингов.
Основные компоненты сети 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) и асимметричную криптографию.
Нужно осознавать, что расшифрование данных без наличия приватного ключа тоже возможно, например, методом последовательного перебора. Хотя такой метод и требует больших вычислительных ресурсов, это только вопрос времени, когда данные смогут быть расшифрованы.
Хотя размер ключа влияет на сложность расшифрования, никакой ключ не дает гарантии полной безопасности данных. Кроме того, существует возможность похищения уже расшифрованных данных и ключей за счет уязвимостей и закладок в операционной системе или прикладном ПО, а также в аппаратном обеспечении серверов и рабочих станций.
Шифрование данных увеличивает трафик и замедляет обмен данными. Чем больше длина ключа, применяемого для шифрования данных, тем труднее будет его подобрать, но и тем заметнее получится замедление обмена данными.
Изначально статья писалась для Ubuntu 18.04.4 LTS, также она была протестирована под Ubuntu 22 LTS.
Задача:
Предоставить доступ удаленным сотрудникам к локальным сетям для работы с бухгалтерским программным обеспечением и для просмотра видеокамер наблюдения. Подключаемые удаленные офисы:
Клиенты:
Создание нового сертификата пользователя, под правами обычного пользователя (не root).
cd ~/openvpn-ca source vars ./build-key zabbix
cd ~/client-configs ./make_config.sh zabbix
cp /etc/openvpn/ccd/base.client /etc/openvpn/ccd/zabbix
Шаблон 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"
Для отзыва дополнительных сертификатов выполните следующие шаги.
Настройка сетевой конфигурации Linux - сервера для безопасной работы сервера OpenVPN: iptables/UFW, ядро Linux.
Делаем первичную настройку безопасности Ubuntu. Iptables при помощи ufw разрешаем только SSH.
Многим удобнее смотреть, чем читать. Ниже видео версия этого руководства. Настоятельно рекомендую руководство прочитать!
Необходимо настроить сетевую конфигурацию сервера, чтобы OpenVPN мог корректно перенаправлять трафик. Инструкция применима для операционных систем на базе Linux ядра: Debian, Ubuntu, CentOS и т.д..
Разрешим серверу перенаправлять трафик, настройка производится в файле /etc/sysctl.conf:
sudo nano /etc/sysctl.conf
Найдите строку настройки net.ipv4.ip_forward. Удалите “#” из начала строки, чтобы раскомментировать её. Для применения настроек к текущей сессии наберите команду:
sudo sysctl -p
В общем случае для корректной работы сервера OpenVPN вы должны открыть входящий порт для клиентов и включить NAT преобразование сетевых адресов Маскарадинг (Masquerading) преобразование, если вы весь трафик клиента, хотите маршрутизировать через VPN.
В моей практике, чаще встречается конфигурация, когда клиентам нужно дать доступ только к локальным сетям, а весь основной трафик идет через обычного провайдер. В этом случае NAT настраивать не надо.
Firewall iptables: Открываем UDP порт 1194 и разрешаем пакеты приходящие с интерфейса TUN и TAP или tun.
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
Если вы используете надстройку над iptables UFW, выполните нижеприведенные действия.
Найдите публичный интерфейс сети (public network interface). Для этого наберите команду:
ip route | grep default
Публичный интерфейс должен следовать за словом "dev". Зная название интерфейса откроем файл /etc/ufw/before.rules и добавим туда соответствующие настройки:
sudo nano /etc/ufw/before.rules
Это файл содержит настройки UFW, которое применяются перед применением правил UFW. Добавьте в начало файла выделенные красным строки. Это настроит правила, применяемые по умолчанию, к цепочке POSTROUTING в таблице nat.
# # 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 . . .
Теперь мы должны сообщить UFW, что ему по умолчанию необходимо разрешать перенаправленные пакеты. Для этого откройте файл /etc/default/ufw. Найдите в файле директиву DEFAULT_FORWARD_POLICY. Мы изменим значение с DROP на ACCEPT:
DEFAULT_FORWARD_POLICY="ACCEPT"
Далее настроим сам файрвол для разрешения трафика в OpenVPN.
Если вы не меняли порт и протокол в файле /etc/openvpn/server.conf, вам необходимо разрешить трафик UDP для порта 1194. Если вы изменили эти настройки, введите указанные вами значения.
sudo ufw allow 1194/udp
Теперь деактивируем и активируем UFW для применения внесённых изменений:
sudo ufw disable sudo ufw enable
Сначала установим OpenVPN на наш сервер. OpenVPN доступен в стандартных репозиториях Ubuntu, мы можем использовать apt для его установки. Также мы установим пакет easy-rsa, который позволит нам настроить наш собственный внутренний центр сертификации (certificate authority, CA) для использования с нашей VPN.
Обновим список пакетов сервера и установим необходимые пакеты следующими командами:
sudo apt update sudo apt full-upgrade sudo apt install openvpn wget https://github.com/OpenVPN/easy-rsa-old/archive/refs/heads/master.zip
Эта статья написана easy-rsa версии 2.3.3. В современных дистрибутивах в репозиториях версия 3. Версия 3 очень сильно изменена и не подходит для использования в этой статье.
OpenVPN это виртуальная частная сеть, использующая TLS/SSL. Это означает, что OpenVPN использует сертификаты для шифрования трафика между сервером и клиентами. Для выпуска доверенных сертификатов (trusted certificates) нам потребуется создать наш собственный центр сертификации.
Первый вариант копирования файлов easy-rsa
cp -r /usr/share/easy-rsa /etc/openvpn/ cd /etc/openvpn/easy-rsa
Но я буду использовать второй вариант копирования файлов easy-rsa Для начала скопируем шаблонную директорию easy-rsa в нашу домашнюю директорию с помощью команды make-cadir:
make-cadir ~/openvpn-ca
Откройте на компьютере CA каталог EasyRSA, для этого перейдем в директорию openvpn-ca для начала настройки центра сертификации:
cd ~/openvpn-ca
В этом каталоге есть файл с именем vars, создайте его копию.
cp vars vars.original
Для настройки переменных нашего центра сертификации нам необходимо отредактировать файл vars. Откройте этот файл в вашем текстовом редакторе:
nano vars
Внутри файла вы найдёте переменные, которые можно отредактировать, и которые задают параметры сертификатов при их создании. Нам нужно изменить всего несколько переменных.
Чтобы в дальнейшем, при создании сертификатов, не появлялась ошибка про отсутствие файла openssl.cnf, вы можете пойти двумя путями. Первый просто переименовать нужный файл.
cp openssl-1.0.0.cnf openssl.cnf
И второй путь, отредактировать в файле vars параметр export KEY_CONFIG:
# 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
Перейдите ближе к концу файла и найдите настройки полей, используемые по умолчанию при создании сертификатов. Они должны выглядеть примерно так:
~/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" . . .
Замените значения, на что-нибудь другое, не оставляйте их не заполненными:
~/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" . . .
Отредактируйте значение KEY_NAME чуть ниже, которое заполняет поле субъекта сертификатов. Проще всего задать ему имя server, потому что в документации примеры конфигов сервера OpenVPN используют это имя:
~/openvpn-ca/vars export KEY_NAME="server"
Сохраните и закройте файл.
Теперь мы можем использовать заданные нами переменные и утилиты easy-rsa для создания центра сертификации.
Убедитесь, что вы находитесь в директории центра сертификации и используйте команду source к файлу vars:
cd ~/openvpn-ca source vars
Вы должны увидеть следующий вывод:
Вывод
NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/sammy/openvpn-ca/keys
Возможно вам нужно будет переименовать файл:
cp openssl-1.0.0.cnf openssl.cnf
Убедимся, что мы работаем в “чистой среде” выполнив следующую команду:
./clean-all
Теперь мы можем создать наш корневой центр сертификации командой:
./build-ca
Эта команда запустит процесс создания ключа и сертификата корневого центра сертификации. Поскольку мы задали все переменные в файле vars, все необходимые значения будут введены автоматически. Нажимайте ENTER для подтверждения выбора:
В результате будет создан центр сертификации и два важных файла, ca.crt и ca.key, представляющие открытую и закрытую части сертификата SSL.
Теперь у нас есть центр сертификации, который мы сможем использовать для создания всех остальных необходимых нам файлов.
Теперь ваш центр сертификации установлен и готов подписывать запросы сертификатов.
Далее создадим сертификат, пару ключей и некоторые дополнительные файлы, используемые для осуществления шифрования, для нашего сервера.
Начнём с создания сертификата OpenVPN и ключей для сервера. Это можно сделать следующей командой:
Внимание: Если ранее вы выбрали имя, отличное от server, вам придётся немного изменить некоторые инструкции. Например, при копировании созданных файлов в директорию /etc/openvpn вам придётся заменить имена на заданные вами. Вам также придётся изменить файл /etc/openvpn/server.conf для того, чтобы он указывал на корректные .crt и .key файлы.
./build-key-server server
Вывод опять будет содержать значения по умолчанию, переданные этой команде (server), а также значения из файла vars.
Согласитесь со всеми значениями по умолчанию, нажимая ENTER. Не задавайте challenge password. В конце процесса два раза введите y для подписи и подтверждения создания сертификата:
Вывод
. . . 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
Далее создадим оставшиеся файлы. Мы можем сгенерировать сильные ключи протокола Диффи-Хеллмана, используемые при обмене ключами, командой:
./build-dh
Для завершения этой команды может потребоваться несколько минут.
Далее мы можем сгенерировать подпись HMAC для усиления способности сервера проверять целостность TSL:
openvpn --genkey --secret keys/ta.key
Далее мы можем сгенерировать сертификат и пару ключей для клиента. Вообще это можно сделать и на клиентской машине и затем подписать полученный ключ центром сертификации сервера, но в этой статье для простоты мы сгенерируем подписанный ключ на сервере.
В этой статье мы создадим ключ и сертификат только для одного клиента. Если у вас несколько клиентов, вы можете повторять этот процесс сколько угодно раз. Просто каждый раз передавайте уникальное значение скрипту.
Поскольку мы можем вернуться к этому шагу позже, мы повторим команду source для файла vars. Мы будем использовать параметр client1 для создания первого сертификата и ключа.
Для создания файлов без пароля для облегчения автоматических соединений используйте команду build-key:
cd ~/openvpn-ca source vars ./build-key client1
Для создания файлов, защищённых паролем, используйте команду build-key-pass:
cd ~/openvpn-ca source vars ./build-key-pass client1
В ходе процесса создания файлов все значения по умолчанию будут введены, вы можете нажимать ENTER. Не задавайте challenge password и введите y на запросы о подписи и подтверждении создания сертификата.
Далее настроим конфигурационный файл сервера OpenVPN с использованием созданных ранее файлов.
Копирование файлов в директорию OpenVPN. Нам необходимо скопировать нужные нам файлы в директорию /etc/openvpn.
Сначала скопируем созданные нами файлы. Они находятся в директории ~/openvpn-ca/keys, в которой они и были созданы. Нам необходимо скопировать сертификат и ключ центра сертификации, сертификат и ключ сервера, подпись HMAC и файл Diffie-Hellman:
cd ~/openvpn-ca/keys sudo cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn
Далее нам необходимо скопировать и распаковать файл-пример конфигурации OpenVPN в конфигурационную директорию, мы будем использовать этот файл в качестве базы для наших настроек:
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf
Изменения вносимые в скопированный конфигурационный файл /etc/openvpn/server.conf. Приведенные ниже директивы, нужно или добавить или раскомментировать, а директиву cipher заменить.
tls-auth ta.key 0 key-direction cipher AES-128-CBC auth SHA256 user nobody group nogroup
Рабочий конфигурационный файл OpenVPN сервера:
;local a.b.c.d local xxx.xxx.xxx.xxx # IP на котором сервер слушает входящие сообщения port 1194 # порт на котором сервер слушает входящие сообщения proto udp # Включение интерфейса управления OpenVPN. Доступен при помощи telnet localhost 7505 # management localhost 7505 dev tun ca ca.crt # местонахождение самоподписного доверенного сертификата (CA) cert server.crt # местонахождение сертификата сервера key server.key # местонахождение закрытого ключа сервера dh dh2048.pem # местонахождение файла параметров Диффи-Хэлмана # Настройка режима сервера и адреса VPN-сети, # из которой OpenVPN будет раздавать адреса клиентам. # Сервер возьмет себе 10.8.0.1, # остальные адреса будут доступны для клиентов. # Каждый клиент сможет связаться с сервером по адресу 10.8.0.1. server 10.8.0.0 255.255.255.0 # в файле ipp.txt хранится информация о соединении, например на случай обрыва соединения # и его дальнейшего восстановления 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 - команда OpenVPN, передаваемая клиенту и выполняемая клиентом # (в данном случае добавляем на стороне клиента два маршрута к виртуальной частной сети) push "route 192.168.35.0 255.255.255.0" # указываем где будут хранятся файлы с настройками IP-адресов клиентов client-config-dir ccd # добавляем маршрут сервер-клиент. # route - добавляет на стороне сервера маршруты к локальным подсетям, находящимся за клиентами 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" # Перенаправлять default gateway на vpn-сервер. Если не нужно - закомментировать или # добавить в ccd для конкретного клиента ;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 # разрешить общение клиентов подключенных к серверу OpenVPN общение между собой ;duplicate-cn # Директива проверки работоспособности, включающая отсылку # ping-подобных сообщений туда и обратно через # соединение для того, чтобы каждая сторона знала когда # другая сторона внезапно пропадет (gone down). # Пинг каждые 10 секунд, с предположением, что удаленный # узел недоступен, если не получено на одного пинга за период времени # равный 120 секундам. 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
Включим сервис OpenVPN с помощью systemd.
При запуске сервера OpenVPN необходимо указать имя нашего файла конфигурации в качестве переменной после имени файла systemd. Файл конфигурации для нашего сервера называется /etc/openvpn/server.conf, поэтому мы добавим @server в конец имени файла при его вызове:
sudo systemctl start openvpn@server
Убедимся, что сервис успешно запущен командой:
sudo systemctl status openvpn@server
Если всё в порядке, настроем сервис на автоматическое включение при загрузке сервера:
sudo systemctl enable openvpn@server
Создание структуры директорий для конфигурационных файлов клиентов. В домашней директории создайте структуру директорий для хранения файлов:
mkdir -p ~/client-configs/files
Поскольку наши файлы конфигурации будут содержать клиентские ключи, мы должны настроить права доступа для созданных директорий:
chmod 700 ~/client-configs/files
Создание базовой конфигурации: Далее скопируем конфигурацию-пример в нашу директорию для использования в качестве нашей базовой конфигурации:
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
Откройте этот файл в вашем текстовом редакторе:
nano ~/client-configs/base.conf
Работающий base.conf. Я привел его одинаковым настройкам с сервером, изменил параметры cipher, auth, key-direction. Основное отличие клиентского файла от серверного в директиве client и задании местонахождения сервера OpenVPN, при помощи директивы remote.
Если ваш клиент работает на Linux и использует файл /etc/openvpn/update-resolv-conf нужно раскомментировать три нижние строчки.
# script-security 2 # up /etc/openvpn/update-resolv-conf # down /etc/openvpn/update-resolv-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
Теперь создадим простой скрипт для генерации файлов конфигурации с релевантными сертификатами, ключами и файлами шифрования. Он будет помещать сгенерированные файла конфигурации в директорию ~/client-configs/files.
Создайте и откройте файл make_config.sh внутри директории ~/client-configs:
nano ~/client-configs/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
Сохраните и закройте файл.
Сделайте его исполняемым файлом командой:
chmod 700 ~/client-configs/make_config.sh
Теперь легко и понятно можно генерировать файлы конфигурации клиентов.
Если вы следовали всем шагам этой статьи, вы создали сертификат client1.crt и ключ клиента client1.key командой ./build-key client1 на шаге 7. Вы можете сгенерировать конфигурацию для этих файлов перейдя в директорию ~/client-configs и используя только что созданный нами скрипт:
cd ~/client-configs ./make_config.sh client1
Если всё прошло успешно, мы должны получить файл client1.ovpn в директории ~/client-configs/files:
ls ~/client-configs/files client1.ovpn
Теперь вы должны скопировать или переместить полученный файл конфигурации на клиентское устройство: на компьютер или смартфон.
Для Linux сервера проще всего ставить этот же пакет OpenVPN, но настраивать его клиентом. Запуск OpenVPN клиента в Xfce, KDE.
sudo apt install openvpn
Пример рабочего конфига для Ubuntu 20.04.1 LTS скачиваем файл (с расширением ovpn) созданный на этапе 10. Копируем его в директорию /etc/openvpn клиента (переименовываем расширение):
cp client1.ovpn client1.conf
Тестируем работу клиента:
sudo openvpn --config client1.conf
Если все ОК - настраиваем автозапуск клиента в Ubuntu. Для Ubuntu 18.04 LTS и выше нужно включить службу OpenVPN для запуска во время загрузки перечитать конфиг systemctl. Положите конфигурационный файл в /etc/openvpn/client/имя-конфига.conf
sudo systemctl enable openvpn-client@client1 sudo systemctl daemon-reload
Запускаем клиента
sudo systemctl start openvpn-client@client1
В директории ccd хранятся индивидуальные настройки для каждого клиента. Имя файла должно соответствовать имени сгенерированного клиентского сертификата. Файлы конфигурации клиентов являются текстовыми файлами и содержат команды, выполняемые сервером при подключении клиентов. Обычно файл клиента содержать команды:
# 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
Сотрудники увольняются и им нужно запретить доступ к VPN. Значит нужно отозвать их сертификат. Команда revoke-full с именем клиента используется для отзыва ssl сертификата OpenVPN.
Если нет файла .rnd (это файл генератора псевдослучайных чисел) в каталоге пользователя, от имени которого вы создаете сертификаты, выполните командой:
$ cd $ touch .rnd
default_crl_days= 3000 # how long before next CRL
Переходим в директорию центра сертификации и вводим команды:
$ cd ~/openvpn-ca $ source vars
Отзываем сертификат используя команду revoke-full с именем клиента, например client1.
$ ./revoke-full client1
В результате работы будет создан файл crl.pem в директории keys с необходимой для отзыва сертификата информацией. Теперь нужно объяснить серверу OpenvPN, где ему брать информацию об отозванных сертификатах, для этого используется директива crl-verify. Сервер OpenVPN будет проверять список отозванных сертификатов из файла каждый раз crl.pem, когда кто-то устанавливает соединение с сервером.
Копируем crl.pem в каталог. В конце файла /etc/openvpn/server.conf задаем путь через директиву crl-verify
crl-verify crl.pem
Перезапускаем сервер OpenVPN
# service openvpn restart
Теперь клиент не сможет устанавливать соединение с сервером OpenVPN используя старый сертификат, в логе сервера будет появляться строка о том что сертификат отозван: VERIFY ERROR: depth=0, error=certificate revoked. В логе OpenVPN клиента будет написано:
Wed Aug 25 14:28:09 2021 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity) Wed Aug 25 14:28:09 2021 TLS Error: TLS handshake failed
Эта процедуру нужно проделывать для отзыва каждого созданного вами сертификата.
Frequently Asked Questions OpenVPN. Часто задаваемые вопросы по настройке сервера и клиентов OpenVPN
Проблема: Если сервер подключён к ISP при помощи технологии Как работает PPPoE, в этом случае OpenVPN не сможет сделать доступными сети за подключённым клиентом. Не будет отрабатывать команда iroute. Это связано с тем, что PPP прописывает маршрут по умолчанию в таком виде:
# 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 U 0 0 0 ppp0
Т.е. указывается маршрутом по умолчанию интерфейс (ppp0), а не IP адресс, такой записи сервер OpenVPN не понимает, для корректной работы сервера OpenVpn маршрут должен бы вида:
# 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
Решение: Исправить маршрут по умолчанию можно командой (соответственно указав нужный вам IP)
route add 0/0 gw 91.196.96.35
или в скрипте при загрузке системы, но после поднятия интерфейса ppp0
route del default route add default gw 91.196.96.35 dev ppp0
Окружение: Клиент выходит в интернет с Ubuntu 14.04.3 LTS + Настройка Dnsmasq Ubuntu установленной в Виртуализация при помощи VirtualBox. Сеть установлена в VirtualBox как сетевой мост. IP получается от Настройка DHCP сервера Linux, FreeBSD на интернет роутере (Netis WF2419R).
Проблема: Не работает push "dhcp-option DNS 10.26.95.254". Соответственно все Раздел DNS: Что такое DNS Dnsmasq отсылает основному DNS серверу. Все бы ничего если бы клиенту не нужны локальные Раздел DNS: Что такое DNS.
Решение: Был доустановлен основной пакет
aptitude install dnsmasq
добавлены описания наших локальных зон (non-public domains) в конфигурационный файл dnsmasq.conf
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
В файле /etc/logrotate.d/openvpn прописываем настройки для приложения logrotate, ключевой параметр copytruncate (чтобы не перегружать OpenVPN и заставить его писать данные в тот же лог файл)
etc/openvpn/servers/vpnluxor/logs/openvpn.log { daily rotate 8 compress delaycompress missingok copytruncate notifempty create 640 root }
Для управления сертификатами/клиентами сервера OpenVPN при помощи веб-интерфейса существует не так много программ:
Файл | Машина | Назначение | Доступ |
ca.crt | Сервер и клиенты | Сертификат корневого СА | Публичный |
ca.key | Только на сервере | Необходим для подписи других сертификатов | Секретный |
dh{n}.pem | Только на сервере | Diffie Hellman параметры | Публичный |
vpnspar.crt | Только на сервере | Сертификат сервера | Публичный |
vpnspar.key | Только на сервере | Ключ сервера | Секретный |
darkfire.crt | Только на клиенте | Сертификат клиента | Публичный |
darkfire.key | Только на клиенте | Ключ клиента | Секретный |
Подборка руководств по настройке сервера и клиентов 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. Это легко можно сделать с помощью следующих директив в конфигурационном файле сервера:
push "route 10.66.0.0 255.255.255.0"
Далее, необходимо настроить на LAN- шлюзе в сети сервера маршрут для маршрутизации пакетов, предназначенных для подсети VPN-клиентов (10.8.0.0/24) через OpenVPN-сервер (это необходимо только тогда, когда сервер OpenVPN и LAN-шлюз – разные машины).
Проталкивание изменений DNS для перенаправления всего трафика через VPN.
Сделанные нами настройки создают VPN соединение между двумя машинами, но они не заставляют эти машины использовать VPN соединение. Если вы хотите использовать VPN соединение для всего своего трафика, вам необходимо протолкнуть (push) настройки DNS на клиентские машины.
Для этого вам необходимо раскомментировать несколько директив. Найдите секцию redirect-gateway и удалите “;” из начала строки для расскоментирования redirect-gateway:
/etc/openvpn/server.conf
push "redirect-gateway def1 bypass-dhcp"
Чуть ниже находится секция dhcp-option. Удалите “;” для обеих строк:
/etc/openvpn/server.conf
push "dhcp-option DNS 208.67.222.222" push "dhcp-option DNS 208.67.220.220"
Это позволит клиентам сконфигурировать свои настройки DNS для использования VPN соединения в качестве основного.