25.10.09

Создание клиент-сервер OpenVPN соединения с аутентификацией по сертификату.

Достаточно быстрый способ создания сервера, и соединения клиента с помощью NetworkManager. Я использую OpenVPN для соединения со своими серверами, и с машин под управлением Windows и Linux, что очень удобно, также данный VPN передерживается NetworkManager что облегчает его быструю настройку на Linux.

Создание туннеля OpenVPN с аутентификацией пользователей с помощью сертификатов.

Сначала установим openvpn с репозиториев на сервер:
#yum install openvpn

после установки создадим ключи для сервера и клиентов, для этого в составе пакета есть группа скриптов, которая устанавливается в /usr/share/openvpn. Скопируем оттуда каталог easy-rsa в домашнюю директорию ~ :
#cp -r /usr/share/openvpn/easy-rsa ~/

В получившемся каталоге easy-rsa будет два каталога 1.0 и 2.0, нам нужен 2.0. Вторая версия скриптов easy-rsa. В каталоге следует поправить файл vars, в котором задайте ваши данные для директив:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="PROVINCE"
export KEY_CITY="City"
export KEY_ORG="Organisation"
export KEY_EMAIL="mail@mail.com"


По умолчанию скрипт генерирует все сертификаты в каталог ./key можно оставить так. Но лучше мы будем генерировать ключи прямо в каталог openvpn, что бы не пришлось возиться с обновлением файлов после того как будем добавлять новых пользователей.  Укажем другой каталог файле vars директива KEY_DIR:
export KEY_DIR="/etc/openvpn/keys/"

Создадим каталог для наших ключей keys:
#mkdir /etc/openvpn/keys/

Укажем скриптам что брать настройки следует из vars:
#source ./vars
#./clean-all

Генерируем сертификаты для серверной части. Первый будет ca сертификат:
#./build-ca
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) [RU]:
State or Province Name (full name) [PROVINCE]:
Locality Name (eg, city) [City]:
Organization Name (eg, company) [Organisation]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [Organisation CA]:
Name []:
Email Address [mail@mail.com]:

Запускаем генерацию ключа (вместо server вставьте свои данные):

#./build-key-server server
Generating a 1024 bit RSA private key
............................++++++
..............................................++++++
writing new private key to 'server.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) [RU]:
State or Province Name (full name) [PROVINCE]:
Locality Name (eg, city) [City]:
Organization Name (eg, company) [Organisation]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [server]:
Name []:
Email Address [mail@mail.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:passwd
An optional company name []:
Using configuration from /root/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'RU'
stateOrProvinceName :PRINTABLE:'PROVINCE'
localityName :PRINTABLE:'City'
organizationName :PRINTABLE:'Organisation'
commonName :PRINTABLE:'server'
emailAddress :IA5STRING:'mail@mail.com'
Certificate is to be certified until Oct 23 12:59:41 2019 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Теперь нужно сгенерировать ключ Диффи-Хелмана для защиты обмена ключами:
#./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.......................................................................+.........................................++*++*++*
В итоге в каталоге keys должно получиться примерно следующее:
-rw-r--r-- 1 root root 3883 2009-10-25 15:59 00.pem
-rw-r--r-- 1 root root 3766 2009-10-25 16:02 01.pem
-rw-r--r-- 1 root root 1233 2009-10-25 15:54 ca.crt
-rw------- 1 root root 887 2009-10-25 15:54 ca.key
-rw-r--r-- 1 root root 245 2009-10-25 16:06 dh1024.pem
-rw-r--r-- 1 root root 210 2009-10-25 16:02 index.txt
-rw-r--r-- 1 root root 20 2009-10-25 16:02 index.txt.attr
-rw-r--r-- 1 root root 21 2009-10-25 15:59 index.txt.attr.old
-rw-r--r-- 1 root root 105 2009-10-25 15:59 index.txt.old
-rw-r--r-- 1 root root 3 2009-10-25 16:02 serial
-rw-r--r-- 1 root root 3 2009-10-25 15:59 serial.old
-rw-r--r-- 1 root root 3883 2009-10-25 15:59 server.crt
-rw-r--r-- 1 root root 700 2009-10-25 15:59 server.csr
-rw------- 1 root root 887 2009-10-25 15:59 server.key

Теперь что касается клиентов создаём клиентские ключи подобным образом (вместо client вставьте свои данные). Сгенерируйте ключи для всех пользователей вашей сети, которым нужен будет доступ по VPN:
#./build-key client
Generating a 1024 bit RSA private key
.++++++
............................++++++
writing new private key to 'client.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) [RU]:
State or Province Name (full name) [PROVINCE]:
Locality Name (eg, city) [City]:
Organization Name (eg, company) [Organisation]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [client]:
Name []:
Email Address [mail@mail.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:passwd
An optional company name []:
Using configuration from /root/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'RU'
stateOrProvinceName :PRINTABLE:'PROVINCE'
localityName :PRINTABLE:'City'
organizationName :PRINTABLE:'Organisation'
commonName :PRINTABLE:'client'
emailAddress :IA5STRING:'mail@mail.com'
Certificate is to be certified until Oct 23 13:02:29 2019 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated



Теперь притупим к конфигурированию непосредственно сервера. В каталоге /usr/share/doc/openvpn-2.1/sample-config-files/ есть примеры конфигурационных файлов, нам нужен оттуда файл server.conf. Скопируем его в каталог конфигураций openvpn:
#cp /usr/share/doc/openvpn-2.1/sample-config-files/server.conf /etc/openvpn/

Изменим некоторые директивы конфига под наши нужды. Укажем порт который будет слушать openvpn:
port 1194

Протокол передачи данных (Можно tcp или udp):

proto udp

Виртуальный интерфейс который будет использовать openvpn
dev tun0


Укажем виртуальную сеть которую будет использовать openvpn:
server 10.8.0.0 255.255.255.0

Укажем лог файл и его уровень для отладки:
status openvpn-status.log
log openvpn.log
log-append openvpn.log
verb 3

Все на этом заканчиваем с настройками сервера, запускаем службу:
#/etc/init.d/openvpn start
И укажем их местонахождение в конфиге сервера с помощью директив:
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem


Если все в норме в логе будут несколько информативных сообщений, заканчивающихся сообщением Initialization Sequence Completed.
Теперь очередь за клиентом. Скопируем с помощью носителя ключи client.crt, client.key, dh1024.pem, ca.crt из папки ~/easy-rsa/2.0/keys в папку клиента ~/.keys.
Для соединения с сетью я рекомендую использовать NetworkManager (идёт по умолчанию в Fedora). Данная система позволяет настраивать множество различных типов сетевых соединений без использования root и заносить настройки с помощью однотипных графических форм.
Для того что бы NetworkManager умел работать с OpenVPN нужно установить для него плагин из репозитариев:
#yum install NetworkManager-openvpn

После того, как плагин установиться вызовем утилиту настроек сетевых соединений в меню Система\Параметры\Сетевые соединения. Откроется нижеследующее окно:

Нажав кнопку добавить, вызовем визард VPN, в ниспадающем меню которого выберем OpenVPN:

Нажатие на кнопку Create... откроет форму в которую занесем данные о наших сертификатах. Если надо поставим галочку подключаться автоматически:


Указываем имя соединения, адрес сервера в поле Шлюз, в ниспадающем меню указываем тип соединения Сертификаты (TSL), в поле сертификат выбираем client.crt, в поле Сертификат CA указываем ca.crt, в поле личный ключ - client.key и наконец в поле пароль личного ключа вносим пароль который мы вводили при генерации ключа клиента. Если вы выбрали протокол tcp в настройках сервера то, клиенту следует указать использовать tcp, щёлкнув на кнопке Дополнительно... и поставив соответственную галку:

Все, подтверждаем наши настройки поклацав на соответствующие кнопки.
Для активации VPN щёлкните на апплете сетевых соединений. В выпавшем меню выбираем: Соединения VPN\"Имя нашего соединения" и если все настроено правильно появиться уведомление о подключении к сети. Что бы получить доступ к подсети, а не только к самому серверу, через этот VPN, необходимо включить маршрутизацию пакетов на сервере выполнив:
#echo "1" > /proc/sys/net/ipv4/ip_forward
А так же настроить iptables для того что бы он NATил пакеты из VPN. В комплекте с пакетом для этих целей идёт скрипт который облегчает эту задачу. Найдёте его по пути: /usr/share/doc/openvpn-2.1/sample-config-files/firewall.sh. Данная система позволяет также соединяться по VPN машинам под управлением Windows для чего есть соответствующий пакет на официальном сайте.
 Отозвать сертификат можно скриптом  revoke-full из каталога easy-rsa:
./revoke-full client

Комментариев нет:

Отправить комментарий

Популярные сообщения