Развертывание собственного OpenVPN / Хабр

Развертывание собственного OpenVPN / Хабр Электронная цифровая подпись
Содержание
  1. Предварительная подготовка сервера
  2. 4 настройка и запуск сервера
  3. Настройка NAT в Firewalld
  4. Выбор устройства openvpn – tap или tun
  5. Дорабатываем конфиг или каждому свое.
  6. Задача
  7. Инструкция по настройка клиентского подключения openvpn
  8. Настраиваем сервер
  9. Настройка firewall (iptables) для openvpn
  10. Настройка openvpn client в windows
  11. Настройка openvpn клиента
  12. Настройка openvpn сервера
  13. Настройка vpn-сервиса
  14. Настройка в centos клиента openvpn
  15. Настройка клиента под centos на сервере camp
  16. Настройка учетных записей клиентов
  17. Подключение клиента к openvpn-соединению
  18. Подключение по openvpn в android
  19. Раздаем интернет
  20. Создание pki на сервере openvpn ubuntu
  21. Создание ключей и сертификатов
  22. Создание сервера центра сертификации с помощью easyrsa
  23. Создание сертификатов и ключей.
  24. Установка openvpn на centos 8
  25. Установка openvpn сервера (freebsd).
  26. Установка и настройка сервера openvpn
  27. Отзыв сертификата
  28. Заключение
  29. Отзыв сертификата

Предварительная подготовка сервера

1.1 Переведите selinux в режим уведомленийНа время настройки сервиса переведите selinux в режим уведомлений. Для этого измените содержимое конфигурационного файла:

nano /etc/selinux/config

Заменив текст SELINUX=enforcing на SELINUX=permissiveВыполните:

setenforce 0

Более подробно см.ссылкуНе забудьте включить selinux после завершения настройки.1.2 Настройка FirewalldЕсли Firewalld активен, то следует открыть порт для OpenVPN. По умолчанию OpenVPN работает на 1194 порту.

firewall-cmd --permanent --add-port=1194/udp
firewall-cmd —reload

1.3 Установка OpenVPN и Easy-RSAВыполните команду:для РЕД ОС версии 7.1 или 7.2:

yum install openvpn easy-rsa

для РЕД ОС версии 7.3 и старше:

dnf install openvpn easy-rsa

1.4 Создание файла varsСоздадим файл vars, который будет использоваться как шаблон, чтобы упростить и ускорить процесс создания ключей. В нем указаны параметры для создаваемых ключей.Перейдите в каталог cd /usr/share/easy-rsa/3Создайте файл с именем vars, ниже приведен пример содержимого файла:

4 настройка и запуск сервера

4.1 Создаем конфигурационный файл для сервера openvpn

nano /etc/openvpn/server/server.conf

Содержимое файла server.conf

local 10.10.0.2
# Сетевой порт сервера
port 1194
# Работа по протоколу UDP
proto udp
dev tun
ca keys/ca.crt
cert keys/vpn-server.crt
key keys/vpn-server.key
dh keys/dh.pem
tls-auth keys/ta.key 0
# Область Ip-адресов виртуальных хостов
server 192.168.10.0 255.255.255.0
# Назначение шлюза клиентам
push "redirect-gateway def1"
push "route-gateway 192.168.10.1"
# Указывается DNS
push "dhcp-option DNS 1.1.1.1"
ifconfig-pool-persist ipp.txt
keepalive 10 120
max-clients 15
client-to-client
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 0
mute 20
daemon
mode server
tls-server
# Компрессия трафика
comp-lzo yes
# Алгоритм шифрования трафика
cipher BF-CBC

4.2 Запуск сервераПеред запуском создадим каталог для «лог-файлов» сервера:

mkdir /var/log/openvpn

Разрешаем автоматический старт сервиса OpenVPN:

systemctl enable openvpn-server@server

Запускаем openvpn-server:

systemctl start openvpn-server@server

Настройка NAT в Firewalld

Если необходимо, чтобы клиенты могли выходить через vpn в интернет, то для этого настроим NAT

nano /etc/sysctl.conf

добавить строку:

net.ipv4.ip_forward=1

Применяем настройки sysctl:

sysctl -p /etc/sysctl.conf

Добавим правила в firewalld. eth0 — внешний, tun0 — внутренний интерфейс OpenVPN:

firewall-cmd --direct --permanent --add-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i tun0 -o eth0 -j ACCEPT
sudo firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

Выбор устройства openvpn – tap или tun

Чуть подробнее остановлюсь на этом моменте. В моей конфигурации я использую tun интерфейс. В чем отличие tun от tap можно прочитать на википедии. Прокомментирую своими словами. Если вам нужно объединить две разные локальные сети в одну условно общую, но с разной адресацией, то вам нужен tun. То есть в нашем случае мы объединяем две сети 192.168.220.0/24 и 192.168.150.0/24 для взаимного совместного доступа.

Если же у вас стоит задача объединить 2 удаленные сети в единое адресное пространство, например сделать и в офисе, и в филиале единую сеть 192.168.220.0/24, то тогда бы мы использовали tap интерфейс и указывали бы на компьютерах в обоих сетях не пересекающиеся адреса из одной подсети.

То есть оба офиса окажутся в одном широковещательном домене и смогут передавать данные с помощью широковещания на канальном уровне сетевой модели OSI. В таком состоянии openvpn работает в режиме моста. По мне так удобнее первый вариант. Я еще не сталкивался с задачей, где бы мне нужен был tap. Вернемся к настройке.

Запускаем сервер:

# systemctl start [email protected]

Если сервер не запустился, а в логе ошибка:

TCP/UDP: Socket bind failed on local address [undef]: Permission denied

Значит вам нужно либо правильно настроить, либо отключить SELinux. В данном материале я не хочу касаться настройки SELinux, поэтому просто отключаем его:

# mcedit /etc/sysconfig/selinux

меняем значение

SELINUX=disabled

Чтобы изменения вступили в силу, выполняет:

# setenforce 0

Пробуем снова запустить openvpn сервер:

# systemctl start [email protected]

Если опять видите какие-то ошибки, то проверяйте лог файлы /var/log/openvpn/openvpn.log и /var/log/messages. Там почти наверняка будет указано, в чем проблема. Проверяем, запустился сервер или нет:

# netstat -tulnp | grep 13555

udp        0      0 0.0.0.0:13555           0.0.0.0:*                           1900/openvpn

Отлично, запустился на указанном порту.

Добавляем сервер openvpn в автозагрузку:

Дорабатываем конфиг или каждому свое.

Теперь я расскажу как раздавать интернет и другие мелочи связанные с настройкой. Начнем с мелочей. Все манипуляции будем проводить с конфигом сервера.

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

client-to-client

Если нужно, чтобы клиентам выдавались статические адреса, тогда в папке config создайте файл ip.txt и впишите в конфиг

ifconfig-pool-persist ip.txt


Неохота создавать каждому сертификаты? Тогда пишем

duplicate-cn

, но учтите, с этой опцией не работает ifconfig-pool-persist.

Теперь о конфиге клиента. Можно не передавать файлы сертификатов, а вписать сразу в конфиг, только делать это лучше не с блокнота, а с AkelPad’а или Notepad например. Открываем ca.crt и выделяем от —–BEGIN CERTIFICATE—– до —–END CERTIFICATE—–. В конфиге будет выглядеть так:

—–BEGIN CERTIFICATE—–сертификат—–END CERTIFICATE———-BEGIN CERTIFICATE—–сертификат—–END CERTIFICATE———-BEGIN PRIVATE KEY—–ключ—–END PRIVATE KEY—–

Задача


Наверно нет смысла рассказывать для чего используются VPN. Я приведу реальную задачу и расскажу как ее достичь.

Основная задача — это безопасное и простое решение доступа к внутренним ресурсам моих серверов.

Первый сервер является «домашним» серверов, подключенный к широкополосному соединению в городе под управлением CentOS 5.5, выполняющий различные функции, в том числе шлюза для квартирной сети. Назовем его CITY. Квартирная сеть использует адреса 192.168.22.0/24 и 192.168.21.0/24.

Второй сервер установлен на дальнем объекте, например, за городом на даче. Сервер работает под управлением CentOS 5.5 и выполняет функции шлюза для дачной сети и тоже выполняет другие задачи. Доступ в сеть осуществляется с помощью недорогого доступа по технологии 3G — в сервер воткнут USB 3g-модем и настроено устойчивое соединение. Назовем его CAMP. Дачная сеть использует адреса 192.168.23.0/24 и адреса 192.168.24.0/24.

А еще у меня есть ноутбук под управлением Windows XP, который вместе с владельцем попадает в разные сети, в том числе из дома, с работы и прочих гостевых мест, где есть доступ в Интернет. Назовем его NOTEBOOK.

Я хочу иметь доступ с ноутбука на мой домашний сервер CITY, в том числе к файлопомойке по NetBIOS и пр. А еще я хочу иметь доступ на сервер CAMP.

В случае CITY некоторые проблемы доступа можно решить публичным IP адресом. Но для CAMP публичный IP адрес у мобильных операторов практически недоступен или стоит неоправданно дорого для частного использования. А обычные клиенты работают через NAT. На ноутбуке проблемы сходные — как правило, везде NAT, бывают публичные открытые сети, где весь трафик виден всем пользователям.

Решением этих проблем является использование OpenVPN для связи всех компьютеров в единую сеть, заодно, защищенную от посторонних глаз.

Инструкция по настройка клиентского подключения openvpn

(Для пользователей не имеющих технической подготовки)

Для установки и настройки OpenVPN соединения необходимо вначале определить разрядность своей операционной системы. Для 32-разрядных систем установочный файл клиента OpenVPN оканчивается на “-i686.exe”. Если же у Вас 64-разрядная MS-Windows, то Вам нужен файл, в названии которого есть “-x86_64.exe”.

Для MS-Windows cкачайте и установите соответствующую клиентскую программу OpenVPN (для Android и iOS есть пакеты в собственных репозиториях market/store). Перейдите в каталог программы OpenVPN (C:Program FilesOpenVPN) и скопируте в него папку config со всем содержимым, полученную у системного администратора. В этой папке расположены ваши клиентские сертификаты и настройки подключения к серверу VPN.

Названия файлов в папке config у Вас могут незначительно отличаться. Запустите OpenVPN клиент от имени Администратора или измените свойства ярлыка на Рабочем столе (установить галочку “выполнять от имени администратора”).

Подключение к локальной сети предприятия через Интернет производися через контекстное меню или двойным кликом на иконке OpenVPN в системной области панели задач. Подключиться можно только находясь за пределами сети предприятия. Соединения изнутри сети сервер OpenVPN не принимает.

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

Читайте также:  Программа «Мигрируй!» / Рутокен

Настраиваем сервер


Итак шаги для настройки сервера на базе СentOS, впрочем они легко применимы и для FedoraProject и собственно RedHat Enterprise Linux и прочим RPM based дистрибутивам, ну а с небольшими изменениями вполне должны работать по Debian/Ubuntu.

На всякий случай, выключите репозиторий rpmforge, т.к. в нем openvpn собран с неверными путями. Я использую репозиторий epel для установки OpenVPN.

Ставим openvpn:

yum install openvpn

переходим в рабочий каталог

cd /usr/share/openvpn/easy-rsa/2.0/


Настраиваем параметры сервера (необязательно):

vi vars

Инициализируем переменные окружения, для последующего запуска скриптов:

source ./vars

Очищаем все на всякий случай:

./clean-all

Создаем сертификат CA

./build-ca


Создаем сертификат X.509

./build-key-server server

Создаем ключ Диффи-Хеллмана

./build-dh

Создаем ta.key (TLS сертификат)

openvpn --genkey --secret /usr/share/openvpn/easy-rsa/2.0/keys/ta.key


Настраиваем конфигурацию сервера:

vi /etc/openvpn/openvpn.conf

Вот такой конфиг файл я использую:

Настройка firewall (iptables) для openvpn

Рассмотрю отдельно вопрос настройки iptables для работы openvpn. В целом, там нет никаких нюансов в самих правилах. Нам необходимо открыть входящий порт для подключения к серверу, разрешить транзитный трафик и включить nat для openvpn интерфейсов. Проблемы обычно бывают в реализации настроек самого firewall.

Если вы используете нативные iptables, то нужны будут следующие правила, разрешающие весь трафик в и из vpn туннелей.

iptables -A INPUT -i ens18 -p udp --dport 13555 -j ACCEPT
iptables -A INPUT -i tun  -j ACCEPT
iptables -A OUTPUT -o tun  -j ACCEPT
iptables -A FORWARD -i tun  -j ACCEPT
$IPT -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE

Не забудьте разместить их выше правил блокировки, если таковые у вас имеются. Если вы используете firewalld для настройки фаервола, то набор правил для openvpn будет следующий:

firewall-cmd --add-port="13555"/"udp"
firewall-cmd --zone=trusted --add-source=10.0.0.0/24
firewall-cmd --permanent --add-port="13555"/"udp"
firewall-cmd --permanent --zone=trusted --add-source=10.0.0.0/24
firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.0.0.0/24 -j MASQUERADE
firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.0.0.0/24 -j MASQUERADE

Если нужно как-то сегментировать доступ в vpn сети, то настраивайте более точечно с использованием конкретных адресов и подсетей. Тонкая настройка правил iptables не тема данной статьи, поэтому я не буду на этом подробно останавливаться.

Сам я обычно использую нативные iptables и управляю ими с помощью скрипта. Более подробно я описываю настройку iptables в отдельной статье. В соответствии с этой статьей я использую следующий итоговый набор правил всего сервера для iptables.

Настройка openvpn client в windows

Теперь рассмотрим вариант подключения к нашей логической сети удаленного сотрудника с рабочей станцией windows. Допустим, мы объединили наши офисы в единую сеть, доступ работает в обе стороны. Нам необходимо, чтобы удаленный пользователь смог подключиться либо к обоим сетям, либо выборочно только к основному офису, либо только к филиалу.

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

Настройка openvpn клиента

На компьютере клиента устанавливаем OpenVPN точно также как на сервер. Галку EasyRSA 2 Certificate Management Scripts не указываем. Галку OpenVPN GUI указываем.

Я устанавливаю OpenVPN на клиенте в папку по умолчанию. C:Program FilesOpenVPN.

Копируем в отдельную папку for_client (её содержимое отправим потом на компьютер клиента) на сервере файлы для клиента:

  • ca.crt
  • client.crt
  • client.key
  • dh2048.pem
  • ta.key

Туда же из папки C:Program FilesOpenVPNsample-config копируем client.ovpn

Переименовываю client.ovpn в config.ovpn. Можно использовать любое имя, лучше созвучное с названием организации. Вот такой получился набор.

Редактируем файл config.ovpn.

Настройка openvpn сервера

Чтобы случайно всё не удалить, создадим папку C:Program FilesOpenVPNssl и скопируем в неё сертификаты. Это будет рабочая папка сервера.

mkdir "C:Program FilesOpenVPNssl"
copy "C:Program FilesOpenVPNeasy-rsakeys" "C:Program FilesOpenVPNssl"

Создадим конфигурационный файл сервера C:Program FilesOpenVPNconfigserver.ovpn:

copy "C:Program FilesOpenVPNsample-configserver.ovpn" "C:Program FilesOpenVPNconfigserver.ovpn"

Открываем блокнотом и редактируем:

notepad "C:Program FilesOpenVPNconfigserver.ovpn"

Лучше изучить конфигурационный файл, я предлагаю свой вариант конфига:

port 1194
proto udp
dev tun
ca "C:\Program Files\OpenVPN\ssl\ca.crt"
cert "C:\Program Files\OpenVPN\ssl\server.crt"
key "C:\Program Files\OpenVPN\ssl\server.key"  # This file should be kept secret
dh "C:\Program Files\OpenVPN\ssl\dh2048.pem"
server 10.8.0.0 255.255.255.0
tls-auth "C:\Program Files\OpenVPN\ssl\ta.key" 0 # This file is secret
keepalive 10 120
comp-lzo
persist-key
persist-tun
cipher AES-256-CBC
status "C:\Program Files\OpenVPN\log\status.log"
log "C:\Program Files\OpenVPN\log\openvpn.log"
verb 4
mute 20

Указываем параметры сервера, пути к ключам и сертификатам. Здесь же пути к логам. Для тестирования можно использовать tcp протокол:

proto tcp

Переходим к службам:

services.msc

Находим службу OpenVPNService.

Настраиваем на автоматический запуск при загрузке сервера.

Запускаем службу.

Согласно настройкам сервера в папке C:Program FilesOpenVPNlog должны появиться логи. Это один из инструментов администратора OpenVPN сервера.

Активировался сетевой адаптер TAP-Windows Adapter V9.

Согласно настройкам сервера IP адрес 10.8.0.1.

Проверяем поднялся ли порт tcp 1194:

netstat -tan | find "1194"

Порт должен прослушиваться.

Теперь нужно настроить firewall. Открываем Windows Defender Firewall with Advanced Security.

Переходим в Inbound Rules.

Создаём правило — New Rule…

Тип правила — Port. Next.

Протоколы и порты — UDP 1194. Как в настройках сервера. Next.

Действия — Allow the connection. Next.

Для всех сетей. Next.

Указываем название правила — OpenVPN. Next.

Правило создано, теперь firewall не блокирует входящие UDP соединения на 1194 порту.

Настройка vpn-сервиса

Для настройки VPN сервиса мы должны  сделать копию шаблонов

$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/server/

Затем распакуйте файл

$ sudo gzip -d /etc/openvpn/server/server.conf.gz

Далее войдите в папку

$ cd /etc/openvpn/server

Некоторые линии будут заменены, чтобы соответствовать нашей конфигурации::

  • Криптографические шифры будут установлены на AES-256-CBC
  • Алгоритм дайджеста сообщений HMAC будет sha256
  • Поскольку мы также используем параметр Diffie-Hellman, мы установим его равным dh.pem
  • После запуска openvpn мы будем использовать пользователя nobody и группу nogroup  без привилегий.
  • Мы будем проталкивать изменения dns, чтобы перенаправить весь трафик через vpn со значениями push redirect-gateway def1 bypass-dhcp,push dhcp-option DNS 208.67.222.222push dhcp-option DNS 208.67.220.220
  • Так же мы сохраним порт по умолчанию 1194
  • Далее мы будем использовать udpпротокол
  • Мы должны указать ключ openvpn-server.key и сертификат openvpn-server.crtкоторые будут использоваться в качестве учетных данных

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

Настройка в centos клиента openvpn

На centos-client не забываем настроить или отключить SELinux. Устанавливаем openvpn:

# yum install openvpn

Создаем в директории /etc/openvpn/client/ файл конфигурации client.conf:

# mcedit /etc/openvpn/client/client.conf
dev tun
proto udp
remote 10.20.1.38 13555
client
resolv-retry infinite
ca /etc/openvpn/client/ca.crt
cert /etc/openvpn/client/client01.crt
key /etc/openvpn/client/client01.key
tls-crypt /etc/openvpn/client/tc.key
route 192.168.220.0 255.255.255.0
remote-cert-tls server
auth SHA256
cipher AES-256-CBC
persist-key
persist-tun
resolv-retry infinite
nobind
comp-lzo
verb 3
status /var/log/openvpn/openvpn-status.log 1
status-version 3
log-append /var/log/openvpn/openvpn-client.log

Не забываем скопировать в /etc/openvpn/client/ сохраненные ранее ключи ca.crt, client01.crt, client01.key и tc.key.

Обращаю внимание на параметр route в данном конфиге. Его можно здесь не указывать, сделав конфиг более унифицированным для множества клиентов. Вместо этого данную настройку можно передавать с сервера openvpn, указав в файле настроек клиента параметр push route следующим образом:

push "route 192.168.220.0 255.255.255.0"

Создаем каталог для логов:

# mkdir /var/log/openvpn

Запускаем openvpn client:

# systemctl start [email protected]

Добавляем в автозагрузку:

# systemctl enable [email protected]

Теперь смотрим картину сетевых настроек на клиенте:

Ну и маршруты глянем заодно:

Все в порядке, подключение к vpn серверу есть, маршруты прописаны верно. Как вы видите, трафик к удаленной сети 192.168.220.0.24 пойдет через vpn туннель. Маршрут для него openvpn поднял автоматически в соответсвии со своими настройками на клиенте или сервере.

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

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

net.ipv4.ip_forward = 1

в файл /etc/sysctl.conf и применить настройку:

# sysctl -p

Если у вас этого не сделано, то трафик между интерфейсами ходить не будет.

Если ваш openvpn клиент не подключается, то в первую очередь проверяйте настройки firewall – входящие подключения к серверу и исходящие клиента. Обратите внимание на номер порта и тип (TCP или UDP) если вы их меняли. У меня были затупы, когда никак не мог разобраться, почему нет соединения. Оказывалось, что я менял порт c UDP на TCP, но по привычке на фаерволе оставлял UDP.

Теперь давайте проверим, как бегают пакеты в нашей vpn сети. Заходим на centos-client (192.168.150.1) и пингуем centos-server (192.168.220.1) и pc1 (192.168.220.10):

Читайте также:  Авторизация в ESIA на сервере терминалов с ЭЦП по ГОСТ-2012 / Хабр

Заходим на pc2 (192.168.150.10) и пингуем centos-server и pc1:

Теперь в обратную сторону. Заходим на pc1 (192.168.220.10) и пингуем centos-client (192.168.150.1) и pc2 (192.168.150.10):

И напоследок пропингуем с vpn сервера подсеть клиента:

Как видите, связь настроена в обе стороны. Если у вас что-то где-то не пингуется, то смотрите в первую очередь на наличие маршрутов на самих серверах с openvpn, а так же на настройки firewall. Проблемы могут быть только здесь. Ну и не забудьте настроить windows firewall на самих виндовых машинах.

В завершение темы объединения удаленных офисов, проверим доступ к общим сетевым ресурсам. Расшарим папку на PC1 и зайдем на нее с PC2:

Все получилось. Мы реально объединили удаленные офисы в единую связную сеть с помощью openvpn сервера. Дальше поверх vpn можно настраивать работу остальных сервисов. Например, объединить 2 сервера asterisk или контроллеры домена.

Настройка клиента под centos на сервере camp

Выполняем

yum install openvpn

забираем клиентские файлы в каталог

/etc/openvpn/

ca.crt<br>
ta.key<br>
camp.crt<br>
camp.key<br>

создаем конфигурацию:

vi /etc/openvpn/openvpn.conf

конфигурация:

client
dev tun
proto udp
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
float
verb 1
log-append      /var/log/openvpn.log
ca              ca.crt
tls-auth        ta.key 1
remote          22.33.44.55 1194
cert            camp.crt
key             camp.key


Разрешаем соединение в firewall. Само главное — обратные пакеты UDP пустить:

Я делаю так в своем любимом /etc/rc.d/rc.firewall:

Настройка учетных записей клиентов

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

./build-key-pass <имя пользователя> 

— для создания сертификата с паролем и

./build-key <имя пользователя>

— для сертификата без пароля.

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

Создаем аккаунт для ноутбука:

заходим в каталог

cd /usr/share/openvpn/easy-rsa/2.0/

инициализируем окружение командой:

source ./vars

генерируем ключ для пользователя notebook с паролем:

./build-key-pass notebook

в подкаталоге

./keys

появится комплект файлов для авторизации.


А еще для клиента нужно настроить параметры сети, которые находятся в файлах с именем клиента

/etc/openvpn/ccd/

, в данном случае нужно редактировать файл

notebook

vi /etc/openvpn/ccd/notebook

В этом файле мы указываем адрес и другие сетевые параметры.


Самое главное — назначим адрес для клиента в нашей VPN подсети.

Дла совместимости со стеком TCP/IP Windows адреса клиентам назначаются с интервалом 4, фактически на каждого клиента выделяется подсеть с маской /30: адрес сети, адрес клиента, адрес шлюза, широковещательный адрес.

Вот здесь указан список возможных адресов

Подключение клиента к openvpn-соединению

Установите openvpn клиент. Он будет использоваться для установки vpn-соединения с сервером

$ sudo apt update && sudo apt install openvpn -y

Теперь скопируйте клиентский файл OpenVPN, который находится на сервере. Копировать надо на клиентский компьютер. После этого на клиентском компьютере выполните следующую команду:

$ rsync -av [email protected]:/opt/client-configs/files/my-pc.ovpn .

Перед редактированием конфигурационного файла клиента OpenVPN мы должны проверить, используем ли мы resolvconf или systemd-resolved для разрешения DNS

$ cat /etc/resolv.conf
OUTPUT:
# This file is managed by man:systemd-resolved(8). Do not edit.
. . .

nameserver 127.0.0.53
options edns0

С этим значением nameserver 127.0.0.53он показывает, что вы используете systemd-resolved. Далее установите пакет, который поможет systemd-resolved использовать VPN для разрешения DNS при подключении.

$ sudo apt install openvpn-systemd-resolved

Теперь мы можем отредактировать файл vpn-клиента, раскомментировав строки, необходимые для systemd-resolved

$ vim my-pc.ovpn
script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
down-pre
dhcp-option DOMAIN-ROUTE .

Для системы, использующей update-resolv-conf раскомментируйте строки

script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

Теперь попробуем подключиться к VPN с помощью команды openvpn:

$ sudo openvpn – config my-pc.ovpn

Вы можете проверить информацию ip для туннельного интерфейса

$ ip a

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

Подключение по openvpn в android

Для того, чтобы настроить openvpn подключение в Android, я обычно использую приложение OpenVPN Connect. Каких-то проблем с ним я не испытывал. К тому же настраивается очень просто. В приложение достаточно импортировать конфигурационный файл с интегрированными сертификатами, типа того, что мы использовали ранее.

При этом приложение нормально поддерживает и tls-crypt, и сжатие. Если у вас будут какие-то проблемы с этой программой на android, попробуйте еще OpenVPN for Android. Оно тоже нормально работает, но настройки более замороченные.

Подключившись к локальной сети в Android с помощью openvpn, можно пользоваться локальными ресурсами. Например, я иногда подключаюсь по RDP с помощью Microsoft Remote Desktop.

Раздаем интернет

Для этого в конфиг сервера вписываем:

push «redirect-gateway def1»
push «dhcp-option DNS 8.8.8.8»
push «dhcp-option DNS 8.8.4.4»

DNS-адреса подставляем те, что даны в настройках. Посмотреть можно зайдя в панель управления-сетевые подключения, дважды кликнув на адаптере который смотрит в интернет. Для Win7 Панель управления-Сеть и Интернет-Центр управления сетями и общим доступом-изменение параметров адаптера.

Далее, заходим в свойства этого же адаптера, вкладка доступ, ставим птичку напротив «Разрешить другим пользователям сети…» и в выпадающем списке, если есть, выбираем виртуальный адаптер vpn. Затем заходим в свойства адаптера vpn, свойства ipv4 и выставляем получение ip и dns автоматически. Спасибо за внимание!

Создание pki на сервере openvpn ubuntu

Теперь нам нужно создать PKI, который поможет запрашивать и управлять сертификатами TLS для клиентов и других серверов, которые будут подключаться к нашей VPN сети.

Эта команда позволяет создать файл vars мы описывали это выше:

$ cp vars.example vars

Теперь отредактируйте файл vars с помощью утилиты VIM, добавив следующие строки в конце файла:

$ vim vars
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

Чтобы создать папку PKI на сервере openvpn, запустите файл easyrsa сценария:

$ ./easyrsa init-pki

Вы увидите следующий ответ в терминале:

Note: using Easy-RSA configuration from: /opt/EasyRSA-3.0.8/vars init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /opt/EasyRSA-3.0.8/pki

Создание ключей и сертификатов

Запускаем командную строку под администратором и переходим в рабочую директорию C:Program FilesOpenVPNeasy-rsa.

cd C:Program FilesOpenVPNeasy-rsa

В этой папке есть всё необходимое для генерации сертификатов.

Выполняем:

init-config.bat
copy vars.bat.sample vars.bat

Создаётся файл vars.bat с настройками и примером готовых параметров для создания CSR запроса сертификатов. Заполним его. Открываем vars.bat блокнотом.

notepad vars.bat

Открывается vars.bat.

Здесь стоит обратить внимание на пути к рабочим директориям. Например, вы можете указать свой путь к openssl.exe, если установили OpenVPN в другую директорию. Здесь же можно изменить длину ключей шифрования.

Заполняем переменные в нижней части файла, указываем:

  • KEY_COUNTRY — страна
  • KEY_PROVINCE — область
  • KEY_CITY — город
  • KEY_ORG — организация
  • KEY_EMAIL — e-mail
  • KEY_CN — (Common Name) имя сервера
  • KEY_NAME — (Name) имя сервера
  • KEY_OU — (Organization Unit) отдел
  • PKCS11_MODULE_PATH — для токенов двухфакторной аутентификации, нам не требуется, укажу имя сервера
  • PKC11_PIN — ПИН для токенов двухфакторной аутентификации, нам не требуется, укажу 1234

Для каждого сертификата нужно будет указывать свои NAME и COMMON NAME, можно их не указывать в vars.bat, потому как при генерации все параметры будут запрашивать.

Обращаем внимание на строку:

set KEY_KONFIG=openssl-1.0.0.cnf

Это имя конфигурационного файла. Находим его в рабочей директории.

Откроем блокнотом.

Внутри есть параметр default_days, в котором можно указать срок действия будущих сертификатов. По умолчанию у меня стоит 3650 дней, это 10 лет. Меня устраивает. Вероятно, кому-то при генерации клиентских сертификатов может понадобиться уменьшить этот срок.

Сохраняем все изменения и возвращаемся к командной строке. Подгружаем утверждённые нами переменные:

vars.bat

Очищаем директорию с ключами:

clean-all.bat

Сертификаты, которые мы будем создавать, появятся в папке C:Program FilesOpenVPNeasy-rsakeys. Сейчас эта папка очистилась, в ней два файла: index.txt и serial.

Генерируем ключ и сертификат центра сертификации:

build-ca.bat

В процессе генерации сертификата нас будут спрашивать все те же параметры, которые мы указали в vars.bat. Если параметр нас устраивает (а он нас устраивает), просто нажимаем ввод и переходим к следующему вопросу. После завершения работы скрипта в папке C:Program FilesOpenVPNeasy-rsakeys появляется два файла:

  • ca.crt — сертификат центра сертификации
  • ca.key — ключ центра сертификации

Ключ секретный, никому не передавайте, он будет храниться на сервере.

Генерируем ключ Диффи-Хеллмана:

build-dh.bat

В папке C:Program FilesOpenVPNeasy-rsakeys появляется файл:

Генерируем ключ и сертификат сервера, назовём сервер именем “server”:

build-key-server.bat server

В процессе генерации серверного сертификата нас будут спрашивать те же параметры, которые мы указали в vars.bat. Если параметр нас устраивает (а он нас снова устраивает), просто нажимаем ввод и переходим к следующему вопросу. На вопрос Sign the certificate отвечаем y. На вопрос 1 out of 1 certificate requests certified, commit отвечаем y.

Читайте также:  Ошибка при вводе лицензии криптопро

После завершения работы скрипта в папке C:Program FilesOpenVPNeasy-rsakeys появляется четыре файла:

  • 01.pem — не понадобится
  • server.crt — сертификат сервера
  • server.csr — запрос сертификата сервера, не понадобится
  • server.key — ключ сервера

Ключ секретный, никому не передавайте, он будет храниться на сервере.

Генерируем ключ и сертификат первого клиента. Для каждого клиента нужно указывать своё имя файла, Name и Common Name. Назовём первого клиента именем “client”:

build-key.bat client

В процессе генерации клиентского сертификата нас будут спрашивать те же параметры, которые мы указали в vars.bat. Нас устраивают все параметры кроме NAME и COMMON NAME, на них отвечаем client. Помним, что для другого клиента имя должно быть другим.

После завершения работы скрипта в папке C:Program FilesOpenVPNeasy-rsakeys появляется четыре файла:

  • 02.pem — не понадобится
  • client.crt — сертификат первого клиента
  • client.csr — запрос сертификата первого клиента, не понадобится
  • client.key — ключ первого клиента

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

В настройках сервера можно потом включить настройку duplicate-cn, которая позволяет подключаться всем клиентам по одному общему сертификату, но это небезопасно и не рекомендуется. Используйте только в тестовых целях.

# Uncomment this directive if multiple clients
# might connect with the same certificate/key
# files or common names. This is recommended
# only for testing purposes. For production use,
# each client should have its own certificate/key
# pair.
#
# IF YOU HAVE NOT GENERATED INDIVIDUAL
# CERTIFICATE/KEY PAIRS FOR EACH CLIENT,
# EACH HAVING ITS OWN UNIQUE “COMMON NAME”,
# UNCOMMENT THIS LINE OUT.
;duplicate-cn

Я на сервере собираюсь использовать tls-auth для дополнительной проверки целостности, это обеспечит дополнительный уровень безопасности протокола SSL/TLS при создании соединения:

  • Сканирование прослушиваемых VPN-сервером портов
  • Инициация SSL/TLS-соединения несанкционированной машиной на раннем этапе
  • DoS-атаки и флуд на порты OpenVPN
  • Переполнение буфера SSL/TLS

При использовании tls-auth на клиенте не понадобится ключ Диффи-Хеллмана, но пусть будет. Генерируем ключ tls-auth:

openvpn --genkey --secret keys/ta.key

В папке C:Program FilesOpenVPNeasy-rsakeys появляется файл:

Минимальный набор сертификатов сгенерирован.

Создание сервера центра сертификации с помощью easyrsa

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

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

$ cd EasyRSA-3.0.8/ && ls -l

В терминале вы увидите следующий ответ:

-rw-rw-r – 1 malain malain 1305 Sep 9 2020 COPYING.md
-rw-rw-r – 1 malain malain 5056 Sep 9 2020 ChangeLog
-rw-rw-r – 1 malain malain 2049 Sep 9 2020 README.md
-rw-rw-r – 1 malain malain 3335 Sep 9 2020 README.quickstart.md
drwxrwxr-x 2 malain malain 4096 Sep 9 2020 doc
-rwxrwxr-x 1 malain malain 76946 Sep 9 2020 easyrsa
-rw-rw-r – 1 malain malain 18093 Sep 9 2020 gpl-2.0.txt
-rw-rw-r – 1 malain malain 1036 Sep 9 2020 mktemp.txt
-rw-rw-r – 1 malain malain 4616 Sep 9 2020 openssl-easyrsa.cnf
-rw-rw-r – 1 malain malain 8925 Sep 9 2020 vars.example
drwxrwxr-x 2 malain malain 4096 Mar 28 14:14 x509-types

Сделайте копию файла vars.example как vars:

$ cp vars.example vars

Теперь откройте файл vars и добавьте информацию об организации в конец файла:

Создание сертификатов и ключей.

Когда-то этот пункт меня останавливал, мол ну их эти ключи, пойду поищу что попроще. Но, увы, ничего лучшего не нашел. Итак, переходим в C:Program filesOpenVPNeasy-rsa, запускаем init-config.bat, появится vars.bat, открываем его в блокноте. Нас интересуют строчки в самом низу, их нужно заполнить как угодно. Например:

set KEY_COUNTRY=RU

set KEY_PROVINCE=Baldur

set KEY_CITY=Piter

set KEY_ORG=OpenVPN

Установка openvpn на centos 8

Теперь вернемся к нашей задаче. Я подразумеваю, что у вас уже есть установленный и настроенный сервер CentOS. Если еще нет, то можете воспользоваться моими материалами. В них раскрыты следующие темы:

Устанавливаем openvpn на оба наших сервера, которые являются шлюзами в своих сегментах сети. Первым делом подключаем репозиторий epel к centos:

# yum install epel-release

Выполняем непосредственно установку:

# yum install openvpn

Установка openvpn сервера (freebsd).


Устанавливаем пакет из портов. Опции можно оставить по умолчанию. Главное, не отключайте ‘easy-rsa’, так как он потребуется для настройки и генерации сертификатов:

# cd /usr/ports/security/openvpn
# make configure-recursiv install clean

Или:

# make configure-recursiv install clean -С /usr/ports/security/openvpn

Создаем каталоги для конфигов:

 # mkdir /usr/local/etc/openvpn/
 # mkdir /usr/local/etc/openvpn/ccd

Копируем каталог easy-rsa в каталог конфигов OpenVPN:

 # cp -r /usr/local/share/easy-rsa /usr/local/etc/openvpn/


Переходим в скопированный каталог:

 # cd /usr/local/etc/openvpn/easy-rsa/

Переходим в оболочку sh:

 # sh

Выполняем команду для генерации собственного сертификата:

 # . ./vars
 # ./clean-all
 # ./build-ca

Данные для сертификата заполните в соотвествии с вопросами.

Установка и настройка сервера openvpn

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

Чтобы установить openvpn на ubuntu, выполните следующие команды:

$ sudo apt update
$ sudo apt install openvpn

На сервере openvpn утилита easyrsa будет использоваться для генерации запроса сертификата, который будет проверен и подписан сервером центра сертификации (ЦА). Выполните те же действия, что и в предыдущем разделе, чтобы установить Easyrsa.

Отзыв сертификата

В нашем примере мы создали сертификат client1, теперь сделаем отзыв этого сертификата. Переходим в каталог:

cd /usr/share/easy-rsa/3

Отзываем сертификат командой:

./easyrsa revoke client1

Подтверждаем действия: Continue with revocation: yes

и вводим пароль от центра сертификации.

После этого создаем/обновляем файл crl.pem:

./easyrsa gen-crl

во время выполнения команды, необходимо будет ввести пароль центра сертификации.

Копируем файл crl.pem в каталог openvpn:

cp pki/crl.pem /etc/openvpn/server/keys/

Перезагружаем сервис openvpn:

systemctl restart openvpn-server@server

Заключение

Теперь подведем итоги того, что мы сделали:

  1. В первую очередь настроили сервер openvpn на CentOS. Для этого создали инфраструктуру для удостоверяющего центра СА, с помощью которого мы создаем сертификаты.
  2. Затем с помощью этого центра сформировали сертификаты для сервера и клиента, в роли которых выступает головной офис компании и его филиал.
  3. Потом мы настроили openvpn сервер в офисе компании и подключили к нему в качестве клиента сервер филиала. Проверили это соединение, взаимную доступность узлов обоих сетей.
  4. В завершении сформировали сертификат для удаленного сотрудника и настроили ему подключение openvpn клиента в windows. Проверили доступность всех узлов обоих сетей.

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

В эту же статью изначально планировал добавить сравнение производительности и пропускной способности туннеля в зависимости от разного шифрования. Но в итоге статья и так получилась очень большая, так что сделаю это позже и оформлю отдельной статьей. Если вам кажется, что скорость тоннеля недостаточная и при этом нет жестких требований по безопасности, можете сменить шифр на BF-CBC. С ним, навскидку, раза в 2-3 производительность должна вырасти. Но это не точно, мое предположение.

Если вам нужен мониторинг пользователей, подключенных по openvpn, то читайте мою статью по мониторингу OpenVPN в Zabbix. Она достаточно старая и мониторинг там сделан не оптимально, но лучше у меня ничего нет. Как основа для вашего мониторинга сойдет, а дальше сможете сами модернизировать как вам будет нужно.

Напоминаю, что данная статья является частью единого цикла статьей про сервер Centos.

Отзыв сертификата

Иногда нужно отозвать сертификат, выданный клиенту. Кто-то увольняется, кто-то палит сертификаты.

cd "C:Program FilesOpenVPNeasy-rsa"
vars.bat
revoke-full client

Где client — это имя клиента.

В папке C:Program FilesOpenVPNkeys появляется файл:

Копируем его с заменой в рабочую директорию сервера C:Program FilesOpenVPNssl.

Добавляем строчку в конфигурационный файл сервера:

crl-verify "C:\Program Files\OpenVPN\keys\crl.pem"  

Перезапускаем службу OpenVPN сервера.

net stop OpenVPNService
net start OpenVPNService

Если в конфигурационном файле уже был ранее указан путь к crl.pem, то службу можно не перезапускать, OpenVPN перечитывает CRL один раз в час. Но в течении этого часа клиенты с отозванными сертификатами смогут продолжать подключаться и работать.

Для клиента с отозванным сертификатом процесс подключения будет “зависать”. В логе можно увидеть:

TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
TLS Error: TLS handshake failed

Чтобы клиент не стучался постоянно на сервер, у него в конфиге есть опция:

connect-retry-max 25

Передать эту опцию при отзыве сертификата нельзя, поэтому указывайте её всем клиентам заранее.

Оцените статью
ЭЦП Эксперт
Добавить комментарий