Разное

Openvpn server conf: How To Guide: Set Up & Configure OpenVPN client/server VPN

Содержание

Настройка OpenVPN

главная
— Статьи — Удаленный доступ (VPN)

Теги: OpenVPN VPN VPN сервер

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

Структура нашей сети такая:

  • Сеть: 192.168.10.0/24
  • IP-адрес внешнего интерфейса сервера OpenVPN: 444.333.222.111
  • Порт, на котором «висит» OpenVPN: 1194 udp (стандартный для OpenVPN)
  • IP-адрес DNS внутренней сети: 192.168.10.100
  • Сеть VPN: 10.8.0.0/24 (стандартная для OpenVPN)
  • Удаленный сотрудник без определенного адреса

Начальная установка простая для любой популярной операционной системы:

  • CentOS: yum install openvpn (правда, это я немного лукавлю насчет просто, читайте ниже)
  • FreeBSD: cd /usr/ports/security/openvpn -> make -> make install
  • Windows: ну тут уж все специалисты!

Пожалуй, не скажу ничего про Mac OS, т.к. не сталкивался лично.

Установка OpenVPN в Linux

Я использую CentOS, поэтому могу описать установку именно для этого Linux.

Как и везде, скачать пакет и установить не есть гуд, т.к. его будет труднее обновлять. А т.к. «yum install openvpn» выдаст фиг, надо нам подключить репозиторий.

Вариант 1 — попробовать поставить репозиторий с самого openvpn.net:

# cd /etc/yum.repos.d
# wget http://repos.openvpn.net/repos/yum/conf/repos.openvpn.net-CentOS6-snapshots.repo
# yum install openvpn

Эти команды см. в файле http://repos.openvpn.net/repos/yum/conf/repos.openvpn.net-CentOS6-snapshots.txt.

Скоре всего, это у вас не прокатит 🙂

Вариант 2 — репозиторий RPMForge

Для i386:

# rpm  -Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.5.1-1.el5.rf.i386.rpm

Для x86_64:

# rpm  -Uhv http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.1-1.el5.rf.x86_64.rpm

Установка ключа

# rpm –import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt

Проверим, чего наставили:

# yum repolist

Особо не увлекайтесь всякими репозиториями 🙂 Чем меньше их, тем лучше.

Вариант 3 — сложные случаи — попробуйте посмотреть http://pkgs.org/search/?keyword=openvpn.

Итак, чтобы вы ни делали, вы должны успешно выполнить команду:

# yum install openvpn

Installed:
  openvpn.i386 0:2.3-3

Dependency Installed:
  pkcs11-helper.i686 0:1.08-1.el6.rf

Complete!

Первичная настройка OpenVPN

Независимо от того, на FreeBSD, Linux или Windows, общие шаги по созданию необходимой инфраструктуры для OpenVPN практически одинаковы.

Копируем файл конфигурации:

# cp /usr/share/doc/openvpn-*/sample-config-files/server.conf /etc/openvpn/

Копируем пакет управления RSA ключами из поставки OpenVPN в /etc/openvpn/easy-rsa:

# cp /usr/share/doc/openvpn-*/easy-rsa/2.0/ /etc/openvpn/
# cd /etc/openvpn/easy-rsa
# cp openssl-1.0.0.cnf openssl.cnf
# mkdir keys

Редактируем файл /etc/openvpn/rsa-keys/vars:

export KEY_COUNTRY=»RU»
export KEY_PROVINCE=»RU»
export KEY_CITY=»Moscow»
export KEY_ORG=»Company»
export KEY_EMAIL=»[email protected]»
export [email protected]
export KEY_CN=changeme
export KEY_NAME=changeme
export KEY_OU=Office
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234

Далее следует экспортировать переменные KEY_*, они необходимы для работы скриптов build-*, генерирующих сертификаты. На этом шаге могу отметить, что у меня не сразу получилось экспортировать переменные из файла /etc/openvpn/easy-rsa/keys, пришлось делать скрипт с экспортом системной переменной $PATH, но, как мне кажется, это чисто у меня такая проблема была (в Windows-версии C:Program FilesOpenVPNeasy-rsavars.bat переменные экспортировались без проблем):

# cd /etc/openvpn/easy-rsa
# ./vars

В Windows откройте командную строку "cmd":

cd «C:Program FilesOpenVPNeasy-rsa
vars.bat

Удаляем все предыдущие файлы ключей и сертифкатов из директории /etc/openvpn/easy-rsa/keys (эта директория указана в переменной KEY_DIR файла vars):

# chmod +x clean-all
# ./clean-all

Создаем сертификат подлинности (Certificate Authority) сервера:

# chmod +x build-ca
# chmod +x pkitool
# ./build-ca

.++++++
………………………………….++++++
writing new private key to ‘ca.key’
——
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.
——
Country Name (2 letter code) [RU]:
State or Province Name (full name) [RU]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [Company]:
Organizational Unit Name (eg, section) [Office]:
Common Name (eg, your name or your server’s hostname) [changeme]:VPNServer
Name [changeme]:Name
Email Address [[email protected]]:

Ок, мы вроде бы все сделали.

Будьте внимательны при заполнени данных сертификатов, поле Common Name обязательно к заполнению, причем для сервера оно должно быть одно, а для клиента другое. Например в поле Common Name при генерации сертификата X.509 для сервера можно написать «server», а для клиента соотвественно «client».

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

# chmod +x build-key-server
# ./build-key-server server
Generating a 1024 bit RSA private key
.++++++
………………..++++++
writing new private key to ‘server.key’
——
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.
——
Country Name (2 letter code) [RU]:
State or Province Name (full name) [RU]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [Company]:
Organizational Unit Name (eg, section) [Office]:
Common Name (eg, your name or your server’s hostname) [server]:
Name [changeme]:IAmServer
Email Address [[email protected]]:

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
countryName           :PRINTABLE:’RU’
stateOrProvinceName   :PRINTABLE:’RU’
localityName          :PRINTABLE:’Moscow’
organizationName      :PRINTABLE:’Company’
organizationalUnitName:PRINTABLE:’Office’
commonName            :PRINTABLE:’server’
name                  :PRINTABLE:’IAmServer’
emailAddress          :IA5STRING:’[email protected]
Certificate is to be certified until Apr  7 12:15:29 2022 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Для создания файла параметров Диффи-Хелмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, выполняем:

# chmod +x build-dh
# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time

Создаем сертификаты для удаленного клиента:

# ./build-key-pass Client1
Generating a 1024 bit RSA private key
……………….++++++
……………………………………………….++++++
writing new private key to ‘Client1.key’


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

На последок генерируем общий для клиента и сервера TLS-ключ, служащий дополнительной защитой. TLS предоставляет возможности аутентификации и безопасной передачи данных через Интернет с использованием криптографических средств. Часто происходит лишь аутентификация сервера, в то время как клиент остается неаутентифицированным. Для взаимной аутентификации каждая из сторон должна поддерживать инфраструктуру открытого ключа (PKI), которая позволяет защитить клиент-серверные приложения от перехвата сообщений, редактирования существующих сообщений и создания поддельных (источник: wikipedia).

openvpn —genkey —secret ta.key

В результате в папке /etc/openvpn/easy-rsa/keys мы имеем следующие файлы:

ca.crt — главный сертификат подлинности (Certificate Authority), этот файл нужен и клиенту и серверу
dh2024.pem — ключ Диффи Хельмана, этот файл нужен только серверу
server.crt — сертификат X.509 сервера (стандарт X.509 ITU-T является фундаментальным стандартом, лежащим в основе всех остальных, используемых в Инфраструктуре Открытых Ключей (ИОК). Основное его назначение — определение формата электронного сертификата и списков отозванных сертификатов), нужен только серверу
server.key — ключ сервера, нужен только серверу (СЕКРЕТНЫЙ файл)
client1.crt — сертификат X.509 клиента, нужен только клиенту
client1.key — ключ клиента, нужен только клиенту (СЕКРЕТНЫЙ файл)
ta.key — TLS-ключ, нужен и клиенту и серверу

Серверу — одно, клиенту — другое

Теперь в папку /etc/openvpn/keys на будущем сервере OpenVPN скопируем файлы ca.crt, dh2024.pem, server.crt, server.key и ta.key:

# mkdir /etc/openvpn/keys
# cp /etc/openvpn/easy-rsa/keys/ca.crt dh2024.pem server.crt server.key ta.key /etc/openvpn/keys

В папку будущего клиента /etc/openvpn/client1 скопируем файлы ca.crt, client1.crt, client1.key и ta.key:

# mkdir /etc/openvpn/client1
# cp /etc/openvpn/easy-rsa/keys/ca.crt client1.crt client1.key ta.key /etc/openvpn/client1

Теперь подкаталог «client1» можно скопировать в папку конфигурации будущего удаленного клиента Windows.

В принципе, в папке /etc/openvpn/easy-rsa/keys/ все файлы можно оставить, на всякий случай 🙂 Права на доступ к папке openvpn лучше обновить до правильных:

# chown -R root:wheel /etc/openvpn

Конфиг сервера OpenVPN

Расположение файла конфигурации сервера: «/etc/openvpn/config/server.conf» (для Windows: «C:Program FilesOpenVPNconfigserver.ovpn«).

Пример файла конфигурации сервера OpenVPN (подходит для Windows, Linux, FreeBSD с минимальными изменениями):

port 1194

# на сайте разработчиков рекомендуется использовать udp в том числе
# по соображениям безопасности
proto udp

dev tun

ca «/etc/openvpn/keys/ca.crt»
cert «/etc/openvpn/keys/server.crt»
key «/etc/openvpn/keys/server.key» # Этот файл хранить в секрете!

dh «/etc/openvpn/keys/dh2024.pem»

topology subnet

# включаем TLS аутификацию
tls-server
# указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента
tls-auth «/etc/openvpn/keys/ta.key» 0
# таймаут до реконекта
tls-timeout 120
auth MD5

# задаем IP-адрес сервера и маску подсети
server 10.8.0.0 255.255.255.0

# задаем МАРШРУТ который передаём клиенту
# и маску подсети для того чтобы он «видел»
# сеть за OpenVPN сервером (сеть 192.168.10.0/24)
push «route 192.168.10.0 255.255.255.0»

ifconfig-pool-persist «/etc/openvpn/config/ipp.txt»

route 192.168.10.0 255.255.255.0

# If enabled, this directive will configure
# all clients to redirect their default
# network gateway through the VPN, causing
# all IP traffic such as web browsing and
# and DNS lookups to go through the VPN
# (The OpenVPN server machine may need to NAT
# or bridge the TUN/TAP interface to the internet
# in order for this to work properly).
# Фактически означает, что даже в интернет вы будете ходить через
# рабочий интернет-шлюз. Имейте это ввиду!
# После отключения от VPN-соединения вполне возможно вам будет необходимо
# выполнить команду в консоли cmd: ipconfig /renew.
push «redirect-gateway def1 bypass-dhcp»

# Сообщаем удаленному клиенту адрес внутреннего DNS-сервера
# чтобы клиент мог по именам обращаться к компьютерам локальной сети
push «dhcp-option DNS 192.168.10.100»

# удерживать соединение (полезно при работе через nat, proxy и т.п.)
keepalive 10 120

# включаем шифрацию пакетов
cipher BF-CBC

# включить сжатие (если есть проблемы при соединении — выключите эту опцию на клиенте и сервере)
comp-lzo

# максимум клиентов
max-clients 5

;user nobody
;group nobody

# Не перечитывать ключи после получения
# SIGUSR1 или ping-restart
persist-key
# Не закрывать и переоткрывать TUNTAP
# устройство, после получения
# SIGUSR1 или ping-restart
persist-tun

# клиенты могут «видеть» друг друга
client-to-client

status «/etc/openvpn/log/openvpn-status.log»

log «/etc/openvpn/log/openvpn.log»
log-append «/etc/openvpn/log/openvpn.log»

# уровень детализации отчетов
verb 3

Примечания к конфигурационному файлу сервера OpenVPN

В данном конфиге будут только два различия в версиях сервера для Unix или для Windows.

1. Пути расположения файлов конфигурации, сертификатов и пр. в конфиге для Windows должны прописываться так:

dh "C:Program FilesOpenvpnconfigdh2024.pem"

а в Linux/FreeBSD так:

dh "/etc/openvpn/config/dh2024.pem"

2. В конфиге для Windows следующие строки должны быть закомментированы:

;user nobody
;group nobody

а в Linux/FreeBSD (по желанию или по соображениям безопасности, но режиме отладки самого сервера OpenVPN можно сначала запускать сервер OpenVPN под админом, чтобы в случае проблем не грешить на права доступа, но потом обязательно сменить запуск на nobody!!!) раскомментированы:

user nobody
group nobody

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

Автозапуск сервера OpenVPN в Linux/FreeBSD

Для автоматического запуска сервера OpenVPN можно использовать следующий скрипт (# — комментарий), например, start_openvpn.sh (не забудьте сделать его исполняемым «chmod +x start_openvpn.sh«):

#!/bin/sh
dir=/etc/openvpn/config
modprobe tun
echo 1 > /proc/sys/net/ipv4/ip_forward
openvpn —cd $dir —daemon —config /etc/openvpn/config/server.conf
# кстати, здесь можно запускать несколько серверов OpenVPN одновременно:
# openvpn —cd $dir —daemon —config /etc/openvpn/config/server2.conf

либо такой (например, во FreeBSD):

openvpn_enable=»YES»
openvpn_if=»tun» #
openvpn_configfile=»/etc/openvpn/config/server.conf»
openvpn_dir=»/etc/openvpn» # —cd directory

Конфиг клиента OpenVPN на Windows XP

Файлы клиента берем из папки /etc/openvpn/client1 на сервере и копируем их в папку «C:Program FilesOpenVPNconfig» на клиенте.

Расположение файла конфигурации клиента: «C:Program FilesOpenVPNconfigclient1.ovpn» (для Linux/FreeBSD расположение, полагаю, где-либо в домашней папке юзера, к примеру, «/home/vpn/client1.ovpn").

Пример файла конфигурации клиента OpenVPN :

client

dev tun

proto udp

# IP-адрес и порт сервера OpenVPN)
remote 444.333.222.111 1194

resolv-retry infinite

nobind

persist-key
persist-tun

ca «C:Program FilesOpenVPNconfigca.crt»
cert «C:Program FilesOpenVPNconfigclient1.crt»
key «C:Program FilesOpenVPNconfigclient1.key»

tls-client
tls-auth «C:Program FilesOpenVPNconfigta.key» 1
auth MD5

#Это еще одна защита, на этот раз от «man in the middle» атаки
ns-cert-type server

comp-lzo

verb 3

Также надо настроить брандмауэр для того, чтобы внешние клиенты OpenVPN могли «видеть» сеть «за NAT». Я приведу часть конфига iptables работающего шлюза CentOS / Squid (внутренняя сеть 192.168.10.0/24):

IF_EXT="eth2"
IF_INT="eth0"
IF_VPN="tun0"

IPT="/sbin/iptables"

VPN_NET="10.8.0.0/24"

IPT="/sbin/iptables"

# flush
$IPT --flush
$IPT -t nat --flush
$IPT -t mangle --flush
$IPT -X

# loopback
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# default
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

# allow forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
...

...
# FORWARD chain
# #########################################

# Форвардинг пакетов из внутренней сети "наружу"
# К нашему вопросу не относится, для общего понимания привел.
$IPT -A FORWARD -i $IF_INT -o $IF_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IF_EXT -o $IF_INT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Маршрутизация пакетов VPN-клиентов
$IPT -A FORWARD -i $IF_INT -o $IF_VPN -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IF_VPN -o $IF_INT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -s $VPN_NET -j ACCEPT
...

...
# NAT
# #########################################

# Веб-трафик клиентов внутренней сети предприятия автоматически "заворачиваем"
# на прокси-сервер Squid в прозрачном режиме. 
$IPT -t nat -A PREROUTING -i $IF_INT -p tcp --dport 80 -j DNAT --to 192.168.10.100:3128

# VPN-clients www via Squid
# Т.к. мы указали клиенту VPN взять маршрут по-умолчанию через сервер OpenVPN,
# то будет весьма неплохо дать ему возможность выходить в интернет без "головной боли",
# прозрачно перекинув его запросы на локальный прокси-сервер Squid в прозрачном режиме.
$IPT -t nat -A PREROUTING -i $IF_VPN -p tcp --dport 80 -j DNAT --to 10.8.0.1:3128

# SNAT - внутреняя сеть (за NAT) должна иметь возможность выхода в интернет
$IPT -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE
...

...
# INPUT chain
# #########################################
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Разрешаем внешним клиентам соединяться с нашим сервером OpenVPN
$IPT -A INPUT -i $IF_EXT -p udp --dport 1194 -j ACCEPT

# ssh
$IPT -A INPUT -i $IF_INT -p tcp --dport 22 -j ACCEPT

# Разрешаем входящие соединения по виртуальной сети
$IPT -A INPUT -i $IF_VPN -j ACCEPT
...

...
# OUTPUT chain
# #########################################

# В принципе, нет смысла ставить здесь ограничения.
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

С этими конфигами клиент VPN может работать с компьютерами локальной сети. Если у вас есть свои соображения по поводу настроек iptables и маршрутизации — буду очень признателен. Да и читатели также. Ведь если вы читаете эту статью, вы наверняка знаете, что на эту тему сломано немало копий.

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

Чтобы отозвать сертификат какого-либо клиента (например, при утере планшета с настроенным OpenVPN), т.е. сделать так, чтобы клиент больше не смог подключиться к серверу, используя свой сертификат, надо сделать несколько простых действий.

# cd /etc/openvpn/easy-rsa/2.0/
# . /etc/openvpn/easy-rsa/2.0/vars
# ./revoke-full client25


error 23 at 0 depth lookup:certificate revoked

После успешного выполнения последней команды (вы должны увидеть последнюю строчку) в директории /etc/openvpn/easy-rsa/2.0/keys будет создан файл файл crl.pem (CRL — certificate revocation list — список отозванных сертификатов). Скопируйте его в директорию, где у вас находятся остальные файлы, имеющие отношение к работающему серверу OpenVPN. По идее, это директория /etc/openvpn. На всякий случай, проверьте существование в этой директории старого файла crl.pem (есть хорошая практика — сначала сделать резервную копию). Учтите, что в команде подразумеваются относительные пути, а не абсолютные:

# cp keys/crl.pem /etc/openvpn/

А теперь укажем нашему серверу проверять список отозванных сертификатов каждый раз при подключении нового клиента. Для этого надо добавить в конфиг сервера (возможно, /etc/openvpn/server.conf) одну строчку:

crl-verify crl.pem

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

# service openvpn restart

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

Авторизуйтесь для добавления комментариев!

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

Инструкция описывает процесс установки и настройки серверной и клиентской частей OpenVPN. Решение предназначено для подключения удаленных клиентов к сети предприятия. После подключения у клиента сохраняется собственный шлюз по-молчанию и не блокируется выход в интернет. Решение показало простоту в настройке клиентской части, было опробовано (и используется в настоящее время) на Windows-XP, Windows-7, Andriod 3.x, Archlinux, Ububnu. Есть информация об успешном подключении и iPad.

Установка OpenVPN сервера (FreeBSD).

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

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

Или:

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

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

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

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

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

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

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

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

 # sh

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

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

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

 # ./build-key-server vpn0.example.com

‘Common name’ должно соответствовать DNS имени вашего VPN-сервера, например: ‘vpn0.example.com’. На последние вопросы отвечаем ‘Y’.

 # ./build-dh

Теперь делаем сертификат для клиента с именем ‘client’. Тут также на последние вопросы отвечаем ‘Y’

 # ./build-key client

Выходим из sh оболочки:

 # exit

Cоздаем ключ для tls-аутификации:

 # /usr/local/sbin/openvpn --genkey --secret /usr/local/etc/openvpn/easy-rsa/keys/ta.key

Создаем файл server.conf (ниже под спойлером). Не забудьте в нем указать адрес внутреннего DNS-сервера, которых знает имена ваших локальных хостов./usr/local/etc/openvpn/server.conf

 # cat /usr/local/etc/openvpn/server.conf
 local vpn0.example.com
 port 1194
 proto udp
 dev tun
 ca /usr/local/etc/openvpn/easy-rsa/keys/ca.crt
 cert /usr/local/etc/openvpn/easy-rsa/keys/vpn0.example.com.crt
 key /usr/local/etc/openvpn/easy-rsa/keys/vpn0.example.com.key
 dh /usr/local/etc/openvpn/easy-rsa/keys/dh2024.pem
 tls-server
 tls-auth /usr/local/etc/openvpn/easy-rsa/keys/ta.key 0
 server 172.17.0.0 255.255.255.0
 ifconfig-pool-persist ipp.txt
 client-config-dir ccd
 push "route 10.10.210.72 255.255.255.248"
 push "route 172.27.102.0 255.255.255.0"
 push "route 172.27.103.0 255.255.255.0"
 push "route 172.27.105.0 255.255.255.0"
 push "dhcp-option DNS 192.168.100.1"
 keepalive 10 120
 comp-lzo
 user nobody
 group nobody
 persist-key
 persist-tun
 status openvpn-status.log
 verb 3

Для каждого клиента надо будет создавать на сервере файл-конфиг пользователя, где указывается назначаемый клиенту IP адрес и шлюз. Например, для клиента с именем ‘client’:

 # cat /usr/local/etc/openvpn/ccd/client
 ifconfig-push 172.17.0.2 172.17.0.1

Для запуска даймона OpenVPN при загрузке операционной системы добавим в ‘/etc/rc.conf’ строки:

 openvpn_enable="YES"
 openvpn_if="tun"
 openvpn_configfile="/usr/local/etc/openvpn/server.conf"
 openvpn_dir="/usr/local/etc/openvpn"

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

 # /usr/local/etc/rc.d/openvpn start
 Starting openvpn.
 add net 172.17.0.0: gateway 172.17.0.2

Если стоит задача предоставлять пользователям через OpenVPN Интернет, то потребуется наличие NAT. Можно включить его поддержку через загружаемые модули, для этого в файл ‘/boot/loader.conf’ надо добавить строки:

ipfw_nat_load="YES"
libalias_load="YES"

Пример настройки NAT IPFW:

${ipfw} nat 1 config if re0 reset same_ports
${ipfw} add nat 1 ip from 172.17.0.0/24 to any via $INT_if
${ipfw} add nat 1 ip from any to $EXT_ip
${ipfw} add allow all from any to any

Все, сервер OpenVPN установлен, настроен и запущен. Теперь можно заняться клиентами.

Создание клиентского сертификата OpenVPN

Описание приведено для сервера на операционной системе FreeBSD с установленным и настроеным, как описано выше, сервисом OpenVPN.

Сертификат генерируется из системной консоли сервера с правами суперпользователя из каталога easy-rsa:

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

 $ cd /usr/local/etc/openvpn/easy-rsa/
 $ sudo /bin/sh
 # . ./vars
 NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/local/etc/openvpn/easy-rsa/keys
 # ./build-key ЛОГИН_ПОЛЬЗОВАТЕЛЯ
 Generating a 1024 bit RSA private key
 ......++++++
 ....++++++
 writing new private key to 'ЛОГИН_ПОЛЬЗОВАТЕЛЯ.key'
 -----
 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.
 -----
 Country Name (2 letter source) [US]:RU
 State or Province Name (full name) [CA]:ZC
 Locality Name (eg, city) [SanFrancisco]:Zabubensk
 Organization Name (eg, company) [Fort-Funston]:JSC Zabuba
 Organizational Unit Name (eg, section) [changeme]:ITD
 Common Name (eg, your name or your server's hostname) [ЛОГИН_ПОЛЬЗОВАТЕЛЯ]:
 !----------------------------------------------------------------------!
 ! ВНИМАНИЕ ! использовать только латинские буквы. Кирилица не работает !
 !----------------------------------------------------------------------!
 Name [changeme]:ИМЯ ФАМИЛИЯ
 Email Address [[email protected]]:ЛОГИН_ПОЛЬЗОВАТЕЛЯ@zabubensk.example.com

 Please enter the following 'extra' attributes
 to be sent with your certificate request
 A challenge password []:
 An optional company name []:
 Using configuration from /usr/local/etc/openvpn/easy-rsa/openssl-0.9.8.cnf
 Check that the request matches the signature
 Signature ok
 The Subject's Distinguished Name is as follows
 countryName           :PRINTABLE:'RU'
 stateOrProvinceName   :PRINTABLE:'ZC'
 localityName          :PRINTABLE:'Zabubensk'
 organizationName      :PRINTABLE:'JSC Zabuba'
 organizationalUnitName:PRINTABLE:'ITD'
 commonName            :PRINTABLE:'ЛОГИН_ПОЛЬЗОВАТЕЛЯ'
 name                  :PRINTABLE:'ИМЯ ФАМИЛИЯ'
 emailAddress          :IA5STRING:'ЛОГИН_ПОЛЬЗОВАТЕЛЯ@zabubensk.example.com'
 Certificate is to be certified until Nov 12 06:24:49 2023 GMT (3650 days)
 Sign the certificate? [y/n]:y

 1 out of 1 certificate requests certified, commit? [y/n]y
 Write out database with 1 new entries
 Data Base Updated
 #
 # exit

В результате будут сгенерированы клиентские файлы сертификатов для подключения. Далее, необходимо создать файл `/usr/local/etc/openvpn/ccd/ЛОГИН_ПОЛЬЗОВАТЕЛЯ` с одной строкой вида:

 $ sudo ee /usr/local/etc/openvpn/ccd/ЛОГИН_ПОЛЬЗОВАТЕЛЯ
 ifconfig-push 172.17.0.118 172.17.0.117

Каждая пара адресов в ifconfig-push соответствует виртуальным IP-адресам конечных точек (клиента и сервера) — каждому клиенту в момент подключения назначается своя подсеть. Сюда-же можно добавить дополнительные маршруты, если клиенты подключаются к разным подсетям (филиалы, технические специалисты)

 $ sudo ee /usr/local/etc/openvpn/ccd/ЛОГИН_ПОЛЬЗОВАТЕЛЯ
ifconfig-push 172.17.0.118 172.17.0.117
push "route 10.12.1.0 255.255.255.0"
push "route 10.12.2.0 255.255.255.0"
push "route 192.168.10.0 255.255.255.0"

Чтобы сохранить совместимость с Windows-клиентами и драйвером TAP-Win32 эти адреса должны быть взяты из следующих друг за другом подсетей с маской /30. Например, для диапазона `172.17.0.1-172.17.0.254` последний октет IP-адреса каждой пары клиент-сервер следует назначать из набора:

  [  1,  2] [  5,  6] [  9, 10] [ 13, 14] [ 17, 18]
  [ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
  [ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
  [ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
  [ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
  [101,102] [105,106] [109,110] [113,114] [117,118]
  [121,122] [125,126] [129,130] [133,134] [137,138]
  [141,142] [145,146] [149,150] [153,154] [157,158]
  [161,162] [165,166] [169,170] [173,174] [177,178]
  [181,182] [185,186] [189,190] [193,194] [197,198]
  [201,202] [205,206] [209,210] [213,214] [217,218]
  [221,222] [225,226] [229,230] [233,234] [237,238]
  [241,242] [245,246] [249,250] [253,254]

Для удобства работы я создал текстовый файл «/usr/local/etc/openvpn/not_use_ip.txt» в котором перечислены свободные пары адресов, удаляемые по мере раздачи клиентам. Обратите внимание, что в конфигурационном фале первым задается назначаемый клиенту IP адрес (старший), вторым — адрес сервера (на единицу меньше).

После добавления клиента желательно перезапустить сервис OpenVPN:

 $ sudo /usr/local/etc/rc.d/openvpn restart
 Stopping openvpn.
 Waiting for PIDS: 62293.
 Starting openvpn.
 add net 172.17.0.0: gateway 172.17.0.2

Клиенту необходимо передать пять файлов (ca.crt, vpn0.crt, vpn0.key, ta.key, vpn0.example.com.ovpn):

  • /usr/local/share/doc/openvpn/easy-rsa/keys/ca.crt
  • /usr/local/share/doc/openvpn/easy-rsa/keys/ЛОГИН_ПОЛЬЗОВАТЕЛЯ.crt → vpn0.crt
  • /usr/local/share/doc/openvpn/easy-rsa/keys/ЛОГИН_ПОЛЬЗОВАТЕЛЯ.key → vpn0.key
  • /usr/local/etc/openvpn/easy-rsa/keys/ta.key
  • /usr/local/etc/openvpn/vpn0.example.com.ovpn

Перечисленные файлы копируются в отдельную (временную) папку с именем «config», файлы вида «ЛОГИН_ПОЛЬЗОВАТЕЛЯ.*» в ней переименовываются в «vpn0.*», папка упаковывается в архив и высылается пользователю электронной почтой со ссылкой на инструкцию по настройке клиентского подключения OpenVPN (см. ниже).

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

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

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

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

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

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

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

После подключения Вам станут доступны все сервисы (RDP, FTP, HTTP …) как по IP адресу так и по доменному имени в разрешенном системным администратором сегменте локальной сети, за исключением возможности подключения сетевых дисков, заблокированной по соображениям безопасности.

Документация и дистрибутив:

создание сервера на Windows / Хабр

Openvpn — виртуальная частная сеть. С ее помощью мы можем:

  • Создать защищенный канал свзяи, в то время, когда мы сидим с бесплатного Wi-Fi в кафе.
  • Обмениваться файлами между участниками сети.
  • Раздавать интернет испульзуя общий шлюз.

Основные преимущества:

  • Простота настройки.
  • Безопасность.
  • Не требует дополнительного оборудования.
  • Высокая скорость и стабильность.

Как и автор статьи об установке OpenVPN на Linux, я не нашел нормальной статьи, да еще и такой, чтоб описывалось все до мелочей. В этой статье на Хабрахабре я постараюсь максимально доступно все объяснить. Итак, поехали!

Скачиваем дистрибутив.

На момент написания статьи доступная версия 2.3.2. Качаем отсюда Windows installer 32-х или 64-х битную версию под разрядность вашей операционной системы.

Установка.

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

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

Когда-то этот пункт меня останавливал, мол ну их эти ключи, пойду поищу что попроще. Но, увы, ничего лучшего не нашел. Итак, переходим в C:\Program files\OpenVPN\easy-rsa, запускаем init-config.bat, появится vars.bat, открываем его в блокноте. Нас интересуют строчки в самом низу, их нужно заполнить как угодно. Например:
set KEY_COUNTRY=RU
set KEY_PROVINCE=Baldur
set KEY_CITY=Piter
set KEY_ORG=OpenVPN
set [email protected]
set KEY_CN=server
set KEY_NAME=server
set KEY_OU=ouou

Там где написано server не трогаем. Сохранили.

Теперь открываем openssl-1.0.0.cnf и ищем строчку default_days 365, ставим 3650. Это продлит жизнь наших сертификатов на 10 лет. Сохраняем. Далее открываем командную строку в пуск-стандартные-командная строка (на Windows Vista/7/8 от имени администратора), пишем последовательно:

cd C:\OpenVPN\easy-rsa

vars

clean-all

В ответ должно написать два раза «Скопировано файлов: 1». Значит, все окей. В этом же окне набираем:
build-dh

Создаст ключ Диффи-Хельмана.
build-ca

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

Будут заданы вопросы, просто нажимаем Enter пока не увидите путь C:\Program files\OpenVPN\easy-rsa. Далее набираем:
build-key-server server

На вопросы также жмем Enter, только не торопитесь! В конце будут два вопроса: «Sign the certificate?» и «1 out of 1 certificate requests certified, commit?», на оба вопроса отвечаем Y. Теперь создадим сертификат клиента:
build-key client

Тут нужно быть вниметельней, при вопросе Common Name (eg, your name or your server’s hostname) нужно ввести client. В конце также два раза Y. Для каждого клиента нужно создавать новый сертификат, только с другим именем, например, build-key client1 и также указывать его в common name. Если все сделали правильно, можете выдохнуть! Самое сложное позади. В папке C:\Program Files\OpenVPN\easy-rsa\keys забираем: ca.crt, dh2024.pem, server.crt, server.key и кладем их в C:\Program Files\OpenVPN\config.

Создаем конфиги.

Переходим в C:\Program Files\OpenVPN\config, создаем текстовой документ, вставляем:
# Поднимаем L3-туннель

dev tun

# Протокол

proto udp

# Порт который слушает впн

port 12345

# Ключи и сертификаты

ca ca.crt

cert server.crt

key server.key

dh dh2024.pem

# Грубо говоря экономим адреса

topology subnet

# Пул адресов

server 10.8.0.0 255.255.255.0

# Метод шифрования

cipher AES-128-CBC

# Сжатие

comp-lzo

# Немного улучшит пинг

mssfix

# Время жизни клиентов, если не откликнулся — отключает

keepalive 10 120

# Уровень отладки

verb 3

Сохраняем файл как server.ovpn. Это наш конфиг сервера. Теперь пробуем запустить сервер. На рабочем столе будет ярлык OpenVPN Gui. После запуска в трее появится красный значок. Кликаем по нему дважды, если загорелся зеленым, значит, все хорошо, если нет, тогда смотрим лог в папке log.

Теперь конфиг клиента:
client

dev tun

proto udp

# Адрес и порт сервера

remote адрес 12345

# Ключи должны лежать в папке с конфигом

ca ca.crt

cert client.crt

key client.key

cipher AES-128-CBC

nobind

comp-lzo

persist-key

persist-tun

verb 3


Сохраняем как client.ovpn. Создаем любую папку и кладем туда конфиг client.ovpn и сертификаты ca.crt, client.crt, client.key которые лежат в C:\Program files\OpenVPN\easy-rsa. Сам клиент для Windows качаем здесь. На клиентской машине устанавливаем, переносим папку с конфигом и сертификатом и запускаем client.ovpn. Если подключились, пробуем в командной строке набрать ping 10.8.0.1. Пакеты пошли? Поздравляю! Сервер готов! Теперь идем в панель управления-администрирование-службы, ищем там OpenVPN, дважды щелкаем и выставляем автоматически. Теперь сервер будет сам стартовать после перезагрузки.

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

Теперь я расскажу как раздавать интернет и другие мелочи связанные с настройкой. Начнем с мелочей. Все манипуляции будем проводить с конфигом сервера.
Если хотите, чтобы клиенты «видели» друг друга т.е. могли обмениваться информацией, тогда в конфиг впишите
client-to-client.
Если нужно, чтобы клиентам выдавались статические адреса, тогда в папке config создайте файл ip.txt и впишите в конфиг
ifconfig-pool-persist ip.txt
Неохота создавать каждому сертификаты? Тогда пишем duplicate-cn, но учтите, с этой опцией не работает ifconfig-pool-persist.
Теперь о конфиге клиента. Можно не передавать файлы сертификатов, а вписать сразу в конфиг, только делать это лучше не с блокнота, а с AkelPad’а или Notepad++ например. Открываем ca.crt и выделяем от ——BEGIN CERTIFICATE—— до ——END CERTIFICATE——. В конфиге будет выглядеть так:



-----BEGIN CERTIFICATE-----

сертификат

-----END CERTIFICATE-----



-----BEGIN CERTIFICATE-----

сертификат

-----END CERTIFICATE-----



-----BEGIN PRIVATE KEY-----

ключ

-----END PRIVATE KEY-----

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

Для этого в конфиг сервера вписываем:
push «redirect-gateway def1»

push «dhcp-option DNS 8.8.8.8»

push «dhcp-option DNS 8.8.4.4»

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

Развертывание VPN сети на основе OpenVPN от А до Я / Песочница / Хабр

Введение

В этой статье рассматривается развертывание сети на базе OpenVPN.
Это пошаговое руководство для получения работоспособной сети и базируется на моем опыте развертывания OpenVPN.
Я решил статью поскольку, существующие в сети руководства имеют пробелы, затрудняющие быстрый запуск OpenVPN.

Задача

Наверно нет смысла рассказывать для чего используются VPN. Я приведу реальную задачу и расскажу как ее достичь.
Основная задача — это безопасное и простое решение доступа к внутренним ресурсам моих серверов.
Первый сервер является «домашним» серверов, подключенный к широкополосному соединению в городе под управлением CentOS 5.5, выполняющий различные функции, в том числе шлюза для квартирной сети. Назовем его CITY. Квартирная сеть использует адреса 192.168.22.0/24 и 192.168.21.0/24.
Второй сервер установлен на дальнем объекте, например, за городом на даче. Сервер работает под управлением CentOS 5.5 и выполняет функции шлюза для дачной сети и тоже выполняет другие задачи. Доступ в сеть осуществляется с помощью недорогого доступа по технологии 3G — в сервер воткнут USB 3g-модем и настроено устойчивое соединение. Назовем его CAMP. Дачная сеть использует адреса 192.168.23.0/24 и адреса 192.168.24.0/24.
А еще у меня есть ноутбук под управлением Windows XP, который вместе с владельцем попадает в разные сети, в том числе из дома, с работы и прочих гостевых мест, где есть доступ в Интернет. Назовем его NOTEBOOK.
Я хочу иметь доступ с ноутбука на мой домашний сервер CITY, в том числе к файлопомойке по NetBIOS и пр. А еще я хочу иметь доступ на сервер CAMP.
В случае CITY некоторые проблемы доступа можно решить публичным IP адресом. Но для CAMP публичный IP адрес у мобильных операторов практически недоступен или стоит неоправданно дорого для частного использования. А обычные клиенты работают через NAT. На ноутбуке проблемы сходные — как правило, везде NAT, бывают публичные открытые сети, где весь трафик виден всем пользователям.
Решением этих проблем является использование OpenVPN для связи всех компьютеров в единую сеть, заодно, защищенную от посторонних глаз.

Эскиз сети

CITY всегда включен и имеет внешний IP адрес, допустим 22.33.44.55, находится на широком и устойчивом канале, поэтому он будет сервером VPN.
А CAMP и NOTEBOOK клиентами VPN.
Сеть с адресами 192.168.25.0/24 выделяем под VPN.
Мы разрешим роутинг, чтобы видить все нужные сети.

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

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

yum install openvpn

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

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

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

vi vars

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

source ./vars

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

./clean-all

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

./build-ca

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

./build-key-server server

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

./build-dh

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

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

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

vi /etc/openvpn/openvpn.conf

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

port     1194
proto    udp
dev      tun
ca       /usr/share/openvpn/easy-rsa/2.0/keys/ca.crt
cert     /usr/share/openvpn/easy-rsa/2.0/keys/server.crt
key      /usr/share/openvpn/easy-rsa/2.0/keys/server.key
dh       /usr/share/openvpn/easy-rsa/2.0/keys/dh2024.pem
tls-auth /usr/share/openvpn/easy-rsa/2.0/keys/ta.key 0
push     "route-method exe"
push     "route-delay 2"
user     nobody
group    nobody
comp-lzo
persist-key
persist-tun
client-config-dir 	/etc/openvpn/ccd/
log-append  		/var/log/openvpn.log
verb 5
server   192.168.25.0 255.255.255.0
client-to-client

В этом варианте я использую файлы ключей и сертификатов по тем путям, где они реально находятся.
На время отладки оставляем уровень детализации журналов verb 5, затем его можно переключить на verb 1. Это надо сделать обязательно. Максимальный размер журнала — 2 Гб. При достижении этого лимита OpenVPN прекратит работу. Поэтому нужно уменьшить детализацию журналирования и настроить ротацию журнала средствами ОС — logrotate.
log-append перенастроен на нормальное место для записи логов сервера.
client-to-client разрешает трафик между клиентами.
Параметр client-config-dir указывает, где хранятся настройки подключения для каждого клиента. Создаем каталог /etc/openvpn/ccd

mkdir /etc/openvpn/ccd

В принципе сервер настроен, можно его перезапустить:

service openvpn restart

Не забудьте прописать автоматический запуск сервиса при перезагрузке системы.

А еще надо настроить firewall для разрешения трафика OpenVPN. Я использую исторически скрипт /etc/rc.d/rc.firewall, который настраивает все цепочки, так как мне надо. Поэтому команды мои выглядят примерно так:

iptables -A INPUT  -p udp --dport 1194 -j ACCEPT
iptables -A OUTPUT -p udp --sport 1194 -j ACCEPT

для идеологически правильного /etc/sysconfig/iptables строчка будут выглядить примерно так:

-A RH-Firewall-1-INPUT -p udp --dport 1194 -j ACCEPT

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

1194:udp

Для разрешения трафика между клиентами я использую команду:

iptables -A FORWARD     -s 192.168.25.0/24 -d 192.168.25.0/24 -j ACCEPT

а для разрешения трафика между подсетями:

iptables -A FORWARD     -s 192.168.25.0/24 -d 192.168.21.0/24 -j ACCEPT
iptables -A FORWARD     -s 192.168.25.0/24 -d 192.168.22.0/24 -j ACCEPT
iptables -A FORWARD     -s 192.168.21.0/24 -d 192.168.25.0/24 -j ACCEPT
iptables -A FORWARD     -s 192.168.22.0/24 -d 192.168.25.0/24 -j ACCEPT

В общем, у нас сервер окончательно настроен. Проверяем.
Наличие процесса:

ps -ef |grep openvpn
nobody    3605     1  0 14:45 ?        00:00:00 /usr/sbin/openvpn --daemon --writepid /var/run/openvpn/openvpn.pid --config openvpn.conf --cd /etc/openvpn --script-security 2

проверяем порты:

netstat -a -n -p |grep 1194
udp        0      0 0.0.0.0:1194     0.0.0.0:*  3605/openvpn

и обязательно должен присутствовать интерфейс tun0, если других VPN не запущено.

ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:192.168.25.1  P-t-P:192.168.25.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Все в порядке.

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

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

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

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

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

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

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

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

source ./vars

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

./build-key-pass notebook

в подкаталоге ./keys появится комплект файлов для авторизации.
А еще для клиента нужно настроить параметры сети, которые находятся в файлах с именем клиента /etc/openvpn/ccd/, в данном случае нужно редактировать файл notebook:

vi /etc/openvpn/ccd/notebook

В этом файле мы указываем адрес и другие сетевые параметры.
Самое главное — назначим адрес для клиента в нашей VPN подсети.
Дла совместимости со стеком TCP/IP Windows адреса клиентам назначаются с интервалом 4, фактически на каждого клиента выделяется подсеть с маской /30: адрес сети, адрес клиента, адрес шлюза, широковещательный адрес.
Вот здесь указан список возможных адресов
http://openvpn.net/index.php/open-source/documentation/howto.html#policy
Первая пара у нас занята адресом самого сервера. Выделяем адреса .5 и .6:

ifconfig-push 192.168.25.5 192.168.25.6

В моем случае, у меня есть свой DNS сервер по адресу 192.168.22.1, он обслуживает локальную DNS зону mynetwork, для настройки я добавлю в файл две строки:

push "dhcp-option DNS 192.168.22.1"

— укажем клиенту какой использовать DNS сервер

push "dhcp-option DOMAIN mynetwork"

— укажем зону по умолчанию для поиска имен DNS.
Поскольку мой сервер CITY имеет две подсети 192.168.22.0/24 и 192.168.21.0/24 и я хочу чтобы клиент мог их видеть, то нужно настроить маршруты, добавляем две строчки:

push "route 192.168.21.0 255.255.255.0"
push "route 192.168.22.0 255.255.255.0"

Теперь тоже самое делаю для клиента CAMP:
заходим в каталог

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

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

source ./vars

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

./build-key camp

Настраиваем параметры сетевого доступа:

vi /etc/openvpn/ccd/camp

пишем:

ifconfig-push 192.168.25.9 192.168.25.10
push "dhcp-option DNS 192.168.22.1"
push "dhcp-option DOMAIN mynetwork"
push "route 192.168.21.0 255.255.255.0"
push "route 192.168.22.0 255.255.255.0"

Итак, настроен сервер, созданы две учетные записи для клиентов camp и notebook.
При подключении camp получит адрес 192.168.25.9, а notebook 192.168.25.5
Теперь дело за настройкой клиентов.

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

Для работы клиентов из каталога
/usr/share/openvpn/easy-rsa/2.0/keys/
забираем следующие файлы:
ca.crt — сертификат сервера
ta.key — tls сертификат
%username%.crt — персональный сертификат
%username%.key — персональный ключ

Настройка клиента под Windows XP на NOTEBOOK

Ставим openvpn вместе с GUI:
http://www.openvpn.net/index.php/open-source/downloads.html
например:
http://swupdate.openvpn.net/community/releases/openvpn-2.2-beta5-install.exe
Надо перегрузить систему, чтобы завершить установку VPN интерфейса.
Копируем клиентские файлы в каталог «C:\Program Files\OpenVPN\config\«
В данном случае, это:
ca.crt

ta.key

notebook.crt

notebook.key

Создаем файл конфигурации клиента notebook.ovpn:

client
dev tun
proto udp
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
float
verb 1
ca              ca.crt
tls-auth        ta.key 1
remote          22.33.44.55 1194
cert            notebook.crt
key             notebook.key

В этом файл выключена запись в файл журнала, в противном случае OpenVPN-GUI не сможет контролировать работу клиента.
Если мы создали сертификат с паролем — нам придется устанавливать соединение всегда руками, т.к. потребуется ввод пароля:
1. Запускаем GUI.
2. В контекстном меню увидим пункт notebook, выбираем connect. Появляется окно журнал работы и запрос пароля на сертификат.
Если используем сертификат без пароля, можно использовать службу OpenVPN:
1. Запускаем services.msc
2. Находим OpenVPN service и ставим автоматический запуск и запускаем службу.
В обоих случаях при успехе — соединение установится, красные цвета иконки OpenVPN-GUI поменяют на зеленые. Будет присвоен адрес 192.168.25.5

Настройка клиента под CentOS на сервере CAMP

Выполняем

yum install openvpn

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

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

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

vi /etc/openvpn/openvpn.conf

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

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

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

echo OPENVPN client
iptables -A INPUT  -s 22.33.44.55 -p udp --sport 1194 -j ACCEPT
iptables -A OUTPUT -d 22.33.44.55 -p udp --dport 1194 -j ACCEPT

В принципе, клиент настроен, можно его перезапустить:

service openvpn restart

Не забываем обеспечить автостарт сервиса при перезагрузке.
Если все в порядке — появится интерфейс tun0, ему будет присвоен адрес 192.168.25.9

Наша VPN сеть запущена. Командой ping и доступом к известным сервисам проверяем работоспособность сети.

Диагностика и устранение неполадок

Основные средства проверки работы — это ping и tcpdump. Большинство ошибок выявляются этими командами.
Например, командой

tcpdump -i eth0 -l src port 1194 or dst port 1194

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

Судя по ошибкам — Адаптер VPN не работает под Windows.

Если установлен OpenVPN для Windows, но систему еще не перегружали — Перегрузите систему после установки OpenVPN.

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

Если включено ведение журнала в файл, то OpenVPN-GUI может иметь проблемы при поднятии соединения, особенно на этапе запроса пароля. Помогает выключение ведения журнала и высокой детализации, нужно открыть *.ovpn файл и закомментировать две строчки (они в конце) вот так:

#log openvpn.log
#verb 5

Нет соединения.

Со стороны клиента нужно сделать пинг на адрес сервера — ping 22.33.44.55. Если не отвечает — устранить причину.
Под Windows убедиться, что openvpn.exe, openvpn-gui.exe и openvpnserv.exe не заблокирован персональным фаерволом или антивирусом.
Просмотреть ошибки в консоли и логе openvpn.log и погуглить их

Соединение не устанавливается — пакет пришел не «с того адреса».

Сопровождается ошибками:
Incoming packet rejected from …, expected peer address…
Такое возможно если клиент находится «рядом» с сервером — пакеты посылаются на один адрес (внешний), а ответы приходят со внутреннего адреса. По умолчанию OpenVPN считает такую конфигурацию небезопасной и блокирует работу. Опция float устраняет проблему.

Соединение есть, но туннель не работает.

1. Убедиться, что персональный firewall не блокирует трафик для подсети 192.168.25.*
2. Что присутствуют маршруты во внутренние подсети — команда в Windows: route print.
3. В случае Vista/W7 не забыть запускать клиента с правами Администратора, иначе не поднимаются маршруты!
В остальных случаях помогает увеличение детализации вывода опцией verb и внимательное штудирование openvpn.log

Послесловие

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

Подробная инструкция по OpenVPN v2.3.8 на Windows server 2008R2 / Хабр

Представляю подробную инструкцию по OpenVPN v2.3.8 на Windows server 2008R2 c уровнем шифрования TLS. Так же будут подробно описаны все параметры.

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

Для начала качаем дистрибутив с официально сайта. Запускаем установщик openvpn-install-2.3.8-I001-x86_64. В компонентах включаем следующее:


Указываем путь установки (Все дальнейшие действия будут ориентироваться на данный путь указанный в примере):

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

После успешной установки переходим в каталог “C:\Programm Files\OpenVPN” где создаем директорию “SSL” (каталог может называться как угодно, в последующих настройках будет использоваться именно этот каталог), в данном каталоге будут располагаться сертификаты сервера, алгоритмы шифрования и проверка подлинности клиента.

Переходим в каталог “C:\Programm Files\OpenVPN\easy-rsa”, открываем с помощью notepad или notepad++ (более правильный вариант) «vars.bat» (скрипт, содержащий в себе параметры ответов для создания и генерации клиентских/серверных сертификатов и последующих настроек сервера).

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

set KEY_COUNTRY=RU

set KEY_PROVINCE=MO

set KEY_CITY=MOSCOW

set KEY_ORG=OpenVPN

set [email protected]

set KEY_CN=server

set KEY_NAME=server

set KEY_OU=OU

set PKCS11_MODULE_PATH=changeme rem Параметр по умолчанию

set PKCS11_PIN=1234 rem Параметр по умолчанию

Сохраняем.

В этом же каталоге “C:\Programm Files\OpenVPN\easy-rsa”, есть конфигурационный файл “openssl-1.0.0.cnf”, открываем его с помощью notepad или notepad++ (более правильный вариант) и изменяем настройку, отвечающую за срок жизни сертификатов, по умолчанию 365 дней, продлим срок жизни до 3650 дней.

default_days = 3650 # how long to certify for

Сохраняем.

Далее будем генерировать следующее:

ca.crt — Собственный доверенный сертификат (Certificate Authority — далее CA) для подписи клиентских сертификатов и для их проверки при авторизации клиента.
dh2024.pem — ключ Диффи Хельмана позволяющий двум и более сторонам получить общий секретный ключ
server.crt — сертификат сервера
server.key — ключ сервера
ta.key — дополнительный ключ для tls-аутентификации (повышение безопасности соединения), сервер и каждый клиент должны иметь копию этого ключа

Открываем командную строку и переходим в каталог “C:\Program Files\OpenVPN\easy-rsa”

cd C:\Program Files\OpenVPN\easy-rsa

Вводим команду “vars” нажимаем Enter (инициируем работу со скриптами, в случае закрытия командной строки, команду “vars” придется вводить заного)

Вводим команду “clean-all” (Очищаем каталог “C:\Program Files\OpenVPN\easy-rsa\keys” c последующим созданием файла“index.txt” (база клиентов, она же database) и “serial” (ключ))

Не закрывая командную строку, проверяем содержимое каталога “ C:\Program Files\OpenVPN\easy-rsa\keys”, должны создаться файлы “index.txt и serial”.

Вводим команду “openvpn —genkey —secret %KEY_DIR%\ta.key

Не закрывая командную строку, проверяем содержимое каталога “ C:\Program Files\OpenVPN\easy-rsa\keys”, должен создаться файл “ta.key”.

Вводим команду “build-dh” — генерация ключа Диффи Хельмана.

Не закрывая командную строку, проверяем содержимое каталога “ C:\Program Files\OpenVPN\easy-rsa\keys”, должен создаться файл “dh2024.pem”.

Вводим команду “build-ca” — генерация ключа центра сертификации (CA)

На все вопросы отвечаем по умолчанию нажатием клавиши Enter, эти параметры мы прописали в “vars.bat

Не закрывая командную строку, проверяем содержимое каталога “ C:\Program Files\OpenVPN\easy-rsa\keys”, должны создаться файлы “ca.crt и ca.key”.

Вводим команду “build-key-server server” — генерация сертификата сервера.

На вопросы Country Name, State Name, Locality Name и т.д. отвечаем по умолчанию нажатием клавиши Enter до самого конца, эти параметры мы прописали в “vars.bat”, далее будет предложено создание сертификата сроком на 3650 дней (данный параметр мы указывали в openssl-1.0.0.cnf) нажимаем “Y”, будет предложено записать сертификат сервера в базу, нажимаем “Y”.

Не закрывая командную строку, проверяем содержимое каталога “ C:\Program Files\OpenVPN\easy-rsa\keys”, должены создаться файлы “server.crt, server.key, server.csr”.

Вводим команду “build-key revokecrt” — команда для создания пользовательского сертификата, но в данном случае мы создаем произвольный сертификат “revokecrt” для последующей генерации файла “crl.pem”, который отвечает за проверку и последующий отзыв сертификатов. Теоретически данную процедуру можно проделать в самом конце и даже жить без нее, но тогда не сможем отзывать сертификаты и конфигурационный файл “server.ovpn” будет выглядеть иначе.

На вопросы Country Name, State Name, Locality Name и т.д. отвечаем по умолчанию нажатием клавиши Enter до вопросов Common Name и Name, на эти вопросы нужно отвечать согласно названию создаваемого сертификата пользователя, в нашем случае это произвольный сертификат “revokecrt” на оставшиеся вопросы нажимаем Enter, далее будет предложено создание сертификата сроком на 3650 дней (данный параметр мы указывали в openssl-1.0.0.cnf) нажимаем “Y”, будет предложено записать сертификат сервера в базу, нажимаем “Y”.

Не закрывая командную строку, проверяем содержимое каталога “ C:\Program Files\OpenVPN\easy-rsa\keys”, должны создаться файлы “revokecrt.crt, revokecrt.key, revokecrt.csr

Вводим команду “revoke-full revokecrt” – команда отвечает за отзыв сертификата и последующего создания файла “crl.pem

Не закрывая командную строку, проверяем содержимое каталога “ C:\Program Files\OpenVPN\easy-rsa\keys”, должен создаться файл “crl.pem

Теперь создадим сертификат пользователя, аналогично сертификату “revokecrt” см. выше.

Вводим команду “build-key user1” – создаем сертификат пользователя с именем user1

.

На данном этапе работа с консолью закончена, можно закрыть окно и проверить содержимое каталога “ C:\Program Files\OpenVPN\easy-rsa\keys”, должны создаться файлы “user1.crt, user1.key, user1.csr

Рекомендую создать папку “Clients” в любом удобном для Вас месте и скопировать туда необходимые файлы для передачи пользователям:

1 — ca.crt
2 — user1.crt

3 — user1.key

4 — ta.key

Также хочу обратить Ваше внимание на то, что содержимое папки “keys” удалять нельзя, при создании пользовательских сертификатов или любых изменениях в консоли, делайте копию данного каталога во избежание потерь или случайных генераций сертификатов сервера и обновления базы данных.

Копируем файлы сервера в раннее созданную папку “ssl” в каталоге “ C:\Program Files\OpenVPN\ssl”:

1 — ca.crt

2 — server.crt

3 — server.key

4 — dh2024.pem

5 — ta.key

Переходим в каталог “C:\Program Files\OpenVPN\config” и создадим файл конфигурации сервера “server.ovpn” со следующим содержимым:

# Создаем маршрутизируемый IP туннель.

dev tun

# Указываем протокол для подключения.

proto udp

# Указываем порт на котором будем слушать.

port 1194

# Указываем что это TLS сервер.

tls-server

# Указываем путь к доверенному сертификату.

ca «C:\\Program Files\\OpenVPN\\ssl\\ca.crt»

# Указываем путь к сертификату сервера.

cert «C:\\Program Files\\OpenVPN\\ssl\\Server.crt»

# Указываем путь к ключу сервера.

key «C:\\Program Files\\OpenVPN\\ssl\\Server.key»

# Указываем путь к ключю Диффи Хельмана

dh «C:\\Program Files\\OpenVPN\\ssl\\dh2024.pem»

# Указываем адресацию сети.

server 10.8.0.0 255.255.255.0

# Указываем алгоритм шифрования должен быть одинаковый клиент/сервер.

cipher AES-128-CBC

# Указываем не перечитавать файлы ключей при перезапуске туннеля.

persist-key

# Указываем путь к ключу безопасности и устанавливаем параметр сервера 0

tls-auth «C:\\Program Files\\OpenVPN\\ssl\\ta.key» 0

# Разрешаем общаться клиентам внутри тоннеля.

client-to-client

# Указываем каталог с описаниями конфигураций каждого из клиентов.

client-config-dir «C:\\Program Files\\OpenVPN\\ccd»

# Указываем файл с описанием сетей между клиентом и сервером.

ifconfig-pool-persist «C:\\Program Files\\OpenVPN\\ccd\\ipp.txt»

# Указывает сверку по отозванным сертификатам.

crl-verify «C:\\Program Files\\OpenVPN\\easy-rsa\\keys\\crl.pem»

# Указываем путь к логу со статусом.

status «C:\\Program Files\\OpenVPN\\log\\logopenvpn-status.log»

# Указываем путь к логу.

log «C:\\Program Files\\OpenVPN\\log\\openvpn.log»

# Указывает MTU для туннеля, должны быть одинаковые параметры клиент/сервер.

tun-mtu 1500

# Включаем сжатие.

comp-lzo

# Устранение проблем с передачей MTU.

mssfix

# Указывает отсылать ping на удаленный конец тунеля после указанных n-секунд,

# если по туннелю не передавался никакой трафик.

# Указывает, если в течении 120 секунд не было получено ни одного пакета,

# то туннель будет перезапущен.

keepalive 10 120

# Указываем уровень логирования.

verb 3

Сохраняем.

На сервере где будет крутиться OpenVPN необходимо проделать следующее:

1 – Если вы используете встроенный Брандмауэр Windows, создайте разрешающее правило для входящих и исходящих подключений по протоколу UDP на порт 1194.

2 – В службах сервера найдите OpenVPN Service и установите запуск на автоматический, это позволит автоматически запускаться сервису при перезагрузке сервера.

C рабочего стола сервера запускаем “OpenVPN GUI”, в трее дважды щелкаем по значку “OpenVPN GUI” откроется окно лога, если после запуска сервиса в пункте 2 нечего не произошло, нажимаем слева внизу подключиться и если все хорошо, мы должны увидеть следующее содержимое:

Сервис VPN на сервере запущен и готов принимать клиентов.

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

Запускаем ранее скаченный установщик openvpn-install-2.3.8-I001-x86_64, выбор компонентов оставляем по умолчанию, путь сохраняется прежний.

После успешной установки переходим в каталог “C:\Program Files\OpenVPN\config” и создаем файл конфигурации клиента “test.ovpn” со следующим содержимым:

# Создаем маршрутизируемый IP туннель.

dev tun

# Указываем протокол для подключения.

proto udp

# Указываем IP аддрес сервера с портом.

remote X.X.X.X 1194

# Указываем задержку в секундах для построения маршрута.

route-delay 3

# Указываем чтобы клиент забирал информацию о маршрутизации с сервера.

client

# Указываем что мы являемся TLS клиентом.

tls-client

# Параметр защиты от MitM атак.

ns-cert-type server

# Указываем путь к доверенному сертификату.

ca «C:\\Program Files\\OpenVPN\\ssl\\ca.crt»

# Указываем путь к клиентскому сертификату.

cert «C:\\Program Files\\OpenVPN\\ssl\\user1.crt»

# Указываем путь к клиентскому ключу.

key «C:\\Program Files\\OpenVPN\\ssl\\user1.key»

# Указываем путь к ключу безопасности и устанавливаем параметр клиента 1

tls-auth «C:\\Program Files\\OpenVPN\\ssl\\ta.key» 1

# Указываем алгоритм шифрования должен быть одинаковый клиент/сервер.

cipher AES-128-CBC

# Включаем сжатие.

comp-lzo

# Устранение проблем с передачей MTU.

mssfix

# Указывает MTU для туннеля, должны быть одинаковые параметры клиент/сервер.

tun-mtu 1500

# Указываем, сли в течении 60 секунд не было получено ни одного пакета,

# то туннель будет перезапущен.

ping-restart 60

# Указывает отсылать ping на удаленный конец тунеля после указанных n-секунд,

# если по туннелю не передавался никакой трафик.

ping 10

# Указываем уровень логирования.

verb 3

Сохраняем.

C рабочего стола запускаем “OpenVPN GUI”, в трее дважды щелкаем по значку “OpenVPN”, откроется окно лога, нажимаем подключиться и если все хорошо, то мы увидим следующее:

Запускаем пинг на 10.8.0.1 и видим что сеть доступна (10.8.0.1 адрес, который получил виртуальный сетевой адаптер на сервере).

На сервере мы увидим лог подключения:

Собственно на этом этапе можно закончить и все в дальнейшем будет работать. Но я хотел бы еще кое-что добавить. Для уменьшения количества файлов у клиента и добавление еще одного пункта в безопасности (пароль на подключение), можно сделать следующее, на этапе создания сертификата пользователя на сервере, выполняем команду “build-key-pkcs12 user2” вместо “build-key user1”, выполняем все аналогично первой команде, до пункта Export Password, в этом пункте необходимо указать пароль, например 12345, данный пароль по факту назначается на сертификат “user2.p12”, при попытке подключения через “OpenVPN”, программа обращается к сертификату и требует пароль (зная пароль, его можно изменить, удалить и т.д).

В таком случае, комплект для пользователя будет состоять из:

1 – user2.p12

2 – ta.key

Конфигурационный файл “test.ovpn” должны быть следующего содержания:

# Создаем маршрутизируемый IP туннель.

dev tun

# Указываем протокол для подключения.

proto udp

# Указываем IP аддрес сервера с портом.

remote X.X.X.X 1194

# Указываем задержку в секундах для построения маршрута.

route-delay 3

# Указываем чтобы клиент забирал информацию о маршрутизации с сервера.

client

# Указываем что мы являемся TLS клиентом.

tls-client

# Параметр защиты от MitM атак.

ns-cert-type server

# Указываем путь к сертификату.

pkcs12 «C:\\Program Files\\OpenVPN\\ssl\\user2.p12»

# Указываем путь к ключу безопасности и устанавливаем параметр клиента 1

tls-auth «C:\\Program Files\\OpenVPN\\ssl\\ta.key» 1

# Указываем алгоритм шифрования должен быть одинаковый клиент/сервер.

cipher AES-128-CBC

# Включаем сжатие.

comp-lzo

# Устранение проблем с передачей MTU.

mssfix

# Указывает MTU для туннеля, должны быть одинаковые параметры клиент/сервер.

tun-mtu 1500

# Указываем, сли в течении 60 секунд не было получено ни одного пакета,

# то туннель будет перезапущен.

ping-restart 60

# Указывает отсылать ping на удаленный конец тунеля после указанных n-секунд,

# если по туннелю не передавался никакой трафик.

ping 10

# Указываем уровень логирования.

verb 3

Сохраняем.

Пробуем подключиться, вводим пароль 12345

Если все хорошо видим следующее:

Ну и на последок, как отозвать сертификат пользователя и вообще посмотреть список выданных сертификатов. Сам список храниться по следующему пути “C:\Program Files\OpenVPN\easy-rsa\keys\index.txt”

Для того чтобы отозвать сертификат, заходим в командную строку. Переходим в каталог “C:\Programm Files\OpenVPN\easy-rsa”:

cd C:\Program Files\OpenVPN\easy-rsa

Вводим команду “vars” нажимаем Enter (инициируем работу со скриптами). Вводим команду для отзыва сертификата пользователя “revoke-full user2” (указываем название заведенного раннее пользователя).

После заходим в “index.txt” “C:\Program Files\OpenVPN\easy-rsa\keys\index.txt” и видим, что сертификат отозван “R”.

Не готов сказать на 100%, но судя по описанию, файл “index.txt” проверяется каждый час, соответственно через час, сертификат будет заблокирован, ну или просто достаточно перезапустить сервис на сервере.

Еще рекомендую использовать отдельную учетную запись для службы “OpenVPN Service” и в случае если пользователи будут работать с этим сервером, где развернут VPN, обязательно уберите права у простых пользователей на каталог “C:\Program Files\OpenVPN”.

Всем спасибо, надеюсь, данная статься поможет многим, кто сталкивается с вопросами и не находил подходящих ответов, разжевал как мог.

OpenVPN, о котором вы так мало знали / Хабр

OpenVPN, как много в этом слове. Мультиплатформенный, гибко настраиваемый, бесплатный VPN сервер с открытым исходным кодом, являющийся фактически стандартом «defacto» для организации доступа к внутренним корпоративным сетям. Большинство администраторов используют его с настройками по умолчанию или с типовыми конфигурациями широко описанными в разных HOW-TO. Но так ли прост OpenVPN, как он кажется на первый взгляд? В данной статье мы рассмотрим скрытые от глаз внутренние механизмы OpenVPN, которые кардинально меняют представление о его возможностях.

OpenVPN сервер распространяется в виде исходного кода или готовых к установке скомпилированных пакетов для различных операционных систем. В качестве библиотеки обеспечивающей шифрование используется OpenSSL.

Большинство конфигураций для связи клиентов с сервером, а также между серверами, предполагает использование связки приватных или приватно/публичных ключей для обеспечения безопасности внутреннего трафика. Для корпоративных сетей в режиме MultiPoint-To-SinglePoint обычно используется свой центр сертификации PKI, который легко строится либо при помощи easy-rsa, либо на основе XCA. Для межсервенной коммуникации типа Point-to-point, в основном используется конфигурация с общим ключом. Вспомним основные, всем известные механизмы и возможности.

  • Сертификатная аутентификация

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

  • Приватные point-to-point ключи

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

Во всех случаях подключения для безопасности «рукопожатия» handshake между клиентом и сервером используется протокол Diffie-Hellmann.

  • Внешняя аутентификация пользователей

    Для упрощения контроля за подключением пользователей, вместо схемы со своим PKI, можно использовать схему с внешней аутентификацией пользователей по логину/паролю. Данная схема удобна для аутентификации пользователей скажем по доменному логину/паролю. Для подключения к серверу в конфигурационный файл клиента добавляется сертификат сервера и ключ подписи передаваемых пакетов HARDENING OPENVPN SECURITY.

    пример клиентского конфига

    dev tun
    proto udp
    # Внешний IP сервера OpenVPN
    remote 172.16.111.166
    # Port сервера
    port 1200
    client
    resolv-retry infinite
    tls-client
    key-direction 1
    auth SHA1
    cipher BF-CBC
    #comp-lzo
    persist-key
    persist-tun
    #
    auth-user-pass c:/temp/pass.txt
    #
    # just create a file with name pass.txt
    # and put to it two lines
    # -------------
    #username
    #password
    # -------------
    #auth-user-pass
    verb 3
    <ca>
    -----BEGIN CERTIFICATE-----
    MIIE5jCCA86gAwIBAgIJAOt3kFH7PxA0MA0GCSqGSIb3DQEBCwUAMIGjMQswCQYD
    ....
    -----END CERTIFICATE-----
    </ca>
    <tls-auth>
    -----BEGIN OpenVPN Static key V1-----
    83ddd29fa82212f3059d85a41490134c
    ....
    a4f2c7df3a22364a49093bca102dedeb
    -----END OpenVPN Static key V1-----
    </tls-auth>

    Часть серверного конфига для аутентификации клиентов через файл
    Using alternative authentication methods

    verify-client-cert none
    #client-cert-not-required
    username-as-common-name
    tls-server
    tls-auth /usr/local/etc/openvpn/ssl/tlsauth.key
    key-direction 0
    tls-timeout 120
    auth SHA1
    cipher BF-CBC
    auth-user-pass-verify /usr/local/etc/openvpn/auth/auth-static-file.pl via-file

    Данная схема удобна, но очень небезопасна.

  • PAM

    Для повышения безопасности можно использовать подключаемые модули обеспечивающие проверку логина/пароля во внешних системах. Самым распространённым методом является системный PAM(Pluggable Authentication Modules).

    В конфигурационный файл OpenVPN необходимо добавить строку

    plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so login

  • Маршрутизация

    Т.к. основной задачей сервера является обеспечение доступа удалённых пользователей/серверов к внутренним ресурсам, сервер позволяет определять статическую маршрутизацию от клиентов к серверу и от сервера к клиентам. С точки зрения доступа клиентов к внутренним ресурсам, сервер при помощи протокола DHCP и директив «route» или «push route» позволяет передать клиенту маршруты внутренних сетей. Для оповещения самого сервера об удалённых сетях на стороне клиента используется «client config dir» (ccd), механизм позволяющий описать при помощи директивы «iroute» список внутренних сетей клиента, которые должны попасть в таблицу маршрутизации сервера для транзита в них трафика.

На этом «штатные» широкоиспользуемые возможности заканчиваются и начинается локальная кастомизация для каждого конкретного случая.

Рассмотрим дополнительные возможности OpenVPN, о которых может кто-то и слышал, но в реальности не видел или не использовал.

  • Безопасность сетей/Packet Filtering

    Т.к. OpenVPN маршрутизирует трафик, у него есть два штатных взаимоисключающих друг друга режима работы. Первый режим это маршрутизация внутри OpenVPN сервера, второй режим это межинтерфейсная ядерная маршрутизация. В первом случае за коммутацию и фильтрацию пакетов между клиентами/сетями отвечает сам OpenVPN, во втором любой поддерживаемый на хосте системный пакетный фильтр(pf, iptables, etc).

    Мало кто знает, что OpenVPN имеет встроенный пакетный фильтр, который позволяет разрешить или изолировать соединения между пользователями и сетями.

    Да, да. Вы правильно прочитали. OpenVPN имеет свой собственный встроенный пакетный фильтр. Возможность фильтрации трафика была реализована еще в далёком 2010 году.
    Пакетный фильтр OpenVPN управляется либо через management-interface, либо через подключаемые к OpenVPN плагины.

    Управление правилами трафика происходит через файл. Формат файла прост.

    [CLIENTS DROP|ACCEPT]
    {+|-}common_name1
    {+|-}common_name2
    . . .
    [SUBNETS DROP|ACCEPT]
    {+|-}subnet1
    {+|-}subnet2
    . . .
    [END]

    Директивы блока (ACCEPT/DENY) задают действие по умолчанию для всех клиентов не указанных внутри блока.

    Например файл для клиента user2

    [CLIENTS DROP]
    +user1
    [SUBNETS DROP]
    [END]

    заблокирует трафик ко всем пользователям и сетям, но разрешит трафик в сторону клиента user1. Если у user1 не будет явным образом описано разрешение передачи трафика в сторону user2, то трафик будет ходить только в одну сторону user2->user1.

Или другой пример.

Отключить всё кроме доступа между пользователями и DNS сервером находящимся в локальной сети и тестовым контуром в сети 192.168.0.0/24

[CLIENTS DROP]
+user1
+user2
[SUBNETS DROP]
+10.150.0.1
+10.150.1.1
+192.168.0.0/24
[END]

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

Данную возможность мы обсудим позже.

Вторым режимом фильтрации трафика является встроенный в систему пакетный фильтр. Для его активации в конфиге не должно быть директивы «client-to-client». С точки зрения автоматизации включения/выключения необходимых правил при подключении/отключении клиентов удобнее всего использовать отдельные вставки в список правил, реализуемые либо через CHAINS в Iptables(Linux), либо в Anchors в PF(FreeBSD). Активация/деактивация правил обычно осуществляется через директивы client-connect/client-disconnect в конфигурационном файле сервера, вызывающие соответствующие скрипты при подключении/отключении пользователя.

  • Расширенная PAM аутентификация

    Под расширенной PAM аутентификацией подразумевается изменение логики работы проверки логина и пароля пользователя. Достигается это либо установкой соответствующих плагинов для OpenVPN, обеспечивающих чтение и проверку данных во внешних источниках, либо подключением в систему библиотек позволяющих скриптовать любую логику. Одной из такой библиотек является pam_python, которая помогает скриптовать любую логику проверки логина/пароля через Python скрипты.

    В случае её использования строка проверки пользователя меняется следующим образом.

    plugin openvpn-plugin-auth-pam.so pam_python login USERNAME password PASSWORD domain mydomain.com

    Так как «под капотом» PAM находятся алгоритмы диалогов системы с пользователем или внешними библиотеками, то этими диалогами можно управлять. Например подключить OTP токены в систему. Библиотека LinOTP взята просто для примера, т.к. свою самописную библиотеку написанную во время тестирования я где-то потерял ¯\(ツ)

    Также примеры легко гуглятся по слову «pam_python».

    Основной проблемой при работе с внешними PAM модулями является невозможность получить сессионное окружение OpenVPN внутри вызываемого Python или любого другого скрипта, вызываемого через системный pam. Т.е. скрипт обеспечивает только те функции по проверке логина/пароля, которые на него возложены.

  • «Отложенная» аутентификация

    Сервер OpenVPN поддерживает так называемую «отложенную» аутентификацию. «Отложенная» аутентификация используется в случаях, когда сервис аутентификации не может обслужить запрос проверки логина/пароля в реальном режиме времени.

  • Плагины OpenVPN

    Это отдельная параллельная вселенная, про которую может быть и знают, но из-за некоторой запутанности не умеют или боятся использовать. Да действительно, написание функционального плагина для OpenVPN требует программирования на C со всеми вытекающими. Примеры простых плагинов включены в исходное дерево OpenVPN или например есть плагин для демонстрации вызова методов из OpenVPN.

Попробуем разобраться как плагины работают со стороны OpenVPN.

Функции и параметры используемые для работы с плагинами описаны в отдельном файле

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

#define OPENVPN_PLUGIN_FUNC_SUCCESS  0
#define OPENVPN_PLUGIN_FUNC_ERROR    1
#define OPENVPN_PLUGIN_FUNC_DEFERRED 2

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

При старте сервера, после чтения конфигурационного файла, сервер вызывает функции OPENVPN_PLUGIN_UP и OPENVPN_PLUGIN_ROUTE_UP. В переменном окружении вызываемых функций передаются основные параметры запущенного сервера.

OPENVPN_PLUGIN_UP
{
   "route_netmask_1":"255.255.0.0",
   "daemon_start_time":"1545994898",
   "ifconfig_remote":"10.150.0.2",
   "local_1":"172.16.100.139",
   "script_context":"init",
   "config":"/usr/local/etc/openvpn/server150.conf",
   "link_mtu":"1622",
   "ifconfig_local":"10.150.0.1",
   "tun_mtu":"1500",
   "verb":"2",
   "daemon_pid":"626",
   "route_vpn_gateway":"10.150.0.2",
   "proto_1":"udp",
   "daemon_log_redirect":"1",
   "daemon":"1",
   "route_net_gateway":"172.16.100.1",
   "dev_type":"tun",
   "route_gateway_1":"10.150.0.2",
   "remote_port_1":"1200",
   "dev":"tun150",
   "pluginid":"0",
   "local_port_1":"1200",
   "route_network_1":"10.150.0.0"
}
OPENVPN_PLUGIN_ROUTE_UP
{
   "route_netmask_1":"255.255.0.0",
   "daemon_start_time":"1545994898",
   "redirect_gateway":"0",
   "ifconfig_remote":"10.150.0.2",
   "local_1":"172.16.100.139",
   "script_context":"init",
   "config":"/usr/local/etc/openvpn/server150.conf",
   "link_mtu":"1622",
   "ifconfig_local":"10.150.0.1",
   "tun_mtu":"1500",
   "verb":"2",
   "daemon_pid":"626",
   "route_vpn_gateway":"10.150.0.2",
   "proto_1":"udp",
   "daemon_log_redirect":"1",
   "daemon":"1",
   "route_net_gateway":"172.16.100.1",
   "dev_type":"tun",
   "route_gateway_1":"10.150.0.2",
   "remote_port_1":"1200",
   "dev":"tun150",
   "pluginid":"2",
   "local_port_1":"1200",
   "route_network_1":"10.150.0.0"
}

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

При подключении клиента, OpenVPN запрашивает возможность активации внутреннего пакетного фильтра.

OPENVPN_PLUGIN_ENABLE_PF
{
   "route_netmask_1":"255.255.0.0",
   "daemon_start_time":"1545994898",
   "redirect_gateway":"0",
   "ifconfig_remote":"10.150.0.2",
   "local_1":"172.16.100.139",
   "script_context":"init",
   "config":"/usr/local/etc/openvpn/server150.conf",
   "link_mtu":"1622",
   "pf_file":"/tmp/openvpn_pf_b7a18ca8fac838679ca87ada6b8a356.tmp",
   "ifconfig_local":"10.150.0.1",
   "tun_mtu":"1500",
   "verb":"2",
   "daemon_pid":"626",
   "route_vpn_gateway":"10.150.0.2",
   "proto_1":"udp",
   "route_net_gateway":"172.16.100.1",
   "daemon":"1",
   "daemon_log_redirect":"1",
   "dev_type":"tun",
   "route_gateway_1":"10.150.0.2",
   "remote_port_1":"1200",
   "dev":"tun150",
   "pluginid":"11",
   "local_port_1":"1200",
   "route_network_1":"10.150.0.0"
}

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

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

OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY
{
   "route_netmask_1":"255.255.0.0",
   "route_gateway_1":"10.150.0.2",
   "IV_NCP":"2",
   "IV_COMP_STUB":"1",
   "daemon_start_time":"1545994898",
   "IV_LZ4":"1",
   "redirect_gateway":"0",
   "ifconfig_remote":"10.150.0.2",
   "untrusted_port":"1200",
   "IV_LZ4v2":"1",
   "local_1":"172.16.100.139",
   "script_context":"init",
   "untrusted_ip":"172.16.111.168",
   "config":"/usr/local/etc/openvpn/server150.conf",
   "username":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568",
   "link_mtu":"1622",
   "pf_file":"/tmp/openvpn_pf_b7a18ca8fac838679ca87ada6b8a356.tmp",
   "ifconfig_local":"10.150.0.1",
   "tun_mtu":"1500",
   "auth_control_file":"/tmp/openvpn_acf_a3d0650a43b88ca1b5f305ce2c8f682.tmp",
   "daemon":"1",
   "IV_COMP_STUBv2":"1",
   "verb":"2",
   "IV_PLAT":"win",
   "daemon_pid":"626",
   "password":"12312312312312",
   "route_vpn_gateway":"10.150.0.2",
   "proto_1":"udp",
   "route_net_gateway":"172.16.100.1",
   "IV_PROTO":"2",
   "daemon_log_redirect":"1",
   "dev_type":"tun",
   "IV_VER":"2.4.3",
   "IV_LZO":"1",
   "remote_port_1":"1200",
   "dev":"tun150",
   "pluginid":"5",
   "local_port_1":"1200",
   "IV_TCPNL":"1",
   "route_network_1":"10.150.0.0"
}

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

Результатом работы данной функции должны быть три варианта ответа.

#define OPENVPN_PLUGIN_FUNC_SUCCESS  0
#define OPENVPN_PLUGIN_FUNC_ERROR    1
#define OPENVPN_PLUGIN_FUNC_DEFERRED 2

Если сервер получает ответ OPENVPN_PLUGIN_FUNC_DEFERRED, то в работу вступает механизм «отложенной» аутентификации. Как мы видим, в переменном окружении появилась переменная «auth_control_file», содержимое данной переменной содержит имя файла, в котором будет ожидаться ответ от системы аутентификации. Ответом является помещённый в указанный файл символ 0(для разрешения доступа), 1(для запрета доступа). Параметр сервера «hand-window» определяет таймаут в секундах, в течении которого сервер будет ожидать ответ. Во время ожидания трафик от других клиентов не прерывается.

Так как мы работаем с парольной аутентификацией, то функции проверки сертификатов OPENVPN_PLUGIN_TLS_VERIFY не вызывается. Вместо этого сразу вызывается OPENVPN_PLUGIN_TLS_FINAL, подтверждающий установление сессии.

OPENVPN_PLUGIN_TLS_FINAL
{
   "route_netmask_1":"255.255.0.0",
   "route_gateway_1":"10.150.0.2",
   "IV_NCP":"2",
   "IV_COMP_STUB":"1",
   "daemon_start_time":"1545994898",
   "IV_LZ4":"1",
   "redirect_gateway":"0",
   "ifconfig_remote":"10.150.0.2",
   "untrusted_port":"1200",
   "IV_LZ4v2":"1",
   "local_1":"172.16.100.139",
   "script_context":"init",
   "untrusted_ip":"172.16.111.168",
   "config":"/usr/local/etc/openvpn/server150.conf",
   "username":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568",
   "link_mtu":"1622",
   "pf_file":"/tmp/openvpn_pf_b7a18ca8fac838679ca87ada6b8a356.tmp",
   "ifconfig_local":"10.150.0.1",
   "tun_mtu":"1500",
   "auth_control_file":"/tmp/openvpn_acf_a3d0650a43b88ca1b5f305ce2c8f682.tmp",
   "daemon":"1",
   "IV_COMP_STUBv2":"1",
   "verb":"2",
   "IV_PLAT":"win",
   "daemon_pid":"626",
   "route_vpn_gateway":"10.150.0.2",
   "proto_1":"udp",
   "route_net_gateway":"172.16.100.1",
   "IV_PROTO":"2",
   "daemon_log_redirect":"1",
   "dev_type":"tun",
   "IV_VER":"2.4.3",
   "IV_LZO":"1",
   "remote_port_1":"1200",
   "dev":"tun150",
   "pluginid":"10",
   "local_port_1":"1200",
   "IV_TCPNL":"1",
   "route_network_1":"10.150.0.0"
}

Далее срабатывает вызов OPENVPN_PLUGIN_IPCHANGE, вызываемый перед сменой ip адреса клиента.

OPENVPN_PLUGIN_IPCHANGE
{
   "route_netmask_1":"255.255.0.0",
   "route_gateway_1":"10.150.0.2",
   "trusted_ip":"172.16.111.168",
   "link_mtu":"1622",
   "IV_COMP_STUB":"1",
   "daemon_start_time":"1547319280",
   "IV_LZ4":"1",
   "redirect_gateway":"0",
   "common_name":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568",
   "ifconfig_remote":"10.150.0.2",
   "IV_NCP":"2",
   "untrusted_port":"1200",
   "IV_LZ4v2":"1",
   "local_1":"172.16.100.139",
   "script_context":"init",
   "untrusted_ip":"172.16.111.168",
   "config":"/usr/local/etc/openvpn/server150.conf",
   "username":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568",
   "trusted_port":"1200",
   "pf_file":"/tmp/openvpn_pf_4fcad505693b33f97c4fe105df8681cb.tmp",
   "ifconfig_local":"10.150.0.1",
   "tun_mtu":"1500",
   "auth_control_file":"/tmp/openvpn_acf_321bb12075dc0e1b5440d227220bac5d.tmp",
   "daemon":"1",
   "IV_COMP_STUBv2":"1",
   "verb":"3",
   "IV_PLAT":"win",
   "daemon_pid":"52435",
   "route_vpn_gateway":"10.150.0.2",
   "proto_1":"udp",
   "route_net_gateway":"172.16.100.1",
   "IV_PROTO":"2",
   "daemon_log_redirect":"1",
   "dev_type":"tun",
   "IV_VER":"2.4.3",
   "IV_LZO":"1",
   "remote_port_1":"1200",
   "dev":"tun150",
   "pluginid":"3",
   "local_port_1":"1200",
   "IV_TCPNL":"1",
   "route_network_1":"10.150.0.0"
}

Функция OPENVPN_PLUGIN_CLIENT_CONNECT_V2, вызывается при установке IP адреса внутренним DHCP сервером.

OPENVPN_PLUGIN_CLIENT_CONNECT_V2
{
   "route_netmask_1":"255.255.0.0",
   "route_gateway_1":"10.150.0.2",
   "trusted_ip":"172.16.111.168",
   "link_mtu":"1622",
   "IV_COMP_STUB":"1",
   "daemon_start_time":"1547319280",
   "IV_LZ4":"1",
   "dev":"tun150",
   "common_name":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568",
   "time_ascii":"Sat Jan 12 18:54:48 2019",
   "ifconfig_remote":"10.150.0.2",
   "IV_NCP":"2",
   "untrusted_port":"1200",
   "IV_LZ4v2":"1",
   "local_1":"172.16.100.139",
   "script_context":"init",
   "untrusted_ip":"172.16.111.168",
   "config":"/usr/local/etc/openvpn/server150.conf",
   "username":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568",
   "trusted_port":"1200",
   "pf_file":"/tmp/openvpn_pf_4fcad505693b33f97c4fe105df8681cb.tmp",
   "ifconfig_local":"10.150.0.1",
   "tun_mtu":"1500",
   "auth_control_file":"/tmp/openvpn_acf_321bb12075dc0e1b5440d227220bac5d.tmp",
   "daemon":"1",
   "IV_COMP_STUBv2":"1",
   "verb":"3",
   "IV_PLAT":"win",
   "daemon_pid":"52435",
   "time_unix":"1547319288",
   "redirect_gateway":"0",
   "route_vpn_gateway":"10.150.0.2",
   "proto_1":"udp",
   "route_net_gateway":"172.16.100.1",
   "IV_PROTO":"2",
   "daemon_log_redirect":"1",
   "dev_type":"tun",
   "IV_VER":"2.4.3",
   "IV_LZO":"1",
   "remote_port_1":"1200",
   "ifconfig_pool_local_ip":"10.150.0.5",
   "pluginid":"9",
   "ifconfig_pool_remote_ip":"10.150.0.6",
   "local_port_1":"1200",
   "IV_TCPNL":"1",
   "route_network_1":"10.150.0.0"
}

В переменном окружении появляются переменные содержащие параметры туннеля «ifconfig_pool_local_ip» и «ifconfig_pool_remote_ip».

Функция OPENVPN_PLUGIN_LEARN_ADDRESS вызывается при обучении OpenVPN сервером, связки IP адресов и маршрутов к ним. После выхода из этой функции активируется процедура применения настроек пакетного фильтра из файла. Переменное окружение OPENVPN_PLUGIN_LEARN_ADDRESS при этом соответствует фазе OPENVPN_PLUGIN_CLIENT_CONNECT_V2.

fa56bf61-.../172.16.111.168:1200 ----- pf_check_reload : struct pf_context -----
fa56bf61-.../172.16.111.168:1200 enabled=1
fa56bf61-.../172.16.111.168:1200 filename='/tmp/openvpn_pf_343330698e4acdea34c8a8c7fb87d861.tmp'
fa56bf61-.../172.16.111.168:1200 file_last_mod=1547319124
fa56bf61-.../172.16.111.168:1200 n_check_reload=1
fa56bf61-.../172.16.111.168:1200 reload=[1,15,1547319125]
fa56bf61-.../172.16.111.168:1200  ----- struct pf_set -----
fa56bf61-.../172.16.111.168:1200  kill=0
fa56bf61-.../172.16.111.168:1200   ----- struct pf_subnet_set -----
fa56bf61-.../172.16.111.168:1200   default_allow=ACCEPT
fa56bf61-.../172.16.111.168:1200   ----- struct pf_cn_set -----
fa56bf61-.../172.16.111.168:1200   default_allow=DROP
fa56bf61-.../172.16.111.168:1200    12345678-90da-11e8-bf33-005056a12a82-1234567 ACCEPT
fa56bf61-.../172.16.111.168:1200    fa56bf61-90da-11e8-bf33-005056a12a82-1234567 ACCEPT
fa56bf61-.../172.16.111.168:1200   ----------
fa56bf61-.../172.16.111.168:1200    fa56bf61-90da-11e8-bf33-005056a12a82-1234567 ACCEPT
fa56bf61-.../172.16.111.168:1200    12345678-90da-11e8-bf33-005056a12a82-1234567 ACCEPT
fa56bf61-.../172.16.111.168:1200 --------------------

При отключении клиента вызывается функция OPENVPN_PLUGIN_CLIENT_DISCONNECT.

OPENVPN_PLUGIN_CLIENT_DISCONNECT
{
   "route_netmask_1":"255.255.0.0",
   "route_gateway_1":"10.150.0.2",
   "trusted_ip":"172.16.111.168",
   "link_mtu":"1622",
   "IV_COMP_STUB":"1",
   "daemon_start_time":"1547319280",
   "IV_LZ4":"1",
   "dev":"tun150",
   "common_name":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568",
   "time_ascii":"Sat Jan 12 18:54:48 2019",
   "bytes_received":"30893",
   "IV_NCP":"2",
   "untrusted_port":"1200",
   "ifconfig_remote":"10.150.0.2",
   "IV_LZ4v2":"1",
   "local_1":"172.16.100.139",
   "script_context":"init",
   "untrusted_ip":"172.16.111.168",
   "config":"/usr/local/etc/openvpn/server150.conf",
   "username":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568",
   "trusted_port":"1200",
   "pf_file":"/tmp/openvpn_pf_4fcad505693b33f97c4fe105df8681cb.tmp",
   "ifconfig_local":"10.150.0.1",
   "tun_mtu":"1500",
   "auth_control_file":"/tmp/openvpn_acf_4bdddbada2885cde42cd3cb1b85d77e5.tmp",
   "daemon":"1",
   "IV_COMP_STUBv2":"1",
   "verb":"3",
   "IV_PLAT":"win",
   "daemon_pid":"52435",
   "time_unix":"1547319288",
   "redirect_gateway":"0",
   "route_vpn_gateway":"10.150.0.2",
   "proto_1":"udp",
   "route_net_gateway":"172.16.100.1",
   "IV_PROTO":"2",
   "daemon_log_redirect":"1",
   "time_duration":"3781",
   "dev_type":"tun",
   "IV_VER":"2.4.3",
   "IV_LZO":"1",
   "bytes_sent":"22684",
   "remote_port_1":"1200",
   "ifconfig_pool_local_ip":"10.150.0.5",
   "pluginid":"7",
   "ifconfig_pool_remote_ip":"10.150.0.6",
   "local_port_1":"1200",
   "IV_TCPNL":"1",
   "route_network_1":"10.150.0.0"
}

В переменном окружении добавляются длительность соединения и трафик пользователя.

Как вы успели заметить, в связи с обилием данных в разных вызовах, написание и отладка плагина на языке программирования C(C++) будет довольно трудоёмкой задачей.

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

После долгого чтения исходных кодов OpenVPN и различных примеров узкоспециализированных плагинов, был написан проект, который в качестве языка программирования логики обработки сессии использует Python. Код представляет собой подключаемый к OpenVPN плагин на языке C, который все запросы поступающие в плагин, отправляет в Python модуль через c-api reference.

OpenVPN plugin python proxy

Почему Python модуль ?

Python c-api reference работая с python файлами напрямую, некорректно работает с загрузкой python библиотек.

Как это работает ?

При инициализации плагина в OpenVPN, плагин возвращает масочный список всех функций, которые может обслужить. При наступлении очередной фазы подключения или внутреннего события, OpenVPN вызывает соответствующие функции из плагина. Плагин преобразует переменное окружение и параметры переданные функции в структуру, инициализирует python и передаёт структуру в соответствующую процедуру python модуля. Процедура возвращает плагину один из трёх ответов (0 — Success, 1 — Error, 2 — Deferred). Ответ транформируется и возвращается OpenVPN.

Обратите внимание, что все вызовы модуля являются «stateless», это означает, что процедуры не помнят и не знают, что происходило ранее в других вызовах. Ориентироваться можно только на переменное окружение передаваемое плагину из OpenVPN.

Внутри python модуля вы можете реализовать любую логику, подключая нужные библиотеки и ресурсы. Если вы не уверены в скорости выполнения проверок, то используйте «отложенные» подтверждения.

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

Во время тестирования проекта был разработан механизм генерации паролей, аналогичный jwt токенам, но имеющим меньший размер.

Суть проста. Токен содержит в себе идентификатор клиента и срок окончания доступа. Для подписи токена используется HMAC_SHA1 с закрытым ключом. После подписи токена, текстовое содержимое ксорится подписью и конвертится в base64. Таким образом получается «запечатывание» токена. «Запечатанный» токен используется в качестве пароля пользователя. При несанкционированном изменении блока с данными, поломается xor, если поломается xor, значит поломается проверка подписи. Без закрытого ключа подпись изменить не получится.

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

Надеюсь информация в данной статье была вам полезна.

Спасибо за потраченное на её прочтение время.

Если есть вопросы, попробую ответить на что смогу.

© Aborche 2019

OpenVPN [Мозаика системного администрирования]

Свободная реализация технологии (VPN) с открытым исходным кодом для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами.

Homepage

Варианты управление ключами и сертификатами:

Настоятельно рекомендуется все операции с ключами производить на отдельном компьютере. Файл ca.key позволяет создавать ключи и сертификаты поэтому должен быть только у Администратора!

TAP — эмулирует Ethernet устройство и работает на канальном уровне модели OSI, оперируя кадрами Ethernet. Используется для создания сетевого моста. Если же у вас стоит задача объединить удаленные сети в единое адресное пространство, например сделать и в офисе и в филиале единую сеть 192.168.10.0/24, то тогда бы мы использовали tap интерфейс и указывали бы на компьютерах в обоих сетях не пересекающиеся адреса из одной подсети.

TUN — сетевой туннель, работает на сетевом уровне модели OSI, оперируя IP пакетами. Используется для маршрутизации.


Установка и настройка openvpn на CentOS 7 Выбор устройства openvpn — TAP или TUN

https://ru.wikipedia.org/wiki/TUN/TAP

Изменение пароля к клиентскому ключу

Change passphrase for private key

Пример:

openssl rsa -des3 -in client.key -out client_new.key

Пример для MS Windows:

change_passphrase.cmd
set OPENSSL="C:\Program Files\OpenVPN\bin\openssl"
%OPENSSL% rsa -des3 -in "C:\Program Files\OpenVPN\config\old.key" -out "C:\Program Files\OpenVPN\config\new.key"

ca.crt

Корневой сертификат

ta.key

Ключ шифрования начала сессии

dh{n}.pem

server.crt

Сертификат сервера

server.key

crl.pem

Список отозванных сертификатов

Сертификат клиента

client.key

ta.key

Ключ шифрования начала сессии

Запуск

systemctl start openvpn@server

Статус

systemctl status openvpn@server

Перезапуск

systemctl start openvpn@server

Останов

systemctl stop openvpn@server

server.conf

Директива client-to-client

Путь к настройкам: /etc/openvpn/server

Пример: /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz

/etc/openvpn/server.conf
local IP_АДРЕС_СЕРВЕРА
port 1194
dev tun
proto udp
tun-mtu 1280
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key  # This file should be kept secret
dh /etc/openvpn/server/dh3048.pem
crl-verify /etc/openvpn/server/crl.pem
server 192.168.168.0 255.255.255.0
 
ifconfig-pool-persist /etc/openvpn/ipp.txt
connect-retry-max 5
 
#auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env
#script-security 3 system
 
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
 
push "route 192.168.168.0 255.255.255.0"
push "route 10.1.0.0 255.255.255.0"
 
push "dhcp-option DNS 192.168.168.1"
push "dhcp-option DOMAIN domain.ru"
 
keepalive 10 120
 
tls-auth /etc/openvpn/keys/ta.key 0 # This file is secret
comp-lzo
max-clients 5
user nobody
group nogroup
 
persist-key
persist-tun
 
status openvpn-status.log
 
log-append /var/log/openvpn.log
verb 3
mute 20
 
#client-connect /etc/openvpn/client-connect.sh

ipp.txt

/etc/openvpn/ipp.txt
client01,192.168.168.22
client02,192.168.168.26
client03,192.168.168.30
client04,192.168.168.34

Особенности ipp.txt в OpenVPN версии 2.4.0

Для выдачи нужных адресов используем такую конструкцию:

/etc/openvpn/server/ipp.txt
N002,10.1.0.2
N003,10.1.0.3
Client-01,10.1.0.4
Client-02,10.1.0.5
Client-03,10.1.0.6
N007,10.1.0.7
N008,10.1.0.8
N009,10.1.0.9
N010,10.1.0.10
Client-04,10.1.0.11
Client-05,10.1.0.12
Client-06,10.1.0.13

где N002, N003, N007, N008, N009 и N010 это несуществующие клиенты для резервирования неиспользуемых адресов.

ipp-restart.sh

Скрипт для обновления /etc/openvpn/server/ipp.txt, новый файл: /etc/openvpn/server/ipp.txt-new

/usr/local/bin/openvpn-ipp-restartp.sh
#!/bin/bash
 
systemctl stop openvpn@server
sleep 3
cp /etc/openvpn/server/ipp.txt-new /etc/openvpn/server/ipp.txt
sleep 3
systemctl start openvpn@server
systemctl status openvpn@server

Особенности работы с MS Windows клиентами

OpenVPN выделяет для каждого клиента подсеть с маской /30 для обеспечения совместимости с клиентами MS Windows из-за ограничения режима эмуляции TUN драйвера TAP-Win32.

Если к серверу OpenVPN не будут подключаться клиенты MS Windows, то можно отключить такой порядок выделения адресов указав в настройках сервера директиву ifconfig-pool-linear

192.168.1.4/30
192.168.1.4Сетевой адрес (network address)
192.168.1.5Адрес виртуального маршрутизатора, шлюза, в качестве которого выступает сервер OpenVPN (virtual IP address in the OpenVPN Server)
192.168.1.6Адрес выдаваемый клиенту (assigned to the client)
192.168.1.7Широковещательный адрес (broadcast address)

Драйвер TAP-Win32 включает DHCP-сервер, который назначает клиенту адрес 192.168.1.6, а адрес 192.168.1.5 определяется как адрес DHCP-сервера.

Такой подход приводит к потере части IP-адресов, но это лучший способ обеспечения совместимости с всеми клиентами OpenVPN.


http://openvpn.net/index.php/open-source/faq/community-software-server/273-qifconfig-poolq-option-use-a-30-subnet-4-private-ip-addresses-per-client-when-used-in-tun-mode.html

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

Настройка OpenVPN клиента на Windows 10

Выполнение команд при подключении клиента

Нужно задать имя скрипта:

/etc/openvpn/openvpn.conf
client-connect /etc/openvpn/client-connect.sh

Пример кода скрипта:

/etc/openvpn/client-connect.sh
case ${common_name} in
Client01)
        sudo /usr/sbin/etherwake 00:11:22:33:44:55
        ;;
Client02)
        sudo /usr/sbin/etherwake 55:44:33:22:11:00
        ;;
esac
 
exit 0

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

nobody ALL = (ALL) NOPASSWD:/usr/sbin/etherwake

client.ovpn

Файл настроек клиента

Пример файла:

client1.ovpn
client
dev tun
proto udp
remote vpn.domain.ru
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
comp-lzo
verb 3
ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1

Запуск через sudo

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

user ALL = (ALL) NOPASSWD:/usr/sbin/openvpn

Пример скрипта запуска:

sudo /usr/sbin/openvpn client.ovpn

update-resolv-conf

Для того, чтобы использовать DNS сервер полученный от сервера OpenVPN нужно:

  1. Установить пакет resolvconf
    apt-get install resolvconf
  2. Добавить в конец файла настроек клиента client.ovpn следующие строки:
    script-security 2
    up /etc/openvpn/update-resolv-conf
    down /etc/openvpn/update-resolv-conf

Проблемы с версией TLS

Вариант 1

Новый клиент не подключается с старому серверу из–за версии TLS, для решения проблемы нужно добавить в файл настройки клиента:

tls-cipher "DEFAULT:@SECLEVEL=0"
tls-version-min 1.0

Вариант 2

Клиенты для MS Windows

openvpn/openvpn.txt · Последние изменения: 2020-08-27 09:57 — GreyWolf

Минутку …

Включите файлы cookie и перезагрузите страницу.

Этот процесс автоматический. Ваш браузер в ближайшее время перенаправит вас на запрошенный контент.

Подождите до 5 секунд…

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] — (!! [])) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [])) / + ((! + [] + (!! []) — [] + []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [ ] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] +! ! []) + (! + [] — (!! [])) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] +! ! [] + []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [])) / + ((! + [] + (!! []) — [] + []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — [ ]) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (+ !! []) + (! + [] + (!! []) — []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! [ ] + !! []) + (! + [] + (!! []) + !! [])) / + ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! []) + (! + [] + (!! [ ]) — []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] +! ! [] + !! []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [ ]) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + ( !! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (! ! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] — (!! [])) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] ) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] +! ! [] + !! [])) / + ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [ ] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [ ] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] ) + (! + [] + (!! []) — []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] +! ! []) + (! + [] — (!! [])) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] ) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [])) / + ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (+ !! []) + (! + [] + (! ! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (+ !! []) + ( ! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] +! ! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [ ] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + ( !! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [])) / + ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [ ] + !! [] + []) + (! + [] + (!! []) — [] ) + (+ !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! []) + (! + [] — ( !! [])) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) — []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [ ] + !! [] + !! [] + []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [ ] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] — (! ! [])) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [])) / + ((! + [] + ( !! []) + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + ( !! []) + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []))

+ ((! + [] + (!! []) + !! [] +! ! [] + !! [] + !! [] + !! [] + !! [] + []) + (+ !! []) + (! + [] + (!! []) +! ! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (! ! []) — []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] )) / + ((! + [] + (!! []) + !! [] + []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! []) + (+ !! []) + (! + [] + (!! []) +! ! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (+ !! []) + (! + [] + (!! []) + !! []))

+ ((! + [] + (!! [ ]) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [ ] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (! ! []) + !! [])) / + ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [ ] + !! [] + []) + (+ !! []) + (+ !! []) + (! + [] + (!! []) + !! []) + (! + [ ] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [ ] + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] — (!! []) ) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! []) + !! [ ] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (! ! []) + !! [] + !! [] + !! [] + !! [] + !! [])) / + ((! + [] + (!! []) + !! [ ] + !! [] + []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] +! ! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [ ] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []))

.

Минутку …

Включите файлы cookie и перезагрузите страницу.

Этот процесс автоматический. Ваш браузер в ближайшее время перенаправит вас на запрошенный контент.

Подождите до 5 секунд…

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [ ] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (+ !! [])) / + ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] +! ! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] +! ! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) — []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! [ ]) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! [] ) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [])) / + ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [ ] + !! [] + !! []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) — []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] +! ! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [] + (! ! []) + !! [])) / + ((+ !! [] + []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + ( !! []) + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) +! ! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + ( ! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] +! ! [] + !! []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [ ] + !! [] + []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (+ !! [])) / + ((! + [] + (!! [] ) + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! [] + !! [] + !! [] +! ! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! [] ) + !! [] + !! [] + !! []) + (! + [] + (! ! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] +! ! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + ( ! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] +! ! [] + []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [])) / + ((! + [] + (!! []) — [] + []) + (+ !! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [ ] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] +! ! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) — []) + (! + [] — (!! [ ])) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! []) +! ! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [ ] + (!! []) + !! [])) / + ((+ !! [] + []) + (! + [] + (!! []) + !! [] + !! [ ] + !! [] + !! [] + !! [] + !! [] + !! [] ) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — [ ]) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) — [ ]) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! []) ) / + ((! + [] + (!! []) + !! [] + []) + (! + [] + (!! []) + !! [] + !! [] +! ! [] + !! []) + (! + [] + (!! []) + !! []) + (! + [] — (!! [])) + (! + [] + ( !! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — []) + (+ !! []) + (+ !! []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [ ] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (+ !! [])) / + ((! + [] + (!! []) + !! [] + !! [] + []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + ( !! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + ( !! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] — ( !! [])) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [])) / + (( + !! [] + []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! [] ) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + ( !! []) + !! [] + !! []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] +! ! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [])) / + ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + ( !! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (! ! []) — []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) +! ! [] + !! [] + !! [] + !! []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [ ] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) — []) + (! + [] — ( !! [])) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! [] ) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — []) + ( ! + [] + (!! []) + !! [])) / + ((+ !! [] + []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] +! ! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [ ] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] +! ! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []))

+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [ ] + (!! []) + !! [] + !! [] + !! []) + ( ! + [] + (!! []) + !! [])) / + ((+ !! [] + []) + (+ !! []) + (! + [] + (!! [ ]) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [ ] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! []) + (+! ! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [ ] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []))

.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *