25.11.2013 - Обзор вcтроенных технологий OpenVPN
Данная статья написана после успешного внедрения технологии OpenVPN. Автор рассматривает ряд технологий реализованных в OpenVPN с описанием конфигурационных команд.Для начала немного предистории. У нашего клиента возникла задача объединить центральный и удаленный офис в одну сеть, а так ИТ инфраструктура у нас на обслуживании - мы тут же принялись подбирать решение этого вопроса.
Было предложено немало решений, от "железных" до роли в Windows Server или одной из *nix систем, но все это требовало дополнительных вложений (покупка маршрутизатора, приобритение ПО или приобритение дополнительной рабочей станции). Поэтому наш выбор пал на OpenVPN!
Что такое OpenVPN?
OpenVPN — свободная реализация технологии Виртуальной Частной Сети (VPN) с открытым исходным кодом для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами. Она позволяет устанавливать соединения между компьютерами, находящимися за NAT-firewall, без необходимости изменения их настроек. OpenVPN была создана Джеймсом Йонаном (James Yonan) и распространяется под лицензией GNU GPL.
Для обеспечения безопасности управляющего канала и потока данных, OpenVPN использует библиотеку OpenSSL. Благодаря этому задействуется весь набор алгоритмов шифрования, доступных в данной библиотеке. Также может использоваться пакетная авторизация HMAC, для обеспечения большей безопасности, и аппаратное ускорение для улучшения производительности шифрования. Эта библиотека использует OpenSSL, а точнее протоколы SSLv3/TLSv1. OpenVPN используется в операционных системах Solaris, OpenBSD, FreeBSD, NetBSD, GNU/Linux, Apple Mac OS X, QNX и Microsoft Windows.
OpenVPN предлагает пользователю несколько видов аутентификации:
1) Предустановленный ключ — самый простой метод. Параметр в конфигурации :
secret «путь» static.key - Представляет собой файл, в котором находится ключ.
2) Сертификатная аутентификация — наиболее гибкий в настройках метод. Параметр в конфигурации:
ca – Корневой сертификат SSL/TLS
dh - Для сервера OpenVPN необходимо создать параметры Diffie Hellman'а (только для сервера)
cert – сертификат
key – закрытый ключ (Этот файл должен храниться в секрете)
*Каждый клиент и сервер должен иметь свои собственные файлы с сертификатом и ключем. Сервер и все клиенты будут использовать один и тот же ca-файл.
Можно воспользоваться командой buil-key-pkcs12 для создания одного файла, в котором будут 3 файла (ca, cert и key). Так же можно на сгенерированный файл установить пароль.
3) С помощью логина и пароля, — может использоваться без создания клиентского сертификата (серверный сертификат всё равно нужен). Параметр конфигурации:
auth-user-pass-verify - Сервер
auth-user-pass - Клиент
Хочу больше безопасности
Для еще большей безопасности чем предоставляет SSL/TLS, создайте "HMAC-файрвол", чтобы заблокировать DoS-атаки и UDP-флуд. Генерация:
openvpn --genkey --secret ta.key
*(файл будет создан в каталоге по умолчанию)
Сервер и каждый клиент должен иметь копию этого ключа. Второй параметр должен быть '0' на сервере и '1 'на клиентах. Соответственно:
tls-auth ta.key 0 – для сервера
tls-auth ta.key 1 – для клиента
*Этот файл является секретным
Выбор криптографического шифра
Этот элемент конфигурации также должен быть скопирован в конфигурацию клиента. Параметр в конфиге:
cipher BF-CBC # Blowfish (default)
cipher AES-128-CBC # AES
cipher DES-EDE3-CBC # Triple-DES
Поддерживаемые транспортные протоколы
OpenVPN проводит все сетевые операции через TCP, либо UDP. Указав в конфиге:
prototcp-server – для сервера
proto tcp - для клиента
Передача сетевых параметров клиентам
Также возможна работа через большую часть прокси серверов, включая HTTP, через NAT и сетевые фильтры. Сервер может быть настроен на назначение сетевых настроек клиенту. Например: IP адрес, настройки маршрутизации и параметры соединения. Параметры в конфиге:
server 10.8.0.0 255.255.255.0 - Настройка режима сервера и адреса VPN-сети, из которой OpenVPN будет раздавать адреса клиентам. Первый адрес сервер возьмет себе 10.8.0.1 а остальные раздаст клиентам.
push "route 192.168.10.0 255.255.255.0" - Передача клиенту маршрутов, чтобы позволить ему связаться с другими частными подсетями
push "route-gateway 10.8.0.1" - Передача клиенту шлюза для связи с другими частными сетями
push "dhcp-option DNS 10.8.0.1"
push "dhcp-option WINS 10.8.0.1" - Некоторые Windows-специфичные сетевые настройки могут быть переданы клиентам, такие как адреса DNS или WINS-серверов.
push "route-gateway 10.8.0.1" - передача клиенту шлюза для связи с другими частными сетями.
Внимание! Если мы будем передавать параметры push "route 192.168.10.0 255.255.255.0" и push "route-gateway 10.8.0.1" могут возникнуть следующие проблемы:
Если мы запускаем OpenVPN GUI на ОС Windows с правами простого пользователя то в логе будут следующие строки:
C:\WINDOWS\system32\route.exe ADD 10.0.0.0 MASK 255.0.0.0 172.16.0.1
ROUTE: route addition failed using CreateIpForwardEntry: Отказано в доступе. [status=5 if_index=13]
Решение:
1) Запускаем OpenVPN GUI от администратора, т.к. для записи маршрута, требуются повышение прав
2) Запускаем OpenVPN как службу, но если для аутентификации используете pkcs12 и вы задали пароль для файла .p12, у вас не выскочит окошка с вводом пароля, а значит не будет даже попытки соединения.
OpenVPN как мост
OpenVPN предлагает два различных варианта сетевых интерфейсов, используя драйвер TUN/TAP. Возможно создать Layer 3-based IP туннель, называемый TUN, и Layer 2-based Ethernet - TAP, способный передавать Ethernet трафик. Если вы хотите использовать Ethernet-мост, вам необходимо заменить server и dev tun на, соответственно, server-bridge и dev tap. Параметр в конфиге:
dev tap
server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100 - Настройка сервера для режима Ethernet-моста (for Ethernet bridging)
Сжатие трафика
Также возможно использование библиотеки компрессии LZO, для сжатия потока данных. Параметр в конфиге:
Comp-lzo - Включить сжатие в VPN-соединении. Если вы включите его здесь, вы также должны включить его в файле конфигурации клиента.
Какой TCP/UDP-порт должен слушать OpenVPN?
Используемый порт 1194 выделен Internet Assigned Numbers Authority для работы данной программы. Версия 2.0 позволяет контролировать несколько одновременных туннелей, в отличие от версии 1.0, позволявшей создавать только 1 туннель на 1 процесс. Использование в OpenVPN стандартных протоколов TCP и UDP позволяет ему стать альтернативой IPsec в ситуациях, когда Интернет-провайдер блокирует некоторые VPN протоколы.
Если вы хотите запустить несколько экземпляров OpenVPN на одной и той же машине, используйте отдельный номер порта для каждого экземпляра. Вам нужно будет открыть этот порт на фаерволе. Параметр в конфиге:
port 1194
Обязательно к вышесказанному
Для ОС Windows необходимо имя TAP-Win32-адаптера из панели Сетевые подключения если у вас больше чем один такой адаптер. В XP SP2 или выше вам, возможно, понадобиться выборочно отключить брандмауэр Windows для TAP-адаптера. Не-Windows системы обычно не требуют этого. Параметр в конфиге:
dev-node MyTap
Если у вас один сертификат для всех клиентов, что делать?
Раскомментируйте эту директиву, если несколько клиентов могут подключаться с одинаковыми файлам сертификата/ключа или common names. Это рекомендуется только в целях тестирования. В промышленном использовании каждый клиент должен иметь свою собственную пару сертификат/ключ.
Внимание! ЕСЛИ У ВАС НЕ СГЕНЕРИРОВАННА ИНДИВИДУАЛЬНАЯ ПАРА СЕРТИФИКАТ/КЛЮЧ ДЛЯ КАЖДОГО КЛИЕНТА И КАЖДЫЙ КЛИЕНТ НЕ ИМЕЕТ СВОЕГО УНИКАЛЬНОГО "COMMON NAME", РАСКОММЕНТИРУЙТЕ ЭТУ СТРОКУ В КОНФИГЕ.
;duplicate-cn
Весь трафик через туннель
Будучи активированной, это директива скажет всем клиентам перенаправить их шлюз по умолчанию через VPN, в результате чего весь IP-трафик, такой как просмотр веб-страниц и DNS-поиск пойдет через VPN (Машине с OpenVPN-сервером, возможно, потребуется NAT'ить весь трафик с TUN/TAP-интерфейса, идущий в Интернет, чтобы все это работало должным образом). Предостережение: Можно нарушить сетевую конфигурацию клиента если пакеты локального DHCP-сервера клиента будут направлены (get routed) через туннель.
Решение: убедитесь, что локальный DHCP-сервер клиента доступен через более определенный (specific) маршрут, чем маршрут по умолчанию
-- 0.0.0.0/0.0.0.0.
Параметр в конфиге:
push "redirect-gateway"
Ой!
Если OpenVPN упадет или будет перезапущен, повторно подключающимся клиентам могут быть назначены из пула такие же виртуальные IP-адреса, которые были назначены им в прошлый раз. Сопоставления клиент <-> виртуальный IP-адрес хранятся в этом файле. Параметр в конфиге:
ifconfig-pool-persist ipp.txt
Не хотим много клиентов или хотим?
Максимальное количество одновременно подключенных клиентов, которое мы хотим разрешить. Параметр в конфиге:
max-clients 100
Клиент, ты точно тут?
Директива проверки работоспособности, включающая отсылку ping-подобных сообщений туда и обратно через соединение для того, чтобы каждая сторона знала когда другая сторона внезапно пропадет (gone down). Пинг каждые 10 секунд, с предположением, что удаленный узел недоступен, если не получено ни одного пинга за период времени равный 120 секундам. Параметр в конфиге:
keepalive 10 120
Дополнительно
Раскомментируйте эту директиву, чтобы позволить различным клиентам "видеть" друг друга. По умолчанию клиенты будут видеть только сервер. Чтобы клиенты видели только сервер, вам также необходимо будет надлежащим образом настроить файрвол сервера для TUN/TAP-интерфейса. Параметр в конфиге:
;client-to-client
Логи
Содержимое небольшого файла состояния, показывающего текущие соединения, усекается и перезаписывается раз в минуту. Параметр в конфиге:
status openvpn-status.log
Установить соответствующий уровень детализации лог-файла.
0 -- молчаливый (silent), за исключением фатальных ошибок
4 -- разумно для обычного использования
5 и 6 помогут найти и устранить (debug) проблемы с соединением
9 -- чрезвычайно подробный
Параметр в конфиге:
verb 3
Не записывать повторяющиеся сообщения. Не более 20 последовательно идущих одинаковых сообщений будут выведены в лог. Параметр в конфиге:
mute 20
Безопасность со стороны клиента
Все последующие команды указываются только в конфиге клиентов.
Проверка сертификата сервера путем контроля того, что в сертификате значение поля nsCertType установленным в значение "server". Это важная меры предосторожности для защиты от потенциальной атаки. Чтобы использовать эту функцию, вам необходимо сгенерировать ваш сертификат для сервера с полем nsCertType, установленным в значение "server". Скрипт build-key-server в папке easy-rsa. Параметр в конфиге:
ns-cert-type server
Подключаемся через WiFi
Беспроводные сети часто производят дубликаты пакетов. Установите этот флаг для того, чтобы отключить предупреждения для пакетов, которые дублируются. Параметр в конфиге:
mute-replay-warnings
Бесконечно пробовать разрешить имя хоста OpenVPN-сервера. Очень полезно на машинах, которые не являются постоянно подключенными к интернету, например, для ноутбуков. Параметр в конфиге:
resolv-retry infinite
Вывод. Рассмотрев долеко не все технологии встроенные в OpenVPN, а лишь не большую часть, можно сказать что OpenVPN очень хорошая штука! Юзайте!
Автор ag | Просмотров 9791
Комментарии (4)
Олег Карягин:
25.11.2013 13:23
Отличная статья!
Артур Гарян:
25.11.2013 14:32
Спасибо !)
Валентина:
25.11.2013 22:38
замечательная статья! все просто,доступно и понятно.
Олег Карягин:
16.12.2013 19:16
У меня возникала ошибка при build-ca.bat
WARNING: can't open config file: /etc/ssl/openssl.cnf
Решение - нужно в vars.bat указать
set OPENSSL_CONF=C:\OpenVPN\easy-rsa\openssl-1.0.0.cnf
после
set KEY_CONFIG=openssl-1.0.0.cnf
Также важно заметить что push "route xxx" не применимо к 2.3, там маршрутизации команда
route 192.168.2.0 255.255.255.0
в клиентском конфиге
Есть что сказать? Пишите нам ->