OpenVPN: кроссплатформенный инструмент для создания виртуальных сетей
Сергей «grinder» Яремчук (grinder@ua.fm, )
Сегодня не часто встретишь ситуацию, когда все подразделения компании находятся в пределах одного здания. Поэтому рано или поздно перед системным администратором встает задача обеспечить удобный и безопасный доступ к внутренним ресурсам. А значит, объединить территориально разнесенные сети с помощью надежного и защищенного канала, обеспечивающего защиту от прослушивания и вмешательства из вне. В этой ситуации на помощь приходят виртуальные частные сети.
Содержание:
- Проект OpenVPN
- Установка OpenVPN
- Создание ключей сервера и клиентов
- Создание конфигурационных файлов – сервер
- Настройки iptables
- Создание конфигурационных файлов – клиент
- Врезка: Фронт-енды для Linux к OpenVPN
В настоящее время существует множество различных решений, позволяющих создавать виртуальные частные сети (ВЧС, англ. Virtual Private Network – VPN), остановим свой выбор на . Это полнофункциональное решение, созданное на основе 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 находится в репозитариях практически всех дистрибутивов. Поэтому в большинстве случаев достаточно ввести что-то вроде «sudo apt-get install openvpn» или «yum install openvpn». Впрочем, сборка из исходных текстов также не сложна. Если ядро собиралось самостоятельно, следует убедиться, что в системе присутствуют устройства tun/tap:
$ sudo modprobe tun $ 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-2.0.9.tar.gz $ cd openvpn-2.0.9
Когда в системе есть все необходимое, для установки хватает и стандартных «./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, удобнее создать подкаталог для каждого, чтобы затем не путаться в назначении конфигурационных файлов.
Создание ключей сервера и клиентов
Как генерировать статический ключ, показано выше («openvpn --genkey»). В этом случае один ключ используется на сервере и клиентах. Это удобно, но весьма рискованно. Если ключ попадет к злоумышленнику, он сможет расшифровывать всю информацию, передаваемую по сети.
Сертификаты и ключи для сервера и клиентов необходимы при асимметричном шифровании. Проще и удобнее создавать их не вручную, а с помощью скриптов, находящихся в подкаталоге easy-rsa (к слову, в подкаталоге Windows имеются и bat файлы). Их здесь несколько:
- Корневой сертификат (CA – Certificate Authority) – build-ca (для подписи сертификатов сервера и клиентов);
- Ключ и сертификат сервера – build-key-server;
- Ключи для клиентов – простые (build-key) и защищенные паролем (build-key-pass);
- Ключи PKCS (Public Key Cryptography Standards) – build-key-pkcs12 (подойдут для хранения на сменных носителях, вроде eToken);
- Создать сертификат и ключ, если СА не доступен в локальной системе – простой (build-req), защищенный паролем (build-req-pass), и подписать их (sign-req);
- Создать сертификат и ключ, используя корневой СА – build-inter;
- Создать ключ Diffie Helman – build-dh (используется при установленном соединении для шифрования трафика);
- Отозвать – сертификат (revoke-crt);
- Отозвать с созданием списка отозванных сертификатов (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 работает по принципу клиент-серверной архитектуры в одном из двух режимов: точка-точка или сервер-клиенты. Количество клиентов во втором случае ограничивается только мощностью компьютера, играющего роль сервера. Причем возможен одновременный запуск на одном компьютере нескольких процессов openvpn, каждый из которых считывает собственный конфигурационный файл и работает в режиме сервера или клиента. Таким образом без проблем создается несколько виртуальных сетей.
Есть несколько вариантов запуска сервера. Например, вызов openvpn из командной строки со всеми параметрами в придачу. Сервер может также запускаться через xinetd. Традиционным считается вариант с использованием конфигурационного файла в /etc/openvpn и стартового скрипта в /etc/init.d. Последний и рассмотрим.
Для создания конфигурационного файла сервера воспользуемся имеющимся шаблоном server.conf, который находится в подкаталоге sample-config-file. Все параметры в нем хорошо прокомментированы. Вариантов описания даже одной конфигурации сети может быть несколько, поэтому рассмотрим лишь один из них. Копируем файл в /etc/openvpn и приступаем к редактированию:
# vi /etc/openvpn/server.conf # Необязательный параметр, указывающий на каком интерфейсе слушать, # иначе сервер будет принимать соединения на всех интерфейсах # local 195.95.95.95 # Если используется несколько серверов, каждый должен работать на своем порту # port 1194 # Тип виртуального устройства (tun, tap, null), в некоторых случаях необходимо # указывать и его номер dev tun # По умолчанию используется протокол UDP, возможные варианты: tcp, udp, # 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 # Добавляем адреса сетей и ресурсов, которые будут доступны клиентам push "route 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 при использовании 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 и других chkconfig-based дистрибутивов. Хотя после небольшой доработки можно использовать их в любом другом дистрибутиве. В общем случае подойдут простые скрипты – openvpn-startup.sh и openvpn-shutdown.sh. Хотя заглянуть внутрь первого также стоит:
# vi openvpn-startup.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 # cp openvpn-startup.sh /etc/init.d # ls –n /etc/init.d/openvpn-startup.sh /etc/rc3.d/S99openvpn-startup # ls –n /etc/init.d/openvpn-startup.sh /etc/rc5.d/S99openvpn-startup # chmod +x openvpn-shutdown.sh # cp openvpn-shutdown.sh /etc/init.d # ls –n /etc/init.d/openvpn-shutdown.sh /etc/rc6.d/K80openvpn-shutdown
Конечно, правила для iptables зависят от конкретной конфигурации, но в общем случае они должны выглядеть так:
# vi 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 # vi 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. Конфигурационные файлы клиентов, подключающихся к одному серверу, будут отличаться лишь названиями файлов ключей и некоторыми сетевыми настройками.
# vi client.conf dev tun # Для клиента обязательно указываем IP-адрес и порт сервера OpenVPN 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 нужно выполнять путем прямого редактирования конфигурационных файлов. Доступны графические интерфейсы, позволяющие сделать это легко и просто. Самым простым является , с его помощью можно запускать и останавливать демон, не вызывая консоль, при запросе вводить имя и пароль.
Чуть больше возможностей у . Здесь и создание ключей, импорт и экспорт конфигурационных файлов и сертификатов, работа с несколькими профилями. Умеет работать и с некоторыми другими VPN клиентами Cisco VPN (vpnc), IPSec (FreeS/WAN (OpenS/WAN), racoon), PPTP. Имеет к тому же локализованный интерфейс.
, написанный на Mono, позволяет создавать и управлять сертификатами с помощью понятных мастеров, создавать и работать с несколькими профилями.
Есть версии не только для *nix, но и Windows, планируется вариант для Nokia 770. Также существует – мультиплатформенный фронт-енд, написанный на Perl и Tk. С его помощью можно просматривать и управлять подключениями к серверу.
Есть и модуль к , позволяющий в удобном графическом окружении отредактировать vars, сгенерировать все необходимые ключи и сертификаты, создавать серверы и отслеживать активные соединения.
Статья опубликована в апрельском номере журнала «Xakep» за 2007 год.




