Еще раз об OpenVPN

Уже как-то описывал настройку OpenVPN сервера и клиентов, но это было давно и не правда, а сегодня (внезапно) друг решился настроить правильный шлюз, и правильный VPN
Все команды по установке OpenVPN, создание моста и пути указаны для уже родного ubuntu-server, но упор сделан на то, чтобы после вдумчивого чтения проблем не возникло в любом дистрибутиве, и даже другой OS.

Задача изначально такая: сделать так, чтобы люди могли подключиться к рабочей сети (увидеть сетевые компьютеры, принтеры, диски, и что там обычно еще видят)
В качестве решения: OpenVPN в режиме моста (bridge) с адаптером смотрящим в сеть.
Конфигурация OpenVPN-сервера будет состоять из

Ну и запуск всего этого дела, конечно.

Установка

Начнем с установки OpenVPN и bridge-utils (они необходимы для создания сетевого моста):
в убунту она выполняется так же просто, как и всегда:

$ sudo apt-get -y install openvpn bridge-utils easy-rsa

Все необходимые пакеты apt-get установит сам, ничего сложного. Далее применим немного магии easy-rsa и создадим папку с ключами:

$ make-cadir keys_dir && cd keys_dir

Далее все действия с ключами и сертификатами будут выполняться именно в этой скопированной папке.
По желанию можно подредактировать файл vars , в нем указаны параметры по-умолчанию для создаваемых ключей, в частности: страна, город, организация и e-mail.
Для успешной генерации всех ключей и сертификатов необходимо установить все переменные среды указанные в файле vars, выполняется это командой

$ source ./vars

Далее очищаем (или создаем) папку со всем добром:

$ ./clean-all

Осторожно! Если вы уже создавали ключи они будут удаленны этой командой!

Certificate Authority (CA):

Это мастер-ключ центра сертификации, OpenVPN – им должны быть подписаны все сертификаты используемые OpepVPN, поэтому создавать нужно в первую очередь

$ ./build-ca

Эта команда (как и остальные build-*) попросит ответить на вопросы о создаваемом сертификате (значения по-умолчанию, как уже упоминалось выше берутся из файла vars), после чего создаст файлы (в папке keys)
ca.crt – сертификат, он нужем всем и клиентам, и серверу
ca.key – мастер-ключ, нужен только для создания новых ключей

Файл параметров Diffie Hellman (DH)

Это файл параметров Алгоритма Диффи-Хеллмана, используемого для получения общего секретного ключа при соединении, подробнее можно почитать на википедии, довольно познавательно
Создается он так же просто как и все остальное:

$ ./build-dh

Эта команда займет около минуты времени и создаст файл dh1024.pem — он нужен только серверу

Сертификат и ключ сервера

Создается командой

$ ./build-key-server server

где параметр команды — имя файла. После стандартных, для создания сертификата, вопросов, просьбы ввести пароль (его оставить пустым) подписания сертификата CA-ключем в папке keys появятся файлы server.crt и server.key, это сертификат и секретный ключ сервера. (если параметр команды был другой, имена файлов соответственно изменятся)

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

$ ./build-key client

Параметр команды, так же как и для сервера — имя файла. Команда задаст те же вопросы что и для сертификата сервера, и так же попросит подписать их CA-ключем. После выполнения появятся файлы client.crt и client.key, они будут использоваться только клиентом. В идеале для каждого клиента нужен свой ключ поэтому эту процедуру придется повторить столь раз, сколько планируется подключать клиентов.

Конфигурация сервера

В ubuntu скрипт инициализации /etc/init.d/openvpn находит все файлы конфигурации /etc/openvpn/*.conf и запускает столько экземпляров OpenVPN, сколько файлов было найдено.
Примеры конфигурации можно найти в папке /usr/share/doc/openvpn/examples/sample-config-files (в ubuntu) или на сайте OpenVPN.
В файле конфигурации указаны пути до файлов ca.crt, server.crt, server.key и dh1024.pem, в примере они скопированны в папку /etc/openvpn/
Доступ к файлам *.key должен быть 600 (права на чтение/запись только у владельца)
Конфиг для запуска OpenVPN в режиме server-bridge будет выглядеть примерно так:

port 1194 # порт сервера
proto udp # протокол udp или tcp
dev tap0   # создать виртуальный ethernet-туннель tap0
#будет запущен сервер в режиме моста
#адрес сети 192.168.0.0 маска 255.255.255.0
#клинетам будут выданы адреса с 192.168.0.100 по 192.168.0.200
server-bridge 192.168.0.0 255.255.255.0 192.168.0.100 192.168.0.200
# путь до CA-сертификатаcert 
ca /etc/openvpn/ca.crt 
# путь до сертификата сервера
cert /etc/openvpn/server.crt 
# путь до секретного ключа сервера
key /etc/openvpn/server.key  
# путь к файлу параметров DH
dh /etc/openvpn/dh1024.pem 
# - эта опция позволит подключиться нескольким клиентам 
#с одинаковыми ключами (один ключ на всех)
duplicate-cn 
# проверять соединение каждые 10 секунд, 
# перезапускать если все проверки за последние 120 секунд провалились
keepalive 10 120 
# сжимать трафик, крайне полезная опция
comp-lzo 
# избегать доступа к ресурсам при перезапуске соединения
# к ключам
persist-key 
# к адаптерам туннеля 
persist-tun  
# путь к статус-логу
status /var/log/openvpn/openvpn-status.log 
#подробность лога
verb 3

сервер запускается командой

$ sudo /etc/init.d/openvpn start

В ubuntu-server стартует по-умолчанию, если найден хотя бы один файл конфигурации

Продолжение следует

Ссылки:
Сайт OpenVPN
Наиподробнейший how-to по OpenVPN
Описание алгоритма DH на вики