Инструменты пользователя

Инструменты сайта


openvpn

OpenVPN

Homepage: OpenVPN Community Software

OpenVPN — это приложение для создания безопасного IP-туннеля через единый UDP- или TCP-порт 1194. Для обеспечения безопасности управляющего канала и потока данных, OpenVPN использует библиотеку OpenSSL (точнее протоколы SSLv3/TLSv1) т.е. доступны все возможности шифрования, аутентификации и сертификации библиотеки OpenSSL (любой шифр, размер ключа). Также может использоваться пакетная авторизация HMAC, для обеспечения большей безопасности, и аппаратное ускорение для улучшения производительности шифрования.

OpenVPN используется на Solaris, OpenBSD, FreeBSD, NetBSD, GNU/Linux, Apple Mac OS X и Microsoft Windows.

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

OpenVPN может использовать статические, предустановленные ключи или обмен динамическими ключами на основе TLS. Он также поддерживает соединения VPN с динамическими удалёнными узлами (DHCP или клиенты dial-up), туннели поверх NAT или через полноценный межсетевой экран (например, iptables в Linux).

Настройки конфигурационного файла клиента идентичны по синтаксису и написанию как для Linux, так и для Windows.

Компоненты сети OpenVPN

Основные компоненты сети OpenVPN и объекты

  • Удостоверяющий центр CA. Выдает сертификаты по запросу узлов сети VPN, подписанные сертификатом удостоверяющего центра. Предоставляет узлам сети VPN свой собственный сертификат для проверки удостоверяющей стороны. Управляет списком отзыва сертификатов CRL.
  • Сервер OpenVPN. ПО сервера OpenVPN создает туннель внутри незащищенной сети, например, Интернета. Этот туннель обеспечивает безопасный зашифрованный трафик между узлами — участниками обмена данными в сети OpenVPN.
  • Клиент OpenVPN. ПО клиента OpenVPN устанавливается на все узлы, которым необходим защищенный канал передачи данный с сервером OpenVPN. При соответствующей настройка сервера OpenVPN возможна защищенная передача данных между клиентами OpenVPN, а не только между клиентами и сервером OpenVPN.
  • Сертификаты (публичные ключи) X.509. Сертификаты X.509 представляют собой публичные ключи, заверенные удостоверяющим центром CA. Они используются для зашифровывания данных. Факт заверения сертификата удостоверяющим центром CA позволяет идентифицировать сторону, передающую зашифрованные данные. Файл запроса на сертификат создается на узлах сети, затем он переносится на узел удостоверяющего центра и там подписывается. Созданный в результате подписанный сертификат переносится обратно на запросивший его узел сети OpenVPN.
  • Приватные ключи. Приватные ключи секретные. Они должны создаваться и храниться на каждом узле сети OpenVPN, предназначены для расшифрования данных и никогда не должны передаваться по сети. Приватные ключи создаются на узлах сети OpenVPN одновременно с файлом запроса на получение сертификата.
  • Список отзыва сертификатов CRL. Содержит список сертификатов, утративших доверие. Он создается и редактируется на узле удостоверяющего центра CA. Чтобы отключить узел от сети, достаточно занести его сертификат в список CRL. После создания и каждого изменения список CRL переносится на серверы OpenVPN.
  • Файл Диффи-Хелмана. Используется, чтобы в случае похищения ключей исключить расшифрование трафика, записанного еще до этого похищения. Создается на сервере OpenVPN.
  • Статический ключ HMAC.

Безопасность и шифрование

Безопасность и шифрование в OpenVPN обеспечивается библиотекой OpenSSL и протоколом транспортного уровня Transport Layer Security (TLS). Вместо OpenSSL в новых версиях OpenVPN можно использовать библиотеку PolarSSL. Протокол TLS представляет собой усовершенствование протокола защищенной передачи данных уровня защищенных сокетов Secure Socket Layers (SSL).

В OpenSSL может использоваться симметричная и ассиметричная криптография.

В первом случае перед началом передачи данных на все узлы сети необходимо поместить одинаковый секретный ключ. При этом возникает проблема безопасной передачи этого ключа через небезопасный Интернет.

Во втором случае у каждого участника обмена данными есть два ключа — публичный (открытый) и приватный (секретный).

Публичный ключ используется для зашифрования данных, а приватный — для расшифрования. В основе шифрования лежит довольно сложная математика. Выбранный в SSL/TLS алгоритм зашифрования публичным ключом обеспечивает возможность расшифрования только с помощью приватного ключа.

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

Для безопасной передачи данных необходимо идентифицировать стороны, принимающие участие в обмене данными. В противном случае можно стать жертвой так называемой "атаки посредника" (Man in the Middle, MITM). В ходе такой атаки злоумышленник подключается к каналу передачи данных и прослушивает его. Он также может вмешиваться, удалять или изменять данные.

Чтобы обеспечить аутентификацию (проверку подлинности пользователя) протокол TLS использует инфраструктуру публичных ключей (Public Key Infrastructure, PKI) и асимметричную криптографию.

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

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

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

OpenVPN Debian Wheezy/sid

# aptitude install openvpn
# mkdir /etc/openvpn/easy-rsa
# cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/

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

# nano /etc/openvpn/easy-rsa/vars 
...
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"

Создадим переменные окружения bash, если это не сделать, при генерации ключей клиентов переменные будут взяты из /etc/openvpn/easy-rsa/openssl.cnf а не из файла vars

# cd /etc/openvpn/easy-rsa
# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
# ./clean-all
# ./build-dh

Создадим сертификат для сервера с именем vpnspar

# ./pkitool --initca
# ./pkitool --server vpnspar

Создадим сертификат для клиента с именем farm1c. Отдельный ключ для каждого клиента.

# ./pkitool farm1c
# mkdir /etc/openvpn/keys
# cp keys/ca.crt /etc/openvpn/keys
# cp keys/dh1024.pem /etc/openvpn/keys
# cp keys/vpnspar.crt /etc/openvpn/keys
# cp keys/vpnspar.key /etc/openvpn/keys

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

  1. добавляет клиенту маршрут к локальной подсети центрального офиса(push "route 192.168.1.0 255.255.255.0")
  2. определяет адрес локальной подсети, находящейся за клиентом (например iroute 192.168.2.0 255.255.255.0)
  3. привязка к статическому IP (ifconfig-push 192.168.14.21 192.168.14.22), где ifconfig-push <IP-адрес клиента> <IP-адрес сервера>. Выбранные пары IP-адресов, во-первых, должны быть уникальными, во-вторых, должны входить в состав последовательных подсетей, ограниченных маской /30 (255.255.255.252), и, в-третьих, должны находиться в пределах пула IP-адресов, выделенного для виртуальной частной сети (определяется параметром server файла конфигурации сервера OpenVPN).
# mkdir /etc/openvpn/ccd
# nano ccd/farm1c
push "route 192.168.1.0 255.255.255.0"
#push "route 192.168.35.0 255.255.255.0"
# static IP
ifconfig-push 192.168.14.21 192.168.14.22
#iroute 192.168.2.0 255.255.255.0

server.conf

Конфигурируем сервер в файле server.conf

# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
# gunzip server.conf.gz
# nano /etc/openvpn/server.conf
server.conf
local ххх.196.98.ххх            # IP на котором сервер слушает входящие сообщения
port 1194                       # порт на котором сервер слушает входящие сообщения
proto udp
dev tun
# Включение интерфейса управления OpenVPN. Доступен при помощи telnet localhost 7505
management localhost 7505
 
ca keys/ca.crt                    # местонахождение самоподписного доверенного сертификата (CA)
cert keys/vpnspar.crt             # местонахождение сертификата сервера
key keys/vpnspar.key              # местонахождение закрытого ключа сервера
dh keys/dh1024.pem                # местонахождение файла параметров Диффи-Хэлмана
# Настройка режима сервера и адреса VPN-сети, 
# из которой OpenVPN будет раздавать адреса клиентам.
# Сервер возьмет себе 192.168.14.1,
# остальные адреса будут доступны для клиентов.
# Каждый клиент сможет связаться с сервером по адресу 192.168.14.1.
server 192.168.14.0 255.255.255.0
# в файле ipp.txt хранится информация о соединении, например на случай обрыва соединения
# и его дальнейшего восстановления
ifconfig-pool-persist ipp.txt
 
# маршруты которые будут передаваться каждому клиенту.
# push - команда OpenVPN, передаваемая клиенту и выполняемая клиентом
# (в данном случае добавляем на стороне клиента два маршрута к виртуальной частной сети)
push "route 192.168.1.0 255.255.255.0"
push "route 192.168.35.0 255.255.255.0"
 
# Перенаправлять default gateway на vpn-сервер. Если не нужно - закомментировать или 
# добавить в ccd для конкретного клиента
push "redirect-gateway def1"
 
# указываем где будут хранятся файлы с настройками IP-адресов клиентов
client-config-dir ccd
 
# добавляем маршрут сервер-клиент.
# route - добавляет на стороне сервера маршруты к локальным подсетям, находящимся за клиентами
route 192.168.14.0 255.255.255.252
 
# разрешить общение клиентов подключенных к серверу OpenVPN общение между собой
client-to-client
 
# Директива проверки работоспособности, включающая отсылку
# ping-подобных сообщений туда и обратно через
# соединение для того, чтобы каждая сторона знала когда
# другая сторона внезапно пропадет (gone down).
# Пинг каждые 10 секунд, с предположением, что удаленный
# узел недоступен, если не получено на одного пинга за период времени
# равный 120 секундам.
keepalive 10 120
comp-lzo
max-clients 10
user nobody
group nogroup
persist-key
persist-tun
# Содержимое небольшого файла состояния, показывающего
# текущие соединения, усекается
# и перезаписывается раз в минуту.
status /var/log/openvpn-status.log
log         /var/log/openvpn.log
verb 3                             # уровень отладки
# /etc/init.d/openvpn start

Аннулировать сертификат клиента

  • Пример. Аннулируем сертификат пользователя farm1c
    # cd /etc/openvpn/easy-rsa
    # source ./vars
    # ./revoke-full farm1c
    Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
    Revoking Certificate 02.
    Data Base Updated

    После команды revoke-full изменится в файл /etc/openvpn/easy-rsa/keys/index.txt строка соответствующая сертификату пользователя farm1c.

Инсталляция OpenVPN + OpenVZ

Окружение:

  • OpenVZ Hardware Node(HD) CentOS 6.5 (Final),
  • Virtual Environment(VE) Ubuntu 14.04.1 LTS,
  • OpenVPN 2.3.2,
  • Easy-RSA 2.2.

Инсталляция VE(VPS, VDS)

  • Инсталлируем VE Ubuntu для OpenVZ
    # cd /vz/template/cache/
    # wget -c http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz
    # vzctl create 111 --layout simfs --ostemplate ubuntu-14.04-x86_64-minimal
    CT configuration saved to /etc/vz/conf/111.conf
  • Настраиваем VE 111.conf.
  • Все остальные настройки производим уже в установленной VE
    # vzctl enter 111

Создание ключей

  • Создание ключей при помощи утилиты Easy-RSA. Ранее эта утилита входила в дистрибутив сервера OpenVPN, сейчас она отдельный проект. Последнюю версию утилиты можно скачать с сайта OpenVPN, но правильнее использовать версию поставляемую с вашим дистрибутивом ОС.
    aptitude install easy-rsa
  • Перед тем как запустить демон OpenVPN, нам нужны в каталоге /etc/openvpn/keys
    openssl.cnf — файл конфигурации OpenSSL;
    server.conf — файл конфигурации сервера OpenVPN;
    ca.crt — cертификат удостоверяющего центра;
    vpn-server.crt — cертификат сервера OpenVPN;
    server.key — приватный ключ сервера OpenVPN, секретный;
    crl.pem — cписок отзыва сертификатов;
    dh.pem — файл Диффи-Хелмана для обеспечения защиты трафика от расшифровки;
    ta.key — ключ HMAC для дополнительной защиты от DoS-атак и флуда
  • Копируем директорию easy-rsa в то место где будем создавать инфраструктуру публичных ключей (Public Key Infrastructure, PKI)
    cp -R /usr/share/easy-rsa /etc/openvpn/
    cd /etc/openvpn/easy-rsa

    Изменяем параметры по умолчанию для сертификатов в файле vars

    export KEY_COUNTRY="US"
    export KEY_PROVINCE="CA"
    export KEY_CITY="SanFrancisco"
    export KEY_ORG="Fort-Funston"
    export KEY_EMAIL="me@myhost.mydomain"
    export KEY_OU="MyOrganizationalUnit"

    Создадим переменные окружения.

    source ./vars
    NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

    Очистим от предыдущих экспериментов. Создадим ключ Диффи-Хелмана (ключ создается некоторое время).

    ./clean-all
    ./build-dh
    Generating DH parameters, 2048 bit long safe prime, generator 2
    This is going to take a long time
    ...
  • Создадим директорию для хранения приватных ключей сервера OpenVPN. Скопируем туда файл Диффи-Хелмана (dh2048.pem)
    mkdir /etc/openvpn/keys
    cp keys/dh2048.pem /etc/openvpn/keys/
  • Статический ключ HMAC для с целью дополнительной защиты от DoS-атака-атак и flood.
  • Создадим удостоверяющий центр CA. Создадутся ca.crt и ca.key. Файл ca.key представляет собой приватный ключ центра CA, он секретный, и его нельзя переносить на другие узлы вашей сети. Файл сертификата удостоверяющего центра ca.crt, напротив, открытый, и он будет нужен на узлах серверов и клиентов OpenVPN.
    ./pkitool --initca
  • Создадим сертификат для сервера с именем vpnluxor
    ./pkitool --server vpnluxor

    Созданные файлы vpnluxor.crt и vpnluxor.key копируем в директорию /etc/openvpn/keys/

  • Создадим сертификат для клиента client1 с одноименном параметром CommonName . Отдельный ключ для каждого клиента.
    ./pkitool client1

Расположение сертификатов и ключей

Файл Машина Назначение Доступ
ca.crt Сервер и клиенты Сертификат корневого СА Публичный
ca.key Только на сервере Необходим для подписи других сертификатов Секретный
dh{n}.pem Только на сервере Diffie Hellman параметры Публичный
vpnspar.crt Только на сервере Сертификат сервера Публичный
vpnspar.key Только на сервере Ключ сервера Секретный
darkfire.crt Только на клиенте Сертификат клиента Публичный
darkfire.key Только на клиенте Ключ клиента Секретный

Инсталлируем OpenVPN

  • Установим OpenVPN 2.3 в VE(Ubuntu 14.04.1 LTS)
    aptitude install openvpn

    Для запуска раскомментируем строку

    nano /etc/default/openvpn
    ...
    AUTOSTART="all"
    ...
  • Копируем openvpn.conf
    cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
    gunzip server.conf.gz

    Пробуем запустить, OpenVPN останавливает свою работу из-за несуществующих сертификатов ca.crt, dh1024.pem и других. Создаем нужные ключи.

  • В директории ccd хранятся индивидуальные настройки для каждого клиента.
    mkdir /etc/openvpn/ccd

Расширение сетевых границ VPN

Расширение границ VPN для включения дополнительных машин из подсетей на стороне клиента или сервера. Включение нескольких машин на стороне сервера при использовании маршрутизируемого VPN (dev tun)

Поскольку VPN действует только в режиме точка-точка, может возникнуть желание расширить границы VPN так, чтобы клиенты могли связываться с другими машинами в сети сервера, а не только с самим сервером.

Чтобы проиллюстрировать это примером, предположим, что в локальной сети на стороне сервера используется подсеть 10.66.0.0/24 и для пула VPN-адресов используется 10.8.0.0/24, о чем говорится в директиве server в файле конфигурации OpenVPN-сервера.

Во-первых, вы должны сообщить VPN-клиентам, что подсеть 10.66.0.0/24 доступна через VPN. Это легко можно сделать с помощью следующих директив в конфигурационном файле сервера:

push "route 10.66.0.0 255.255.255.0"

Далее, необходимо настроить на LAN- шлюзе в сети сервера маршрут для маршрутизации пакетов, предназначенных для подсети VPN-клиентов (10.8.0.0/24) через OpenVPN-сервер (это необходимо только тогда, когда сервер OpenVPN и LAN-шлюз – разные машины).

Убедитесь, что вы включили пересылку для IP (ip-forwarding) (параметр ядра net.ipv4.ip_forward должен быть равен 1) и TUN/TAP на машине OpenVPN-сервера.

Безопасность OpenVPN

  • Используйте proto udp, потому что он по сравнению с TCP обеспечивает более надежную защиту от DoS-атак и сканирования портов.
  • Используйте HMAC
  • Запускайте демон OpenVPN сервера от имени непривилегированного пользователя: user nobody group nobody

Firewall iptables

Открываем UDP порт 1194 и разрешаем пакеты приходящие с интерфейса TUN и TAP или tun.

iptables -A INPUT -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -i tap+ -j ACCEPT
or
iptables -A INPUT -i tun+ -j ACCEPT

OpenVPN управление

Для управления сервером OpenVPN существует не так много программ для управления пользователями.

Проблема PPPoE и OpenVPN

Проблема: Если сервер подключён к ISP при помощи технологии PPPoE, в этом случае OpenVPN не сможет сделать доступными сети за подключённым клиентом. Не будет отрабатывать команда iroute. Это связано с тем, что PPP прописывает маршрут по умолчанию в таком виде:

# netstat -rn
Kernel IP routing table              
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         0.0.0.0         0.0.0.0         U         0 0          0 ppp0

Т.е. указывается маршрутом по умолчанию интерфейс (ppp0), а не IP адресс, такой записи сервер OpenVPN не понимает, для корректной работы сервера OpenVpn маршрут должен бы вида:

# netstat -rn
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         91.196.96.35    255.255.255.255 UGH       0 0          0 ppp0

Решение: Исправить маршрут по умолчанию можно командой (соответственно указав нужный вам IP)

route add 0/0 gw 91.196.96.35

или в скрипте при загрузке системы, но после поднятия интерфейса ppp0

route del default
route add default gw 91.196.96.35 dev ppp0

Проблема OpenVPN + Virtualbox + Dnsmasq

Окружение: Клиент выходит в интернет с Ubuntu 14.04.3 LTS + Dnsmasq установленной в VirtualBox. Сеть установлена в VirtualBox как сетевой мост. IP получается от DHCP на интернет роутере (Netis WF2419R).

Проблема: Не работает push "dhcp-option DNS 10.26.95.254". Соответственно все DNS Dnsmasq отсылает основному DNS серверу. Все бы ничего если бы клиенту не нужны локальные DNS.

Решение: Был доустановлен основной пакет

aptitude install dnsmasq

добавлены описания наших локальных зон (non-public domains) в конфигурационный файл dnsmasq.conf

server=/gaga.lan/10.26.95.254
server=/m86a.lan/10.26.95.254
server=/atlex.lan/10.26.95.254
 
server=/95.26.10.in-addr.arpa/10.26.95.254
server=/168.192.in-addr.arpa/10.26.95.254
server=/85.161.10.in-addr.arpa/10.26.95.254

Клиенты OpenVPN для разных ОС

  • Для Linux проще всего ставить этот же пакет OpenVPN, но настраивать его клиентом.
    aptitude install openvpn

    Пример рабочего конфига для Ubuntu 14.04.3 LTS

    client.conf
    client
    proto udp
    dev tun
    ca ca.crt
    dh dh2048.pem
    cert client.crt
    key client.key
    remote xxx.xxx.xxx.xxx 1194
    tls-auth ta.key 1
    cipher AES-256-CBC
    user nobody
    group nogroup
    verb 2
    mute 20
    keepalive 10 120
    comp-lzo
    persist-key
    persist-tun
    float
    resolv-retry infinite
    nobind

Ротация логов OpenVPN

  • В файле /etc/logrotate.d/openvpn прописываем настройки для logrotate, ключевой параметр copytruncate (чтобы не перегружать OpenVPN и заставить его писать данные в тот же лог файл)
    openvpn
    etc/openvpn/servers/vpnluxor/logs/openvpn.log {
            daily
            rotate 8
            compress
            delaycompress
            missingok
            copytruncate
            notifempty
            create 640 root
    }

Ссылки

openvpn.txt · Последние изменения: 2015/10/02 06:28 (внешнее изменение)

Яндекс.Метрика