OpenVPN

Материал из Hack Wiki

Перейти к: навигация, поиск

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 и Microsoft Windows.

[править] Аутентификация

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

[править] Сеть

OpenVPN проводит все сетевые операции через 1 TCP, либо UDP (предпочтительнее) порт (при выборе протокола существуют две точки зрения одна Why TCP Over TCP Is A Bad Idea и другая Tcp Over TCP Is Not So Bad-web). Также возможна работа через большую часть прокси серверов, включая HTTP, через NAT и сетевые фильтры. Сервер может быть настроен на назначение сетевых настроек клиенту. Например: IP адрес, настройки маршрутизации и параметры соединения. OpenVPN предлагает два различных варианта сетевых интерфейсов, используя драйвер TUN/TAP. Возможно создание Layer 3 based IP туннель, называемый TUN, и Layer 2 based Ethernet — TAP, способный передавать Ethernet трафик. Также возможно использование библиотеки компрессии LZO, для сжатия потока данных. Используемый порт 1194 выделен Internet Assigned Numbers Authority для работы данной программы. Версия 2.0 позволяет контролировать несколько одновременных туннелей, в отличие от версии 1.0, позволявшей создавать только 1 туннель на 1 процесс. Использование OpenVPN стандартных протоколов TCP и UDP позволяет ему стать альтернативой IPsec в ситуациях, когда Интернет-провайдер блокирует некоторые VPN протоколы.



[править] Введение FAQ

В данном FAQ предпринята попытка изложить небольшое пособие по OpenVPN (http://openvpn.net/) на основании личного опыта (в основном для ОС Windows, хотя многое применимо и для других ОС) и общения в теме FAQ: OpenVPN (тема для обсуджений и консультаций), которая и стала версией 0.х данного FAQ. Ввиду того, что тема стала больше консультационной, нежели самим FAQ, возникла мысль разделить FAQ и консультации.

Данный FAQ является неофициальным и не гарантирует полную правильность информации. Вы можете следовать данным советам ТОЛЬКО на свой страх и риск.

Выражаю благодарности за советы и информацию участникам конференции: phaoost, за информацию о работе OpenVPN в Linux AlexSSS2 за образец курируемого им FAQ в другом форуме

По возможности постараюсь не забывать указывать авторство других участников в соответствующих местах


[править] Обзор технологии VPN и некоторых её реализаций

VPN (сокр. от Virtual Private Network, Виртуальная частная сеть) - технология, изначально разработанная для того, чтобы позволить безопасно взаимодействовать компьютерам, расположенным в разных местах, так, как будто они расположены в одной частной сети. Термин "частная сеть" в данном случае подразумевает: безопасность, то есть посторонние не должны иметь доступа к данным, передаваемым в этой частной сети. Способ обеспечения данного требования един у подавляющего большинства технологий VPN - это шифрование. близость и доступность, то есть компьютеры, которые без VPN не могут обмениваться информацией напрямую, будучи подключенными к VPN могут обмениваться информацией и даже быть включёнными в один и тот же виртуальный сегмент (с "точки зрения" ПК они получаются почти рядом). Термин "виртуальная сеть" подразумевает, что этой сети "физически" нет, то есть нет проводов, адаптеров и т.п., эта виртуальная сеть существует только как процессы внутри компьютеров.

Есть различные типовые применения технологий VPN: Объединение компьютеров и сетей, подключенных к интернет, в безопасную виртуальную сеть - классическое применение технологии в точности по её названию. Применяется для связи офисов, подключения удалённых компьютеров к сетям офисов и т.п. Использование VPN в качестве средства гарантированно надёжной и безопасной аутентификации в сетях, которые потенциально могут быть "подслушаны". Яркий представитель этого варианта применения - VPN в домовых сетях для учёта доступа к интернет, цель - обеспечить невозможность подключения абонента от чужого имени и использования чужих денег. Часто в таких сетях даже не используется шифрование трафика, а используется лишь защищённый механизм аутентификации (то есть невозможность перехвата логина и пароля пользователя). Аналогичная схема может использоваться и в офисных системах учёта интернет-трафика. Использование VPN как средства гарантированно надёжной и безопасной работы в локальных сетях, которые могут быть "прослушаны" или в которых даже гарантировано есть "посторонние". Например, если в WiFi-сети используется шифрование ниже минимального разумного WPA (например, если развёрнута WDS, в которой поддерживается только ненадёжный WEP), то можно совсем отключить собственную безопасность WiFi-сети, сделав выход из неё только через VPN и запретив на WiFi-интерфейсах весь трафик кроме VPN. Или совсем небольшие офисы, работающие непосредственно в общей локальной сети арендуемого здания вместе с такими же небольшими офисами. Надёжное ограничение доступа к некоторым ресурсам (то есть уже, например, не на базе фильтрации по адресам, а уже с применением криптографии), не имеющим достаточных собственных средств безопасности. Например, по каким-либо причинам требуется наличие telnet-сервера на Win Server 2003, сам по себе протокол telnet является незащищённым, однако если для трафика этого протокола назначить политику IPSec, требующую безопасность, то компьютер не имеющий аналогичной настроенной политики, не сможет даже установить tcp-соединение с telnet-портом сервера, не то что начать обмен данными. Также ничего не даст и попытка перехвата этого трафика.

Существуют различные реализации VPN: PPTP - Point-to-Point Tunelling Protocol, протокол соединений "точка-точка" PPP ("работавший" ещё во времена модемов), пакеты которого могут шифроваться протоколом MPPE и/или сжиматься MPPC, затем упаковываются в пакеты протокола GRE и передаются по IP-сети между PPTP-сервером и PPTP-клиентом. В работе протокола используется управляющее соединение 1723/tcp и соединение передачи данных по протоколу GRE (IP protocol 47, не путать с портами TCP/UDP). Протокол используется широко и разнообразно. Среди преимуществ можно отметить его штатное наличие в подавляющем большинстве ОС, простоту настройки клиентской части (в простых случаях), работоспособность в т.ч. и без прав администратора. Среди недостатков - использование "проблемного" GRE, недостаточную гибкость и управляемость, худшую диагностируемость (особенно в Windows). L2TP, L2TP-over-IPSec PPPoE (PPPoA) - протокол PPP, но работающий непосредственно поверх Ethernet (ATM). Основное применение - подключение к интернет-провайдерам по локальной сети. Не предназначен для работы через Internet. IPSec MPLS иногда тоже причисляют к VPN, однако IMHO это не VPN-технология, т.к. сеть передачи не является публичной (она полностью контролируется оператором, предоставляющим эту услугу), в ней AFAIK не предусмотрено шифрование. По тем же причинам не являются VPN-технологиями выделенные каналы, которые провайдеры могут предоставлять для объединния офисов. OpenVPN сочетает в себе множество из указанных возможностей.


[править] Обзор версий, ссылки на первоисточники и другие публикации

Не вижу большого смысла углубляться в историю OpenVPN и т.п., есть масса материалов об этом. Однако не могу не выразить уважение автору - James Yonan, , браво!

Обращаю внимание, что сайт openvpn.net немного модифицирован и "классический" OpenVPN находится в разделе Open Source Project

Для OpenVPN доступны исходные тексты, его Лицензия (OpenVPN GPL License) позволяет свободно использовать для собственных нужд, лицензирование требуется лишь для модифированных версий, распространяемых под иной лицензией.


[править] Применяемые сокращения и понятия

хост - любое устройство (обычно компьютер, безразлично физический или виртуальный, но может быть и маршрутизатор или подобное сетевое устройство, встраиваемый компьютер, КПК и т.п.), на котором запущен экземляр ОС, имеющий стек сетевых протоколов, в основном TCP/IP. OpenVPN-сервер, он же сокращённо О_С - хост, на котором запущен процесс OpenVPN в режиме сервера и к которому подключаются OpenVPN-клиенты. В большинстве случаев предполагается что О_С работает постоянно и "ожидает" подключения клиентов. О_С имеет должен иметь открытый и доступный для клиентов порт tcp или udp. OpenVPN-клиент, он же сокращённо О_К - хост, на котором запущен процесс OpenVPN в режиме клиента и который "по своей инициативе" подключается к OpenVPN-серверу. В большинстве случаев предполагается что О_К не обязан работать постоянно и может не иметь открытых и доступных извне портов tcp или udp. L3 и L2 - 3-ий и 2-ой уровни в обеих распространённых моделях сетевых протоколов - и ISO OSI Reference Model (Эталонная модель взаимодействия открытых систем) и Internet Protocol Suite. Точное название термина - Layer 3 (2), однако иногда говорят и Level 3 (2). L3 (Layer 3) - 3-ий уровень - Network Layer, сетевой уровень, уровень Internet. Если идёт речь об IP-маршрутизации (маршрутизатор (router)), то это как раз L3, соответственно, на уровне 3 находится IP-протокол (не путать с TCP, UDP и т.п. - они выше). Хосты, соединённые через маршрутизаторы, могут напрямую (без технологий инкапсуляции) обмениваться только данными 3 уровня (более высокие уровни вложены в него), то есть IP-пакетами (и соответственно не могут обмениваться L2-кадрами). Важно также запомнить, что термин пакет относится именно к данному уровню и в данной теме подразумевает именно IP-пакет. L2 (Layer 2) - 2-ой уровень - Data Link Layer, канальный уровень. Если идёт речь о коммутации (коммутатор (switch), мост (bridge)), то это как раз L2. На уровне 2 в применении к OpenVPN находится IEEE 802 (но мы будем считать с допустимой степенью ошибочности, что на этом уровне находятся протоколы 802.3 Ethernet (формально он расположен чуть ниже)). Хосты, соединённые через коммутаторы или мосты, могут напрямую обмениваться данными 2 уровня (более высокие уровни вложены в него), то есть Eth-кадрами (L2-кадрами). Важно также запомнить, что термин кадр (frame, фрейм) относится именно к данному уровню и в данной теме подразумевает именно Eth-кадр. Broadcast - широковещательный. В применении к рассматриваемой теме это широковещательный Eth-кадр на адрес FF:FF:FF:FF:FF:FF и вложенный в него IP-пакет с широковещательным адресом сети, такой кадр рассылается всем устройствам сегмента. Не вдаваясь в излишние детали и ограничиваясь только кругом вопросов, который может интересовать тех, кто с этим плотно не знаком, скажу что этот механизм используется, например, службой "обозревателя сети" Windows ("Сетевое окружение"), различного рода играми и т.п. для обнаружения в сегменте сети других компьютеров с нужными ресурсами. Особенность данного механизма состоит в том, что ни такие L2-кадры ни вложенные в них IP-пакеты не пересылаются через маршрутизаторы. Соответственно, наличие маршрутизаторов между компьютерами является проблемой для работы таких служб - "обозревателя сети" Windows ("Сетевое окружение"), игр и т.п.


[править] Установка

Особая благодарность Ck-NoSFeRaTU

Пример настройки в среде FreeBSD.

1. Ставим openvpn из портов:

  1. cd /usr/ports/security/openvpn
  2. make clean install

2. Radiusplugin for OpenVPN Забираем последнюю версию радиус-плагина для openvpn с cvs и собираем его(последний выложенный релиз на сайте глючит)

  1. cd /tmp
  2. cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/radiusplugin co radiusplugin
  3. cd radiusplugin
  4. g++ -Wall -I/usr/local/include -L/usr/local/lib -shared -o radiusplugin.so \

AccountingProcess.cpp Exception.cpp PluginContext.cpp UserAuth.cpp AcctScheduler.cpp \ IpcSocket.cpp radiusplugin.cpp User.cpp AuthenticationProcess.cpp main.cpp UserAcct.cpp \ UserPlugin.cpp Config.cpp RadiusClass/RadiusAttribute.cpp RadiusClass/RadiusPacket.cpp \ RadiusClass/RadiusConfig.cpp RadiusClass/RadiusServer.cpp \ RadiusClass/RadiusVendorSpecificAttribute.cpp -lgcrypt -lgpg-error -lstdc++ -lm 3. Создаем папку с конфигами, копируем туда радиус-плагин, его конфиг

  1. mkdir /usr/local/etc/openvpn
  2. cp radiusplugin.so /usr/local/etc/openvpn/
  3. cp radiusplugin.cnf /usr/local/etc/openvpn/

Создаем сертификаты (Читаем команды для openssl тут)

4. Файл /usr/local/etc/openvpn/server.conf

dev tap8 port 1194 mode server tls-server server 10.1.100.0 255.255.255.0 10.1.100.1 management 127.0.0.1 7505 ca /usr/local/etc/openvpn/keys/server/ca.crt cert /usr/local/etc/openvpn/keys/server/server.crt key /usr/local/etc/openvpn/keys/server/server.key dh /usr/local/etc/openvpn/keys/server/dh1024.pem tls-auth /usr/local/etc/openvpn/keys/server/ta.key keepalive 10 60 client-connect /usr/local/abills/libexec/openvpn-up client-disconnect /usr/local/abills/libexec/openvpn-down ifconfig-pool-persist /usr/local/etc/openvpn/keys/server/ip.txt 1300000 plugin /usr/local/etc/openvpn/radiusplugin.so /usr/local/etc/openvpn/radiusplugin.cnf username-as-common-name comp-lzo push "redirect-gateway def1" push "route 0.0.0.0 0.0.0.0" push "dhcp-option DNS 10.1.100.1" log-append /var/log/openvpn-server.log 5. Файл /usr/local/etc/openvpn/radiusplugin.cnf

NAS-Identifier=openvpn Service-Type=2 Framed-Protocol=1 NAS-Port-Type=5 NAS-IP-Address=127.0.0.1 OpenVPNConfig=/usr/local/etc/openvpn/server.conf

  1. subnet=255.255.255.0

server { acctport=1813 authport=1812 name=127.0.0.1 retry=1 wait=1 sharedsecret=наш_секретный_пароль_от_радиуса } 6. Файл /usr/local/abills/libexec/openvpn-up

  1. !/bin/bash

/usr/local/abills/libexec/linkupdown openvpn up $dev inet $ifconfig_local $ifconfig_pool_remote_ip $common_name >& /dev/null

    • /usr/local/abills/libexec/openvpn-down**\\
  1. !/bin/bash

/usr/local/abills/libexec/linkupdown openvpn down $dev inet $ifconfig_local $ifconfig_pool_remote_ip $common_name >& /dev/null 7. Заводим ещё один nas с NAS-Identifier=тому, что мы указывали в radiusplugin.cnf, тип Other nas server. В radius-параметры не забываем Acct-Interim-Interval=300.

8. /usr/local/sbin/openvpn –daemon –config /usr/local/etc/openvpn/server.conf

Теперь про клиентов (Мастдай):

9. Openvpn/config/example.ovpn

nobind remote ип_нашего_сервера port 1194 client dev tap proto udp auth-user-pass authinfo tls-auth ta.key pull tls-client reneg-sec 1209600 ca tmp-ca.crt cert client.crt key client.key comp-lzo

В Openvpn/config/authinfo две строчки:

логин пароль


[править] Примечание по клиентскому openvpn:

С какой-то версии openvpn`а заблокирована возможность хранения в текстовом файле логина и пароля пользователя, я не хотел напрягать пользователей каждый раз вводить его вручную, поэтому собрал собственный инсталятор openvpn для клиентов. В него входят уже разблокированные бинарники openvpn, драйвера, openvpn-gui, набор нужных сертификатов и конфигов, а также форма, где просит указать логин и пароль, т.е. клиенту нужно только вписать свой логин/пароль прямо в формочку в инсталяторе, а остальное всё настроит он уже сам. Если кому нужно, то поделюсь скриптами для nsis`а.


[править] Примечание по radiusplugin:

Обработку Framed-IP-Address завести не удалось. Автор пишет следующее:

OpenBSD(BSD): RADIUS attributes FramedIP and FramedRoutes mandatory RADIUS attribute FramedIP is ignored Надо бы связаться с автором и спросить будет ли чинить FramedIP в бсд или нет…

Поэтому пока как костыль, если нужно использование статики, юзаем ifconfig-pool-persist в конфиге openvpn, к примеру ifconfig-pool-persist /usr/local/etc/openvpn/keys/server/ip.txt 1300000. И в этот ip.txt прописываем вручную/скриптами статические ипшники, в таком формате: логин,ип логин2,ип2





[править] Download's

[1]

Key: MXWI-9JL8-TMKV-88RQ