Данная статья не претендует на исчерпывающее повествование по данной
теме. В ней не раскрываются все возможности и опции настройки пакетов
OpenSSL (http://www.openssl.org/) и OpenVPN (http://www.openvpn.net/).
За более подробной информацией рекомендуется обратится на сайты
разработчиков и man-страницы.
Все Изложенное тут является результатом попытки автора решить прикладную
задачу подключения удаленных клиентов к серверу не используя при этом
статические ключи и дополнительное ПО для управления ключами и
сертификатами.
Статья писалась как пошаговое руководство-инструкция для начинающих,
позволяющее "с нуля" настроить соединение 2-х и более машин по
технологии VPN, используя свободно-распространяемое ПО.
Начиная с версии 2 в пакете OpenVPN появилась возможность создавать
соединения типа точка-многоточка с использованием на сервере одного
виртуального адаптера - tap/tun - и как следствие использовать один
процес демона OpenVPN.
Установка и настройка производится на машине с установленной ОС FreeBSD,
настроенной сетевой подсистемой и доступом в Интернет. Автор описал
процесс настройки под FreeBSD 4.11-RELEASE-p11 и FreeBSD
5.3-RELEASE-p20, который проверил сам лично.
На машине были установлены пакеты (устанавливалось из коллекции портов
при помощи portinstall):
- OpenSSL v. 0.9.7g
- OpenVPN v. 2.0.2
Создание Certificate Authority (CA)
После установки OpenSSL, файл конфигурации (openssl.cnf), потребуется
отредактировать, чтобы при необходимости изменить каталоги в которых
будут располагаться ключи, сертификаты и прочее во время настройки, а
также имена и наименование организации.
Как правило, конфиг располагается в каталоге /usr/local/openssl/, либо в /etc/ssl/.
После редактирования openssl.cnf делаем следующее:
Создаем файл /usr/local/openssl/serial c содержимым '01'
# touch serial
# echo 01 > serial
Создаем каталоги /crl, /newcerts, /private
# mkdir crl newcerts private
Для каталога private, в целях безопастности частного ключа сервера,
рекомендую установить права только для пользователя root
Теперь, когда мы имеем CA, мы можем создавать сертификаты и ключи для
машин, образующих туннель. Вместо host_x и client_x рекомендую
указывать осмысленное имя вашей машины-сервера и клиентов, что бы потом
не запутаться самому.
Сгенерируем частный ключ для сервера, его настоятельно рекомендуется
хранить в тайне:
И в конце создаем ключик ta.key. Этот ключ используется для
предотвращения DoS атак и UDP port flooding
# openvpn --genkey --secret ta.key
Таким образом мы получили подписанный нами же сертификат X.509.
Необходимо повторить эти действия для всех имеющихся у нас машин.
Далее создать ключ Диффи Хельман (подробнее о нем
http://www.rsasecurity.com/rsalabs/node.asp?id=2248).Этот ключ
используется для шифрования трафика при установлении соединения:
# openssl dhparam -out dh1024.pem 1024
Теперь переходим к конфигурированию самого OpenVPN.
Файл конфигурации для сервера у меня находится в /usr/local/etc/openvpn/
и выглядит так:
proto udp
dev tap0 # использую tap, хотя можно и tun (рекомендуется)
port 1194
После создания файлов конфигурации, запускаем демона openvpn на сервере:
# sh /usr/local/etc/rc.d/openvpn.sh start (скрипт созданный при инсталляции)
Проверяем запустился ли демон:
# sockstat | grep openvpn
Если видим что-то вроде:
nobody openvpn 33072 3 udp4 *:1194 *:*
значит сервер готово принимать входящие подключения.
Далее запускаем клиента на своей машине. Рекомендую использовать GUI
оболочку, если клиентом будет являться машина с Windows.
Если клиентом выступает машина с FreeBSD , то запуск аналогичен
серверной части.
Для прояснения некоторых моментов образования соединения нелишним будет
изучить вывод, который пишется в /var/log/openvpn.log.
Именно используя его, автор получил большую часть информации
пригодившейся при отладке конфигов. Регулировать детализацию
логирования помогает ключик 'verb',
Для более детального изучения возможностей OpenVPN, настоятельно
рекомендую изучить примеры конфигов: http://openvpn.net/howto.html#examples
Ну и конечно рекомендуется не забывать о том, что многие ошибки кто-то
совершал и с проблемами сталкивался, а потому Google ваш помощник :)