вторник, 18 июня 2013 г.

OpenVPN сервер на Ubuntu 12.04 и подключение клиентов (Windows)

Добрый день.

Понадобилось настроить 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

Переходим на страницу: http://openvpn.se/download.html
И скачиваем 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: тыц

7 комментариев:

  1. Привет, спасибо за мануал. Все настроил по нему на сервере DigitalOcean. Только в качестве клиента mac os через Tunellblick.

    Все подключается и авторизируется, пингуется айпи 10.8.0.1, только весь трафик идет мимо vpn соединения. Как можно заставить весь трафик идти через vpn? Спасибо!

    ОтветитьУдалить
  2. Не понятно как ca.crt, client2.crt, client2.key и скопировать в каталог:
    C:\Program Files\OpenVPN\config. Для этого ведь необходимо настроить сеть?

    ОтветитьУдалить
  3. Лично я копировал их на свой ПК и отправлял нужному человеку на мыло...

    ОтветитьУдалить
  4. Если будет такая ошибка:
    ERROR: Windows route add command failed [adaptive]: returned error code 1

    то надо запустить openvpn-gui от имени администратора.

    ОтветитьУдалить
  5. Делал все как написано. Нет подключения. в чем причина не пойму. В линуксе новичек

    ОтветитьУдалить
  6. Спасибо за пост. В некоторых случаях нужно быстро поднять тунель между двома точками. И самый быстрый способ с минимальной безопасностью, это общий ключ, как пишут, к примеру здесь - http://sysadm.pp.ua/linux/shifrovanie/openvpn-point-to-point.html . Генерацию ключей через OpenSSL никто не подскажет как делать?

    ОтветитьУдалить