Как настроить openvpn на CentOS

Как настроить openvpn на CentOS

В современном интернете вопрос анонимности встает с каждым годом все острее. Запреты на доступ к контенту вынуждают пользователей искать обходные пути, одним из которых является использование приватных тоннелей. Установка на CentOS openvpn сервера для подключения удаленных клиентов является одной из реализаций шифрованного vpn канала. Этой задачей мы и займемся в текущей статье — поднимем шифрованный тоннель и подключим клиентов.


Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «Administrator Linux. Professional» в OTUS. Курс не для новичков, для поступления нужно пройти .

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

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

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

Автоматическое подключение Openvpn при загрузке системы

Подключение по Openvpn в Android

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

Заключение

Видео

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

Введение — что такое vpn server?

Упомянутое во вступлении применение технологии vpn и openvpn сервера в частности не ограничивается созданием каналов для анонимного трафика пользователей. Более того, я думаю это не основная сфера применения данных технологий. Давайте поподробнее познакомимся с этими вещами, чтобы иметь полное представление о том, что мы будем настраивать.

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

OpenVPN — одна из реализаций технологии VPN с открытым исходным кодом, а значит бесплатная. С ее помощью можно объединять в единую сеть компьютеры в том числе и находящиеся за NAT, что очень удобно. Openvpn поддерживает все популярные на сегодняшний день операционные системы, в том числе и Windows.

Среди малого и среднего бизнеса сервер openvpn очень популярен благодаря своей бесплатности, кроссплатформенности, быстроте и гибкости настроек. Лично я предпочитаю именно его для объединения удаленных локальных сетей. Его же предпочитают использовать vpn-провайдеры для оказания своих услуг по организации анонимного серфинга в интернете.

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

Объединение офисов с помощью openvpn

У нас имеется офис с шлюзом CentOS 8, на который мы будем устанавливать openvpn сервер. И есть филиал с таким же шлюзом, где будет установлен openvpn client для подключения сети филиала к офису:

 

Описание схемы сети

Имя Centos-server PC1 Centos-client PC2
Внешний ip 10.20.1.38 192.168.13.188
Локальный ip 192.168.220.1 192.168.220.10 192.168.150.1 192.168.150.10
Комментарий Сервер openvp и шлюз в офисе Компьютер с Windows 10 в офисе Клиент openvp и шлюз в филиале Компьютер с Windows 10 в филиале

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

Наша задача в данном случае будет сводиться к тому, чтобы компьютеры PC1 и PC2 увидели друг друга и могли совместно использовать свои сетевые ресурсы в обе стороны. То есть как за сервером, так и за клиентом openvpn мы должны видеть сеть.

Хочу отметить, что конфигурация openvpn кроссплатформенная и отлично переносится с одной системы на другую, необходимо только пути проверить, так как в каждой системе они свои. Моя инструкция подойдет для настройки openvpn сервера на любой операционной системе, отличаться будут только специфичные для каждой системы команды установки и проверки, но сама суть настройки vpn будет такой же.

Данный материал я создавал на тестовом стенде, который специально собрал для написания статьи. Но все настройки взяты с реально работающих серверов, причем разных систем, в том числе и freebsd. Для практического применения нужно просто поменять IP адреса на свои. У меня на стенде 10.20.1.38 и 192.168.13.188 по сути внешние IP адреса, которые смотрят в интернет.

Где скачать openvpn

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

Где можно скачать openvpn

Исходники openvpn-2.5.0.tar.gz
Openvpn client Windows 32 bit OpenVPN-2.5.0-I601-x86.msi
Openvpn client Windows 64 bit OpenVPN-2.5.0-I601-amd64.msi
Openvpn Portable openvpn-portable-win64-setup.exe

Сразу же прокомментирую по поводу portable версии openvpn. На текущий момент официальной портированной версии openvpn не существует. Та версия, на которую я дал ссылку, найдена мной в гугле и сделана отдельной командой Portapps. Это наиболее актуальная и свежая версия. До нее я использовал OpenVPN Portable с sourceforge, но она сильно устарела, хотя кое-где может и работать. Я специально по этому поводу почитал форум Community Openvpn и нашел там неутешительные ответы. Разработчики говорят, что portable версия openvpn не поддерживается и выпускать ее они даже не собираются. А жаль, было бы удобно получить портированную версию от них.

Для Linux систем дистрибутив проще всего получить в системных репозиториях и устанавливать с помощью стандартных установщиков пакетов.

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

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

  • Подробное описание установки CentOS 8 с разбором всех этапов и параметров.
  • Настройка CentOS шаг за шагом — базовая конфигурация сервера.

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

# yum install epel-release

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

# yum install openvpn

 

Создание сертификатов

Для работы сервера openvpn необходимо создать соответствующие сертификаты. Для этого воспользуемся программой Easy-RSA, которая генерирует сертификаты с помощью утилиты openssl. Все работы в этом разделе выполняем только на centos-server.

Создаем директорию для ключей:

# mkdir /etc/openvpn/keys

Скачиваем и устанавливаем утилиту Easy-RSA. Ссылку на последнюю версию можно посмотреть на github.

# cd /etc/openvpn/keys
# wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz

Если получаете сообщение:

-bash: wget: command not found

То устанавливаете wget:

# yum install wget

Продолжаем:

# tar xzvf EasyRSA-3.0.8.tgz && mv EasyRSA-3.0.8 easyrsa && rm -f EasyRSA-3.0.8.tgz
# cd /etc/openvpn/keys/easyrsa

Создаем структуру публичных PKI ключей:

# mv vars.example vars
# ./easyrsa init-pki
Note: using Easy-RSA configuration from: /etc/openvpn/keys/easyrsa/vars

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/keys/easyrsa/pki

Создайте удостоверяющий центр CA:

# ./easyrsa build-ca

Note: using Easy-RSA configuration from: /etc/openvpn/keys/easyrsa/vars
Using SSL: openssl OpenSSL 1.1.1g FIPS  21 Apr 2020

Enter New CA Key Passphrase: 
Re-Enter New CA Key Passphrase: 
Generating RSA private key, 2048 bit long modulus (2 primes)
........................+++++
................................................+++++
e is 65537 (0x010001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:serveradmin.ru

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/keys/easyrsa/pki/ca.crt

Не забудьте указанный пароль. Его нужно будет вводить каждый раз при создании нового сертификата openvpn.

Мы получили 2 файла:

  • /etc/openvpn/keys/easyrsa/pki/private/ca.key
  • /etc/openvpn/keys/easyrsa/pki/ca.crt

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

Создаем запрос сертификата для сервера без пароля с помощью опции nopass, иначе придется вводить пароль с консоли при каждом запуске сервера:

# ./easyrsa gen-req server nopass

Note: using Easy-RSA configuration from: /etc/openvpn/keys/easyrsa/vars
Using SSL: openssl OpenSSL 1.1.1g FIPS  21 Apr 2020
Generating a RSA private key
.........+++++
.....................+++++
writing new private key to '/etc/openvpn/keys/easyrsa/pki/easy-rsa-1861.5z2vXi/tmp.hy40wb'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [server]:

Keypair and certificate request completed. Your files are:
req: /etc/openvpn/keys/easyrsa/pki/reqs/server.req
key: /etc/openvpn/keys/easyrsa/pki/private/server.key

Подписываем запрос на получение сертификата у нашего CA:

# ./easyrsa sign-req server server

Note: using Easy-RSA configuration from: /etc/openvpn/keys/easyrsa/vars
Using SSL: openssl OpenSSL 1.1.1g FIPS  21 Apr 2020


You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 825 days:

subject=
    commonName                = server


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /etc/openvpn/keys/easyrsa/pki/easy-rsa-1888.qaUUvJ/tmp.Y4X2zV
Enter pass phrase for /etc/openvpn/keys/easyrsa/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server'
Certificate is to be certified until Apr 18 15:34:20 2023 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /etc/openvpn/keys/easyrsa/pki/issued/server.crt

В процессе работы скрипта вводим пароль от CA, который указывали раньше и отвечаем на вопрос yes. Мы получили подписанный удостоверяющим центром сертификат для сервера — /etc/openvpn/keys/easyrsa/pki/issued/server.crt

Нам еще пригодится ключ Диффи-Хелмана, генерируем его:

# ./easyrsa gen-dh

По завершению работы скрипта получаем файл dh сертификата — /etc/openvpn/keys/easy-rsa/pki/dh.pem.

Копируем в папку /etc/openvpn/server/ все необходимые для работы openvpn сервера файлы:

# cp pki/ca.crt /etc/openvpn/server/ca.crt
# cp pki/dh.pem /etc/openvpn/server/dh.pem
# cp pki/issued/server.crt /etc/openvpn/server/server.crt
# cp pki/private/server.key /etc/openvpn/server/server.key

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

# openvpn --genkey --secret /etc/openvpn/server/tc.key

Создадим ключ для клиента openvpn:

# ./easyrsa gen-req client01 nopass
# ./easyrsa sign-req client client01

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

  •  /etc/openvpn/keys/easy-rsa/pki/issued/client01.crt
  • /etc/openvpn/keys/easy-rsa/pki/private/client01.key

Команды gen-req и sign-req можно объединить в одну с помощью build-client-full примерно так:

# ./easyrsa build-client-full client01 nopass

Клиенту, которым у нас является шлюз филиала, нужно будет передать следующий набор файлов — client01.crt, client01.key, ca.crt, tc.key. Либо использовать единый файл конфигурации клиента, который включает в себя в том числе и сертификаты. Я отдельно покажу как это сделать.

Настройка openvpn на CentOS 8

Теперь приступаем к настройке. Создаем файл конфигурации openvpn:

# mcedit /etc/openvpn/server/server.conf
port 13555 # я предпочитаю использовать нестандартные порты для работы
proto udp # протокол может быт и tcp, если есть необходимость в этом
dev tun

ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem

auth SHA256 # выбор алгоритма шифрования для аутентификации
cipher AES-256-CBC # выбор алгоритма шифрования всех передаваемых через vpn данных
tls-version-min 1.2 # ограничиваем минимальную версию протокола tls
tls-crypt tc.key # ключ для шифрования TLS control channel

server 10.0.0.0 255.255.255.0 # подсеть для туннеля, может быть любой
route 192.168.150.0 255.255.255.0 # указываем подсеть, к которой будем обращаться через vpn

ifconfig-pool-persist ipp.txt # файл с записями соответствий clinet - ip
client-to-client # позволяет клиентам openvpn подключаться друг к другу
client-config-dir /etc/openvpn/ccd # директория с индивидуальными настройками клиентов

keepalive 10 120
comp-lzo # если используется протокол tcp, сжатие надо отключить
explicit-exit-notify 1 # если используется протокол tcp, поменять на 0
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
user nobody
group nobody
verb 3

Подробное описание всех параметров можно посмотреть в официальной wiki.

Создаем необходимые директории:

# mkdir /etc/openvpn/ccd && mkdir /var/log/openvpn

Создаем файл конфигурации клиента в папке, указанной в параметре client-config-dir :

mcedit /etc/openvpn/ccd/client01
iroute 192.168.150.0 255.255.255.0

Здесь client01 — имя сертификата пользователя. Параметр iroute означает, что за подсеть 192.168.150.0/24 отвечает именно этот клиент. Если в openvpn не передать эту настройку, то сеть, находящуюся за клиентом, будет не видно, при этом сам клиент будет видеть всю сеть, которую обслуживает сервер. Такой вариант подходит для подключения удаленных сотрудников.

Выбор устройства 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 в автозагрузку:

# systemctl enable openvpn-server@server.service

Created symlink /etc/systemd/system/multi-user.target.wants/openvpn-server@server.service → /usr/lib/systemd/system/openvpn-server@.service.

Теперь внимательно проверим корректность всех настроек на сервере. Сначала посмотрим информацию о сетевых интерфейсах:

Обращаем внимание на адреса туннеля vpn. Теперь проверяем статические маршруты:

Тут тоже все в порядке. Траффик для подсети филиала 192.168.150.0/24 будет маршрутизироваться в тоннель. С настройкой сервера закончили, идем теперь на клиент.

Настройка 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.

#!/bin/bash

export IPT="iptables"

# Внешний интерфейс
export WAN=ens18
export WAN_IP=10.20.1.38

# Локальная сеть
export LAN1=ens19
export LAN1_IP_RANGE=192.168.220.1/24

# Очищаем правила
$IPT -F
$IPT -F -t nat
$IPT -F -t mangle
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

# Запрещаем все, что не разрешено
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

# Разрешаем localhost и локалку
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A INPUT -i $LAN1 -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
$IPT -A OUTPUT -o $LAN1 -j ACCEPT

# Рзрешаем пинги
$IPT -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# Разрешаем исходящие подключения сервера
$IPT -A OUTPUT -o $WAN -j ACCEPT

# разрешаем установленные подключения
$IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

# Отбрасываем неопознанные пакеты
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A FORWARD -m state --state INVALID -j DROP

# Отбрасываем нулевые пакеты
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

# Закрываемся от syn-flood атак
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP

# Разрешаем доступ из локалки наружу
$IPT -A FORWARD -i $LAN1 -o $WAN -j ACCEPT
# Закрываем доступ снаружи в локалку
$IPT -A FORWARD -i $WAN -o $LAN1 -j REJECT

# Разрешаем OpenVPN
$IPT -A INPUT -i tun+ -j ACCEPT
$IPT -A OUTPUT -o tun+ -j ACCEPT
$IPT -A FORWARD -i tun+ -j ACCEPT
# Разрешаем доступ из внутренней сети в vpn
$IPT -A FORWARD -i $LAN1 -o tun+ -j ACCEPT

# Включаем NAT
$IPT -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
$IPT -t nat -A POSTROUTING -o $WAN -s $LAN1_IP_RANGE -j MASQUERADE

# открываем доступ к SSH
$IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT

# Открываем порт для openvpn
$IPT -A INPUT -i $WAN -p udp --dport 13555 -j ACCEPT

# Сохраняем правила
/sbin/iptables-save  > /etc/sysconfig/iptables

Это минимальный набор правил для шлюза локальной сети с openvpn на борту. Про настройку шлюза на базе centos я так же рассказываю отдельно. Для сервера клиента openvpn набор правил будет точно такой же, только ip адреса, подсети и интерфейсы будут другие.

Настройка в 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 или контроллеры домена.

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

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

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

Скрипт по генерации сертификата и конфига add_vpn_user.sh:

#!/bin/bash

proto="udp"
port="13555"
server="10.20.1.38"
confdir="/etc/openvpn/users-conf"

echo -n "Enter user name: "
read user

echo "Protect the private key with a password?"
echo " 1) No, passwordless client"
echo " 2) Yes, use a password for the client"

until [[ $pass =~ ^[1-2]$ ]]; do
     read -rp "Select an option [1-2]: " -e pass
done

clientexist=$(tail -n +2 /etc/openvpn/keys/easyrsa/pki/index.txt | grep -c -E "/CN=$user$")
     if [[ $clientexist == '1' ]]; then
       echo ""
       echo "The specified client name was already found in easy-rsa"
     exit
     else
       cd /etc/openvpn/keys/easyrsa/ || return
       case $pass in
            1)
                ./easyrsa build-client-full "$user" nopass
                ;;
            2)
                ./easyrsa build-client-full "$user"
                ;;
            esac
            echo "Client $user added."
     fi

touch /etc/openvpn/ccd/$user
mkdir -p $confdir

echo "dev tun
proto $proto
remote $server $port
client
resolv-retry infinite
remote-cert-tls server
auth SHA256
cipher AES-256-CBC
persist-key
persist-tun
resolv-retry infinite
nobind
comp-lzo
verb 3" > $confdir/$user.ovpn
{ echo "<ca>"
  cat "/etc/openvpn/keys/easyrsa/pki/ca.crt"
  echo "</ca>"

  echo "<cert>"
  awk '/BEGIN/,/END/' "/etc/openvpn/keys/easyrsa/pki/issued/$user.crt"
  echo "</cert>"

  echo "<key>"
  cat "/etc/openvpn/keys/easyrsa/pki/private/$user.key"
  echo "</key>"

  echo "<tls-crypt>"
  cat "/etc/openvpn/server/tc.key"
  echo "</tls-crypt>"
} >> $confdir/$user.ovpn

Скрипт делает следующие операции:

  1. Проверяет, есть ли уже пользователь с указанным именем. Если есть, то завершает работу.
  2. Выпускает и подписывает сертификат пользователя, давая возможность выбрать, указывать пароль для защиты приватного ключа или нет.
  3. Создает пустой файл для серверных настроек пользователя в ccd директории. Параметры туда нужно будет добавить вручную, если они нужны.
  4. Создает готовый конфиг .ovpn, куда включены параметры подключения и все необходимые сертификаты и ключи.

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

Дальше редактируем файл конфигурации на сервере openvpn для этого клиента:

# cd /etc/openvpn/ccd
# mcedit user08
push "route 192.168.220.0 255.255.255.0"
push "route 192.168.150.0 255.255.255.0"

Этими параметрами мы передаем клиенту маршруты к обоим сетям офисов. Если нужно подключать клиента только к какой-то одной сети, то оставляйте одну сеть, вторую удаляйте. Обращаю внимание на еще один факт. В конфигурации openvpn сервера у нас уже добавлен маршрут для 192.168.220.0, так что он в любом случае будет добавлен всем клиентам, которые будут подключаться к этому серверу.

Если вы хотите, чтобы весь трафик клиента заворачивался автоматически в vpn туннель, по сути подменяя его внешний ip адрес адресом vpn сервера, то добавьте следующий параметр в конфиг клиента:

push "redirect-gateway def1 bypass-dhcp"

Теперь нужно скачать openvpn client под нашу версию windows. Ссылки для скачивания я давал в самом начале статьи. Дальше выполняем установку клиента. Обращаю внимание, что для полной установки понадобятся права администратора:

Приступаем к настройке клиента openvpn в windows. Для этого нам понадобится файл конфигурации, который мы создали ранее. Заберите его любым подходящим способом. Например, с помощью WinSCP.  Файл конфигурации openvpn клиента будет выглядеть примерно так:

dev tun
proto udp
remote 10.20.1.38 13555
client
resolv-retry infinite
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
<ca>
-----BEGIN CERTIFICATE-----
MIIDVDCCAjygAwIBAgIUBPs8jwyy1zXzzPxXwsy8Zym6TRcwDQYJKoZIhvcNAQEL
BQAwGTEXMBUGA1UEAwwOc2VydmVyYWRtaW4ucnUwHhcNMjEwMTE1MDQyMjM3WhcN
MzEwMTEzMDQyMjM3WjAZMRcwFQYDVQQDDA5zZXJ2ZXJhZG1pbi5ydTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMzWGWWY1ly8goyiLJrSWm9jwA7L/lL1
ItwOU3IJbA1FUJkZN4o2xnrzzcjYnpAauF/JBoUGXPPn8tbfOxAw0ScrwK2041N5
j3OgjtMJDa64WBfW8JhSu2qMWFkE6MMyl254nzRQWX1xp7W6T+TevvBFqbwlQf6B
34HqNTcsBB0w98L/2+jndYEA73+5/WIUj48GQl3qxlbF7mebPcnJ9uY4R7ypX7Dv
EsdJc0N5Ccn7knBdDkPLu+cy6c2W5QBHYVp+ZJSvZyGzpKgv39RaChDqM3+Ak+i2
C0U8DY8XZIrh93hH//6FpzH+cFLspOeu95k2qg+2FKgqTlAfkS82JtsCAwEAAaOB
kzCBkDAdBgNVHQ4EFgQUjSVPyvZ1R1/lDApbcielAyjLrFMwVAYDVR0jBE0wS4AU
jSVPyvZ1R1/lDApbcielAyjLrFOhHaQbMBkxFzAVBgNVBAMMDnNlcnZlcmFkbWlu
LnJ1ghQE+zyPDLLXNfPM/FfCzLxnKbpNFzAMBgNVHRMEBTADAQH/MAsGA1UdDwQE
AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAD9OnpuyAypQ3NXDKp4gCp/vTmfJtYZmf
1fJ4qIAhuxfh4dOzuWEEGH/SOFj1WLimS0DhKPedo4NxwEvl3mfX15BVVg4l+64l
eEDrKgYQqCZe+uTM1kjy9910rLBu9k5HlMJN/pdtl9Weg9Xl7HIM2icnnLgaxvid
iyywlH0PjCOAB3cYh26yplqxF/etgin2EYBsws+9wuKsp07lxGHr6K8BpNfhb7FJ
kHqs6No1N3OvgY0NVICEEjdfSjRZoWenuwbUWQI9upkDJu3fwb2DedR5UbRFiUsA
thpky1K16oYpRAIEKSWKjcC16Zf0kE+vOVEXU6VSArpLx2DEE2LHJw==
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
MIIDWzCCAkOgAwIBAgIRAM4vdyTPpevleeccthmYizQwDQYJKoZIhvcNAQELBQAw
GTEXMBUGA1UEAwwOc2VydmVyYWRtaW4ucnUwHhcNMjEwMTE1MTYwNzA1WhcNMjMw
NDIwMTYwNzA1WjARMQ8wDQYDVQQDDAZ1c2VyMDUwggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQDUW+fSTJZFWoisj3gTHg797lIqhnbebczYY6GIPALqy37Q
TBsyzeaCA4pt/1PKe7PMafxrVc9nu+bwEdR1OynN0EJppujb1AkqVWsF197qoCoD
wCNfzcKOcuVLOJzfPGbQrUth2yMCJJ+hT39P+Z8ZPwhks2lR29FqwzDJFObBfA7F
aLl9JI5wSX+imz0WSYKhkrBA9PUg3UAJ9cDjY3p3Y6m4QI0R49Hh5PJpJ4z0xRXI
iCl2rCvLbkxTiUZoDMfsAO9rYKMb0zVvWtnz+YuJVGlck7AGTrPMeBC92u5dNo+h
YS1IWbQdu8LgwXCMaWwscEAp50VErVMoTO1h6ut/AgMBAAGjgaUwgaIwCQYDVR0T
BAIwADAdBgNVHQ4EFgQUfT6l/W9IvkNnSKrzJYHYtCxoBhowVAYDVR0jBE0wS4AU
jSVPyvZ1R1/lDApbcielAyjLrFOhHaQbMBkxFzAVBgNVBAMMDnNlcnZlcmFkbWlu
LnJ1ghQE+zyPDLLXNfPM/FfCzLxnKbpNFzATBgNVHSUEDDAKBggrBgEFBQcDAjAL
BgNVHQ8EBAMCB4AwDQYJKoZIhvcNAQELBQADggEBAGPjghLJpB55n6ioyT8Jzw5l
AiXW/9FyNDMN6zWF3wrkHvZznLZWfOXnTmZdnh8icvzieUngUHoKSgSgAJDJNWp1
KVQ4pgts9g62qerYzsLVS+1HIBSYLul/W336sma2YsstDNBrUpZKhFwwl0J1EeGY
7SvdBSE0ysxia3NxT3LPoziQ0FIr7GLT1KosOTO6JzKRHgDzPkW5njHioaRyKTMN
ahKc9ESW3/ShgQndoYldXQTs4LCOYrSkspzf3651I1XnQkwb+jofvC0Sba3YXnXy
tROkDsB0lr3p4Wmne+oIj8A4NcNCb3HWimMVfbhzHvqx8rBhnAdmpLhyLjyNgc0=
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDUW+fSTJZFWois
j3gTHg797lIqhnbebczYY6GIPALqy37QTBsyzeaCA4pt/1PKe7PMafxrVc9nu+bw
EdR1OynN0EJppujb1AkqVWsF197qoCoDwCNfzcKOcuVLOJzfPGbQrUth2yMCJJ+h
T39P+Z8ZPwhks2lR29FqwzDJFObBfA7FaLl9JI5wSX+imz0WSYKhkrBA9PUg3UAJ
9cDjY3p3Y6m4QI0R49Hh5PJpJ4z0xRXIiCl2rCvLbkxTiUZoDMfsAO9rYKMb0zVv
Wtnz+YuJVGlck7AGTrPMeBC92u5dNo+hYS1IWbQdu8LgwXCMaWwscEAp50VErVMo
TO1h6ut/AgMBAAECggEANFPVQu/WU46kgQj1SJiujwnru0jY/6RExsl+I0jOWzb7
r64hQZqVA1KGCObSqeFjg6pWJcjGS8R0epGaLaz/dxSrWMdlN83+2CymK5Fu/5ep
4rS0wsW7/Ef5kliH50ZF+4PIQHu0G7IUl7Y0I+vZtWnf0piXCjHFX65rVhFNbz2E
iC1XcpbgYV9/YisTniT815hTt2MVGCs64Vf5gt9TEwTD0GTEj9PX1mnafSvnHH9l
cs/6/g9Jgx4c+G3JTlks7kZB+AaHiQG46eR42lyo2kHRwYeO44LYvJYmG+wL1S+2
q9Kwy+7x4a2uqPmdQ/ggN4m+TGJBwJExBQA+KJHNoQKBgQD0kvQhIAetQNQEXSJr
HvZ+VKuA85vl3ODhIYSJse+wHGpOusvzsQFYb5fdJlEHTxrScDjfLRJn7cnyYzGt
pAHXY8D4E/hCZ53CgSs8S3F0FgVSITT5P8MftIu+ydbM+365n9qkIb7kmh8qEOaa
C/2NCWTWHwHDmPZ52kVME4CPbwKBgQDeR6r9mRvhpCJjIi1h0qn7ru50wYRskZP7
aM0dNqubhaKlRZMVfjyh1ZLVxZ0l2EoeiE3Nm6HbSgfW5P7oKw9HWTqOgVRQy6Z+
VZnMkXFCwqvPoxZLLzTw+0OLctk4zs40tyP0swNoUjTu0QYIJFxFGs1OpcwPsenW
Lcgrpyhc8QKBgQD0TTZ/QDdq4K7oDQAscKlYV8tY6/52BcS8HXb+9DawfDHUotLH
gbAOXqobxgJ6gpIQUvj8NVGFbwmijWM6R/Fu7b38EDaUXlw/xjch61pQ0w5Nk84O
i5qlOPu+gG+IIk/bq8oC2ZKNV0Z6BpfSmNeU4iVPnXltoIXUAivmajSpEQKBgF8k
phgutTR8IQv10R8SIRhN5FutiZU/KuxuC335rLLBHMFJao/EnQdYd6VxFLbiQbeX
+FWNzFYk9f4Rvtp5s+yCUQI2cXSz9uwUj+R0TNqaoRgbYquD5VFQ+7Rw0HH0c2c1
DPrstQSuS2H9rmtFxQj/U+naJeKB8OlwZ0HoJurBAoGBAPGBekQHqVToFXylxOst
ufyj0bAUWyoFKUHc7jiTOYUTlxsDcQho8aeveRD5GkE0ZTiKLFv9/QouCUjLKj2u
tD/IyAjj5X59FhIJ4pu+xiJhaie7LvoojiCQMtP5lrt+y6IH+pzd0L3P1S/e5ttd
UJ2bVZguV0qBXoJiKbuDmJl+
-----END PRIVATE KEY-----
</key>
<tls-crypt>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
73a440594e622482311817c96808bbe6
ef2cf42445013ab49ac7e2e64bc15b84
fd11ce32252690989a1bc56ae24318a5
3097e194f17578b819febcef7dfb9651
125bd310a67ddd40bcf388af777cc2b2
14505ed2dd827a5346a1ac2d0f2b8c5a
472680165136adabdeead231a73530db
9aaa30d0e1309d415db00a803b7893d7
36dd9b376d9083e9773c2365f61839b6
0740ee6943b8f3c39b8f7e36e7fe485a
c4c07f0dc1827b2aecc809775b86a078
ffc9976dcab6a1221890d0d73096697c
9cf1f9958f2cd6a2a474a8357249606d
ba688aa0cac64d44614b0e7683e6e894
dafeffc9da5ded05b06c88986eb4fac6
960398bb8b70fe01c8c06c1abd7db8bd
-----END OpenVPN Static key V1-----
</tls-crypt>

У нас нет задачи видеть сеть за клиентом, да и он скорее всего не будет являться шлюзом, поэтому параметра iroute для этого клиента нет. Плюс убраны пути для логов — openvpn будет создавать их в папке по умолчанию — C:usersusernameOpenVPNlog. Туда же, рядом, кладем конфиг в папку  C:usersusernameOpenVPNconfig.

Для подключения openvpn клиента в windows запускаем OpenVPN GUI от имени администратора!

Это важно, без прав администратора openvpn client для правильной маршрутизации не сможет прописать необходимые  маршруты автоматически.

Ищем мониторчик в трее, нажимаем правой кнопкой мыши на него и выбираем «Подключиться».

Если в директории с конфигами несколько файлов конфигураций, то будет выбор, к какому серверу подключиться. Чтобы одновременно подключаться к разным серверам, необходимо добавить несколько TAP-Windows Adapter для openvpn.

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

Для того, чтобы openvpn client автоматически подключался при запуске, нужно создать для него ярлык с параметрами:

--connect "user05.ovpn"

Для этого выбираем ярлык на рабочем столе OpenVPN GUI и нажимаем правой кнопкой мыши, открываем «Свойства».  На вкладке «Ярлык» в поле «Объект» в самом конце дописываем указанные параметры. Вся строка должна выглядеть следующим образом:

"C:Program FilesOpenVPNbinopenvpn-gui.exe" --connect "user05.ovpn"

Теперь при запуске ярлыка, openvpn будет автоматически подключаться к серверу и устанавливать vpn соединение.

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

192.168.220.1 192.168.220.10 192.168.150.1 192.168.150.10

Отлично, связь есть. Теперь попробуем зайти на сетевой ресурс, который мы создали ранее на компьютере сети филиала PC2:

Доступ есть, все в порядке. Если у вас какие-то проблемы с доступом к ресурсам по vpn, в первую очередь смотрите маршруты на клиенте. Они должны быть прописаны до всех необходимых подсетей филиалов.

Если запустить openvpn gui без прав администратора, то он не сможет добавить маршруты в систему. Соответственно и доступа никуда не будет.

Автоматическое подключение Openvpn при загрузке системы

Если вы хотите, чтобы ваш openvpn клиент в Windows автоматически подключался к серверу при старте системы, необходимо во время установки клиента добавить установку OpenVPN Service. По умолчанию она отключена.

Когда клиент будет установлен, убедитесь, что указанная служба имеет автоматический запуск.

Выше вы можете наблюдать еще одну службу, которая добавляется автоматически во время установки openvpn client в windows. Она отвечает за возможность запускать с правами администратора openvpn-gui у пользователя, который администратором не является.

Для того, чтобы после загрузки Winows OpenVPN подключилась автоматически к серверу, необходимо добавить конфигурационный файл в директорию C:Program FilesOpenVPNconfig-auto.

Теперь проверяйте. Перезагрузите компьютер и смотрите настройки сетевых интерфейсов Openvpn TAP-Windows.

Подключение к openvpn серверу выполнено автоматически после загрузки операционной системы. Через GUI информации об этом подключении вы не увидите. Если что-то пойдет не так, то лог автоматического подключения будет в директории C:Program FilesOpenVPNlog. Если вам нужно будет подключиться к еще одному vpn серверу, то вы можете сделать это через openvpn-gui, если в системе есть еще сетевые интерфейсы openvpn.

Подключение по Openvpn в Android

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

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

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

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

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

# ./easyrsa --batch revoke user01

Using SSL: openssl OpenSSL 1.1.1g FIPS  21 Apr 2020
Using configuration from /etc/openvpn/keys/easyrsa/pki/easy-rsa-1505.XnOgIX/tmp.3v8Hny
Enter pass phrase for /etc/openvpn/keys/easyrsa/pki/private/ca.key:
Revoking Certificate 2A4F516FA120BE4284FE9D0C46119BB0.
Data Base Updated

После отзыва необходимо сформировать файл со списком отозванных сертификатов. Это нужно будет делать каждый раз после отзыва.

# ./easyrsa gen-crl

Скопируем теперь этот файл в директорию с конфигом openvpn server.

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

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

crl-verify /etc/openvpn/server/crl.pem

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

Так же после отзыва не лишним будет удалить файл настроек и конфигурации клиента, а так же сохраненный ip адрес. Чтобы все это не делать вручную, я написал простенький скрипт revoke-user.sh, который включает все необходимые действия.

#!/bin/bash

echo -n "Enter user name for revoke: "
read user

clientexist=$(tail -n +2 /etc/openvpn/keys/easyrsa/pki/index.txt | grep -c -E "/CN=$user$")
    if [[ $clientexist == '0' ]]; then
	echo ""
        echo "The specified client name was not found in easy-rsa"
        exit
    else
    cd /etc/openvpn/keys/easyrsa/
    ./easyrsa revoke "$user"
    ./easyrsa gen-crl
    rm -f /etc/openvpn/server/crl.pem
    cp /etc/openvpn/keys/easyrsa/pki/crl.pem /etc/openvpn/server/crl.pem
    rm -f "/etc/openvpn/users-conf/$user.ovpn"
    rm -f "/etc/openvpn/ccd/$user"
    sed -i "/^$user,.*/d" /etc/openvpn/server/ipp.txt
    echo ""
    echo "Certificate $user revoked."
    fi

Отозванные сертификаты в списке index.txt помечаются буквой R.

На этом все основное по настройке openvpn сервера.

Заключение

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

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

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

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

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

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

Онлайн курс по Linux

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «Administrator Linux. Professional» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.

Что даст вам этот курс:

  • Знание архитектуры Linux.
  • Освоение современных методов и инструментов анализа и обработки данных.
  • Умение подбирать конфигурацию под необходимые задачи, управлять процессами и обеспечивать безопасность системы.
  • Владение основными рабочими инструментами системного администратора.
  • Понимание особенностей развертывания, настройки и обслуживания сетей, построенных на базе Linux.
  • Способность быстро решать возникающие проблемы и обеспечивать стабильную и бесперебойную работу системы.

Проверьте себя на вступительном тесте и смотрите подробнее программу по .

Видео

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.
Источник

Просмотров:

Добавить комментарий

Adblock
detector