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-сертификатов и ключей. Посмотреть, какие алгоритмы шифрования доступны, можно с помощью команды:
Результатом должно быть сообщение о том, что «OpenVPN crypto self-test mode SUCCEEDED».
Для проверки работы с асимметричными ключами следует воспользоваться готовыми конфигурационными файлами, которые находятся в подкаталоге sample-config-files архива. В разных консолях выполняем следующие команды:
Если в ответ мы получаем «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
# Отправка icmp-пакетов, чтобы межсетевые экраны не разорвали соединения при их неактивности
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 содержит информацию о новом маршруте, в простейшем случае запись такая:
Здесь 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
$ 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 зависят от конкретной конфигурации, но в общем случае они должны выглядеть так:
Некоторые варианты настройки 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 на обоих компьютерах. По адресу 10.1.0.2 должен проходить ping. При этом о шифровании будет свидетельствовать то, что захваченный с помощью tcpdump пакет на интерфейсах eth0 и tun0 отличается. Успехов.