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 methodsverify-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) с открытым исходным кодом для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами.
Варианты управление ключами и сертификатами:
Настоятельно рекомендуется все операции с ключами производить на отдельном компьютере. Файл 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 нужно:
- Установить пакет
resolvconf
apt-get install resolvconf
- Добавить в конец файла настроек клиента
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 секунд…
+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [ ] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (+ !! [])) / + ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] +! ! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] +! ! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — []))
+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) — []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! [ ]) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! [] ) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [])) / + ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [ ] + !! [] + !! []))
+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) — []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] +! ! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [] + (! ! []) + !! [])) / + ((+ !! [] + []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + ( !! []) + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) +! ! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + ( ! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] +! ! [] + !! []))
+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [ ] + !! [] + []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (+ !! [])) / + ((! + [] + (!! [] ) + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! [] + !! [] + !! [] +! ! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! [] ) + !! [] + !! [] + !! []) + (! + [] + (! ! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] +! ! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + ( ! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! []))
+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] +! ! [] + []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [])) / + ((! + [] + (!! []) — [] + []) + (+ !! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [ ] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []))
+ ((! + [] + (!! []) + !! [] + !! [] + !! [] +! ! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) — []) + (! + [] — (!! [ ])) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! []) +! ! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [ ] + (!! []) + !! [])) / + ((+ !! [] + []) + (! + [] + (!! []) + !! [] + !! [ ] + !! [] + !! [] + !! [] + !! [] + !! [] ) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — [ ]) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! []))
+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) — [ ]) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! []) ) / + ((! + [] + (!! []) + !! [] + []) + (! + [] + (!! []) + !! [] + !! [] +! ! [] + !! []) + (! + [] + (!! []) + !! []) + (! + [] — (!! [])) + (! + [] + ( !! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — []) + (+ !! []) + (+ !! []))
+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [ ] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (+ !! [])) / + ((! + [] + (!! []) + !! [] + !! [] + []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + ( !! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + ( !! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []))
+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] — ( !! [])) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [])) / + (( + !! [] + []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! [] ) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + ( !! []) + !! [] + !! []))
+ ((! + [] + (!! []) + !! [] + !! [] + !! [] +! ! [] + !! [] + !! [] + []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [])) / + ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + ( !! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (! ! []) — []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [] + (!! []) +! ! [] + !! [] + !! [] + !! []))
+ ((! + [] + (!! []) + !! [] + !! [] + !! [ ] + !! [] + !! [] + !! [] + !! [] + []) + (! + [] + (!! []) — []) + (! + [] — ( !! [])) + (! + [] + (!! []) + !! [] + !! []) + (+ !! []) + (! + [] + (!! [] ) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) — []) + ( ! + [] + (!! []) + !! [])) / + ((+ !! [] + []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] +! ! [] + !! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [ ] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] +! ! [] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! []))
+ ((! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! [] + !! [] + []) + (+ !! []) + (! + [] + (!! []) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []) + (! + [] — (!! [])) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) — []) + (! + [ ] + (!! []) + !! [] + !! [] + !! []) + ( ! + [] + (!! []) + !! [])) / + ((+ !! [] + []) + (+ !! []) + (! + [] + (!! [ ]) + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [ ] + !! [] + !! [] + !! [] + !! [] + !! []) + (! + [] + (!! []) + !! []) + (+! ! []) + (! + [] + (!! []) + !! [] + !! []) + (! + [] + (!! []) + !! [] + !! [ ] + !! []) + (! + [] + (!! []) + !! [] + !! [] + !! []))
.