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

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

Онлайн-курс по устройству компьютерных сетей

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

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

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

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

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

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

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

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

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

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

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

 

Описание схемы сети
Имя 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. Если еще нет, то можете воспользоваться моими материалами. В них раскрыты следующие темы:

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

# yum install epel-release

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

# yum install openvpn

 

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

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

Для работы сервера 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

Создание CA сертификата для openvpn server

Не забудьте указанный пароль. Его нужно будет вводить каждый раз при создании нового сертификата 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

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

Подписываем запрос на получение сертификата у нашего 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.

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

Настройка openvpn на centos

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

openvpn маршруты

Тут тоже все в порядке. Траффик для подсети филиала 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

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

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

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

Настройка openvpn client

Все в порядке, подключение к 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):

Проверка соединения по vpn

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

Ping внутри vpn

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

Тестирвоание работы openvpn

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

Доступ с vpn сервера в удаленную подсеть

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

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

Сетевая папка по vpn

Все получилось. Мы реально объединили удаленные офисы в единую связную сеть с помощью 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

Дальше редактируем файл конфигурации на сервере 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 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:\users\username\OpenVPN\log. Туда же, рядом, кладем конфиг в папку  C:\users\username\OpenVPN\config.

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

Запуск openvpn-gui

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

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

Настройка подключения openvpn в windows

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

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

Установленное vpn соединение

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

--connect "user05.ovpn"

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

"C:\Program Files\OpenVPN\bin\openvpn-gui.exe" --connect "user05.ovpn"

Автоподключение openvpn к серверу

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

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

192.168.220.1 192.168.220.10 192.168.150.1 192.168.150.10

Проверка работы openvpn в windows
Подключение удаленного сотрудника через openvpn

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

Доступ к сетевой папке по vpn

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

Маршруты в Windows после подключения к openvpn серверу

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

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

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

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

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

Автозапуск службы openvpn service

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

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

Конфигурация для автоматического подключения openvpn

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

Автоподключение openvpn

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

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

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

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

При этом приложение нормально поддерживает и 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

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

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

# ./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.

Видео

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Подписывайся на telegram канал автора

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

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

310 комментариев

  1. подскажите, подойдёт ли данная инструкция для серфинга в интернете через сервер с VPN ?

    имеется сервер CentOs 7 "за бугром" и локальная ОС Ubuntu

    с локальной тачки хочу зацепиться к серверу, чтобы "в мир" ходить через него

    • Да, подойдёт. Но для личного использования есть готовые решения, который в разы проще и быстрее разворачиваются.

  2. после
    $IPT -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE

    получаю
    bash: -t: команда не найдена

  3. Владимир, я уже голову сломал, куда дальше копать не понимаю...

    конфигурация openvpn сервер и клиент, оба на centos stream 8
    все поднял по данной статье

    на обоих машинах ens192: WAN, ens224: LAN

    сервер:
    ------

    ip a

    3: ens224: mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:65:9c:e9 brd ff:ff:ff:ff:ff:ff
    inet 10.1.1.51/23 brd 10.1.1.255 scope global noprefixroute ens224
    valid_lft forever preferred_lft forever

    5: tun0: mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none
    inet 10.1.4.1 peer 10.1.4.2/32 scope global tun0
    valid_lft forever preferred_lft forever

    netstat -nr

    Destination Gateway Genmask Flags MSS Window irtt Iface
    0.0.0.0 xxxxx 0.0.0.0 UG 0 0 0 ens192
    10.1.0.0 0.0.0.0 255.255.254.0 U 0 0 0 ens224
    10.1.4.0 10.1.4.2 255.255.255.0 UG 0 0 0 tun0
    10.1.4.2 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
    10.60.20.0 10.1.4.2 255.255.255.0 UG 0 0 0 tun0
    10.60.21.0 10.1.4.2 255.255.255.0 UG 0 0 0 tun0

    клиент:
    -------

    3: ens224: mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:0c:d4:01 brd ff:ff:ff:ff:ff:ff
    altname enp19s0
    inet 10.60.21.1/24 brd 10.60.21.255 scope global noprefixroute ens224
    valid_lft forever preferred_lft forever
    inet 10.60.20.1/24 brd 10.60.20.255 scope global noprefixroute ens224:0
    valid_lft forever preferred_lft forever
    5: tun0: mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none
    inet 10.1.4.6 peer 10.1.4.5/32 scope global tun0
    valid_lft forever preferred_lft forever

    Destination Gateway Genmask Flags MSS Window irtt Iface
    0.0.0.0 xxxxx 0.0.0.0 UG 0 0 0 ens192
    10.1.0.0 10.1.4.5 255.255.254.0 UG 0 0 0 tun0
    10.1.4.0 10.1.4.5 255.255.255.0 UG 0 0 0 tun0
    10.1.4.5 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
    10.60.20.0 0.0.0.0 255.255.255.0 U 0 0 0 ens224
    10.60.21.0 0.0.0.0 255.255.255.0 U 0 0 0 ens224

    Туннели поднялись.
    с клиента напрямую любой хост в 10.1.0.0/23 пингуется
    с машины в сети 10.60.21.0/24 (за клиентом) хосты в 10.1.0.0/23 не пингуются
    при этом на клиенте tcpdump на tun интерфейсе эхо запросы показывает, но их не видно на tun интерфейсе на сервере
    из сети за сервером и с самого сервера хосты в 10.60.21.0/24 (которая за клиентом) не пингуются

    отключение файерволла на клиенте не дает эффекта, значит что-то в маршрутизации (на сервере отключить файерволл не могу, т.к. маскарадит боевую локалку наружу)
    как крайний вариант, что-то с маскарадингом, но правило одно, маскарадить диапазон LAN сети на WAN интерфейсе сервера (клиента)

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

    • Я обычно начинаю с того, что включаю логирование всех запрещающих правил на фаерволах. Это более правильный подход, нежели отключение. Там сразу будет видно, если что-то блокируется. Чаще всего это решает проблему. Тут смотреть нужно только на фаерволы и на маршруты. Больше ничего, относящегося к хождению пакетов, нет. Но маршруты и фаерволы надо смотреть по всему пути пакетов, а не только на vpn клиенте и сервере. Возможно есть какой-то нюанс с /23 сетками. Я сам никогда их не использую.

      Немного подумал и вижу, что тут скорее всего проблема с пересечением адресных пространств. У вас и VPN сеть, и рабочая 10.1.Х.Х и при этом с разными масками. Тут скорее всего они накладываются друг на друга и пакеты идут не туда, куда вы ожидаете. У меня сейчас нет времени подробно разбираться в этом, но мне кажется, проблема именно тут. Возьмите для vpn сети подсеть 192.168.55.0/24 и попробуйте.

      • сети не должны пересекаться (10.1.0.0/23 - офис, 10.60.20.0/24 management и 10.60.21.0/24 lan - филиал. 10.1.4.0/24 -- vpn подсеть)

        обнаружил интересный момент:

        со стороны клиента
        5: tun0: mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
        link/none
        inet 10.1.4.6 peer 10.1.4.5/32 scope global tun0

        пингуется только inet адрес 10.1.4.5, а peer адрес 10.1.4.6 не пингуется

        со стороны сервера
        6: tun0: mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
        link/none
        inet 10.1.4.1 peer 10.1.4.2/32 scope global tun0

        пингуется только inet адрес 10.1.4.1, а peer адрес 10.1.4.2 не пингуется

        при этом есть рабочая пара сервер\клиент на 6 сайнтифике
        4: tun0: mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
        link/[65534]
        inet 10.200.0.5 peer 10.200.0.6/32 scope global tun0
        тут пингуется и inet IP и peer IP

        пингую с хоста на котором поднимается туннель (как на сервере, так и на клиенте)

        такое ощущение, что проблема с openvpn пакетом или вообще с ядром!!!!
        в рабочей системе все-таки древний сайнтифик, а в нерабочей на обоих концах centos stream 8

        У Вас нет статистики случайно работает ли OpenVPN на centos stream 8?

        • На centos stream 8 работает. Все проблемы хождения пакетов по VPN это всегда вопросы к firewall и маршрутам. Всегда, сколько бы я таких проблем не видел. Надо подробно разбираться с этими вещами.

  4. Привет, сделал по вашей инструкции, и на этапе добавления пользователя через скрипт сталкиваюсь с ошибкой

    [root@vm3301024 /]# sh ect/add_vpn_usr.sh
    Enter user name: su
    Protect the private key with a password?
    1) No, passwordless client
    2) Yes, use a password for the client
    Select an option [1-2]: 1

    Note: using Easy-RSA configuration from: /etc/openvpn/keys/easyrsa/vars
    Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017
    Generating a 2048 bit RSA private key
    ..........................................................+++
    .....................................+++
    writing new private key to '/etc/openvpn/keys/easyrsa/pki/easy-rsa-11452.KTr6Oq/tmp.jFja0o'
    -----
    Using configuration from /etc/openvpn/keys/easyrsa/pki/easy-rsa-11452.KTr6Oq/tmp.4g1R51
    Enter pass phrase for /etc/openvpn/keys/easyrsa/pki/private/ca.key:
    unable to load CA private key
    140267397597072:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:618:
    140267397597072:error:0906A065:PEM routines:PEM_do_header:bad decrypt:pem_lib.c:488:

    Easy-RSA error:

    signing failed (openssl output above may have more detail)

    Easy-RSA error:

    Failed to sign 'su'

    Client su added.
    awk: fatal: cannot open file `/etc/openvpn/keys/easyrsa/pki/issued/su.crt' for reading (No such file or directory)
    cat: /etc/openvpn/keys/easyrsa/pki/private/su.key: No such file or directory

  5. Сегодня по данному мануалу настраивал поднимал OpenVPN на Debian 11, для доступа из внешнего мира к ресурсам локалки ну и прочих плюшек VPN.
    Выложу здесь свои шаги и конфиги, может кому поможет, а может кто и покритикует )))
    По центру сертификации и по созданию сертификатов всё шло как по маслу, потом было немножко граблей по которым я походил с удовольствием )))
    Ну поехали по шагам:
    1. apt update
    2. apt install openvpn
    3. Идём на https://github.com/OpenVPN/easy-rsa/releases - смотрим последний релиз easy-rsa
    4. wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz
    5. mkdir /etc/openvpn/keys
    6. mv EasyRSA-3.0.8.tgz /etc/openvpn/keys
    7. cd /etc/openvpn/keys
    8. tar xzvf EasyRSA-3.0.8.tgz
    9. mv EasyRSA-3.0.8 easyrsa
    10. rm -f EasyRSA-3.0.8.tgz
    11. cd easyrsa
    ######### СОЗДАЕМ СТРУКТУРУ PUBLIK KEY ##########
    12. mv vars.example vars
    13. ./easyrsa init-pki
    ########### Создание удостоверяющего центра ##########
    14. ./easyrsa build-ca
    - при выполнении нужно задать пароль в строке "Enter New CA Key Passphrase:" он потребуется при созданиии сертификатов
    В итоге получаем 2 файла:
    /etc/openvpn/keys/easyrsa/pki/private/ca.key (Сертификат сервера)
    /etc/openvpn/keys/easyrsa/pki/ca.crt (Клиентский сертиификат)
    ###### Создание (запрос) сертификата для сервера без пароля с помощью опции nopass############
    15. ./easyrsa gen-req server nopass
    ##########Подписываем запрос на получение сертификата у нашего CA:###########
    16. ./easyrsa sign-req server server
    ########## Генерируем ключ Диффи-Хелмана ###############
    17. ./easyrsa gen-dh
    ########### копируем в папку server все необходимые файлы ###########
    18. 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 #############
    19. openvpn --genkey secret /etc/openvpn/server/tc.key
    ########### Создадим ключ для клиента openvpn ##############
    20. ./easyrsa build-client-full client01 nopass

    ################# НАСТРОЙКИ OpenVPN #####################################
    21. mcedit /etc/openvpn/server/server.conf
    Содержимое файла
    (-----------------------
    port 41941
    proto udp
    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 # подсеть для туннеля, может быть любой
    ifconfig-pool-persist ipp.txt # файл с записями соответствий clinet - ip
    push "redirect-gateway def1 bypass-dhcp"
    push "dhcp-option DNS 77.88.8.8"
    push "dhcp-option DNS 77.88.8.1"
    client-to-client # позволяет клиентам openvpn подключаться друг к другу
    client-config-dir /etc/openvpn/ccd # директория с индивидуальными настройками клиентов

    keepalive 10 120
    comp-lzo # если используется протокол tcp, сжатие надо отключить
    max-clients 10

    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 nogroup
    verb 3
    mode server
    ---------------------)

    22. mkdir /etc/openvpn/ccd && mkdir /var/log/openvpn
    23. mcedit /etc/openvpn/ccd/client01 - файл создал, но никаких параметров в нем не указывал.
    24. systemctl start openvpn-server@server.service - Запускаем сервер
    25. netstat -tulnp | grep 41941 - смотрим открылся ли порт
    26. ip a - проверяем интерфейс tun
    27. netstat -nr - проверяем статическую маршрутизацию.
    28. systemctl enable openvpn-server@server.service - добавляем сервер в автозапуск
    29. Добавляем правила в iptables:
    создаем файл или правим существующий /etc/iptables.sh
    (-----------------------
    #!/bin/bash
    #
    # Объявление переменных
    export IPT="iptables"

    # Активный сетевой интерфейс
    export WAN=enp5s0
    export WAN_IP=192.168.10.2

    # Очистка всех цепочек iptables
    $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

    # разрешаем локальный траффик для loopback
    $IPT -A INPUT -i lo -j ACCEPT
    $IPT -A OUTPUT -o lo -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

    # Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении.
    # Пропускать все уже инициированные соединения, а также дочерние от них
    $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

    # Включаем фрагментацию пакетов. Необходимо из-за разных значений MTU
    $IPT -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

    # Отбрасывать все пакеты, которые не могут быть идентифицированы
    # и поэтому не могут иметь определенного статуса.
    $IPT -A INPUT -m state --state INVALID -j DROP
    $IPT -A FORWARD -m state --state INVALID -j DROP

    # Приводит к связыванию системных ресурсов, так что реальный
    # обмен данными становится не возможным, обрубаем
    $IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
    $IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP

    # Разрешаем OpenVPN
    $IPT -A INPUT -i tun+ -j ACCEPT
    $IPT -A OUTPUT -o tun+ -j ACCEPT
    $IPT -A FORWARD -i tun+ -j ACCEPT

    # Открываем порт для ssh (!!!не забудьте указать свой порт, который вы изменили ранее!!!)
    $IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT
    # Открываем порт для web сервера
    #$IPT -A INPUT -i $WAN -p tcp --dport 80 -j ACCEPT - (у себя не открывал, кому надо активируйте)
    #$IPT -A INPUT -i $WAN -p tcp --dport 443 -j ACCEPT - (у себя не открывал, кому надо активируйте)

    # Открываем порт для openvpn
    $IPT -A INPUT -i $WAN -p udp --dport 41941 -j ACCEPT
    $IPT -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE

    # Записываем правила в файл

    /sbin/iptables-save > /etc/iptables_rules
    ----------------------------------)
    делаем файл иисполняемым chmod 700 /etc/iptables.sh
    и выполняем скрипт sh /etc/iptables.sh

    30. добавляем net.ipv4.ip_forward = 1 в файл /etc/sysctl.conf и применяем настройку командой sysctl -p

    ########################## Создаем файл конфигурации для клиента ###############################
    Дальше выполняем всё как описано в статье с использованием скрипта приведённого в статье - всё работает.
    #####################################################################################

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

    • Привет. Вопрос к вам, и ко всем кто прочитает, не было ли у вас проблем с типом шифрования? Просто у меня сервер то стартует, норм, но если логи посмотреть, там пишут что ПРЕДУПРЕЖДЕНИЕ!!! ))) что мол от AES-256-CBC надо уходить, либо принять меры. Хотя если на сайте пишут что только BF-256-CBC, устарел. Я в общем ставил AES-256-GCM. И что делать лучше, перейти на другое шифрование или дополнительные параметры вводить, что бы сервер принял AES-256-CBC нормально?

  6. "Сервер": Винда-7 про. OpenVPN-2.5.5-I602-amd64.
    # ./easyrsa init-pki - выполнена успешно, все создало.
    # ./easyrsa build-ca - после ввода пароля и подтверждения к нему (правильного - вводил очень внимательно и медленно!) выдает ошибку
    Extra arguments given.
    Failed create CA private key
    - - - - - - - - - - - - - - - - - - - - - -
    Вывод команды:
    Note: using Easy-RSA configuration from: ./vars
    Using SSL: openssl OpenSSL 1.1.1l 24 Aug 2021
    path = C:/Program Files/OpenVPN/easy-rsa/pki/easy-rsa-6060.a08748/tmp.XXXXXX
    lpPathBuffer = D:\Temp\SYSTEM\
    szTempName = D:\Temp\SYSTEM\tmpA109.tmp
    path = D:\Temp\SYSTEM\tmpA109.tmp
    fd = 4
    path = C:/Program Files/OpenVPN/easy-rsa/pki/easy-rsa-6060.a08748/tmp.XXXXXX
    lpPathBuffer = D:\Temp\SYSTEM\
    szTempName = D:\Temp\SYSTEM\tmpA1A5.tmp
    path = D:\Temp\SYSTEM\tmpA1A5.tmp
    fd = 4
    path = C:/Program Files/OpenVPN/easy-rsa/pki/easy-rsa-6060.a08748/tmp.XXXXXX
    lpPathBuffer = D:\Temp\SYSTEM\
    szTempName = D:\Temp\SYSTEM\tmpA251.tmp
    path = D:\Temp\SYSTEM\tmpA251.tmp
    fd = 4

    Enter New CA Key Passphrase:
    Re-Enter New CA Key Passphrase:
    Extra arguments given.
    genrsa: Use -help for summary.

    Easy-RSA error:

    Failed create CA private key
    - - - - - - - - - - - - - - - - - - - - - -
    Если добавить параметр "nopass", то ключи генерируются успешно.

    • А почему Win7? Она уже сколько времени не поддерживается. В этом может быть проблема. Каких-нибудь шифров нет. А вообще не стоит сильно запариваться с этой системой. Ключи можно где угодно сделать и просто скопировать на сервер.

  7. Добрый день
    спасибо за статью и скрипт, интересный подход с добавление сертификата и ключей в конфиг клиента, раньше такое не использовал!
    подскажите, вы использовали когда- то промежуточный центр сертификации? когда из СА генерируется subCA и уже subCA подписывает сертификаты клиентов и серверов, тогда в случае компроментации секрета subCA его можно отозвать и сгенерировать новый

    • Ни разу не использовал subCA. Думаю, это актуально для больших систем. У меня таких не было никогда.

      • subCA оказалось не сложно развернуть, особо никаких нюансов нету , только в конфиге клиента нужно всю цепочку сертификатов держать и соблюдать последобавтельно - , при другой последовательности у меня подключения не устанавливались, так не смог понять почему OpenVpn Connect не захотел подключаться! на клиенте и сервере в логах ничего криминального, TunnelBlick подключается с тем же конфигом так что просто пользуюсь им

        • Аноним

          последовательность :)

          • Аноним

            я хотел написать потому что потратил время тусуя эти сертификаты , а в комментах знаки больше/меньше урезаются :D
            [CA]
            [clientCert
            subCA]
            [clientKey]
            [ta]

  8. Здравствуйте! Полезная статья, спасибо! Подскажите пожалуйста как реализовать при помощи того же vpn сервера возможность доступа к хостам которые находятся в филиалах по доменному имени, например office1.mycompany.ru, office2.mycompany.ru и тд. Вообще возможно ли такое? Как понимаю нужно задействовать службу dns на сервере, а дальше не соображу.

    • Обращение по имени с vpn вообще никак не связно. Нужно просто добавить dns записи по ip адресам ваших серверов.

  9. Аноним

    Добрый день!
    Есть два вопроса.
    1) Как можно защитится от передачи пользователям сертификата другому пользователя.
    2) Настроил всё как в гайде но при вводе команды netstat -nt | grep 13555 не отображаются подключенные клиенты, подключение по другим портам видно.

  10. Александр

    Не могу понять в чем дело.
    С сервера и опорной машины клиента пинги идут и на клиентскую машину и на сервер/опорную. С клиентских машин обоих сетей не идут ни на какую машину другой подсети. Так же они не идут если пинговать от имени внутреннего тнтерфейса опорной/сервера.

    ip_forward прописан.
    Маршруты выглядят нормально.
    Маршруты 192.168.251.0 255.255.255.0 10.1.1.5 UG 0 tun 0 на клиенте и 192.168.252.0 255.255.255.0 10.1.1.2 UG 0 tun 0 на сервере есть.
    Пакеты в тунель с интерфейсов локалок не попадают (не форвардятся).

    В чем может быть дело? Куда смотреть?

    • Такие проблемы все решаются одинаково - надо проверять все маршруты и настройки фаерволов. Больше проблем неоткуда взяться.

      • Александр

        Вроде все делал по статье. Включая настройки iptables.
        Нулевая метрика маршрута это нормально?

      • Александр

        Строчка после добавления которой заработало.
        $I -A FORWARD -i $L -o $V -j ACCEPT
        I - iptables
        L - local iface
        V - tun0

  11. Спасибо большое за статью, а также за обновление информации в ней.
    Сервер запустился, а на клиенте (CentOS 8) после запуска не появляется интерфейс tun0. На каком этапе он должен появлятся? С чем может быть связано? CentOS-client настроен, как шлюз для офиса по вашей статье https://serveradmin.ru/nastroyka-shlyuza-dlya-lokalnoy-seti-na-centos-7/

    • Скорее всего клиент не запустился, раз интерфейс не поднялся. Надо смотреть системный лог messages на наличие ошибок и дополнительной информации. По умолчанию, openvpn туда свои логи пишет, если не настроен отдельный файл для них в конфигурации.

      • Статус службы - active. /var/log/messages отсутствует. Лог по адресу /var/log/openvpn/openvpn-client.log показывает:
        TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
        TLS Error: TLS handshake failed
        SIGUSR1[soft,tls-error] received, process restarting
        Restart pause, 300 second(s)
        TCP/UDP: Preserving recently used remote address: [AF_INET]xxx.xxx.xxx.xxx:13555
        Socket Buffers: R=[212992->212992] S=[212992->212992]
        UDP link local: (not bound)
        UDP link remote: [AF_INET]xxx.xxx.xxx.xxx:13555
        То есть - проблема с сетью? Фаервол (iptables) ?

        • Не обязательно с сетью, но начинать проверки следует с нее.

          • Проблема была с файлом tc.key : он должен лежать на сервере рядом с server.conf и на клиенте рядом с client.conf. У меня он был на сервере в другом каталоге. Сервер на CentOS-7, клиент на CentOS-8, потому с каталогами напутал.

            • Текст ошибки, к сожалению, неинформативный. Часто так бывает. В логах пишет что-то про сеть, но проблема совсем в другом. Часто с таким сталкиваюсь.

  12. Андрей

    Понимаю, что это не круто, но может кому сгодится, сам не тестил)))

    https://cryptopunks.org/article/secure+openvpn+installer/

    https://github.com/adamwalach/openvpn-web-ui/blob/master/docs/screenshots.md

  13. Аноним

    А для чего в такой задаче нужен TLS? Решил посоветоваться, может чего то не так делаю.
    Я создаю один ключ самим ovpn:
    openvpn --genkey --secret /etc/openvpn/key22.key и копирую его на второй сервер.

    Делаю конфиг:

    remote 179.37.25.12
    proto udp4
    port 46752
    dev tun-of7
    keepalive 10 120
    ping-timer-rem
    persist-tun
    persist-key
    cipher AES-256-CBC
    ifconfig 192.168.20.5 192.168.20.4
    #route 192.168.1.0 255.255.255.0
    secret /etc/openvpn/key22.key
    status /var/log/ovpn-office7.log

    На другом сервере конфиг такой же, только, remote, заменен на local и в ifconfig адреса меняю местами.
    Все, systenctl start…
    Повторюсь, хотел узнать грабли моего варианта, при соединении двух сетей? (или просто ноут - работа :)

    • А как сюда внешнего клиента в виде удаленного сотрудника подключить? Вы настроили Site-to-Site соединение. Если вам этого достаточно, то можно больше ничего не настраивать. Я так тоже делал иногда, когда точно не нужно было никого подключать, кроме двух серверов между собой.

      • Аноним

        >А как сюда внешнего клиента в виде удаленного сотрудника подключить?
        Каждый новый клиент, в моей реализации - гемор. Показалось, что статья про side2side. Важность TLS для провайдеров vpn не отрицаю (нет опыта). В общем успокоили, с s2s не косячу. Еще раз, спасибо за темы и стиль изложения.

  14. Спасибо Вам за обновление статьи, последний раз делал по нескольким статьям на разных сайтах, а теперь тут все в одном месте

    • А по этой одной получилось сделать? Она самодостаточна или чего-то не хватает? Я старался все основное охватить.

  15. Может кто сделает такую же инструкцию только по L2TP как клиент к серверу микротик, а то везде какая то лажа

    Может еще как сервер кому пригодится это работает https://github.com/xelerance/xl2tpd

  16. Здравствуйте! В комментариях ответа не нашёл, хотя подобные вопросы были но остались без ответа. Если vpn сервер выступает в роли клиента сети а не шлюза. Шлюз на mikrotik получает на wan интерфейс серый ip адрес провайдерской сети. Вообще реализация по удалённому доступу к vpn серверу будет работать при таких условиях? Или в любом случае необходим белый IP?

    • Будет работать. Клиенту белый ip не нужен. Клиент vpn подключается к серверу и поднимает vpn канал. Далее на микротике, если он является дефолтным шлюзом для локальной сети, добавляете маршруты vpn туннеля и удаленных сетей за ним. Для этих маршрутов ставите шлюзом сервер, где vpn клиент. Вот и все.

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

      • Немного не пойму что то, как удалённый клиент знает что за адресом напр. 10.12.3.140/20 находиться vpn сервер? Интернет не знает ничего про адрес 10.12.3.140/20 к которому подключается клиент.
        И в конфигурации сервера строка route 10.12.0.0 255.225.240.0 должна остаться? Или это нужно только если необходим доступ к сети клиента?

        • VPN сервер должен иметь внешний ip адрес. В моей статье в этом качестве выступает адрес 10.20.1.38. Просто у меня нет тестового стенда с внешним ip.

  17. Здравствуйте!
    я не в теме, но кажется у нас на предыдущей работе был аппаратный open VPN , на роутере Asus был такой функционал. Для оптимизации, интересно, можно в Головном Офисе поставить программный сервер, который Вы описали, а в филиалах аппаратный Open VPN ? подружатся филиалы с программным сервером в ГО?

    • Да, конечно можно. Единственное, у аппаратных реализаций openvpn наверняка будут какие-то специфичные требования к конфигурации. Их не сложно узнать и нужно будет учесть. К примеру, я использовал центральный openvpn сервер на базе centos и подключал к нему клиентов на mikrotik.

  18. Виталий

    mkdir /etc/openvpn/keys не хватает ключа -p

    • В целом да, с ключом более универсально. Но в данном случае это не обязательно, так как директория openvpn 100% будет после установки пакета.

  19. Кирилл

    Здравствуйте, с наступающим Вас! Возможно в комменте эта ситуация обсуждалась, извините за скорость.
    Но не об этом, в общем столкнулся с такой проблемой, что после выполнения команды "systecmtl start openvpn@server", пропадает подключение к самому серверу из локальной сети по порту 22, но после не определённого времени возобновляется, но пароль не подходит, в дальнейшем так же сам сервер не может пинговать своё локальное окружение и это отражается на клиентах, после подключения к серверу не каких доступов и пингов в подсеть указанную в "route".
    Сервер просто закрывается от местных своих скажем так, и у клиента подключение есть, но адрес внешний у него свой так и остается, ну и соответственно подсеть не видит за сервером, не хотел повторяться, так получилось)
    Подскажите пожалуйста куда копать.

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

  20. Спасибо за информацию. А если на VPS сервере размещены сайты, vpn сервер не будет мешать? Или надо арендовать VPS отдельно?

    • Мешать несколько некорректное слово в данном случае. Технически мешать не будет. А дальше смотрите сами, подходит вам такое соседство функционала или нет. Я предпочитаю функционал разделять.

  21. Подскажите по поводу NAT
    Настроил связь по Вашему примеру, раньше Centos-server и Centos-client, была настроена как то по другому, без NAT походу
    В сети 192.168.10.0/24 есть Zabbix-server 192.168.10.8
    В сети 192.168.20.0/24 zabbix-agent(ы)
    После настройки сети с NATом zabbix-agent(ы) начали видеть сервер как 10.0.0.1 (т.е. VPN Server адрес), я конечно добавил его в конфиг агента, и все заработало, но мне не нравиться что все происходит через VPNовские адреса
    Если я отключу NAT в iptables, нужно ли будет что-то еще настраивать?
    Cпрашиваю, потому что это все делаю в рабочем режиме, не хочу оставлять офис надолго без работы

  22. Если у вас низкая скорость openvpn по tcp на windows
    Добавляем в конфиг сервера.
    sndbuf 0
    rcvbuf 0
    push "sndbuf 393216"
    push "rcvbuf 393216"

    Для UDP:
    sndbuf 393216
    rcvbuf 393216
    push "sndbuf 393216"
    push "rcvbuf 393216"

    –Sndbuf размер
    Установите размер буфера отправки сокета TCP / UDP. По умолчанию используется операционная система по умолчанию.
    –Rcvbuf размер
    Установите размер приемного буфера сокета TCP / UDP. По умолчанию используется операционная система по умолчанию.

  23. При правельных конфигах есть разница TUN и TAP
    TUN - на сервере автоматом поднимается интерфейс TUN0 - доступ клиентов только в интернет ( сервер за роутером ).
    TAP - на сервере автоматом поднимается интерфейс TAP0 - доступ клиентов и в локалку и интернет ( сервер за роутером ).
    Если сервер сразу от провайдера надо поднимать BRIGE - интерфейс.

  24. Всегда читаю ваши статьи ! Напишите мне на мыло - есть увлекательные темы и вопросы !

  25. Сергей Вагнер

    Владимир добрый день, как то в вашем Телеграмме вы говорили что обновите данную статью - очень-очень ждем)))

  26. У openvpn есть обёртка в виде Pritunl. Если нужны только элементарные основные функции, он бесплатен для неограниченного количества клиентов и быстро настраивается.

    • Смотрел эту панель несколько лет назад. На тот момент она была бесплатна только для 2-х клиентов. У них больше нет этого ограничения?

      • Нету. Проверил только что.
        Free:
        Single server
        Unlimited users
        Unlimited devices
        $0/month

        Классная штука .. мне сэкономила столько времени и нервов ))))
        Есть более гибкий, мульти-протокольный и совсем бесплатный SoftEther, но он не так удобен и не так быстро разворачивается.

      • Single server - имеется ввиду что он не поддерживает кластер в бесплатной версии,
        а не то что его только на 1 сервер ставить можно.

  27. Всем привет!
    Уже который день мучаюсь с настройкой сервера OpenVPN.
    Суть такая:
    У меня есть роутер, он раздает IP с своей сети 192.168.0.0
    На сервере VPN стоит сеть 10.8.0.0
    Если я подключаюсь к серверу VPN внутри сети роутера, то все норм!
    Если подключаюсь к VPN из вне (мобильная сеть ТЕЛЕ2 с раздачей инета для бука), провайдер присваивает IP WiFi адаптеру 192.168.43.233, и TAP адаптер клиента OpenVPN берет Gateway с WiFi карты "192.168.43.1". И соответственно моя домашняя сеть перестает работать (не видно расшаренных папок и т.д.)

    И еще есть один нюанс - при подключении бука к VPN через мобильную сеть, внутрисетевые IP пингуются (192.168.0.2), а расшаренные папки появляются после команды tracert 192.168.0.2

    Ребята, можете мне объяснить, что за хрень происходит?)))
    1. Почему TAP адаптер присваивает шлюз сетевой карты?
    2. Почему я вижу внутреннюю сеть после команды tracert 192.168.0.2?

    Вот конфиг OpenVPN:

    local 192.168.0.10
    client-to-client
    port 1194
    proto udp
    dev tun
    ca ca.crt
    cert server.crt
    key server.key
    dh dh.pem
    auth SHA512
    tls-crypt tc.key
    topology subnet
    server 10.8.0.0 255.255.255.0
    push "redirect-gateway def1 bypass-dhcp"
    push "route 192.168.0.0 255.255.255.0"
    ifconfig-pool-persist ipp.txt
    push "dhcp-option DNS 192.168.0.1"
    push "dhcp-option DNS 8.8.8.8"
    push "dhcp-option DNS 8.8.4.4"
    keepalive 10 120
    cipher AES-256-CBC
    user nobody
    group nobody
    persist-key
    persist-tun
    status openvpn-status.log
    verb 3
    crl-verify crl.pem
    explicit-exit-notify

  28. Не подскажите, возможно ли настроить впн на Centos 8 так, чтобы можно было подключиться к сети дефолтной утилитой винды 10? Везде этот openvpn, не хочется использовать на винде сторонний софт для подключения к сети(

  29. HorekRediskovich

    А зачем использовать NAT для внутренних серых IP?

    • В каких-то ситуациях NAT нужна и в серых адресах. NAT не только для выхода в интернет бывает нужен.

  30. Все вкурить не могу где у меня проблемы с Нат.
    Есть роутер 91.xx.xx.x внутренняя сеть 10.0.0.1
    Есть опенвпн c ip 10.0.0.2 и тап интерфейсом 192.168.0.1
    Клинт получает адрес 192.168.1.2
    Когда клиент подключается к любому адресу 10.0.0.4 то отображается адрес в линуксе что заходил 10.0.0.2 а не 192.168.1.2.
    Хотя с 10.0.0.4 пинается адрес 192.168.1.2

  31. В нашем офисе авторизация к впн по логину/паролю. Как указать данные для клиента openvpn?
    На винде понятно - там выскакивает окно OpenVPN GUI.

    • Если на винде понятно, то где конкретно не понятно?

      • Очень интересует как подключить машину CentOS в качестве клиента к впн

        • А в чем конкретно проблема? Там нет никаких сложностей. Ставится пакет openvpn-client. Настраивается конфиг. Его формат примерно одинаковый для всех систем. Потом клиент через systemctl запускается.

          • Хорошо, благодарю. Тема организации удаленной работы сейчас весьма актуальна и данная статься пришлась очень кстати =)

  32. А вот тут push "route 192.168.20.0 255.255.255.0" вместо 20 сети разве не 10 нужно передавать?

    • Все верно. Так и должно быть. Мы указываем, что этот маршрут на сервере обслуживает vpn тоннель. А следующей командой передаем маршрут клиенту.

      • Ну правильно через пуш мы передаем клиентам маршрут где находится сеть сервера, а у вас получается мы передаем клиентам их же сеть.

        • А всё увидел, на клиенте тоже в конфиге есть маршрут. Не внимательно смотрел.

  33. А почему бы не добавить TLS...? Сгенерировать ta.key...

    • Все можно добавить и заменить. Статья уже давно ждет обновления и актуализации. Пока руки не дошли.

  34. Спасибо большое за статью, было очень полезно. Еще здесь читал немало инфо о VPN сервисах с поддержкой Linux https://testvpn.ru/vpn-dlya-linux/

  35. Не могу сообразить что написать в iptables.sh если это не шлюз, а отдельная машина с OpenVPN

  36. Огромное спасибо за статью, все получилось!

    Хотел только уточнить, что в Centos 8 для корректного автозапуска сервера через systemctl
    файл server.conf необходимо разместить не в /etc/openvpn/server.conf а подпапке server,
    т.е. он должен находиться в /etc/openvpn/server/server.conf
    судя по более ранним комментариям, я не первый, кто на эти грабли наступил,
    буду признателен, если Вы сможете внести это уточнение в текст основной статьи

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

    • Сама команда запуска серевера на CentOS 8:
      systemctl start openvpn-server@server.service
      клиента:
      systemctl start openvpn-client@client.service
      где "server" или "client" после @ - имя сертификата сервера или клиента соответственно, а перед @ - часть команды.

  37. Сергей

    Добрый день.А как удалить уже ненужных клиентов на сервере чтобы они не могли соединяться?

    • В директории со скриптами есть скрипт revoke-all. Надо с его помощью отозвать сертификат:
      # revoke-all unwanted-client-name

      После работы скрипта появится файл crl.pem. Его надо добавить в конфиг сервера:
      crl-verify /etc/openvpn/crl.pem

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

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

    • По сути клиент и сервер openvpn между собой никак не связаны. Вы можете настраивать как клиент, так и сервер на одном компьютере.

      • по сути да, но что-то не работает :)
        есть два настроенных и работающих сервера OVPN, на них без проблем конектятся виндовые одиночные клиенты.
        на одном из серверов пытаюсь запустить клиентскую настройку для объединения этих серверов постоянным тоннелем, но клиент не хочет конектится к серверу. все настройки серверов выполнены по этой статье

        в логе клиента:
        Mon Mar 23 11:46:11 2020 WARNING: No server certificate verification method has been enabled. See http://openvpn.net/howto.html#mitm for more info.
        Mon Mar 23 11:46:11 2020 TCP/UDP: Preserving recently used remote address: [AF_INET]хх.хх.хх.хх:13555
        Mon Mar 23 11:46:11 2020 Socket Buffers: R=[212992->212992] S=[212992->212992]
        Mon Mar 23 11:46:11 2020 UDP link local (bound): [AF_INET][undef]:1194
        Mon Mar 23 11:46:11 2020 UDP link remote: [AF_INET]хх.хх.хх.хх:13555
        Mon Mar 23 11:47:11 2020 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
        Mon Mar 23 11:47:11 2020 TLS Error: TLS handshake failed
        Mon Mar 23 11:47:11 2020 SIGUSR1[soft,tls-error] received, process restarting
        Mon Mar 23 11:47:11 2020 Restart pause, 80 second(s)

        может подскажет кто в чем причина?

      • Правильно ли я понимаю что на стороне где запускается два экземпляра OpenVPN должно подняться два TUN интерфейса?

  39. При попытке применить правила iptables выдаёт такое:
    Bad argument `tun+'
    Try `iptables -h' or 'iptables --help' for more information.

    интерфейс tun0 присутствует

    • В синтаксисе правила ошибка. Посмотрите внимательно на него.

      • Спасибо, перепроверил правила раз десять, но пока не сказали что там ошибка, не видел её.
        Странно, почему при этой ошибке, ругается на tun+?

  40. Статья, как всегда, отличная, но пора уже пофиксить устаревшее, а еще лучше, переписать под Centos 8 + SElinux :)

    Читатели, если будете копировать конфиг сервера, учтите, что:
    " 'comp-lzo' was deprecated in OpenVPN 2.4 and has been or will be removed in a later version".
    Клиенты на маках будут получать назойливые уведомления, а после обновления все перестанут соединяться с сервером.

    Фиксим конфиг:

    compress lz4-v2 # новый формат для сжатия
    push "compress lz4-v2" # передать настройку сжатия клиентам

    • Храни тебя бог, не работало и всё, я просто не мог понять что не так....... замена comp-lzo на compress lz4-v2 помогла

  41. Привет, подскажи плз, я поднял OPENVPN сервер на VPS (Cent OS), с компов заходит на ура, с телефона через ПО OpenVPN connect вот не в какую, там заблочено на уровне ядра маршрутизация udp пакетов?
    инет на телефоне 4г
    ноут, на котором пашет, получает инет с телефона по 4г =)
    сервер по tun, udp.

    в логах пишется ошибка рукопожатия tls

  42. Владимир

    Привет, подскажи пожалуйста, я поднял OPENVPN сервер на VPS (Cent OS), с компов заходит на ура, с телефоне через ПО OpenVPN connect вот не в какую, там заблочено на уровне ядра маршрутизация udp пакетов?
    openvpn через tun по upd
    на мобильнике инет через 4G
    ноут, который получает инет с мобильника без проблем подключается к серверу впн

    • У меня нет проблем с подключением к openvpn серверам, настроенным по этой статье, на мобильном телефоне. Прямо сейчас настроены 3 разных подключения и все работают. Использую программу OpenVPN Connect.

  43. Спасибо за статью, помогла весьма сильно в своё время.
    Понадобилось тут запустить ещё одну копию OpenVPN сервера с другим конфигом. А как правильно ключи генерировать в таком случае, чтоб старые не затёрлись?

    • Папку easy-rsa-master скопировать в другое место и выпускать там сертификаты. Они все в этой директории хранятся.

  44. Александр

    Здравствуйте, есть задача прокинуть порты UDP 5060,10000-20000 от астериска который стоит за клиентом в ОВПН сеть, с iptables знаком минимально, поэтому назрел такой вопрос.
    Схема:
    ovpnclient+softphone
    |
    ovpnserver
    |
    ovpnclient
    |
    Asterisk

    если не сложно напишите пожалуйста правила для iptables для PAT'а из приватной сети в локальную сеть за ovpnclient'ом
    за ранее спасибо

  45. парни, в двух словах, зачем всё это, когда есть pfsense??

    • В смысле зачем? Получается, если есть pfsense, то все остальные маршрутизаторы вообще не нужны стали? А если у тебя вся инфрастурктура построена на Centos и управляется через ansible playbooks, ты будешь их отдельно пилить для pfsense на базе freebsd? При том, что pfsense управляется через браузер.

      Комбайны все в одном это решение для тех, кому так быстрее, проще управлять. Но оно подходит не всем. Уверен, что критическое обновление безопасности, обнаруженное в каком-нибудь компоненте системы быстрее приедет в centos, чем в pfsense.

  46. Ильдар

    Как решаете вопрос с бэкапом настроек VPN сервера, центра сертификации? Или если необходимо переносом данных на другой сервер? Какие файлы необходимо скопировать?

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

  47. Нужна помощью. Перенес через копирование OpenVPN сервак с одной машины на другу, копированием. Теперь на новом у меня при старте службы орет: openvpn error opening configuration file service.conf Все права на новой машине соответствует старой. Что я не учел?!

    • Четко ошибка прописана:
      openvpn error opening configuration file service.conf
      Сервис не может найти конфиг по нужному пути.

  48. Владимир

    Сделал в соответствии с документацией. Из дома я и коллеги к директориям и машинам по SSH/RDP подключаемся. А вот по Web-интерфейсам (допустим на ZABBIX, GLPI) подключиться не выходит. Пишет превышении времени ожидания, как я понимаю надо порты 443 и 80 пробрассовать.
    Попробовал полностью пробросить порты:
    $Tabl -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
    $Tabl -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
    не помогло.
    Попробовал с использованием PREROUTING и POSTROUTING прописать маршруты на вх/исх трафик на конкретны адреса по интерфейсу tun0, ни к чему не привело. Что надо в Iptables прописать что бы открыть все порты в VPN, полный доступ в локальную сеть и обратно?

    • Все, что касается настройки iptables для доступа к ресурсам через vpn сеть, в статье есть. Этих правил достаточно. Они разрешают весть трафик по vpn туннелям. Порты пробрасывать не надо, их надо открывать.

      Смотрите, нет ли блокировки запросов на 80 и 443 порт на серверах с zabbix и glpi. Так же смотрите, чтобы на этих серверах были маршруты в vpn сеть. В общем случае, vpn сервер должен быть их шлюзом по-умолчанию. Если это не так, то надо маршруты прописывать для доступа в серые сети vpn.

  49. Константин

    Здравствуйте. Подскажите сделал все как в описании создал сервер centos 7 и клиент centos 7 все работает и пингуется, теперь не могу подключится локально виндовс 10. В общем после всех манипуляций при подключении через значка в трее openvpn gui выдает красную строчку TCP: connect to [AF_INET]ххх.ххх.ххх.ххх:13555 failed: Unknown error

    • Смотрите, что на сервере в логах в этот момент. Если совсем ничего, то похоже на сетевые проблемы. Клиент не может достучаться до сервера.

  50. Добрый день!
    В статье описывается объединение двух филиалов, а как добавить к нему последующие если в каждом из филиалов своя подсеть? Необходим выпуск сертификатов для каждого? Или возможна ли работа одного сертификата на нескольких клиентах? Если да, то будет ли работать если я в конфиге пропишу, скажем, route 192.168.0.0 255.255.0.0 и будут ли подключаться филиалы начиная с 192.168.1.0, заканчивая 192.168.30.0?

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

      • Да, спасибо, я просто немного сглупил не дочитав статью до конца, ведь в разделе настройки Windows-клиента это описано. Я просто выпускаю сертификат с новым именем и через /etc/openvpn/ccd/new-cert-name делаю "соответствие" адресов и пушу маршруты а так же в конфиге сервера добавить строки новые, например:

        route 192.168.20.0 255.255.255.0 # указываем подсеть, к которой будем обращаться через vpn
        route 192.168.30.0 255.255.255.0 # подсеть второго филиала
        push "route 192.168.20.0 255.255.255.0" # передаем маршрут клиентам
        push "route 192.168.30.0 255.255.255.0" # передаем маршрут клиентам второй подсети

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

  51. Михаил

    Добрый день.
    Хочу настроить связку Микротик, а за ним openvpn.
    Что принципиально следует учесть если настраивать по Вашей статье?
    Какие правила следует добавить на Микротик, чтобы создать режим моста между Ovpn?

    • Михаил

      Или просто настроить проброс пота к ovpn серверу:

      chain=dstnat action=netmap to-addresses=192.168.5.89 protocol=udp port=1194 log=no

  52. Александр

    Подскажите, а что будет при замене сетевого адаптера , т.е. mac адреса, можно ли использовать тот же сертификат сервера, или его нужно перегенерить?
    Ключи и сертификаты клиентов будут работать, или их тоже нужно менять

    • Ничего не надо делать. Сертификат никак не привязан к серверу и сетевым интерфейсам. Его можно без проблем переносить на другой сервер и использовать там. Клиенты будут подключаться.

  53. Скажите пожалуйста, могу ли я настроить vpn сервер на виртуальной машине и подключаться к нему из своей основной ОС. При этом я не имею белого ip?

  54. при настройки клиентской части, tun0 не поднимается. При этом systemctl restart openvpn@client не выдает никаких ошибок. Помогите в чем может быть проблема ?

  55. Настроил, все отлично. Вопрос в одном: не могу понять почему фтп не работает(коннект есть, при попытке считать каталог - дисконнект) через впн сервер. Есть ли какие либо моменты которые надо учитывать?

  56. Александр

    Закооментил в конфиге сервера строчку

    # route 192.168.20.0 255.255.255.0 # указываем подсеть, к которой будем обращаться через vpn?
    и интерфейсы на месте, не отключаются, полет пока номальный :)

  57. Александр

    Я получил надежный вылючатель интерфейса : systemctl start openvpn@server.service раз, и все сервер доступен только с локальной консоли.
    systemctl stop openvpn@server.service и все восстанавливается, даже SSH становиться доступен!
    Все делалось по мануалу, чудеса начались со старта OPENVPN,
    HELP , как это вылечить, из за чего такое ?

  58. Привет.
    Столкнулся с такой проблемой. Настроен шлюз+squid+OpenVPN server в ЦО и к нему подключаются 4 ф-ла OpenVPN client. Все работает отлично. Всех юзеров с ф-лов завернул на proxy в ЦО и спокойно настраиваю для них правила. Но вот беда) один из ф-лов в ЦО попадает весь трафик как от OpenVPN clienta по внутреннему адресу. Что ограничивает настройку proxy, т.е одно правило настраивается сразу для всего ф-ла.
    Сеть ЦО 192.168.0.Х
    Сеть VPN 10.0.X.X
    Сеть проблемного ф-ла 192.168.9.Х, с него приходит весь трафик как 10.0.9.1
    С других ф-лов трафик приходит с сети 192.168.Х.Х (т.е не внутренней)
    Куда смотреть ?
    Маршруты уже проверил.

    • Я так понимаю, в сторону NAT надо смотреть для интерфейса tun, который использует этот филиал.

      • Все настроено через интерфейс tap, полностью переписал iptables по аналогии другого ф-ла, но трабл остался.

        • Не понял, а откуда тогда берется подсеть 10.0.X.X? Если я не ошибаюсь, то tap интерфейс объединяет все подключения в единое адресное пространство. Сам никогда не использовал tap, могу ошибаться.

          • Никогда не работал с tun, всегда использовал tap, не буду утверждать за отличия. Но tap отлично справлялся с разными сетями и под сетями.
            Каждый ф-ал имеет свою сеть 192.16.Х.Х
            А связаны они между собой 10.0.X.X

  59. Александр

    Итак, проблема была в понимании : Кого просить о сервисе? Просить нужно было интерфейс Tun, у мня он Tun01, именно на нем отвечает и отлично функционирует сервис Астериска, настраивать телефоны нужно было на него.
    Но кто ж знал , адрес локальный сервера 192.168.x.x пингуется , вэб морда FPBX открывается, чего же надо, логично , что и телефон настраивать на 192.168.x.x, ан нет нужно на 10.8.0.1. Кстати 10.8.0.1 это адрес изначально заточеный в FPBX под OpenVPN, важно ли его использование , не знаю, но там своя настройка Iptables , и к ним лучше подстраиваться, логично не шалить, тем более , что "диапазон тоннеля может быть любым".
    Таким образом телефоны работают, что и нужно было критично
    Что хотелось бы , но не критично пока:
    Шлюз в интернет не пингуется , клиенты друг друга тоже не видят, с другой стороны еще не факт , что прооблема есть. Клиенты на Win10 и маршруты уперто не передаются. Т.е. нужно поставить линуксовую машинку и проверить есть ли глюк. :D

  60. Александр

    Нет, как раз все работает, кроме телефонов по Vpn, а без него , звонят и пашут как часы

  61. Александр

    Здравствуйте , помогите понять где проблема
    Итак DREEPBX Distro ? поднял OpenVPN ? обнаружил, что там уже была предуствновка его же, но получилось и вроде все работает, клиенту подключаются, а дальше косяки: маршруты Win 10 , тупо не желает принимать, программные телефоны через тоннель подключаться не желают. В туннеле пингунтся сервер, и шлюз туннеля , более того открывается Webморда FPBX и еще пару сайтов c сервака, то есть между интерфейсами траффик ходит. Только Sip не хочет, firewall отключал, включал - нет результата. У FPBX 13-14 firewall свой, заточенный под PBX ? что вносит свои и плюсы и минусы.
    Не ясен следующий нюанс:
    В адаптере клиента 10.11.11.6 нет шлюза, есть только адрес DHCP сервера 10.11.11.5 , пинг по этому адресу не проходит, а по адресу интерфейса Tun01 10.11.11.1 без проблем, пингуется
    То есть клиент 6 прет через шлюз ..5 , Сервер врет , что это DHCP, другому клиенту xx.10 он уже говорит , что DHCP на 9 адресе, сам же OPenVPN ждет запросов на TUN 01 интерфейсе на x.x.x.1 адресе ?
    push "redirect-gateway def1" ничего не меняет ,по крайней мере в конфиге клиента , то ли он передает обманку адрес DHCP, то ли как и маршруты win 10 не желает получать? Ну и как передать клиенту шлюз 10.11.11.1
    Что делать то?
    Кстати , может кто знает, как можно пиговать через определенный, указанный шлюз ?

    • Друг, с такими проблемами тебе вряд ли кто поможет. Я даже не осилил понять, что написано. Возникло ощущение, что не работает все :)

  62. Зашел в тупик:
    root ~ # systemctl start openvpn@server
    Failed to start openvpn@server.service: Unit not found.
    Как решить проблему?

    • Возможно конфиг сервера называется не server.conf.

      • Проверил, все верно.
        root /etc/openvpn # ls
        ca.crt client dh.pem easy-rsa keys server server.conf server.crt server.key

        А так запускается:
        root ~ # openvpn /etc/openvpn/server.conf
        Mon Jan 21 23:02:55 2019 OpenVPN 2.4.6 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Jul 5 2018
        Mon Jan 21 23:02:55 2019 library versions: OpenSSL 1.0.2k-fips 26 Jan 2017, LZO 2.06
        Mon Jan 21 23:02:55 2019 Diffie-Hellman initialized with 2048 bit key
        Mon Jan 21 23:02:55 2019 ROUTE_GATEWAY 192.168.12.1/255.255.255.0 IFACE=enp3s0 HWADDR=1c:1b:0d:44:fe:04
        Mon Jan 21 23:02:55 2019 TUN/TAP device tun1 opened
        Mon Jan 21 23:02:55 2019 TUN/TAP TX queue length set to 100
        Mon Jan 21 23:02:55 2019 do_ifconfig, tt->did_ifconfig_ipv6_setup=0
        Mon Jan 21 23:02:55 2019 /sbin/ip link set dev tun1 up mtu 1500
        Mon Jan 21 23:02:55 2019 /sbin/ip addr add dev tun1 local 10.8.0.1 peer 10.8.0.2
        Mon Jan 21 23:02:55 2019 /sbin/ip route add 10.8.0.0/24 via 10.8.0.2
        RTNETLINK answers: File exists
        Mon Jan 21 23:02:55 2019 ERROR: Linux route add command failed: external program exited with error status: 2
        Mon Jan 21 23:02:55 2019 Could not determine IPv4/IPv6 protocol. Using AF_INET
        Mon Jan 21 23:02:55 2019 Socket Buffers: R=[212992->212992] S=[212992->212992]
        Mon Jan 21 23:02:55 2019 TCP/UDP: Socket bind failed on local address [AF_INET][undef]:1194: Address already in use (errno=98)
        Mon Jan 21 23:02:55 2019 Exiting due to fatal error
        Mon Jan 21 23:02:55 2019 Closing TUN/TAP interface
        Mon Jan 21 23:02:55 2019 /sbin/ip addr del dev tun1 local 10.8.0.1 peer 10.8.0.2

        • Надо тогда systemd конфиг смотреть. Может там ошибка, либо не установился. Ни разу с таким не сталкивался.

          Смотреть тут - /usr/lib/systemd/system
          Должны быть файлы:
          openvpn-client@.service
          openvpn-server@.service
          openvpn@.service

          Нужен последний шаблон конфига.

    • В моем случае, мне нужен был просто клиент VPN на CentOS 8, чтобы подключиться к шлюзу PFsense, на котором работает сервер VPN и с которого была экспортирована конфигурация. После того, как конфигурация была положена в папку /etc/openvpn/client, при попытке выполнить
      # systemctl start openvpn@client
      выдавалось сообщение с ошибкой "Failed to start openvpn@client.service: Unit not found."
      Все попытки перекладывать куда-то конфигурацию, смотреть статус службы выдавали одно и тоже. Либо Unit not found, либо что вообще нет такой службы. Переустановка openvpn тоже ничего не дала.
      Плюс к тому с PFsense конфигурация экспортируется в формате *.ovpn. Может быть этот файл можно просто переименовать в *.config, что я пробовал делать и это не помогало, и в результате оставил его в формате .ovpn все равно.

      Полечил таким образом:
      В конфигурации самой службы я указал использовать свой файл конфига. Понимаю, что функциональность перестает быть универсальной, но в моем случае это не важно.
      В файле /usr/lib/systemd/system/openvpn-client@client я изменил строчку:
      ExecStart=/usr/sbin/openvpn --suppress-timestamps --nobind --config myConfig.ovpn
      Соответственно, на сколько я понял, в этой строчке можно было бы оставить что-то вида ... --config %I.ovpn, чтобы без проблем подсовывать туда конфигурации из PFsense.

      После этого создал symlink на службу клиента, как любезно подсказал Westus.
      # systemctl enable openvpn-client@client.service
      После запроса статуса службы
      # systemctl status openvpn-client
      мне выдалось сообщение с ошибкой в статусе, что мне бы следовало сделать
      #systemctl daemon-reload
      что я и сделал.
      После этого служба openvpn-клиента стала запускаться с помощью:
      systemctl start openvpn-client@client

      В самой конфигурации VPN у меня прописан параметр
      auth-user-pass fileWithCredentials.txt
      чтобы клиент подключался автоматом с логином и паролем, указанным в файле fileWithCredentials.txt

      Поскольку я нахожусь в разных сетях с сервером CentOS, меня соответственно выкинуло из консоли, что я исправил добавлением маршрута к своей сети:
      #ip route add 10.0.xx.0/24 via 10.0.xx.254 dev devXXX
      проверил, что доступ появился и добавил в /etc/sysconfig/network-scripts/route-devXX
      строчку
      10.0.xx.0/24 via 10.0.xx.254 dev devXXX
      чтобы маршрут стал постоянным.

      P.S.: только не закидывайте меня тапками, please! Я вообще ничего не понимаю в Линуксах, пытаюсь учиться на ходу... Напишите, если я что-то сделал неправильно.

  63. у меня на этом шаге выдает ошибку, пароль ввожу какой и до этого
    ./easyrsa sign-req client client

    Using configuration from ./safessl-easyrsa.cnf
    Enter pass phrase for /etc/openvpn/keys/easy-rsa-master/easyrsa3/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:'canada'
    Certificate is to be certified until Jan 2 23:13:37 2022 GMT (1080 days)
    failed to update database
    TXT_DB error number 2

    Easy-RSA error:

    signing failed (openssl output above may have more detail)

  64. Отличная статья. Вопрос - а процесс перевыпуска сертификата после завершения действия этого сертификата как выглядеть будет?

    • Там по дефолту по-моему на 10 лет выпускается. Мне еще ни разу не приходилось сталкиваться с перевыпуском :) Но я не вижу тут никаких проблем. Выпускается новый сертификат и все.

      • Евгений

        Не могли бы вы подсказать как это делается?

        • Так ровно так же, как описано в статье. С нуля выпускается CA, потом серверный сертификат и клиентские. И всё заменяется. Тут полный перевыпуск всего должен быть, есть надо заменить сертификат удостоверяющего центра.

  65. Коллега, спасибо за статью. По ней пытался поднять VPN-client на шлюзе Debian 8. Изначально шлюз был на windows. Решил заменить на Debian (т.е. сервер OpenVPN у меня уже был поднят и все работало). После всех настроек. Компы на стороне Debian видят всю сеть на стороне сервера, а наоборот нет! Правда было исключение компьютер на Windows XP пинговался (со стороны сети сервера OpenVPN)...
    Короче пару часов убил, нашел решение. Немного переписал Ваш файл с конфигурацией файервола. Ниже важные правила, после чего у меня все запинговалось.

    export ПОДСЕТЬ_OpenVPN =10.0.0.1/24
    export ПОДСЕТЬ_сети_за_сервером_OpenVPN = 192.168.0.1/24
    $IPT -A FORWARD -i tun0 -j ACCEPT
    $IPT -A FORWARD -i tun0 -o $LAN1 -m state --state RELATED,ESTABLISHED -j ACCEPT
    $IPT -A FORWARD -i $LAN1 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    $IPT -t nat -A POSTROUTING -s $ПОДСЕТЬ_OpenVPN -o $LAN1 -j MASQUERADE
    $IPT -t nat -A POSTROUTING -s $ПОДСЕТЬ_сети_за_сервером_OpenVPN -o $LAN1 -j MASQUERADE

    Может кому то время сэкономлю...

  66. Здравствуйте! Спасибо за статью.
    У вас в криншотах, после установки соединения на сервере:

    tun0: mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/none
    inet 10.10.0.1 peer 10.10.0.2/32 scope global tun0

    на клиенте : ..... inet 10.10.0.6 peer 10.10.0.5/32.

    По логике на клиенте должно быть: .........inet 10.10.0.2 peer 10.10.0.1/32

    Почему при установлении одного туннеля мы видим, что задействованы 4 адреса:
    10.10.0.1
    10.10.0.2
    10.10.0.5
    10.10.0.6

    ?

    Причем, что с сервера, что с клиента противоположные концы тоннеля почему-то не пингуются?

  67. Сергей

    Здравствуйте! Спасибо огромное за толковую статью, долго собирал куски информации по инету, прежде чем наткнутлся на вашу. Очень сильно помогло и сэкономило время. Все настроил, все работает, за исключением мелочи.Вроде не нашел в статье упоминания об этом

    Есть сервер OpenVPN, есть 2 роутера с подсетями, которые коннектятся к серверу - все друг друга видят из подсетей, все хорошо.
    А если я из сторонней сети за-за NAT коннекчусь к серверу OpenVPN отдельной машиной (с внутренним адресом машины, допустим, 192.168.100.100 и адресом клиента VPN 10.100.0.10) - подсети за роутерами я вижу. А они эту машину 10.100.0.10 - нет. Возможно ли сделать, чтобы и она была видна из любой подсети?

  68. Добрый день. Спасибо за статью.
    Вопрос в следующем, можно ли изменить конфигурацию клиента или сервера так, что бы определенный клиент или группа клиентов при подключении к серверу получала доступ не ко всей посети, а к одному конкретному серверу?

    • Можно. Самый простой вариант, который сразу приходит в голову - сделать статические ip для клиентов openvpn и с помощью фаервола настроить необходимый доступ для этих адресов.

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

  69. Добрый день! Что делать если у меня только один сетевой интерфейс (LAN\WAN) ?
    #!/bin/bash
    #
    # Объявление переменных
    export IPT="iptables"

    # Интерфейс который смотрит в интернет
    export WAN=eth0
    export WAN_IP=192.168.1.25

    # Локалка
    export LAN=eth0
    export LAN_IP_RANGE=192.168.10.0/24

  70. Добрый день! 2 вопроса, видел вариант настррйки OpenVPN на https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-an-openvpn-server-on-centos-7 можете ответить в чем разница от вашей конфигурации?
    2-й вопрос, видел настройку VPN в режиме bridge https://www.server-world.info/en/note?os=CentOS_7&p=openvpn&f=1, можете подсказать для чего оно делается?

    • 1. Принципиальной разницы нет, по сути то же самое настраивается.
      2. По второй ссылке не увидел ничего особенного, только интерфейс tap, в не tun, как у меня. В чем разница я описал в статье.

  71. #iroute-does-not-work

    Строго говоря, при наличии белыъх ип с каждой стороны, можно бросить два тонеля и тогда проблема исчезнет.. но.... Не для того мы гуглим бест практикс, и пилим конфиги, чтобы вот так легко взять и сдаться... не для того сервис, чтобы взять и просто сделать по тонелю в каждую посдеть... Это же не наш метод... Знатоки, выручайте.. я уже все версии перебрал... что с этим капризным роутингом не так ).

  72. iroute-does-not-work

    Уточню, что есть просто 1 сервер, к нему цепляется клиент и ЗА ним подсеть, ни сам сервер ни подсеть в которой живёт севрер - никак не может заглянуть ЗА этого клиента. client-to-client включено..
    Просто не могу понять что я делаю не так. Конечно можно через одного этого клиента бросать пакеты через форвардинг и форвардить чреез пачку портов всё, но это не совсем удобно... хотелось бы именно между подсетью ЗА клиентом и плжсеть в котрой живёт сервер организовать связь... в чём проблема не могу понять.

  73. #iroute-does-not-work

    У меня одного не пробросываются сети за клиентами ? Отказывается срабатывать параметр iroute. Проверено tcpdump'ами пакеты бегут из сети сервера и маскарадятся всё как полагается, но как только попытка доступа в сеть ЗА одним из клиентов (ovpn согласно таблице маршрутов должен зарулить пакет на внутренний свой адрес и "знать" какая подсеть живёт за клиентом, параметр iroute лишь фильтр чтобы не передавать подсеть за клиентом самому клиенту ) то до клиентам пакетики отказываются заруливаться.
    Маскарадинги включены, дампы говорят что всё как надо заруливается на внутренний ип ovpn'а. но вот до самого клиента пакет не доходит (по любому протоколу, все ифейсы в доверенных зонах так что любой протокол не роутиться).
    в общем знатоки, подскажите в чём может быть загвоздка (форвардинги включены, маскарадинги включены, всё правила нарисованы через firеwall-cmd - просто ифейсы добавлены в доверенные зоны то есть всё должно быть ок).
    в ощбем всё работате ок.... кроме одной детали... не видятся подсети за клиентами )) Гугл не помог - ибо везде ссылаются на параметр iroute. (все сети которые живут ЗА клиентами - пропушены, в конфиг сервера добавлены, в общей итаблице маршрутизации всё добавлено). Уже голову сломал в чём проблема. Хоть исходники ovpn открывай. Что я делаю не так )

  74. Zerox, не сталкивались с таким, что после установки и настройки сервера указаный порт в настройках не находится в состоянии LISTEN?
    Много раз использовал ваш мануал и все было без проблем.
    А тут напоролся и не могу понять в чем проблема.
    21 и 22 порты LISTEN, опен впновский не слушается, хотя через netstat выдается:

    udp 0 0 0.0.0.0:6333 0.0.0.0:* 999/openvpn

  75. День добрый! Настроил все по Вашей статье, все получилось, спасибо!
    Есть такой вопрос, можно ли к такой конфигурации прикрутить openvpnadmin на webmin?

    • Думал об этом, но все руки не доходили проверить. Мне кажется, что если использовать webmin, то надо настраивать в нем с самого начала. Не думаю, что если установить на готовую конфигурацию, то он ее корректно воспримет и позволит управлять.

  76. Здравствуйте, коллеги.
    Подскажите, пожалуйста, где можно посмотреть информацию о принципах работы туннельных интерфейсов в контексте linux? В частности сейчас очень интересует механизм прохождения ipip-трафика через netfilter. Самому картину сложить не удаётся.
    Может быть, кто-то сможет на словах объяснить?
    Конфигурация простая:
    2 территориально удалённых шлюза. Каждый смотрит одним интерфейсом в интернет, другим в локальную сеть.
    На обоих шлюзах CentOS. Поднят IPIP-туннель. Соответственно, помимо двух физических сетевых интерфейсов, на каждом ещё есть виртуальный ifcfg-tun.
    Интересно, что происходит, после того, как пакет по туннелю попадает на физический внешний интерфейс шлюза. Где происходит декапсуляция, как пакет передаётся от физического внешнего интерфейса виртуальному, какой процесс обеспечивает фунционирование туннельного адаптера и тд
    tcpdump'ом вижу на внешнем интерфейсе ipip-пакеты, а на туннельном - данные уже декапсулированы. Схему прохождения пакета через netfilter в голове держу, но сообразить как всё работает не удаётся.

    • #iroute-does-not-work

      Всё ж просто. Качаем версию пакета прям с исходниками, открываем, смотрим (не забываем ещё джержать в голвое что у нас есть кернел спейс, не забываем про ipc и все интерфейсы внутри ko плюс помним что обработка пакетов ведётся ещё и фаером, у кторого часть функций внутри юзерспейса в часть в ядре ) в итоге получается маленькая схемка такая на всю стену в кабинете ).
      зы: кроме шуток, такие вопросы наверное более актуальны для разработчиков. а то если вы задаёте вопрос что во что инкапсулируется... чтобы актуальыне данные получать их надо либо копирвоать до того как их любой процесс как-то обработал, а схемы работы netfilter гуглятся

  77. Владимир

    Спасибо за мануал. Очень помог. Только вот была странность на клиенте, он получал маску 255.255.255.252 вместо 255.255.255.255
    тут проблемой служило отсутствие в конфиге сервера строка topology subnet.
    Сейчас проблема другая: имеется две сети 192.168.100.0/24 и 192.168.77.0/24. есть сеть туннеля 10.31.0.0/24 есть pc1 в сети 1 и pc2 в сети 2
    при подключении к серверу pc1 получает адрес 10.31.0.2 а pc2 получает адрес 10.31.0.3 адрес сервера в туннеле 10.31.0.1.
    так вот пинг между pc1 и pc2 есть только по их туннельным адресам, а по их реальным адресам они не пингуют друг друга. Кроме того с сервера опенвпн тоже не пингуются ни pc1 ни pc2 по реальным адресам. Приведу route -n:
    [root@pfsense openvpn]# route -n
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    0.0.0.0 xx.x6.70.1 0.0.0.0 UG 0 0 0 eth0
    10.31.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
    xx.x6.70.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
    xxx.xxx.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
    192.168.77.0 10.31.0.2 255.255.255.0 UG 0 0 0 tun0
    192.168.100.0 10.31.0.2 255.255.255.0 UG 0 0 0 tun0

    теперь route print -4 с pc1:
    IPv4 таблица маршрута
    ===========================================================================
    Активные маршруты:
    Сетевой адрес Маска сети Адрес шлюза Интерфейс Метрика
    0.0.0.0 0.0.0.0 192.168.100.1 192.168.100.3 25
    10.31.0.0 255.255.255.0 On-link 10.31.0.2 276
    10.31.0.2 255.255.255.255 On-link 10.31.0.2 276
    10.31.0.255 255.255.255.255 On-link 10.31.0.2 276
    127.0.0.0 255.0.0.0 On-link 127.0.0.1 306
    127.0.0.1 255.255.255.255 On-link 127.0.0.1 306
    127.255.255.255 255.255.255.255 On-link 127.0.0.1 306
    192.168.77.0 255.255.255.0 10.31.0.1 10.31.0.2 20
    192.168.100.0 255.255.255.0 On-link 192.168.100.3 281
    192.168.100.3 255.255.255.255 On-link 192.168.100.3 281
    192.168.100.255 255.255.255.255 On-link 192.168.100.3 281
    224.0.0.0 240.0.0.0 On-link 127.0.0.1 306
    224.0.0.0 240.0.0.0 On-link 192.168.100.3 281
    224.0.0.0 240.0.0.0 On-link 10.31.0.2 276
    255.255.255.255 255.255.255.255 On-link 127.0.0.1 306
    255.255.255.255 255.255.255.255 On-link 192.168.100.3 281
    255.255.255.255 255.255.255.255 On-link 10.31.0.2 276
    ========================== =================================================

    и route print -4 с pc2:
    IPv4 таблица маршрута
    ===========================================================================
    Активные маршруты:
    Сетевой адрес Маска сети Адрес шлюза Интерфейс Метрика
    0.0.0.0 0.0.0.0 192.168.100.1 192.168.100.3 25
    10.31.0.0 255.255.255.0 On-link 10.31.0.2 276
    10.31.0.2 255.255.255.255 On-link 10.31.0.2 276
    10.31.0.255 255.255.255.255 On-link 10.31.0.2 276
    127.0.0.0 255.0.0.0 On-link 127.0.0.1 306
    127.0.0.1 255.255.255.255 On-link 127.0.0.1 306
    127.255.255.255 255.255.255.255 On-link 127.0.0.1 306
    192.168.77.0 255.255.255.0 10.31.0.1 10.31.0.2 20
    192.168.100.0 255.255.255.0 On-link 192.168.100.3 281
    192.168.100.3 255.255.255.255 On-link 192.168.100.3 281
    192.168.100.255 255.255.255.255 On-link 192.168.100.3 281
    224.0.0.0 240.0.0.0 On-link 127.0.0.1 306
    224.0.0.0 240.0.0.0 On-link 192.168.100.3 281
    224.0.0.0 240.0.0.0 On-link 10.31.0.2 276
    255.255.255.255 255.255.255.255 On-link 127.0.0.1 306
    255.255.255.255 255.255.255.255 On-link 192.168.100.3 281
    255.255.255.255 255.255.255.255 On-link 10.31.0.2 276
    ===========================================================================

  78. Аноним

    Хотел узнать. Зачем нужны ca.crt client.crt и server.crt если у нас есть прешаред server.key одинаковый на обоих пирах?
    Всегда соединял два сервера созданием одного ключа и пятью строками в конфиге. Может я что-то упускаю?

  79. Добрый день.
    Настроил все по вашему ману, но задача у меня не много иная не до конца все работает есть vds сервер с белым айпи есть клиенты zyxel kenetic с юсб модемами серыми айпи за натом провайдера за zyxel есть видео регистраторы к котором надо попадать по белому айпи vds/
    VDS OPENVPN сервер ip 94.x.x.x
    openvpn Тунель ip 10.0.0./24 пинги работаю в обе стороны
    внутренняя сеть zyxel 192.168.8.0/24
    видеорегистратор за zyxelом 192.168.8.100
    так вот у меня не пингуеться с сервера сам регистратор 192.168.8.100
    и как с внешнего айпи по нужному порту про кинуть в впн на видеорегистратор.

    [spoiler]
    server.conf
    port 1313 # я предпочитаю использовать нестандартные порты для работы
    proto tcp # протокол может быт и tcp, если есть необходимость в этом
    dev tun

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

    server 10.0.0.0 255.255.255.0 # подсеть для туннеля, может быть любой
    route 192.168.8.0 255.255.255.0 # указываем подсеть, к которой будем обращаться$
    push "route 10.0.0.0 255.255.255.0" # передаем маршрут клиентам
    # push "route 192.168.8.0 255.255.255.0"
    ifconfig-pool-persist ipp.txt # файл с записями соответствий clinet - ip
    client-to-client # позволяет клиентам openvpn подключаться друг к другу
    client-config-dir /etc/openvpn/ccd # директория с индивидуальными настройками к$

    keepalive 10 120
    #comp-lzo
    persist-key
    persist-tun
    status /var/log/openvpn/openvpn-status.log
    log /var/log/openvpn/openvpn.log
    verb 3
    [/spoiler]

    [spoiler]
    iptables
    #!/bin/bash
    #
    # Объявление переменных
    export IPT="iptables"

    # Интерфейс который смотрит в интернет
    export WAN=eth0
    export WAN_IP=94.X.X.X

    # Очистка всех цепочек iptables
    $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

    # разрешаем локальный траффик для loopback
    $IPT -A INPUT -i lo -j ACCEPT
    $IPT -A OUTPUT -o lo -j ACCEPT

    # Разрешаем исходящие соединения самого сервера
    $IPT -A OUTPUT -o $WAN -j ACCEPT
    # Разрешаем 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 $WAN -o tun+ -j ACCEPT
    # Маскарадинг
    $IPT -t nat -A POSTROUTING -o tun0 -j MASQUERADE
    #$IPT -t nat -A POSTROUTING -o $WAN -s tun0 -j MASQUERADE

    # Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении.
    # Пропускать все уже инициированные соединения, а также дочерние от них
    $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
    # Включаем фрагментацию пакетов. Необходимо из за разных значений MTU
    $IPT -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

    # Отбрасывать все пакеты, которые не могут быть идентифицированы
    # и поэтому не могут иметь определенного статуса.
    $IPT -A INPUT -m state --state INVALID -j DROP
    $IPT -A FORWARD -m state --state INVALID -j DROP

    # Приводит к связыванию системных ресурсов, так что реальный
    # обмен данными становится не возможным, обрубаем
    $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 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
    # Открываем порт для ssh
    $IPT -A INPUT -i $WAN -p tcp --dport 1327 -j ACCEPT
    $IPT -A INPUT -i $WAN -p tcp --dport 1313 -j ACCEPT
    $IPT -A INPUT -i $WAN -p udp --dport 1313 -j ACCEPT
    # Открываем порт для DNS
    #$IPT -A INPUT -i $WAN -p udp --dport 53 -j ACCEPT
    # Открываем порт для NTP
    #$IPT -A INPUT -i $WAN -p udp --dport 123 -j ACCEPT

    # Логирование
    # Все что не разрешено, но ломится отправим в цепочку undef

    $IPT -N undef_in
    $IPT -N undef_out
    $IPT -N undef_fw
    $IPT -A INPUT -j undef_in
    $IPT -A OUTPUT -j undef_out
    $IPT -A FORWARD -j undef_fw
    # Логируем все из undef

    $IPT -A undef_in -j LOG --log-level info --log-prefix "-- IN -- DROP "
    $IPT -A undef_in -j DROP
    $IPT -A undef_out -j LOG --log-level info --log-prefix "-- OUT -- DROP "
    $IPT -A undef_out -j DROP
    $IPT -A undef_fw -j LOG --log-level info --log-prefix "-- FW -- DROP "
    $IPT -A undef_fw -j DROP

    # Записываем правила
    /sbin/iptables-save > /etc/sysconfig/iptables

    [/spoiler]

    • В своих конфигурациях вы сами разбирайтесь, я искать ошибки не буду. Скажу только, что это реально. Я сам так делаю. Есть сервер с белым ip, есть дачные дома с серыми ip через мобильную связь. Эти дома подключаются по vpn к серверу. На сервере настроен проброс на эти регистраторы. Проброс получается двойной. Сначала с белого ip на роутер с серым ip, а потом с этого роутера на регистратор. Если все сделать аккуратно и правильно, будет работать. Нужно проверять все элементы - сервер, модемы в домах, настраивать маршруты.

  80. можете подсказать , как сделать чтоб по каждому пользователю подключившемуся по vpn велся лог действий в сети?

    • Этот вопрос не имеет отношения к vpn. Чтобы следить за всей сетевой активностью, перехватывая все сетевые пакеты, нужен отдельный софт. Я сомневаюсь, что есть хороший, бесплатный вариант такого софта. По крайней мере мне такой не попадался. В общем случае, нужно просто собирать дамп всей сетевой активности и анализировать его.

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

        • Вы же подключаете людей по сертификатам. Для каждого сертификата можно назначить статичный ip через ccd. А дальше уже по ip собирать статистику. Либо через лог-файл статуса брать информацию о подключенных клиентах и их ip. Там это все фиксируется.

  81. Спасибо, делал по статье, всё работает.
    Один вопрос: как прописать на сервере статический маршрут в сеть клиента? то есть:
    мне нужен доступ со стороны centos openvpn сервера в сеть клиента. Команда ip route add - всё работает, пингутеся, всё ок. Но после перезагрузки роут пропадает.
    в network-scripts делал файл route-tun0 - не работает (при этом там же файл route-eth0 на выдуманный маршрут - работает).
    Как ещё можно прописать статический маршрут для tun0 интерфейса? спасибо.

    • Всё оказалось просто (хотя полдня потратил на поиск )))
      надо в server.conf указать указать сеть клиента:
      route 192.168.1.0 255.255.255.0,
      где 192.168.1.0 сеть клиента

  82. SELINUX=disabled
    ламер...

  83. Добрый день.столкнулся с проблемой на сервере почему то интерфейс eth0 видит tun0. для чистоты эксперимента iptables отключал, net.ipv4.ip_forward = 1 прописал , что может быть еще?

  84. я так понимаю мне не поможете?!

    • Тут советом не помочь, а разбираться в чужих конфигурациях у меня нет возможности.

  85. Александр

    Решил проблему SoftEther VPN Client

    • Александр

      Нет , показалось :D Вопрос с запуском клиета в Open VPN сервере доступа по прежнему актуален, тем более , что версия удаленного сервера может быть иной, в моем случае провайдер прелдлагает отразец настроек с сертификатом в тексте конфига. То есть tun адаптер занят обслуживанием входящих подключений + для исходящего подключения нужно "совместиться" с требованиями удаленного сервера доступа :(

      • А в чем конкретно проблема? Можно отдельно запускать клиент и сервер, причем сколько угодно клиентов и серверов. У каждого будет свой конфиг и свой интерфейс tun1, tun2 и т.д.

        Создаете в директории с openvpn 2 конфига, один client.conf, второй server.conf Настраиваете в конфигах все, что надо, только разные tun интерфейсы указываете. Потом запускаете отдельно сервер, отдельно клиент:

        systemctl start openvp@server
        systemctl start openvp@client

        • Александр

          Спасибо за ответ, но можно уточнить:
          Для сервера указывали tun - в системе появился tun0
          Для клиента в конфиге пишем , что tun1 ?

  86. Александр

    Итак, благодаря Вашей статье есть сервер удаленного доступа, как теперь сделать его клиентом к другому серваку?
    Адаптер то 1 tun0 и шифрование TLS нужно на нем же запустить клиента. Клиент получит адрес, и.. не глюкнет ли вся конструкция ?

  87. Александр

    Здравствуйте уважаемый. Спасибо за мануал.
    Благодаря Вам быстро настроил сервер и решил задачу подклбчения IP телефонов удаленных сотрудников.
    И когда все было сделано, обновление прошивки телефонов добавило к Open Vpn разделу поля юзер и пароль. :)
    Что наводит на подозрения , о возможности идентификации клиента либо вообще без сертификатов, либо без клиентских?
    Но , тогда не понятно где и как на сервере задавать user-пароль?
    Если это важно телефоны GXP1620 , в них есть PPoE и OpenVpn подключения, сервер Centos 7.
    Из глюков : пропал доступ к web морде Elastix . но его удалось легко восстановить
    Еще раз спасибо за Вашу работу.

    • Я настраивал на этих аппаратах openvpn. Интересная возможность, которая на удивление еще и работает нормально, без глюков. Главное подобрать параметры opevpn сервера под требования телефона, так как на телефоне клиент не настраивается.

      • Александр

        :D Знаете , я не знал об этих сложностях , мне , в виду отсутствия инструментария на стороне "клиента" , сложнее было угадать параметры на нем и логику его подключения. Но , вроде , правда работает стабильно . Теперь нужно к провайдеру по vpn подключиться и можно закрывать порты на роутере.
        Подключение тупых "железяк" вообще отдельная тема, не слишком освещенная. Вот, к примеру, у этого же телефона есть PPoe, а у меня на роутере, о счастье, есть функция PPoE server. Удачно? Ну приемлемо, только эта хрень на роутере , по моему, не работает вообще. Мне не удалось ее завести ни на 480 , ни на 470, ни на 604W моделях TP-Link. Есть правда и PPTP и работающий, но его нет на телефоне.
        Кстати , если интересно, скриншоты настроек телефона могу скинутьБ если скажете куда.

  88. это на windows так говорит, когда хотел подключить удалённый комп. Между двум просто супер работает

  89. Привет! У меня такая ошибка
    Tue Apr 03 16:25:34 2018 WARNING: No server certificate verification method has been enabled. See http://openvpn.net/howto.html#mitm for more info.

    ВНИМАНИЕ: Не проверен метод проверки сервера - translate google

    помогите! :)

    • А чем помочь то? Это просто предупреждение, не ошибка. Плюс дана ссылка, где можно прочитать о чем идет речь. Если не понимаешь, о чем идет речь, просто не обращай внимание. Это не страшно :)

  90. Бьюсь вторую неделю и не могу найти где косяк, нет интернета с клиента. В связи с чем вот мой iptables Может сможете подсказать где косяк. А то не могу понять.

    #!/bin/bash

    export IPT="iptables"

    # Внешний интерфейс
    export WAN=eth0
    export WAN_IP=109.*.*.*

    # Локальная сеть
    export LAN1=eth1
    export LAN1_IP_RANGE=192.*.*.*/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

    # Разрешаем 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

    # разрешаем установленные подключения
    $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 INPUT -s 84.122.21.197 -j REJECT

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

    # Пробрасываем внешний порт на локальный адрес и порт
    $IPT -t nat -A PREROUTING -d 109.*.*.*/32 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.*.*.*:25

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

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

    # Открываем доступ к почтовому серверу
    $IPT -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
    #$IPT -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
    #$IPT -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
    #$IPT -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT
    #$IPT -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
    #$IPT -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT

    #Открываем доступ к web серверу
    #$IPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
    #$IPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

    $IPT -A INPUT -i $LAN1 -p tcp --dport 80 -j ACCEPT
    $IPT -A INPUT -i $LAN1 -p tcp --dport 443 -j ACCEPT

    #Открываем порт VPN сервера
    $IPT -A INPUT -p udp -m udp --dport 882 -j ACCEPT

    #Открываем доступ к DNS серверу
    #$IPT -A INPUT -i $WAN -p udp --dport 53 -j ACCEPT

    # Включаем логирование
    $IPT -N block_in
    $IPT -N block_out
    $IPT -N block_fw

    $IPT -A INPUT -j block_in
    $IPT -A OUTPUT -j block_out
    $IPT -A FORWARD -j block_fw

    $IPT -A block_in -j LOG --log-level info --log-prefix "--IN--BLOCK"
    $IPT -A block_in -j DROP
    $IPT -A block_out -j LOG --log-level info --log-prefix "--OUT--BLOCK"
    $IPT -A block_out -j DROP
    $IPT -A block_fw -j LOG --log-level info --log-prefix "--FW--BLOCK"
    $IPT -A block_fw -j DROP

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

    скрипт сервера ВПН взят от сюда

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

    • Зависит от того, как клиенты получают интернет. В общем случае, если у них пропал интернет, значит либо изменился шлюз по-умолчанию, либо на самом шлюзе что-то изменилось, что привело к пропаже интернета.

  92. Только что настроил все по статье. Она актуальна.

    • Нашел проект на гитхабе по установке openvpn, на мой взгляд с точки зрения безопасности и быстродействия, в свете версии 2.4 у них оч грамотно сделан скрипт. При небольшом допиливании их скрипта адаптировал под себя.
      https://github.com/Angristan/OpenVPN-install

      • Мощный скрипт. Не хватило терпения все осмысленно проверить. Что там полезного есть, если в двух словах? Всякие dns блоки и настройка iptables меня не интересуют. В самом конфиге server.conf чего-то интересного и полезного не увидел. В общем, не очень понял, для чего это.

        • Вместо DH - ECDH, TLS-Auth, шифрация - AES-GCM. Все это есть только на 2.4. Ну и полноценный скрипт по генерации конфигов для юсеров. Что не понравилось - скрипт трогает штатный юнит systemd - соответственно при обновлении все слетит и как следствие запуск нескольких демонов на разных портах невозможен. Да и настройку ипитаблес зря они в скрипт прилепили. Если будете смотреть - смотрите сразу ветку openvpn-2.4-update.

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

    • Подскажи что надо исправить чтоб работал клиент под Андроидом. При подключении на андроиде пропадает интренет. Делал все по статье. Необходимо обеспечить подключение смартфонов и планшетов к рабочей сети, удаленная работа в сети предприятия

  93. При выполнении ./easyrsa sign-req server server
    выдает ошибки:
    ERROR: on line 16 of config file '/etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/extensions.temp'
    140617769633696:error:02001002:system library:fopen:No such file or directory:bss_file.c:175:fopen('/etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/index.txt.attr','rb')
    140617769633696:error:2006D080:BIO routines:BIO_new_file:no such file:bss_file.c:182:
    140617769633696:error:0E078072:configuration file routines:DEF_LOAD:no such file:conf_def.c:195:
    140617769633696:error:0E079065:configuration file routines:DEF_LOAD_BIO:missing equal sign:conf_def.c:345:line 16

    В сети не нашел ответа из-за чего возникают данные ошибки. Может подскажите причину и метод решения?

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

      сервер сконфигурировал:
      port 882 # я предпочитаю использовать нестандартные порты для работы
      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

      server 192.168.10.0 255.255.255.0 # подсеть для туннеля, может быть любой
      route 192.168.0.0 255.255.255.0 # указываем подсеть, к которой будем обращаться через vpn
      push "dhcp-option DNS 192.168.0.220" # передаем маршрут клиентам

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

      keepalive 10 120

      comp-lzo

      persist-key
      persist-tun
      status /var/log/openvpn/openvpn-status.log
      log /var/log/openvpn/openvpn.log
      verb 3

      Клиент:
      client
      dev tun
      proto udp

      remote 109.202.11.243 882

      resolv-retry infinite

      nobind

      user nobody
      group nobody

      persist-key
      persist-tun

      comp-lzo
      verb 3

      ca /path/to/ca.crt
      cert /path/to/client.crt
      key /path/to/client.key

      в итоге. при подключении выдает ошибку:
      Wed Dec 26 10:53:22 2017 UDP link local (bound): [undef]
      Wed Dec 26 10:53:22 2017 UDP link remote: [AF_INET]109.202.11.243:882
      Wed Dec 26 10:53:22 2017 read UDP [ECONNREFUSED]: Connection refused (code=111)
      Wed Dec 26 10:53:24 2017 read UDP [ECONNREFUSED]: Connection refused (code=111)
      Wed Dec 26 10:53:29 2017 read UDP [ECONNREFUSED]: Connection refused (code=111)
      Wed Dec 26 10:53:36 2017 read UDP [ECONNREFUSED]: Connection refused (code=111)
      Wed Dec 26 10:53:52 2017 read UDP [ECONNREFUSED]: Connection refused (code=111)
      Wed Dec 26 10:54:22 2017 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
      Wed Dec 26 10:54:22 2012 TLS Error: TLS handshake failed
      Wed Dec 26 10:54:22 2012 TCP/UDP: Closing socket
      Wed Dec 26 10:54:22 2012 SIGUSR1[soft,tls-error] received, process restarting

      • В принципе, в логе все написано, куда копать:
        Wed Dec 26 10:53:52 2017 read UDP [ECONNREFUSED]: Connection refused (code=111)
        Wed Dec 26 10:54:22 2017 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
        Я часто вижу подобные ошибки и они действительно сетевые, но не всегда лежат на поверхности. Нужно все аккуратно проверять и пробовать подключаться из разных мест. Я частенько не могу подключиться через мобильных операторов, как раз ошибка TLS выскакивает. Может на фаерволе что-то не так сделано, правила перепутаны, переадресации или пробросы какие-то. В общем, надо аккуратно во всем разбираться на месте.

      • Столкнулся с этой же проблемой.

        • как успехи? сумел понять почему интерфейс не поднимается? я нет, лог чист.

          • Александр

            Уважаемый, я смотрел, интерфейс tun уже имелся на серваке еще до всякого OPenVPN
            лежит где то тут /dev/net/tun он размером 0 права 666 может создать и наступит счастье?
            Но вряд ли..

  94. Подскажите какие программы и модули нужны. Не могу подписать сертификат сервера

  95. Добрый день. Получилось выпустить клиентов через openvpn. Но возникла проблема с подключением с android устройств (на маках не пробовал). Подскажите плыз, может кто-то сталкивался с проблемой подключения на andorid?

    log:

    2017-11-09 13:45:50 New OpenVPN Status (USER_VPN_PASSWORD->LEVEL_WAITING_FOR_USER_INPUT): 
    2017-11-09 13:45:59 Создание конфигурации…
    2017-11-09 13:45:59 New OpenVPN Status (VPN_GENERATE_CONFIG->LEVEL_START): 
    2017-11-09 13:45:59 New OpenVPN Status (VPN_GENERATE_CONFIG->LEVEL_START): 
    2017-11-09 13:45:59 started Socket Thread
    2017-11-09 13:45:59 Статус сети: CONNECTED  to WIFI "Wi-Fi-Name"
    2017-11-09 13:45:59 Debug state info: CONNECTED  to WIFI "Wi-Fi-Name", pause: userPause, shouldbeconnected: true, network: SHOULDBECONNECTED 
    2017-11-09 13:45:59 Debug state info: CONNECTED  to WIFI "Wi-Fi-Name", pause: userPause, shouldbeconnected: true, network: SHOULDBECONNECTED 
    2017-11-09 13:45:59 P:Initializing Google Breakpad!
    2017-11-09 13:45:59 Current Parameter Settings:
    2017-11-09 13:45:59   config = '/data/user/0/de.blinkt.openvpn/cache/android.conf'
    2017-11-09 13:45:59 Ожидание 0s секунд между попыткой подключения
    2017-11-09 13:45:59   mode = 0
    2017-11-09 13:45:59   show_ciphers = DISABLED
    2017-11-09 13:45:59   show_digests = DISABLED
    2017-11-09 13:45:59   show_engines = DISABLED
    2017-11-09 13:45:59   genkey = DISABLED
    2017-11-09 13:45:59   key_pass_file = '[UNDEF]'
    2017-11-09 13:45:59   show_tls_ciphers = DISABLED
    2017-11-09 13:45:59   connect_retry_max = 0
    2017-11-09 13:45:59 Connection profiles [0]:
    2017-11-09 13:45:59   proto = udp
    2017-11-09 13:45:59   local = '[UNDEF]'
    2017-11-09 13:45:59   local_port = '1194'
    2017-11-09 13:45:59   remote = 'Server_IP'
    2017-11-09 13:45:59   remote_port = 'Server_Port'
    2017-11-09 13:45:59   remote_float = DISABLED
    2017-11-09 13:45:59   bind_defined = DISABLED
    2017-11-09 13:45:59   bind_local = ENABLED
    2017-11-09 13:45:59   bind_ipv6_only = DISABLED
    2017-11-09 13:45:59   connect_retry_seconds = 2
    2017-11-09 13:45:59   connect_timeout = 120
    2017-11-09 13:45:59   socks_proxy_server = '[UNDEF]'
    2017-11-09 13:45:59   socks_proxy_port = '[UNDEF]'
    2017-11-09 13:45:59   tun_mtu = 1500
    2017-11-09 13:45:59   tun_mtu_defined = ENABLED
    2017-11-09 13:45:59   link_mtu = 1500
    2017-11-09 13:45:59   link_mtu_defined = DISABLED
    2017-11-09 13:45:59   tun_mtu_extra = 0
    2017-11-09 13:45:59   tun_mtu_extra_defined = DISABLED
    2017-11-09 13:45:59   mtu_discover_type = -1
    2017-11-09 13:45:59   fragment = 0
    2017-11-09 13:45:59   mssfix = 1450
    2017-11-09 13:45:59   explicit_exit_notification = 0
    2017-11-09 13:45:59 Connection profiles END
    2017-11-09 13:45:59   remote_random = DISABLED
    2017-11-09 13:45:59   ipchange = '[UNDEF]'
    2017-11-09 13:45:59   dev = 'tun'
    2017-11-09 13:45:59   dev_type = '[UNDEF]'
    2017-11-09 13:45:59   dev_node = '[UNDEF]'
    2017-11-09 13:45:59   lladdr = '[UNDEF]'
    2017-11-09 13:45:59   topology = 1
    2017-11-09 13:45:59   ifconfig_local = '[UNDEF]'
    2017-11-09 13:45:59   ifconfig_remote_netmask = '[UNDEF]'
    2017-11-09 13:45:59   ifconfig_noexec = DISABLED
    2017-11-09 13:45:59   ifconfig_nowarn = ENABLED
    2017-11-09 13:45:59   ifconfig_ipv6_local = '[UNDEF]'
    2017-11-09 13:45:59   ifconfig_ipv6_netbits = 0
    2017-11-09 13:45:59   ifconfig_ipv6_remote = '[UNDEF]'
    2017-11-09 13:45:59   shaper = 0
    2017-11-09 13:45:59   mtu_test = 0
    2017-11-09 13:45:59   mlock = DISABLED
    2017-11-09 13:45:59   keepalive_ping = 0
    2017-11-09 13:45:59   keepalive_timeout = 0
    2017-11-09 13:45:59   inactivity_timeout = 0
    2017-11-09 13:45:59   ping_send_timeout = 0
    2017-11-09 13:45:59   ping_rec_timeout = 0
    2017-11-09 13:45:59   ping_rec_timeout_action = 0
    2017-11-09 13:45:59   ping_timer_remote = DISABLED
    2017-11-09 13:45:59   remap_sigusr1 = 0
    2017-11-09 13:45:59   persist_tun = DISABLED
    2017-11-09 13:45:59   persist_local_ip = DISABLED
    2017-11-09 13:45:59   persist_remote_ip = DISABLED
    2017-11-09 13:45:59   persist_key = DISABLED
    2017-11-09 13:45:59   passtos = DISABLED
    2017-11-09 13:45:59   resolve_retry_seconds = 60
    2017-11-09 13:45:59   resolve_in_advance = DISABLED
    2017-11-09 13:45:59   username = '[UNDEF]'
    2017-11-09 13:45:59   groupname = '[UNDEF]'
    2017-11-09 13:45:59   chroot_dir = '[UNDEF]'
    2017-11-09 13:45:59   cd_dir = '[UNDEF]'
    2017-11-09 13:45:59   writepid = '[UNDEF]'
    2017-11-09 13:45:59   up_script = '[UNDEF]'
    2017-11-09 13:45:59   down_script = '[UNDEF]'
    2017-11-09 13:45:59   down_pre = DISABLED
    2017-11-09 13:45:59   up_restart = DISABLED
    2017-11-09 13:45:59   up_delay = DISABLED
    2017-11-09 13:45:59   daemon = DISABLED
    2017-11-09 13:45:59   inetd = 0
    2017-11-09 13:45:59   log = DISABLED
    2017-11-09 13:45:59   suppress_timestamps = DISABLED
    2017-11-09 13:45:59   machine_readable_output = ENABLED
    2017-11-09 13:45:59   nice = 0
    2017-11-09 13:45:59   verbosity = 4
    2017-11-09 13:45:59   mute = 0
    2017-11-09 13:45:59   gremlin = 0
    2017-11-09 13:45:59   status_file = '[UNDEF]'
    2017-11-09 13:45:59   status_file_version = 1
    2017-11-09 13:45:59   status_file_update_freq = 60
    2017-11-09 13:45:59   occ = ENABLED
    2017-11-09 13:45:59   rcvbuf = 0
    2017-11-09 13:45:59   sndbuf = 0
    2017-11-09 13:45:59   sockflags = 0
    2017-11-09 13:45:59   fast_io = DISABLED
    2017-11-09 13:45:59   comp.alg = 0
    2017-11-09 13:45:59   comp.flags = 0
    2017-11-09 13:45:59   route_script = '[UNDEF]'
    2017-11-09 13:45:59   route_default_gateway = '[UNDEF]'
    2017-11-09 13:45:59   route_default_metric = 0
    2017-11-09 13:45:59   route_noexec = DISABLED
    2017-11-09 13:45:59   route_delay = 0
    2017-11-09 13:45:59   route_delay_window = 30
    2017-11-09 13:45:59   route_delay_defined = DISABLED
    2017-11-09 13:45:59   route_nopull = DISABLED
    2017-11-09 13:45:59   route_gateway_via_dhcp = DISABLED
    2017-11-09 13:45:59   allow_pull_fqdn = DISABLED
    2017-11-09 13:45:59   route 0.0.0.0/0.0.0.0/vpn_gateway/default (not set)
    2017-11-09 13:45:59   management_addr = '/data/user/0/de.blinkt.openvpn/cache/mgmtsocket'
    2017-11-09 13:45:59   management_port = 'unix'
    2017-11-09 13:45:59   management_user_pass = '[UNDEF]'
    2017-11-09 13:45:59   management_log_history_cache = 250
    2017-11-09 13:45:59   management_echo_buffer_size = 100
    2017-11-09 13:45:59   management_write_peer_info_file = '[UNDEF]'
    2017-11-09 13:45:59   management_client_user = '[UNDEF]'
    2017-11-09 13:45:59   management_client_group = '[UNDEF]'
    2017-11-09 13:45:59   management_flags = 4390
    2017-11-09 13:45:59   shared_secret_file = '[UNDEF]'
    2017-11-09 13:45:59   key_direction = (null)
    2017-11-09 13:45:59   ciphername = 'BF-CBC'
    2017-11-09 13:45:59   ncp_enabled = ENABLED
    2017-11-09 13:45:59   ncp_ciphers = 'AES-256-GCM:AES-128-GCM'
    2017-11-09 13:45:59   authname = 'SHA1'
    2017-11-09 13:45:59   prng_hash = 'SHA1'
    2017-11-09 13:45:59   prng_nonce_secret_len = 16
    2017-11-09 13:45:59   keysize = 0
    2017-11-09 13:45:59   engine = DISABLED
    2017-11-09 13:45:59   replay = ENABLED
    2017-11-09 13:45:59   mute_replay_warnings = DISABLED
    2017-11-09 13:45:59   replay_window = 64
    2017-11-09 13:45:59   replay_time = 15
    2017-11-09 13:45:59   packet_id_file = '[UNDEF]'
    2017-11-09 13:45:59   test_crypto = DISABLED
    2017-11-09 13:45:59   tls_server = DISABLED
    2017-11-09 13:45:59   tls_client = ENABLED
    2017-11-09 13:45:59   key_method = 2
    2017-11-09 13:45:59   ca_file = '[[INLINE]]'
    2017-11-09 13:45:59   ca_path = '[UNDEF]'
    2017-11-09 13:45:59   dh_file = '[UNDEF]'
    2017-11-09 13:45:59   cert_file = '[[INLINE]]'
    2017-11-09 13:45:59   extra_certs_file = '[UNDEF]'
    2017-11-09 13:45:59   priv_key_file = '[[INLINE]]'
    2017-11-09 13:45:59   pkcs12_file = '[UNDEF]'
    2017-11-09 13:45:59   cipher_list = '[UNDEF]'
    2017-11-09 13:45:59   tls_verify = '[UNDEF]'
    2017-11-09 13:45:59   tls_export_cert = '[UNDEF]'
    2017-11-09 13:45:59   verify_x509_type = 2
    2017-11-09 13:45:59   verify_x509_name = 'Server_IP'
    2017-11-09 13:45:59   crl_file = '[UNDEF]'
    2017-11-09 13:45:59   ns_cert_type = 0
    2017-11-09 13:45:59   remote_cert_ku[i] = 0
    2017-11-09 13:45:59   remote_cert_ku[i] = 0
    2017-11-09 13:45:59   remote_cert_ku[i] = 0
    2017-11-09 13:45:59   remote_cert_ku[i] = 0
    2017-11-09 13:45:59   remote_cert_ku[i] = 0
    2017-11-09 13:45:59   remote_cert_ku[i] = 0
    2017-11-09 13:45:59   remote_cert_ku[i] = 0
    2017-11-09 13:45:59   remote_cert_ku[i] = 0
    2017-11-09 13:45:59   remote_cert_ku[i] = 0
    2017-11-09 13:45:59   remote_cert_ku[i] = 0
    2017-11-09 13:45:59   remote_cert_ku[i] = 0
    2017-11-09 13:45:59   remote_cert_ku[i] = 0
    2017-11-09 13:45:59   remote_cert_ku[i] = 0
    2017-11-09 13:45:59   remote_cert_ku[i] = 0
    2017-11-09 13:45:59   remote_cert_ku[i] = 0
    2017-11-09 13:45:59   remote_cert_ku[i] = 0
    2017-11-09 13:45:59   remote_cert_eku = '[UNDEF]'
    2017-11-09 13:45:59   ssl_flags = 0
    2017-11-09 13:45:59   tls_timeout = 2
    2017-11-09 13:45:59   renegotiate_bytes = -1
    2017-11-09 13:45:59   renegotiate_packets = 0
    2017-11-09 13:45:59   renegotiate_seconds = 3600
    2017-11-09 13:45:59   handshake_window = 60
    2017-11-09 13:45:59   transition_window = 3600
    2017-11-09 13:45:59   single_session = DISABLED
    2017-11-09 13:45:59   push_peer_info = DISABLED
    2017-11-09 13:45:59   tls_exit = DISABLED
    2017-11-09 13:45:59   tls_auth_file = '[UNDEF]'
    2017-11-09 13:45:59   tls_crypt_file = '[UNDEF]'
    2017-11-09 13:45:59   client = ENABLED
    2017-11-09 13:45:59   pull = ENABLED
    2017-11-09 13:45:59   auth_user_pass_file = '[UNDEF]'
    2017-11-09 13:45:59 OpenVPN 2.5-icsopenvpn [git:icsopenvpn-d51333c645c12713+] android-21-arm64-v8a [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [MH/PKTINFO] [AEAD] built on Jun 26 2017
    2017-11-09 13:45:59 library versions: OpenSSL 1.1.0f  25 May 2017, LZO 2.10
    2017-11-09 13:45:59 MANAGEMENT: Connected to management server at /data/user/0/de.blinkt.openvpn/cache/mgmtsocket
    2017-11-09 13:45:59 MANAGEMENT: CMD 'hold release'
    2017-11-09 13:45:59 MANAGEMENT: CMD 'proxy NONE'
    2017-11-09 13:45:59 MANAGEMENT: CMD 'bytecount 2'
    2017-11-09 13:45:59 MANAGEMENT: CMD 'state on'
    2017-11-09 13:46:00 MANAGEMENT: CMD 'password [...]'
    2017-11-09 13:46:00 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
    2017-11-09 13:46:00 Control Channel MTU parms [ L:1621 D:1212 EF:38 EB:0 ET:0 EL:3 ]
    2017-11-09 13:46:00 Data Channel MTU parms [ L:1621 D:1450 EF:121 EB:406 ET:0 EL:3 ]
    2017-11-09 13:46:00 Local Options String (VER=V4): 'V4,dev-type tun,link-mtu 1541,tun-mtu 1500,proto UDPv4,cipher BF-CBC,auth SHA1,keysize 128,key-method 2,tls-client'
    2017-11-09 13:46:00 Expected Remote Options String (VER=V4): 'V4,dev-type tun,link-mtu 1541,tun-mtu 1500,proto UDPv4,cipher BF-CBC,auth SHA1,keysize 128,key-method 2,tls-server'
    2017-11-09 13:46:00 TCP/UDP: Preserving recently used remote address: [AF_INET]Server_IP:Port
    2017-11-09 13:46:00 Socket Buffers: R=[212992->212992] S=[212992->212992]
    2017-11-09 13:46:00 MANAGEMENT: CMD 'needok 'PROTECTFD' ok'
    2017-11-09 13:46:00 UDP link local (bound): [AF_INET][undef]:1194
    2017-11-09 13:46:00 UDP link remote: [AF_INET]Server_IP:Port
    2017-11-09 13:46:00 MANAGEMENT: >STATE:1510227960,WAIT,,,,,,
    2017-11-09 13:46:00 New OpenVPN Status (WAIT->LEVEL_CONNECTING_NO_SERVER_REPLY_YET): ,,,,,
    2017-11-09 13:46:00 New OpenVPN Status (WAIT->LEVEL_CONNECTING_NO_SERVER_REPLY_YET): ,,,,,
    2017-11-09 13:46:00 MANAGEMENT: >STATE:1510227960,AUTH,,,,,,
    2017-11-09 13:46:00 TLS: Initial packet from [AF_INET]Server_IP:Port, sid=83571245 634e1803
    2017-11-09 13:46:00 New OpenVPN Status (AUTH->LEVEL_CONNECTING_SERVER_REPLIED): ,,,,,
    2017-11-09 13:46:00 New OpenVPN Status (AUTH->LEVEL_CONNECTING_SERVER_REPLIED): ,,,,,
    2017-11-09 13:46:00 VERIFY OK: depth=1, CN=Server_Name
    2017-11-09 13:46:00 VERIFY X509NAME ERROR: CN=server, must be Server_IP
    2017-11-09 13:46:00 OpenSSL: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed
    2017-11-09 13:46:00 TLS_ERROR: BIO read tls_read_plaintext error
    2017-11-09 13:46:00 New OpenVPN Status (RECONNECTING->LEVEL_CONNECTING_NO_SERVER_REPLY_YET): tls-error,,,,,
    2017-11-09 13:46:00 New OpenVPN Status (RECONNECTING->LEVEL_CONNECTING_NO_SERVER_REPLY_YET): tls-error,,,,,
    2017-11-09 13:46:00 New OpenVPN Status (CONNECTRETRY->LEVEL_CONNECTING_NO_SERVER_REPLY_YET): 2
    2017-11-09 13:46:00 New OpenVPN Status (CONNECTRETRY->LEVEL_CONNECTING_NO_SERVER_REPLY_YET): 2
    2017-11-09 13:46:00 Ожидание 2s секунд между попыткой подключения
    2017-11-09 13:46:00 TLS Error: TLS object -> incoming plaintext read error
    2017-11-09 13:46:00 TLS Error: TLS handshake failed
    2017-11-09 13:46:00 TCP/UDP: Closing socket
    2017-11-09 13:46:00 SIGUSR1[soft,tls-error] received, process restarting
    2017-11-09 13:46:00 MANAGEMENT: >STATE:1510227960,RECONNECTING,tls-error,,,,,
    2017-11-09 13:46:05 MANAGEMENT: CMD 'hold release'
    2017-11-09 13:46:05 MANAGEMENT: CMD 'proxy NONE'
    2017-11-09 13:46:05 MANAGEMENT: CMD 'bytecount 2'
    2017-11-09 13:46:05 MANAGEMENT: CMD 'state on'
    2017-11-09 13:46:06 Control Channel MTU parms [ L:1621 D:1212 EF:38 EB:0 ET:0 EL:3 ]
    2017-11-09 13:46:06 Data Channel MTU parms [ L:1621 D:1450 EF:121 EB:406 ET:0 EL:3 ]
    2017-11-09 13:46:06 Local Options String (VER=V4): 'V4,dev-type tun,link-mtu 1541,tun-mtu 1500,proto UDPv4,cipher BF-CBC,auth SHA1,keysize 128,key-method 2,tls-client'
    2017-11-09 13:46:06 Expected Remote Options String (VER=V4): 'V4,dev-type tun,link-mtu 1541,tun-mtu 1500,proto UDPv4,cipher BF-CBC,auth SHA1,keysize 128,key-method 2,tls-server'
    2017-11-09 13:46:06 TCP/UDP: Preserving recently used remote address: [AF_INET]Server_IP:Port
    2017-11-09 13:46:06 Socket Buffers: R=[212992->212992] S=[212992->212992]
    2017-11-09 13:46:06 MANAGEMENT: CMD 'needok 'PROTECTFD' ok'
    2017-11-09 13:46:06 UDP link local (bound): [AF_INET][undef]:1194
    2017-11-09 13:46:06 UDP link remote: [AF_INET]Server_IP:Port
    2017-11-09 13:46:06 New OpenVPN Status (WAIT->LEVEL_CONNECTING_NO_SERVER_REPLY_YET): ,,,,,
    2017-11-09 13:46:06 New OpenVPN Status (WAIT->LEVEL_CONNECTING_NO_SERVER_REPLY_YET): ,,,,,
    2017-11-09 13:46:06 MANAGEMENT: >STATE:1510227966,WAIT,,,,,,
    2017-11-09 13:46:07 New OpenVPN Status (AUTH->LEVEL_CONNECTING_SERVER_REPLIED): ,,,,,
    2017-11-09 13:46:07 New OpenVPN Status (AUTH->LEVEL_CONNECTING_SERVER_REPLIED): ,,,,,
    2017-11-09 13:46:07 MANAGEMENT: >STATE:1510227966,AUTH,,,,,,
    2017-11-09 13:46:07 TLS: Initial packet from [AF_INET]Server_IP:Port, sid=7da2882a af2f0b57
    2017-11-09 13:46:07 VERIFY OK: depth=1, CN=Server_Name
    2017-11-09 13:46:07 VERIFY X509NAME ERROR: CN=server, must be Server_IP
    2017-11-09 13:46:07 New OpenVPN Status (RECONNECTING->LEVEL_CONNECTING_NO_SERVER_REPLY_YET): tls-error,,,,,
    2017-11-09 13:46:07 New OpenVPN Status (RECONNECTING->LEVEL_CONNECTING_NO_SERVER_REPLY_YET): tls-error,,,,,
    2017-11-09 13:46:07 New OpenVPN Status (CONNECTRETRY->LEVEL_CONNECTING_NO_SERVER_REPLY_YET): 2
    2017-11-09 13:46:07 New OpenVPN Status (CONNECTRETRY->LEVEL_CONNECTING_NO_SERVER_REPLY_YET): 2
    2017-11-09 13:46:07 Ожидание 2s секунд между попыткой подключения
    2017-11-09 13:46:07 OpenSSL: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed
    2017-11-09 13:46:07 TLS_ERROR: BIO read tls_read_plaintext error
    2017-11-09 13:46:07 TLS Error: TLS object -> incoming plaintext read error
    2017-11-09 13:46:07 TLS Error: TLS handshake failed
    2017-11-09 13:46:07 TCP/UDP: Closing socket
    2017-11-09 13:46:07 SIGUSR1[soft,tls-error] received, process restarting
    2017-11-09 13:46:07 MANAGEMENT: >STATE:1510227967,RECONNECTING,tls-error,,,,,
    2017-11-09 13:46:12 MANAGEMENT: CMD 'hold release'
    2017-11-09 13:46:12 MANAGEMENT: CMD 'proxy NONE'
    2017-11-09 13:46:12 MANAGEMENT: CMD 'bytecount 2'
    2017-11-09 13:46:12 MANAGEMENT: CMD 'state on'
    2017-11-09 13:46:13 Control Channel MTU parms [ L:1621 D:1212 EF:38 EB:0 ET:0 EL:3 ]
    2017-11-09 13:46:13 Data Channel MTU parms [ L:1621 D:1450 EF:121 EB:406 ET:0 EL:3 ]
    2017-11-09 13:46:13 Local Options String (VER=V4): 'V4,dev-type tun,link-mtu 1541,tun-mtu 1500,proto UDPv4,cipher BF-CBC,auth SHA1,keysize 128,key-method 2,tls-client'
    2017-11-09 13:46:13 Expected Remote Options String (VER=V4): 'V4,dev-type tun,link-mtu 1541,tun-mtu 1500,proto UDPv4,cipher BF-CBC,auth SHA1,keysize 128,key-method 2,tls-server'
    2017-11-09 13:46:13 TCP/UDP: Preserving recently used remote address: [AF_INET]Server_IP:Port
    2017-11-09 13:46:13 Socket Buffers: R=[212992->212992] S=[212992->212992]
    2017-11-09 13:46:13 MANAGEMENT: CMD 'needok 'PROTECTFD' ok'
    2017-11-09 13:46:13 UDP link local (bound): [AF_INET][undef]:1194
    2017-11-09 13:46:13 UDP link remote: [AF_INET]Server_IP:Port
    2017-11-09 13:46:13 MANAGEMENT: >STATE:1510227973,WAIT,,,,,,
    2017-11-09 13:46:13 New OpenVPN Status (WAIT->LEVEL_CONNECTING_NO_SERVER_REPLY_YET): ,,,,,
    2017-11-09 13:46:13 New OpenVPN Status (WAIT->LEVEL_CONNECTING_NO_SERVER_REPLY_YET): ,,,,,
    2017-11-09 13:46:13 TLS Error: Unroutable control packet received from [AF_INET]Server_IP:Port (si=3 op=P_CONTROL_V1)
    2017-11-09 13:46:15 TLS Error: Unroutable control packet received from [AF_INET]Server_IP:Port (si=3 op=P_ACK_V1)
    2017-11-09 13:46:16 TLS Error: Unroutable control packet received from [AF_INET]Server_IP:Port (si=3 op=P_CONTROL_V1)
    2017-11-09 13:46:19 TLS Error: Unroutable control packet received from [AF_INET]Server_IP:Port (si=3 op=P_ACK_V1)
    2017-11-09 13:46:22 TLS Error: Unroutable control packet received from [AF_INET]Server_IP:Port (si=3 op=P_CONTROL_V1)
    • Вопрос снят, это все настройки самого клиента на android.
      Но если кто ткнет носом на статейку как правильно создать конфигурационный файл для клиентов на моб (android, ios)? буду очень признателен. Так как моб клиенты, почему-то не видят filename.ovpn.

      • Дмитрий

        А ищи.
        В этом весь OpenSource.
        Вторая нога не знает, куда идет первая.
        У всех все по-своему. Без стандартизации.

  96. Алуксандр

    добрый день
    спасибо за статью
    возникла одна проблема при установке которую не могу ни нагуглить ни сам решить

    [root@Openvpn easyrsa3]# ./easyrsa sign-req server server

    Note: using Easy-RSA configuration from: ./vars
    Usage: rand [options] num
    where options are
    -out file - write to file
    -engine e - use engine e, possibly a hardware device.
    -rand file:file:... - seed PRNG from files
    -base64 - base64 encode output
    -hex - hex encode output

    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 3650 days:

    subject=
    commonName = server

    Type the word 'yes' to continue, or any other input to abort.
    Confirm request details: yes
    Using configuration from ./openssl-1.0.cnf
    Enter pass phrase for /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/private/ca.key:
    Check that the request matches the signature
    Signature ok
    The Subject's Distinguished Name is as follows
    commonName :PRINTABLE:'server'
    ERROR: adding extensions in section default
    140605755951008:error:22097082:X509 V3 routines:DO_EXT_NCONF:unknown extension name:v3_conf.c:124:
    140605755951008:error:22098080:X509 V3 routines:X509V3_EXT_nconf:error in extension:v3_conf.c:93:name=copy_extensions, value=copy

    Easy-RSA error:

    signing failed (openssl output above may have more detail)
    подскажите пожалуйста что я делаю не так

    • Алуксандр

      пробовал обновить openssl (не помогло)
      # openssl version
      OpenSSL 1.0.1e-fips 11 Feb 2013
      # yum -y install gcc
      # yum -y install gcc-c++
      # yum install make

      # cd /usr/local/src
      # wget https://www.openssl.org/source/openssl-1.0.2-latest.tar.gz
      # tar -zxf openssl-1.0.2-latest.tar.gz
      # cd openssl-1.0.2a
      # ./config
      # make
      # make test
      # make install
      # mv /usr/bin/openssl /root/
      # ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl

      # openssl version
      OpenSSL 1.0.2l 25 May 2017

    • Надо гуглить ошибку и смотреть, в чем может быть проблема. Так трудно что-то советовать. У меня обычно все штатно проходит, без проблем.

      • Алуксандр

        говорят в easyrsa надо исправить
        источник #https://github.com/OpenVPN/easy-rsa/commit/bc586578b4d6318e1a00317e5a14a19311649eac#diff-231cb43897d7aa2a98dfda5720c2b40fL537#

        - EASYRSA_EXTRA_EXTS="
        + local extra_exts="
        и
        - print "$EASYRSA_EXTRA_EXTS" | \
        + print "$extra_exts" | \
        но у меня уже исправленно хз проблама была в 2015 году и в новой версии должны были поправить но ничего не работает
        centos 3 раза перебивал
        походу дело в скрипте
        Может у кого есть рабочий архив - поделитесь пожалуйста
        Коллеги пожалуйста у кого есть

  97. Добрый день! Возможно ли подключиться к OpenVPN серверу клиентом модема, например TP-Link. Там, на сколько понял, нет выбора сертификата с которым можно будет подключиться.

  98. Спасибо за статью! Очень полезно. Один из вопросов, как заставить весь трафик клиента идти в тоннель в обход локального подключения к интернету?

    • Гугли вот этот параметр:
      push redirect-gateway def1
      Его нужно передать клиенту, чтобы он весь траффик пускал через vpn.

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

        На свежеустановленной системе iptables некорректно обрабатывает конфиги данные в статье (в этой и в соседних про настройку сервера и firewall).
        Конкретнее, iptables игнорирует все настройки что ниже этих строк (раздел *filter)
        INPUT DROP
        OUTPUT DROP
        FORWARD DROP

        Пок