OpenVPN

Опубликовано 21 Февраля, 2009 под тегами openssl, openvpn, Debian, Gentoo, Ubuntu, Сеть

Настраиваем OpenVPN-сервер (Ubuntu) и клиента (Gentoo).

Сервер

Во-первых, openvpn нужно поставить. На Debian-based дистрибутивах это делается командой

apt-get install openvpn openvpn-blacklist

Сертификаты

Сразу скажу, что здесь я немного схалтурил: поскольку ко всем машинам, на которые мне нужно распространить сертификаты, у меня есть физический доступ, а делать отдельный сервер для CA (Certificate Authority) мне не хотелось (да и лишних железок у меня нет), я сгенерировал все сертификаты непосредственно на сервере, а потом раскидал их по scp куда надо. Нам понадобятся следующие сертификаты:

  1. Корневой сертификат CA и его ключ.
  2. Сертификат сервера и его ключ.
  3. Сертификаты клиентов и соответсвующие им ключи.

Так же нужно будет сгенерировать параметры Диффи-Хеллмана Все ключи - секретные, соответственно, нужно проявить осторожность в обращении с ними. В генерации ключей нам поможет пакет утилит easy-rsa, идущий в комплекте документации openvpn. Удобства для (и чтобы обновления пакета не перезаписали мои ключи), я скопировал набор скриптов в /etc/openvpn:

cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn/
cd /etc/openvpn/easy-rsa/2.0/

Для инициализации скриптов так же следует выполнить команды:

. ./vars
./clean-all #Опционально, она в основном удаляет сгенерированные ключи.
#Кстати, осторожнее, когда понадобится добавить нового клиента - удалять
#все сертификаты в этом случае, очевидно, не нужно.

CA

./build-ca

Скрипт (вернее, вызванный из него openssl) задаст несколько простых вопросов, на которые труда ответить не составит. Здесь нужно иметь ввиду, что Common Name - это не имя хоста, а имя центра сертификации, и если имя сервера/любого клиента будет совпадать с CN CA, соединение будет отвергнуто. Пример результата работы скрипта (из OpenVPN HOWTO)

Generating a 1024 bit RSA private key
............++++++
...........++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KG]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [BISHKEK]:
Organization Name (eg, company) [OpenVPN-TEST]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:OpenVPN-CA
Email Address [me@myhost.mydomain]:

Сертификат сервера

./build-key-server server

Common Name желательно должно соответствовать имени сервера (в идеале - полное доменное имя).  На вопросы “Sign the certificate? [y/n]” и “1 out of 1 certificate requests certified, commit? [y/n]” нужно ответить положительно.

Сертификаты клиентов

./build-key client1
./build-key client2
./build-key client3
...

За исключением названия команды, все то же самое, что и в случае с сертификатом сервера. CN желательно соответствующим hostname клиента, хотя это не особо важно. Важнее чтобы не было совпадающих CN.

Параметры Диффи-Хеллмана

Вкратце, они нужны для обмена секретными ключами по незашифрованному соединению. Подробнее можно прочитать на википедии.

./build-dh

Распределение ключей

На самом деле, здесь все довольно просто: все конечные точки (клиенты и сервер) должны иметь собственный сертификат, его ключ и сертификат центра сертификации (CA). Обращаю внимание, что самое слабое место во всей схеме - это ключ сертификата CA, ибо если будет скомпрометирован он, придется перегенерировать все сертификаты. Поэтому ключ сертификата CA нужно хранить как зеницу ока в недоступном для детей… то есть нехороших людей месте.

В терминах файлов, лежащих теперь в /etc/openvpn/easy-rsa/2.0/keys:

  • ca.crt должен быть в папке /etc/openvpn на сервере и на всех клиентах
  • ca.key в идеале должен быть на шифрованном носителе в несгораемом сейфе. На практике сойдет и где-нибудь попроще, в зависимости от степени вашей паранойи.
  • server.crt должен быть в папке /etc/openvpn на сервере
  • server.key должен быть в папке /etc/openvpn на сервере (и только там)
  • clientN.crt должен быть на соответствующем клиенте
  • clientN.key должен быть на соответствующем клиенте (и только на нем)
  • dh1024.pem должен лежать на сервере в папке /etc/openvpn

Покидать файлы можно, например, при помощи scp. На всякий случай можно сделать бэкапы ключей, но хранить их имеет смысл там же, где и ca.key, с теми же мерами предосторожности.

Настройка сервера

Настройка сервера достаточно тривиальна. Помимо подробной документации, есть примеры конфигурации, которыми я и рекомендую воспользоваться:

cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn
cd /etc/openvpn
gunzip server.conf.gz
$EDITOR server.conf

Из соображений безопасности, я не стану приводить свой конфиг дословно, а просто укажу, какие параметры следует отредактировать.

Во-первых, следует выбрать между tcp и udp, соответственно параметром

proto tcp
proto udp

Если вас не устраивает адресация виртуальной сети по умолчанию (10.8.0.0/24), то нужно изменить параметр server: server ip_family netmask

Например: server 192.168.0.0 255.255.255.0

Далее, если вы хотите, чтобы VPN-клиенты “видели” друг друга, раскомментируйте параметр client-to-client

Можно так же немного усилить безопасность, раскомментировав user nobody group nobody

Клиент

Как уже было упомянуто выше, я использовал в качестве тестовой клиентской машины Gentoo. Соответственно, нужно опять же, поставить OpenVPN:

emerge -a openvpn

Рекомендую USE=examples, однако можно обойтись и без этого.

Далее мы (если еще этого не сделали) кидаем в /etc/openvpn сгенерированные на сервере сертификаты и ключ:

  • ca.crt
  • client1.crt
  • client1.key

Помимо этого, я утянул пример клиентской конфигурации с сервера (/usr/share/doc/openvpn/examples/sample-config-files/client.conf).

В нем (/etc/openvpn/client.conf) необходимо исправить следующие параметры:

  • proto (по умолчанию proto udp)
  • remote your_server port Порт по умолчанию - 1194, вместо your_server, естественно, вписать адрес/доменное имя OpenVPN-сервера.
  • Возможно, осмысленно раскомментирвать user nobody group nobody
  • cert client1.crt key client1.key

Собственно, это все. Настройка клиента закончена.

Чтобы запустить OpenVPN-сессию, можно либо выполнить /etc/init.d/openvpn start либо перейти в /etc/openvpn и выполнить openvpn client.conf

Второй вариант так же выводит много отладочной информации.

Ссылки

OpenVPN Official HOWTO можно найти по адресу http://openvpn.net/index.php/documentation/howto.html. Большая часть материалов - именно оттуда.