OpenVPN: кроссплатформенный инструмент для создания виртуальных сетей

12 Янв
2008

Статья напечатана в журнале Хакер

Для терпеливых в конце видео.

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

 

Проект OpenVPN

В настоящее время существует множество различных решений позволяющих создавать виртуальные частные сети (ВЧС, англ. Virtual Private Network — VPN), остановим свой на выбор OpenVPN (openvpn.net). Это полнофункциональное решение созданное на основе SSL позволяющее просто решить весь спектр задач по подключению удаленных пользователей или сетей, с четко разграниченными правами доступами, поддержкой беспроводных сетей и балансировки нагрузки. Имеются реализации для всех популярных операционных систем: Linux, *BSD, Solaris, Mac OS X, Windows от 2000. Поддерживаются адаптивная компрессия потока, работа через NAT, использование всех доступных в SSL алгоритмов шифрования, аутендификации и сертификатов. Клиенты могут иметь как статические, так и динамические IP-адреса, что весьма полезно при использовании dial-up или перемещении пользователя. Может работать в chroot окружении, в целях безопасности демон после запуска понижает права до минимально необходимых. OpenVPN является обычным пользовательским приложением использующим драйверы tun/tap. Tun применяется при туннелировании IP-пакетов, а tap, он же ethertap, — при туннелировании фреймов Ethernet. В терминологии OpenVPN такие туннели называются соответственно – routed (точка-точка) и bridged (один сервер – несколько клиентов). Драйвер TUN/TAP позволяет пользовательским программам самостоятельно обрабатывать соответствующие пакеты. OpenVPN оптимизирован для работы с протоколом UDP, который используется по умолчанию и рекомендуем разработчиками, но можно использовать и TCP.

Установка OpenVPN

В репозитариях большинства дистрибутивов OpenVPN есть. Поэтому в большинтсве случаев достаточно ввести что-то вроде “sudo apt-get install openvpn” или “yum install openvpn”. Впрочем, сборка из исходных текстов, также не сложна. Если ядро собиралось самостоятельно следует убедиться, что в системе устройства tun/tap присутствуют:


$ sudo modprobe tun

$ /bin/lsmod | grep tun

$ ls /dev/net/tun


Если ответ ничего не содержит, пересоберите ядро активировав следующие пункты:


Device Drivers —>

Network device support —>

[*]Network device support

<M> Universal TUN/TAP device driver support


Теперь скачиваем последнюю версию OpenVPN с сайта проекта и вперед:

$ tar -xzvf openvpn-x.x.x.tar.gz

$ cd openvpn-x.x.x/

Если в системе есть все необходимое, то в большинстве случаев достаточно дать стандартные “./configure; make; sudo make install”. Проблемы при установке обычно возникают в случае отсутствия библиотек lzo или ssl. После установки, работу компонентов можно протестировать, введя “make check”. Кому сообщение о том, что “ All 2 test passed” покажется мало информативным, следует провести два доступных теста вручную. Система, построенная на основе OpenVPN, может использовать два вида ключевой информации и соответственно алгоритмов шифрования: симметричное шифрование со статическим ключом и асимметрично с использование TLS/SSL сертификатов и ключей. Посмотреть, какие алгоритмы шифрования доступны, можно с помощью команды:
 

$ sudo openvpn –show-ciphers

 
Проверим работу OpenVPN со статическим ключом. Сначала создадим такой ключ:
 

$ sudo openvpn —genkey —secret /etc/openvpn/static.key

И теперь проверим работу:

 
$ sudo openvpn --test-crypto --secret /etc/openvpn/static.key 
 

Результатом должно быть сообщение о том, что “OpenVPN crypto self-test mode SUCCEEDED”. Для проверки работы с асимметричными ключами следует воспользоваться готовыми конфигурационными файлами, которые находятся в подкаталоге sample-config-files архива. Выполняем в разных консолях, следующие команды:

$ sudo openvpn sample-config-files/loopback-server

$ sudo openvpn sample-config-files/loopback-client

Если в ответ получаем “VERIFY OK” и далее проходит обмен зашифрованными пакетами, можно смело идти дальше. Следующим шагом создадим учетную запись, под которой будет работать демон openvpn, понижая свои привилегии после запуска:

$ sudo useradd openvpn

Очень не рекомендую использовать здесь nobody, если несколько серверов работают от имени этого пользователя он становится не менее всемогущим чем root. И каталог, в котором будут храниться настройки и ключи (если он еще не создан):

$ sudo mkdir /etc/openvpn

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

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

Как генерировать статический ключ, показано выше. В этом случае один ключ используется на сервер и клиентах. Это удобно, но весьма рисковано. Если этот файл попадет постороннему, он сможет расшифровывать всю информацию, передаваемую по сети. Сертификаты и ключи для сервера и клиентов, необходимые при асимметричном шифровании. Проще и удобнее создавать не вручную, а с помощью скриптов, находящихся в подкаталоге easy-rsa (здесь же в подкаталоге Windows имеются и bat файлы). Их здесь несколько:


1. Корневой сертификат (CA — Certificate Authority) – build-ca (для подписи сертификатов сервера и клиентов);

2. Ключ и сертификат сервера – build-key-server;

3. Ключи для клиентов – простые (build-key) и защищенные паролем (build-key-pass);

4. Ключи PKCS (Public Key Cryptography Standards) — build-key-pkcs12 (подойдут при хранении на сменных носителях, вроде eToken);

5. Создать сертификат и ключ, если СА не доступен в локальной системе – простой (build-req), защищенный паролем (build-req-pass), и подписать их (sign-req);

6. Создать сертификат и ключ, используя корневой СА — build-inter;

7. Создать ключ Diffie Helman — build-dh (используется при установленном соединении для шифрования трафика);

8. Отозвать — сертификат (revoke-crt);

9. Отозвать с созданием списка отозванных сертификатов (Certificate Revocation List — CRL) — revoke-full

OpenVPN поддерживает двунаправленную аутентификацию, основанную на сертификатах, поэтому клиент должен идентифицировать сертификат сервера, проверяя что сертификат подписан с помощью СА и наоборот. После просматривается информация в заголовке сертификата. Это отлично видно в последнем тесте. Итак, вначале следует создать СА, а затем сертификат и секретный ключ для сервера и всех клиентов. Создаем каталог /etc/openvpv/keys и копируем в него все из easy-rsa.

Чтобы меньше вбивать руками, первоначально стоит заглянуть в скрипт vars и подправить значения параметров KEY_COUNTRY, KEY_PROVINCE, KEY_CITY=BISHKEK, KEY_ORG, KEY_EMAIL. Кроме того, параметр KEY_CONFIG, указывает на файл openssl.cnf находящийся в этом же каталоге. Он аналогичен одноименному файлу, используемому OpenSSL, в него также стоит заглянуть, либо, взяв свой вариант в /etc/ssl (если конечно до этого туда кто-то заглядывал). Теперь можно создавать все необходимое:

$ cd easy-rsa

$ sudo ./vars

$ sudo ./clean-all

$ sudo ./build-ca

Если файлы vars и openssl.cnf были подправлены, при создании сертификатов в большинстве ответов можно оставлять значения, предлагаемые по умолчанию. Кроме одного. Поле Common Name в который вписывается имя хоста обязательно к заполнению в любом случае, причем для сервера и для каждого клиента оно должно быть уникальным. По окончании работы в каталоге появятся два файла ca.key и ca.crt. Для проверки сертификатов секретный ключ не нужен, он используется только для подписи. Поэтому, учитывая его значимость, лучше файл ca.key спрятать подальше от чужих глаз.

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

$ sudo ./build-key-server server

$ sudo ./build-dh


И затем для клиентов:


$ sudo ./build-key client1
$ sudo ./build-key-pass client2


Для второго клиента был создан ключ, защищенный паролем. На сервере оставляем файлы
ca.crt, dh1024.pem, server.srt и server.key. На компьютеры клиентов кроме сертификата и ключа переносим и ca.crt.

Создание конфигурационных файлов — сервер


OpenVPN работает по принципу клиент-серверной архитектуры, в одном из двух режимов: routed и bridged. Количество клиентов во втором случае ограничивается только мощностью компьютера, играющего роль сервера. Причем возможен одновременный запуск на одном компьютере нескольких процессов openvpn, каждый из которых считывает собственный конфигурационный файл и работает в режиме сервера или клиента. Таким образом, без проблем создается несколько виртуальных сетей. Есть несколько вариантов запуска сервера. Например, вызов openvpn из командной строки со всеми параметрами в придачу. Сервер может также запускаться через xinetd. Традиционным считается вариант с использованием конфигурационного файла и стартового скрипта в /etc/init.d. Последний и рассмотрим.

Для создания конфигурационного файла сервера воспользуемся имеющимся шаблоном server.conf который находится в подкаталоге sample-config-file. Все параметры в нем хорошо комментированы. Вариантов описания даже одной конфигурации сети, может быть несколько, поэтому рассмотрим лишь один из них. Копируем файл в /etc/openvpn и приступаем к редактированию:


# необязательный параметр, указывающий на каком интерфейсе слушать

# иначе сервер будет принимать соединения на всех интерфейсах

# local 195.95.95.95


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

# port 1194


# тип виртуального устройства (tun, tap, null), в некоторых случаях необходимо указывать и его номер

dev tun


# по умолчанию используется протокол UDP, чтобы использовать tcp следует

# указать на это с помощью proto, возможны варианты udp, tcp, tcp-server, tcp-client

# proto tcp-server


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

comp-lzo


# отсылка
ping пакетов, чтобы межсетевые экраны не разорвали соединения при их неактивности

ping 15


# для
dial-up, NAT, PPP понадобится и следующие параметры

# ping-restart 45

# ping-timer-rem

# persist-tun

# persist-key


# вывод отладочных сообщений, максимальное значение 9 стоит устанавливать только при отладке

verb 3


# назначаем виртуальному интерфейсу
IP-адрес своему 10.1.0.1 и удаленному 10.1.0.2

# используется при соединении точка-точка,

ifconfig 10.1.0.1 10.1.0.2

# при установленном “mode server”, задается пул клиентских адресов

# mode server

# server 10.1.0.0 255.255.255.0

# Скрипт содержащий сведения о новом маршруте

up ./server.up


# удаляем маршрут при остановке

down ./server.down

# добавляем адреса сетей и ресурсов, которые будут доступны клиентам

pushroute 192.168.1.0 255.255.255.0”


# использование
SSL/TLS (только для сервера)

tls-server

# файлы ключей

ca /etc/openvpn/keys/ca.crt

cert /etc/openvpn/keys/server.crt

key /etc/openvpn/keys/server.key

# И Diffie-Hellman Parameters при использовании tls-server

dh /etc/openvpn/keys/dh1024.pem

# пользователь и група от имени которых будет работать программа

user openvpn

group openvpn


Файл server.up содержит информацию о новом маршруте, в простейшем случае запись такая:

route add -net 10.0.1.0 netmask 255.255.255.0 gw 192.168.1.1


Где 192.168.1.1 адрес внутреннего интерфейса сервера OpenVPN. И server.down:

route del -net 10.0.1.0/24

Когда конфигурационный файл создан, можно проверить работу сервера, первый раз лучше сделать это из консоли, куда будут выводиться все сообщения:


$ sudo openvpn —config /etc/openvpn/server.conf

Теперь подсоединяемся telnet:


$ telnet localhost 1194

Если получен ответ сервера, можно продолжать.

В том случае, когда OpenVPN устанавливался из исходных текстов необходимо обеспечить его автоматический запуск при загрузке системы и остановку при выключении. Разработчики заранее подготовили несколько скриптов. В подкаталоге gentoo находится готовый файл openvpn.init для одноименного дистрибутива, в sample-scripts – файл для запуска и остановки OpenVPN в RedHat/Fedora и других RedHat chkconfig-based дистрибутивов. Хотя после небольшой доработки можно использовать их в любом другом дистрибутиве. В общем случае подойдут простые скрипты – openvpn-startup.sh и openvpn-shutdown.sh. Хотя заглянуть внутрь первого также стоит:


#!/bin/sh

# конфигурационный каталог openvpn

dir=/etc/openvpn

# в этом файле есть готовые правила для iptables на все случаи жизни

# если используете его, то самостоятельную загрузку iptables следует отключить

$dir/firewall.sh

modprobe tun


#
включаем IP forwarding

echo 1 > /proc/sys/net/ipv4/ip_forward


#
оставляем одну запись

openvpn —cd $dir —daemon —config server.conf

# openvpn —cd $dir —daemon —config vpn2.conf

# openvpn —cd $dir —daemon —config vpn2.conf

Теперь копируем его в /etc/init.d/, делаем исполняемым и создаем необходимые символические ссылки на уровнях запуска, помня, что OpenVPN желательно загружать, после того как будет поднята сеть:


$ chmod +x openvpn-startup.sh

$ sudo cp openvpn-startup.sh /etc/init.d/

$ sudo ls –n /etc/init.d/openvpn-startup.sh /etc/rc3.d/S99openvpn-startup

$ sudo ls –n /etc/init.d/openvpn-startup.sh /etc/rc5.d/S99openvpn-startup

$ chmod +x openvpn-shutdown.sh

$ sudo cp openvpn-shutdown.sh /etc/init.d/

$ sudo ls –n /etc/init.d/openvpn-shutdown.sh /etc/rc6.d/K80openvpn-shutdown

Настройки iptables

Конечно правила для iptables зависят от конкретной конфигурации в общем случае они выглядят так. Это добавляем в server.up:


/sbin/iptables -I INPUT -p udp —dport 1194 -j LogAccept

/sbin/iptables -I OUTPUT -p udp —sport 1194 -j LogAccept

/sbin/iptables -I FORWARD -s 10.0.1.0/24 -d 192.168.1.0/24 -j LogAccept

/sbin/iptables -I FORWARD -d 10.0.1.0/24 -s 192.168.1.0/24 -j LogAccept


А это в server.down:


/sbin/iptables -D INPUT -p udp —dport 1194 -j LogAccept

/sbin/iptables -D OUTPUT -p udp —sport 1194 -j LogAccept

/sbin/iptables -D FORWARD -s 10.0.1.0/24 -d 192.168.1.0/24 -j LogAccept

/sbin/iptables -D FORWARD -d 10.0.1.0/24 -s 192.168.1.0/24 -j LogAccept

Некоторые варианты настройки iptables можно подсмотреть в файле firewall.sh.

Создание конфигурационных файлов – клиент

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

dev tun

# для клиента обязательно указываем IP-адрес сервера OpenVPN

# если используется стандартный порт (1194), его можно опустить

remote 195.95.95.95 1194

proto udp

comp-lzo

ping 15

verb 3

# обратите внимание, что IP-адреса проставлены наоборот

ifconfig 10.1.0.2 10.1.0.1

up ./client.up

down ./client.down

ca /etc/openvpn/keys/ca.crt

cert /etc/openvpn/keys/client1.crt

key /etc/openvpn/keys/client1.key

user openvpn

group openvpn

Клиент и сервер готовы. Можно запускать и пробовать соединиться. Команда “ifconfig” должна показать наличие “tun0” на обеих компьютерах. Также должен проходить ping по по адресу 10.1.0.2. При этом захваченный с помощью tcpdump пакет на интерфейсах eth0 и tun0 должен отличаться, что говорит о шифровании. Успехов.
 

Фронт-енды для Linux к OpenVPN


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

kovpn (www.enlighter.de), с его помощью можно запускать и останавливать демон, не вызывая консоль, и при запросе вводить имя и пароль. Чуть больше возможностей у (home.gna.org/kvpnc/), здесь и создание ключей, импорт и экспорт конфигурационных файлов и сертификатов, работа с несколькими профилями.

KVpnc

Он к тому же он умеет работать и с некоторыми другими VPN клиентами Cisco VPN (vpnc), IPSec (FreeS/WAN (OpenS/WAN), racoon), PPTP. Имеет к тому же локализованный интерфейс. Написанный на Mono OpenVPN-Admin (openvpn-admin.sf.net), позволяет создавать и управлять сертификатами с помощью понятных мастеров, создавать и работать с несколькими профилями. Есть версии не только для Linux, но и Windows, планируется вариант для Nokia 770. Также мультиплатформенный, написанный на Perl и Tk OpenVPN Control (openvpn-control.sf.net), сего помощью можно просматривать и управлять подключениями к серверу. Есть и модуль к Webmin (www.openit.it/index.php/openit_en/software_libero/openvpnadmin) позволяющий в удобном графическом окружении отредактировать vars, сгенерировать все необходимые ключи и сертификаты, включая DH и управлять ими, создавать серверы и отслеживать активные соединения.

Webmin

 

Обещанный видеофайл

Комментировать

Наверх