Блог Андрея Боровкова

О СЕБЕ И О ТОМ ЧТО ИНТЕРЕСНО

OpenVPN — описание настройки на практике

by borovkovadmin on 01.09.2013, no comments

OpenVPNOpenVPN на практике 

По мотивам статьи
http://sergeysl.pnz.ru/freebsd/openvpnx509.php
Берем либо установленный либо устанавливаем OpenVPN

1) Создаем структуру директорий
mkdir /etc/openvpn/
cd /etc/openvpn/
mkdir ccd
mkdir certs
mkdir crl
mkdir keys
mkdir private
mkdir req
chmod 700 keys private
echo «01» > serial
touch index.txt

Указанные команды создают папку /etc/openvpn; вложенные в нее папки: ccd (конфигурации удаленных клиентов), certs (сертификаты клиентов и сервера), crl (списки отзыва сертификатов), keys (закрытые ключи сертификатов клиентов и сервера), private (закрытый ключ самоподписного доверенного сертификата (CA), req (запросы на сертификаты); ограничивают права доступа к каталогам keys и private; создают базу данных сертификатов (файлы serial и index.txt).

2) Файл конфигурации OpenSSL
По умолчанию OpenSSL использует глобальный файл конфигурации /etc/ssl/openssl.cnf. Я рекомендую создать в папке /etc/openvpn отдельный файл конфигурации OpenSSL для OpenVPN. Данный файл должен называться openssl.cnf и иметь следующее содержимое:

[ ca ]
default_ca = CA_default

[ CA_default ]
dir = /etc/openvpn/certs
crl_dir = $dir/crl
database = $dir/index.txt
new_certs_dir = $dir/certs
certificate = $dir/CA_cert.pem
serial = $dir/serial
crl = $dir/crl/crl.pem
private_key = $dir/private/CA_key.pem
RANDFILE = $dir/private/.rand
default_days = 3650
default_crl_days = 365
default_md = md5
unique_subject = yes
policy = policy_any
x509_extensions = user_extensions

[ policy_any ]
organizationName = match
organizationalUnitName = optional
commonName = supplied

[ req ]
default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
x509_extensions = CA_extensions

[ req_distinguished_name ]
organizationName = NAME
organizationName_default = NAME
organizationalUnitName = OIT
commonName = net.local
commonName_max = 64

[ user_extensions ]
basicConstraints = CA:FALSE

[ CA_extensions ]
basicConstraints = CA:TRUE
default_days = 3650

[ server ]
basicConstraints = CA:FALSE
nsCertType = server

3) Создание самоподписного доверенного сертификата (CA)
Для создания самоподписного доверенного сертификата (CA) и закрытого ключа для него необходимо, находясь в каталоге /etc/openvpn, выполнить команду:

openssl req -new -nodes -x509 -keyout private/CA_key.pem -out CA_cert.pem -days 3650

Команда req заставляет OpenSSL создать сертификат, ключи: -new — cоздать запрос на сертификат, -nodes — не шифровать закрытый ключ, -x509 (совместно с -new) — создать самоподписной сертификат (CA), -keyout — задает местонахождение закрытого ключа, -out — задает местонахождение самоподписного сертификата, -days — задает время действия сертификата (365×10 дней, что приблизительно равно десяти годам). В процессе выполнения команды на экран будут выданы запросы о вводе таких параметров как: Country Name, State or Province Name; Locality Name; Organization Name; Organizational Unit Name; Common Name; Email Address. Самым важным параметром является значение Common Name. В данном случае оно должно совпадать с FQDN-именем сервера (!!!В конфиге на стороне клиента это будет фигурировать как значение опции tls-server!!!).

4) Создание сертификата сервера
Для создания сертификата сервера сначала нужно создать запрос на сертификат сервера и закрытый ключ сервера. Для этого, находясь в каталоге /etc/openvpn, нужно выполнить команду:

openssl req -new -nodes -keyout keys/server.pem -out req/server.pem

Команда и ключи OpenSSL рассмотрены выше. В процессе выполнения комнды Вам опять придется ответить на вопросы. Ответы должны соответствовать ответам из предыдущего пункта. В ответ на дополнительные запросы «A challenge password []:» и «An optional company name []:» необходимо просто нажать.

Для создания сертификата сервера необходимо подписать запрос на сертификат сервера доверенным самоподписным сертификатом (CA). Для этого, находясь в каталоге /etc/openvpn, нужно выполнить команду:

openssl ca -batch -config openssl.cnf -extensions server -out certs/server.pem -infiles req/server.pem

Команда ca заставляет OpenSSL подписать запрос на сертификат, ключи: -config задает местонахождение файла конфигурации OpenSSL, -extensions — задает секцию файла конфигурации OpenSSL, содержащую дополнительные параметры генерируемого сертификата, -out — задает местонахождение генерируемого сертификата, -infiles — задает местонахождение запроса на сертификат, -batch — избавляет Вас от ответов на дополнительные вопросы. В процессе выполнения команды Вам будет задан вопрос «Sign the certificate? [y/n]:», на который нужно ответить утвердительно, после чего произойдет генерация сертификата и обновление базы данных сертификатов (index.txt и serial).

5) Создание файла параметров Диффи-Хэлмана
Для создания файла параметров Диффи-Хэлмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, находясь в каталоге /etc/openvpn, нужно выполнить команду:

openssl dhparam -out dh2048.pem 2048

Команда dhparam приказывает OpenSSL создать файл параметров Диффи-Хэлмана, число 2048 определяет разрядность в битах. Внимание: данная команда выполняется медленно даже на очень мощных компьютерах.

6) Создание клиентских сертификатов
Процедура создания клиентских запросов на сертификаты и закрытых ключей, подписания запросов на сертификаты и генерации сертификатов, а также просмотра запросов на сертификаты, сертификатов и закрытых ключей полностью аналогична соответствующей процедуре для сервера. Сделаю одно небольшое замечание: запросы на сертификаты, закрытые ключи и сертификаты должны иметь шаблонные имена, например, вида: req/RClient для запросов на сертификаты, keys/KClient для закрытых ключей и certs/CClient для сертификатов, соответственно. Слово Client должно быть заменено именем клиента, которое обязательно должно соответствовать значению параметра Common Name, вводимого при генерации запроса на сертификат для соответствующего клиента (!!!ОЧЕНЬ ВАЖНО Чтобы при генерации сертификатов для клиентов их Common Name не совпадали друг с другом!!!). Возможность дублирования Common Name у нескольких клиентов определяется конфигурацией сервера. Для генерации запроса на сертификат и закрытого ключа, а также подписания запроса на сертификат и генерации сертификата для клиента Client, находясь в каталоге /etc/openvpn, нужно выполнить команды:

openssl req -new -nodes -keyout keys/KClient.pem -out req/RClient.pem
openssl ca -batch -config openssl.cnf -out certs/CClient.pem -infiles req/RClient.pem

На данном этапе для рассматриваемого случая необходимо создать три групы, состоящих из запроса на сертификат / закрытого ключа / сертификата, с именами Rclient1 / Kclient1 / Cclient1, Rclient2 / Kclient2 / Cclient2 и Rclient3 / Kclient3 / Cclient3 для филиала № 1 (Common Name — client1), для филиала № 2 (Common Name — client2) и для системного администратора (Common Name — client3), соответственно.

7) Создание списка отзыва сертификатов
Для создания списка отзыва сертификатов, находясь в каталоге /etc/openvpn, нужно выполнить команду:

openssl ca -config openssl.cnf -gencrl -out crl/crl.pem

Команда ca с ключем -gencrl заставляет OpenSSL создать список отзыва сертификатов, ключи: -config рассмотрен выше, -out — задает местонахождение списка отзыва сертификатов. Данная команда создает пустой список отзыва сертификатов. Для того, чтобы отозвать сертификат клиента Client, находясь в каталоге /etc/openvpn, нужно выполнить команду:

openssl ca -config openssl.cnf -revoke certs/CClient.pem

Команда ca с ключем -revoke заставляет OpenSSL отозвать заданный сертификат, ключ -config рассмотрен выше. Для просмотра списка отозванных сертификатов, находясь в каталоге /usr/local/etc/openvpn, можно выполнить команду:

openssl crl -noout -text -in crl/crl.pem

8) Создание статического ключа HMAC

Для создания статического ключа HMAC, обеспечивающего дополнительную защиту от DoS-атак и флудинга UDP-портов, находясь в каталоге /etc/openvpn, нужно выполнить команду:

openvpn —genkey —secret ta.key

9) Файл конфигурации сервера
#———————————-server.conf——————————————
#local <Внешний IP-адрес сервера>, если не указано то все интерфейсы
port 1194
proto udp
dev tap0 #Обязательно должен использоваться девайс tap0 а не tun0 для работы с множеством клиентов
mode server
ifconfig-pool 192.168.200.2 192.168.200.10
ifconfig 192.168.200.1 255.255.255.0
#up /etc/openvpn/server.up — скрипт при запуске
#down /etc/openvpn/server.down — скрипт при остановке
route 192.168.100.0 255.255.255.0 192.168.200.2 # маршрут для клиента 1 добавляется при запуске
route 192.168.101.0 255.255.255.0 192.168.200.3 # маршрут для клиента 2 добавляется при запуске
#client-to-client — возможность клиентам видеть другдруга
tls-server
dh /etc/openvpn/dh2048.pem
ca /etc/openvpn/CA_cert.pem
cert /etc/openvpn/certs/server.pem
key /etc/openvpn/keys/server.pem
crl-verify /etc/openvpn/crl/crl.pem
tls-auth /etc/openvpn/ta.key 0
comp-lzo
keepalive 10 60
tun-mtu 1500
mssfix 1450
persist-key
persist-tun
#user openvpn
#group openvpn
verb 3
#—————————————————————————————
В данном файле заданы следующие значения параметров сервера OpenVPN: dev — интерфейс OpenVPN, local и port — IP-адрес и порт, на которых OpenVPN принимает входящие соединения, proto — протокол (в данном случае UDP), server — пул IP-адресов, выделенный для виртуальной частной сети и автоматически распределяемый между клиентами, push — команда OpenVPN, передаваемая клиенту и выполняемая клиентом (в данном случае «route 10.0.0.0 255.255.255.0» добавляет на стороне клиента маршрут к виртуальной частной сети), route — добавляет на стороне сервера маршруты к локальным подсетям, находящимся за клиентами, client-config-dir — папка с файлами конфигурации клиентов, client-to-client — разрешение клиентам «видеть» друг друга (естественно, при наличии соответствующих правил маршрутизации), tls-server — включение поддержки TLS; dh — местонахождение файла параметров Диффи-Хэлмана, ca — местонахождение самоподписного доверенного сертификата (CA), cert — местонахождение сертификата сервера, key — местонахождение закрытого ключа сервера, crl-verify — местонахождение списка отзыва сертификатов, tls-auth — местонахождение статического ключа HMAC, comp-lzo — использование LZO-компрессии трафика, keeplive — поддержание соединения (в данном случае отправка пингов каждые 10 секунд, и закрытие соединения через две минуты после отсутствия ответных пакетов, как сервером, так и клиентами), tun-mtu и mssfix — параметры передачи данных по тоннелю, persist-tun — не закрывать / открывать по-новой tun-устройство при получении сигнала SIGUSR1 (перезапуск без привилегий root) или при выполнении ping-restarts, user и group — пользователь и группа, от имени которых работает OpenVPN после запуска (запуск выполняется под root’ом), verb — уровень детализации сообщений, выдаваемых OpenVPN в /var/log/messages.

10) Файл конфигурации клиентов

client1
#———————————-openvpn.conf—————————————-
client
dev tap0
proto udp
remote 93.88.6.42
ifconfig 192.168.200.2 255.255.255.0
route 192.168.0.0 255.255.255.0 192.168.200.1
tls-client
tls-remote gate.net.local
ca /etc/openvpn/CA_cert.pem
cert /etc/openvpn/Cgw-rdnv.pem
key /etc/openvpn/Kgw-rdnv.pem
tls-auth /etc/openvpn/ta.key 1
ns-cert-type server
comp-lzo
tun-mtu 1500
mssfix 1450
verb 3
#—————————————————————————————
client2
#———————————-openvpn.conf—————————————-
client
dev tap0
proto udp
remote 93.88.6.42
ifconfig 192.168.200.3 255.255.255.0 # жестко назначается ip этому клиенту
route 192.168.0.0 255.255.255.0 192.168.200.1 # добавляется маршрут до основной подсети
tls-client
tls-remote gate.net.local #здесь должно быть тоже что и при генерации сертификатов сервера CommonName
ca /etc/openvpn/CA_cert.pem
cert /etc/openvpn/Cgw-khb.pem
key /etc/openvpn/Kgw-khb.pem
tls-auth /etc/openvpn/ta.key 1
ns-cert-type server
comp-lzo
tun-mtu 1500
mssfix 1450
verb 3
#—————————————————————————————
11) Маршрутизация
на стороне сервера как видно из конфига добавляются маршруты через интерфейсы tap0 на клиентах до подсетей клиентов
на сторонах клиентов добавляются маршрут до основной подсети через интерфейс tap0 на стороне сервера

12) Файрволы
на файрволах нужно разрешить forward правила для всех подсетей как для источника так и для назначения.

Добавить комментарий