OpenVPN
Настраиваем OpenVPN-сервер (Ubuntu) и клиента (Gentoo).
Сервер
Во-первых, openvpn нужно поставить. На Debian-based дистрибутивах это делается командой
apt-get install openvpn openvpn-blacklist
Сертификаты
Сразу скажу, что здесь я немного схалтурил: поскольку ко всем машинам, на которые мне нужно распространить сертификаты, у меня есть физический доступ, а делать отдельный сервер для CA (Certificate Authority) мне не хотелось (да и лишних железок у меня нет), я сгенерировал все сертификаты непосредственно на сервере, а потом раскидал их по scp куда надо. Нам понадобятся следующие сертификаты:
- Корневой сертификат CA и его ключ.
- Сертификат сервера и его ключ.
- Сертификаты клиентов и соответсвующие им ключи.
Так же нужно будет сгенерировать параметры Диффи-Хеллмана Все ключи - секретные, соответственно, нужно проявить осторожность в обращении с ними. В генерации ключей нам поможет пакет утилит 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. Большая часть материалов - именно оттуда.