Добрый день.
Понадобилось настроить
VPN сервер, в заметке буду использовать
OpenVPN сервер с системой
Ubuntu 12.04.
Теоретическая часть:
VPN ( Virtual Private Network - виртуальная частная сеть) - обобщенное название технологий, позволяющих обеспечить одно или несколько сетевых соединений (логическую сеть) поверх другой сети. Несмотря на то, что коммуникации осуществляются по сетям с меньшим или неизвестным уровнем доверия (например, по публичным сетям), уровень доверия к построенной логической сети не зависит от уровня доверия к базовым сетям благодаря использованию средств криптографии (шифрования, аутентификации, инфраструктуры открытых ключей)
В зависимости от применяемых протоколов и назначений, VPN может обеспечивать соединения трех видов: узел-узел, узел-сеть и сеть-сеть.
Я буду реализовывать соединение типа: узел-сеть. Где будет
OpenVPN сервер (
Ubuntu 12.04) и клиенты:
2 ПК с Windows XP.
OpenVPN - свободная реализация технологии VPN с открытым исходным кодом для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами.
Принцип работы:
Сначала сервер и клиент обмениваются своими публичными ключами (они не секретны и можно их не прятать и не беспокоиться о их доступности). Потом обеими сторонами проводится проверка полученных ключей на предмет легитимности, то есть срок действия, проверка подписи СА, проверка в списке отозванных ключей и так далее. Если все отлично, то начинается обмен данными:
- Отправляемый пакет шифруется с помощью открытого ключа получателя;
- Потом пакет подписывается закрытым ключом отправителя;
- Пакет отправляется на другую сторону;
- У получаемого пакета проверяется подпись с помощью открытого ключа отправителя;
- Если подпись верна. то пакет расшифровывается с помощью закрытого ключа получателя.
В нашем случае Ubuntu будет выступать в роли центра сертификации (
СА) и openvpn сервера, который обеспечивает возможность подключения удаленных клиентов.
Центр сертификации - отдельная папка на винчестере, в которой находятся:
- Пара файлов ca.key и ca.crt - ключ и сертификат центра сертификации;
- Простейшая база данных из двух файлов:
- Файл serial - счетчик;
- Файл index.txt - список выданных сертификатов.
- Файлы уже выданных сертификатов (*.crt) для возможности их отзыва;
- Файл crl.pem, в котором накапливается информация об отозванных ключах;
- Несколько скриптов для генерации новых ключей и сертификатов.
Походу установки и настройки, я буду делать лирические отступления для пояснения. Приступим:
1. Установка openvpn сервера
Пожалуй сама установка самое простое:
# sudo apt-get update
# sudo apt-get install openvpn -y
2. Установка центра сертификации (СА)
Что бы установить свой собственный центр сертификации и сгенерировтаь сертификаты и ключи для OpenVPN сервера и нескольких клиентов необходимо сначала скопировать easy-rsa в каталог /etc/openvpn. Это будет гарантировать, что любые изменения в сценариях не будут потеряны при обновлении пакета.
# sudo mkdir /etc/openvpn/easy-rsa
# sudo cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/
Далее необходимо отредактировать соответствующие строки в конце файла /etc/openvpn/easy-rsa/vars, содержащего различные переменные, которые будут загружаться в командную оболочку перед каждым сеансом генерации сертификатов и ключей.
# sudo nano /etc/openvpn/easy-rsa/vars
Я только поменяю такие строки:
export KEY_COUNTRY="UA" # страна
export KEY_PROVINCE="Crimea" # регион
export KEY_CITY="Sevastopol" # город
export KEY_ORG="home test vpn" # организация
export KEY_EMAIL="qqw1mb0@gmail.com" # почтовый адрес
Это редактирование можно и пропустить, так как при генерации ключей и сертификатов все равно опять будут запрашиваться все эти параметры, просто если этот файл отредактировать, то данные, которые мы вписали будут использоваться по умолчанию. Да и вообще эти данные можно не изменять, если вы не серьезная контора. Так как никакой функциональной нагрузки они не несут.
Создадим главный сертификат центра сертификации (СА) и ключ:
# cd /etc/openvpn/easy-rsa
# source vars
Скорее всего мы увидим такое сообщение об отсутсвтии файла openssl.cnf, если же его нет то можно пропустить этот момент. Благо разработчики OpenVPN о нас позаботились и в папке /etc/openvpn/easy-rsa уже есть несколько шаблонов: openssl-0.9.6.cnf , openssl-0.9.8.cnf , openssl-1.0.0.cnf , openssl-1.0.0.cnf-old-copy.
Узнаем, какая версия openssl стоит у нас в системе:
# aptitude show openssl
Нас интересует строка Version, в ней указано 1.0.1-4ubuntu5.9.
Ну что же, файла с такой версией нет, но нам подойдет и openssl-1.0.0.cnf , переименуем его, так как нам нужен файл openssl.cnf:
# sudo mv openssl-1.0.0.cnf openssl.cnf
Теперь мы можем загрузить переменные:
# source vars
или можно воспользоваться: # . vars , так как "source" одно и тоже что "." .
На что мы должны получить ответ:
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
Вот как раз дальше мы и выполним:
# ./clean-all
Однако на это мы получим ответ:
mkdir: cannot create directory `/etc/openvpn/easy-rsa/keys': Permission denied
Интересно и почему так? а потому что мы копировали easy-rsa с правами суперпользователя (root) и владельцем всего easy-rsa является root, а мы выполняем ./clean-all с правами пользователя.
Я решил эту проблему так:
# sudo chown -R $USER /etc/openvpn/easy-rsa/
Переменная $USER - это переменная в которой хранится имя пользователя. Вот так мы сделали владельцем каталога easy-rsa своего пользователя. Теперь выполним, то что хотели:
# ./clean-all
И мы не увидим никаких ошибок. И сгенерируем наконец сертификат и ключ центра сертификации:
# ./build-ca
Теперь в /etc/openvpn/easy-rsa/keys лежат сертификат центра сертификации ca.crt и приватный ключ центра сертификации ca.key. Сертификат центра сертификации находится как на сервере, так и на клиенте, так что в будущем его надо будет скопировать на клиентскую машину, но об этом позже.
Приватный ключ центра сертификации чрезвычайно секретный и не должен попасть в чужие руки. Нужно как можно лучше его спрятать, после генерации ключей для клиентов.
3. Сертификаты сервера
Далее мы сгенерируем сертификат и закрытый ключ для OpenVPN сервера:
# ./build-key-server server1
где server1 любое имя вашего OpenVPN сервера.
Большая часть вопросов аналогична вопросам при генерации сертификата и ключа для центра сертификации однако есть и новые поля:
Часть я обрезал, что бы скрины не были уж слишком большими.
Больше всего нас интересуют два вопроса:
- Sign the certificate? [y/n]:
- 1 out of 1 certificate requests certified, commit? [y/n]:
На которые нужно ответить утвердительно: y
Для сервера OpenVPN необходимо использовать алгоритм Диффи-Хеллмана:
# ./build-dh
Вывод будет примерно таким:
Все сертификаты и ключи были сгенерированы в подкаталоге keys/. Обычно их копируют в /etc/openvpn/ , зачем и мне отличаться? Да и потом в конфиге меньше букв набирать:
# cd keys/
# sudo cp ca.crt dh1024.pem server1.crt server1.key /etc/openvpn/
4. Конфигурация сервера OpenVPN
Вместе с утсновкой OpenVPN мы получаем примеры нужных нам конфигурационных файлов (и многих других, если присмотреться):
# ls -l /usr/share/doc/openvpn/examples/sample-config-files/
Однако нас интересует один файл server.conf.gz.
Скопируем его в /etc/openvpn/ и разархивируем:
# cd /etc/openvpn
# sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
# sudo gzip -d server.conf.gz
Отредактируем server.conf:
# sudo nano server.conf
так, что бы убедиться, что следующие строки указывают на корректные сертификаты и ключи:
ca ca.crt
cert server1.crt
key server1.key
dh dh1024.pem
Тут мне пришлось изменить только строки cert и key, так как я назвал свой сервер: server1, а по умолчанию идет: server.
Так же на самом деле можно как угодно назвать файлы, главное указать в соответсвтующих строках (это может помочь сбить с толку злоумышленника).
Стандартных настроек server.conf вполне хватает для работоспособного сервера, однако вы можете по изучать интернет на эту тему, с OpenVPN можно делать очень интересные и хитрые штуки.
Стартанем OpenVPN сервер:
# sudo /etc/init.d/openvpn start
Демон успешно стартовал. Проверим, создался ли сетевой интерфейс:
# ifconfig tun0
По умолчанию OpenVPN первому серверу назначает первый IP: 10.8.0.1. Нас это вполне устраивает. Так что перейдем к настройке клиентов.
5. Генерация сертификатов и ключей для клиентов.
Для каждого клиента необходимо индивидуально создавать ключи и сертификаты:
# cd /etc/openvpn/easy-rsa/
# source vars
# ./build-key client1
Вывод будет такой же, как при создании ключа и сертификата для сервера OpenVPN (пункт 3).
В подкаталоге keys/ появиться три файла: client1.crt - сертификат, client1.key - ключ, clien1.csr - вроде как мусор, он нам дальше не пригодится.
Необходимо каким либо безопасным образом скопировать файлы:
ca.crt , clien1.crt, client1.key скопировать на клиентский компьютер.
Так же поступим для генерации ключа и сертификата для второго клиента:
# cd /etc/openvpn/easy-rsa/
# source vars
# ./build-key client2
Для копирования на Windows клиенты можно воспользоваться WinSCP или существует много других способов.
6. serial и index.txt
Ранее я упоминал об этих файлах:
serial - серийный номер;
index.txt - список выданных ключей.
можно глянуть их содержимое:
# cat /etc/openvpn/easy-rsa/keys/serial
04
# cat /etc/openvpn/easy-rsa/keys/index.txt
Так же можно избавиться от файлов: client1.crt, client1.csr, client1.key, client2.crt, client2.csr, client2.key:
# rm client*
7. Настройка клиентов Windows XP
И скачиваем openvpn-2.0.9-gui-1.0.3-install.exe
Устанавливаем OpenVPN GUI соглашаясь со всеми пунктами.
Теперь возьмем файлы: ca.crt, client2.crt, client2.key и скопируем в каталог:
C:\Program Files\OpenVPN\config
Далее возьмем файл C:\Program Files\OpenVPN\sample-config\client.ovpn и скопируем его в C:\Program Files\OpenVPN\config.
У меня почему-то файлы сертификатов (*.crt) поменяли расширение на *.cer. Но это не страшно, просто главное заметить.
UPD: Если расширение файла у вас не поменялось с crt на cer, то в конфиге нужно указывать соответственно то расширение, которое имеют файлы (если у файлов расширение crt то в конфиге нужно указать: ca ca.crt и cert client2.crt). Спасибо за уточнение Мостовому Павлу.
Откроем файл C:\Program Files\OpenVPN\config\client.ovpn и приведем к такому виду:
client
dev tun
proto udp
remote 192.168.1.104 1194 # Это адрес моего OpenVPN сервера, а 1194 - стандартный порт для OpenVPN
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.cer
cert client2.cer
key client2.key
comp-lzo
verb 3
Теперь нажмем дважды на значок OpenVPN GUI в трее:
И увидим примерно такую картину:
А после успешного подключения увидим в трее:
Теперь вспомним, что когда мы запустили OpenVPN сервер у нас получил IP-адрес: 10.8.0.1 и попробуем его пропинговать:
И это при том, что у меня в сети адреса были только в диапазоне: 192.168.1.0/36
Вот мы и получили рабочий сервер OpenVPN и подключили к нему клиентов.
Далее я напишу заметку, для чего я все это делал.
Ссылки:
Большую часть информации я взял отсюда, хорошая статья:
тыц
Описание много чего в конфиге OpenVPN:
тыц