- Предварительная подготовка сервера
- 4 настройка и запуск сервера
- Настройка NAT в Firewalld
- Выбор устройства openvpn – tap или tun
- Дорабатываем конфиг или каждому свое.
- Задача
- Инструкция по настройка клиентского подключения openvpn
- Настраиваем сервер
- Настройка firewall (iptables) для openvpn
- Настройка openvpn client в windows
- Настройка openvpn клиента
- Настройка openvpn сервера
- Настройка vpn-сервиса
- Настройка в centos клиента openvpn
- Настройка клиента под centos на сервере camp
- Настройка учетных записей клиентов
- Подключение клиента к openvpn-соединению
- Подключение по openvpn в android
- Раздаем интернет
- Создание pki на сервере openvpn ubuntu
- Создание ключей и сертификатов
- Создание сервера центра сертификации с помощью easyrsa
- Создание сертификатов и ключей.
- Установка openvpn на centos 8
- Установка openvpn сервера (freebsd).
- Установка и настройка сервера openvpn
- Отзыв сертификата
- Заключение
- Отзыв сертификата
Предварительная подготовка сервера
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 openvpn-server@server.service
Если сервер не запустился, а в логе ошибка:
TCP/UDP: Socket bind failed on local address [undef]: Permission denied
Значит вам нужно либо правильно настроить, либо отключить SELinux. В данном материале я не хочу касаться настройки SELinux, поэтому просто отключаем его:
# mcedit /etc/sysconfig/selinux
меняем значение
SELINUX=disabled
Чтобы изменения вступили в силу, выполняет:
# setenforce 0
Пробуем снова запустить openvpn сервер:
# systemctl start openvpn-server@server.service
Если опять видите какие-то ошибки, то проверяйте лог файлы /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.222
,push 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 openvpn-client@client.service
Добавляем в автозагрузку:
# systemctl enable openvpn-client@client.service
Теперь смотрим картину сетевых настроек на клиенте:
Ну и маршруты глянем заодно:
Все в порядке, подключение к 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):
Заходим на 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 franck@X.X.X.X:/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
Заключение
Теперь подведем итоги того, что мы сделали:
- В первую очередь настроили сервер openvpn на CentOS. Для этого создали инфраструктуру для удостоверяющего центра СА, с помощью которого мы создаем сертификаты.
- Затем с помощью этого центра сформировали сертификаты для сервера и клиента, в роли которых выступает головной офис компании и его филиал.
- Потом мы настроили openvpn сервер в офисе компании и подключили к нему в качестве клиента сервер филиала. Проверили это соединение, взаимную доступность узлов обоих сетей.
- В завершении сформировали сертификат для удаленного сотрудника и настроили ему подключение 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
Передать эту опцию при отзыве сертификата нельзя, поэтому указывайте её всем клиентам заранее.