Установка OpenVPN сервера на Ubuntu

Установка сервера
Инициализируем инфраструктуру открытых ключей (PKI) для OpenVPN
Создание сертификата сервера OpenVPN
Генерация Diffie Hellman параметров
Перемещение ключей сервера
Создадим директорию /etc/openvpn/ccd
Создадим директорию /var/log/openvpn/
Подготовка шаблона конфиг файла для OpenVPN клиента
Создание сертификатов клиентов
Перемещение ключей клиента

Установка сервера

sudo apt-get install openvpn

Копируем  примеры скриптов называющихся easy-rsa. из каталога /usr/share/doc/openvpn/examples/easy-rsa/ в /etc/openvpn

sudo cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/

Настройка переменных для OpenVPN PKI

Для того что бы при создании сертификатов вносить меньше данных внесем изменения в файл vars, пропишем те данные которые будут постоянными для всех сертификатов:

sudo nano /etc/openvpn/easy-rsa/2.0/vars
export KEY_COUNTRY="RU"
export KEY_PROVINCE="YourProvince"
export KEY_CITY="YourCity"
export KEY_ORG="YourCompany"
export KEY_EMAIL="mail@example.com"
export KEY_CN="CommonName"
export KEY_NAME="KeyName"
export KEY_OU="OrganisationUnit"

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

Cтрочки:

#export PKCS11_MODULE_PATH=changeme
#export PKCS11_PIN=1234

лучше закоментировать, эти переменные определены выше.

увеличиваем ключа до 2048, изменив 1024 на 2048 в строке:

export KEY_SIZE=2048

Определим срок выдаваемых сертификатов в днях:

# Срок действия сертификата Центра Сертификации 10 лет
export CA_EXPIRE=3650
# Срок действия выпускаемых сертификатов 1 год
export KEY_EXPIRE=3650\

Инициализируем инфраструктуру открытых ключей (PKI) для OpenVPN

Следующие команды инициализируют Центр Сертификации (CA) и PKI, пользователь из подкоторого запускается скрипт должен иметь права на запись в папкуetc/openvpn/easy-rsa/2.0/

cd /etc/openvpn/easy-rsa/2.0/
. /etc/openvpn/easy-rsa/2.0/vars
. /etc/openvpn/easy-rsa/2.0/clean-all # Убиваем старые ключи, если они были.
. /etc/openvpn/easy-rsa/2.0/build-ca

Последняя команда build-ca запустит генерацию главного сертификата центра сертификатов (CA) и его секретного ключа. 
Common Name сертификата должно быть уникальным.
Получи два файла:
ca.crt сертификат центра сертификации
ca.key приватный ключ центра сертификации.
Установите права на чтение приватного ключа ca.key только для root. Если ключ центра сертификации ca.key будет скопирован, то придется перевыпустить все сертификаты, так как злоумышленник завладевший таким ключем сможет подключиться к OpenVPN серверу.

Создание сертификата сервера OpenVPN

Запустим команду на генерацию сертификата сервера:

. /etc/openvpn/easy-rsa/2.0/build-key-server servername

Дополнительно запрашиваемые challenge password и optional company name оставьте пустыми.
В результате будет создано три файла:
servername.csr c кодом запроса сертификата
servername.key с приватным ключом сертификата
servername.crt с выпущенным сертификатом.
Установите права на чтение приватного ключа servername.key только для root. 
 

Генерация Diffie Hellman параметров

Запустим генерацию сертификата Diffie Hellman его параметры определяют метод авторизации и обмена ключами используемый OpenVPN сервером:

. /etc/openvpn/easy-rsa/2.0/build-dh

Перемещение ключей сервера

Переместим Все созданные ключи и сертификаты из /etc/openvpn/easy-rsa/2.0/keys/  в /etc/openvpn/keys/Серверу OpenVPN понадобятся:

ca.crt # сертификат центра сертификации
dh2048.pem # параметры Diffie Hellman
servername.crt # сертификат сервера
servername.key # ключ сервера

перемещаем, и проверяем права доступа на файлы и папку:

mkdir /etc/openvpn/keys
cd /etc/openvpn/easy-rsa/2.0/keys
cp ca.crt dh2048.pem servername.crt servername.key /etc/openvpn/keys

проверяем права доступа на файлы и папку, устанавливаем владельцем root для отсальных закрываем.

Распакуем и переместим в директорию /etc/openvpn пример конфигурационного файла для OpenVPN сервера, который находится в /usr/share/doc/openvpn/examples/sample-config-files:

cd /usr/share/doc/openvpn/examples/sample-config-files
sudo gunzip -d server.conf.gz
sudo mv server.conf /etc/openvpn/

внесем изменения в файл конфигуркции server.conf

sudo nano /etc/openvpn/server.conf

укажем явно полные пути к файлам: приватного ключа и сертификата OpenVPN сервера, сертификату центра сертификации, и параметры Diffie Hellman:


ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/servername.crt
key /etc/openvpn/keys/servername.key  # This file should be kept secret
......
dh /etc/openvpn/keys/dh2048.pem

Укажем виртуальную подсеть - подсеть openvpn:

server 172.33.255.0 255.255.255.0

Для передачи параметров подключающемуся клиенту в его таблицу роутинга, (необходимо для доступа к хостам находящимся в сети 192.168.10.0) за openvpn сервером:

push "route 192.168.10.0 255.255.255.0"

 

Эта строчка заставит OpenVPN клиент при подключении к серверу модифицировать свою таблицу роутинга. 

Для внесения изменений в таблицу роутинга OpenVPN сервера (необходимо для того что бы сервер и клиенты за сервером видили сеть за клиентом openvpn) пропишем строки в server.conf:

client-config-dir /etc/openvpn/ccd
route 192.168.20.0 255.255.255.0

Позже мы Создадим директорию (после того как закончим с файлом server.conf) /etc/openvpn/ccd

 

Выбрем (раскомментировав строчку) криптографический механизм AES установив в значение 256:

;cipher BF-CBC        # Blowfish (default)
cipher AES-256-CBC    # AES
;cipher DES-EDE3-CBC  # Triple-DES

Раскомментируем строчки в файде server.conf:

user nobody
group nogroup

чтобы уменьшить привилегии OpenVPN сервера после инициализации

Изменим указаное в server.conf расположение файла status-server.log в котором отображается текущий статус сервера с /etc/openvpn/openvpn-status.log (по умолчанию) на /var/log/openvpn/status-server.log:

status /var/log/openvpn/status-server.log

Каталог openvpn в /var/log/ для статусного файла должен существовать, автоматически он не создается, чуть позже мы Создадим директорию и файл (после того как закончим с файлом server.conf)

После сохраняем файл server.conf и досоздадим нужные директории и файлы о которых писалось выше:

Создадим директорию /etc/openvpn/ccd, создадим в ней файл с именем подключающегося клиента client1.

sudo mkdir /etc/openvpn/ccd
sudo touch /etc/openvpn/ccd/client1
sudo nano /etc/openvpn/ccd/client1

Внесем в этот этот файл единственную строчку:

iroute 192.168.20.0 255.255.255.0

Создадим директорию /var/log/openvpn/ и файл в ней status-server.log, для записи статуса сервера

sudo mkdir /var/log/openvpn
sudo touch /var/log/openvpn/status-server.log

Статусный файл перезаписывается раз в минуту.
Если он не нужен закомментируйте строку в файле server.conf

и перезапускаем процесс openvpn:

/etc/init.d/openvpn start

Поскольку путь и имя лог файла openvpn не указаны, OpenVPN будет отправлять свой лог в syslog: /var/log/syslog
после запуска в лог файле /var/log/syslog, должны увидеть Initialization Sequence Completed

 

Подготовка шаблона конфиг файла для OpenVPN клиента

Переместим на нашем сервере openvpn пример конфигурационного файла client.conf, который потом будем использовать у клиентов OpenVPN из /usr/share/doc/openvpn/examples/sample-config-files в папку /etc/openvpn/confforclients
Так же перед этим создадим папку:

sudo mkdir /etc/openvpn/confforclients
cd /usr/share/doc/openvpn/examples/sample-config-files
sudo cp client.conf /etc/openvpn/confforclients

Мы не переместили файл client.conf в директорию /etc/openvpn/ так как Сервер OpenVPN может одновременно являтся и клиентом, и если мы поместим client.conf в директорию /etc/openvpn/, то наш сервер будет пытатся подключится в роли клиента, используя этот конфигурациионный файл.

Внесем изменения в конфигурациионый файл:

Указыжум адрес OpenVPN сервера где AAA.BBB.CCC.DDD внешний ip адрес:

remote AAA.BBB.CCC.DDD 1194

Лучше указать в файле vpn.mydomain.ru и привязать ip адрес к этому поддомену, тем самым сменив внешний ip адрес openvpn сервера не придется вносить изменения в конфигурацию всех клиентов.
 
Явно укажем месторасположения файлов приватного ключа и сертификата OpenVPN клиента nameclient (для каждого клиента свое иникальное имя см. ниже создание сертификатов для клиентов) поскольу мы подготоваливаем общую болванку оставим nameclient
Для Linux:

ca /etc/openvpn/ca.crt
cert /etc/openvpn/nameclient.crt
key /etc/openvpn/nameclient.key

Для Windows:

ca "C:\\Program Files\\OpenVPN\\config\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\config\\nameclient.crt"
key "C:\\Program Files\\OpenVPN\\config\\nameclient.key"

Необходимо выбрать тот же механизм шифрования, что и на сервере (см выше) AES-256: 

;cipher BF-CBC        # Blowfish (default)
cipher AES-256-CBC    # AES
;cipher DES-EDE3-CBC  # Triple-DES

Для Linux хоста укажем месторасположения лог файла и статусного файла OpenVPN клиента. Если не укажем log-append, то вывод лога будет производится на stdout.

log-append /var/log/openvpn/openvpn_client.log
status /var/log/openvpn/status_client.log

Создание сертификатов клиентов

Выпустим сертификат клиента client1, для этого не сервере OpenVPN:

. /etc/openvpn/easy-rsa/2.0/vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/keys

Если Вы запустите скрипт ./clean-all после vars он удалит все выпущеные сертификаты будьте внимательны, об этом Предупреждает система.

. /etc/openvpn/easy-rsa/2.0/build-key client1

Каждое клиентское подключение должно иметь свой уникальный ключ с уникальным именем в нашем случае client1.
Вся остальная информация может быть одинаковой. Пользователей можно добавлять в любое время.
В результате будет создано три файла:
client1.csr кодом запроса сертификата
client1.key приватный ключ сертификата
client1.crt сертификат клиента.
Убедитесь, что файл с приватным ключом client1.key доступен на чтение только для root.

Перемещение ключей клиента

Созданные ключи и сертификаты клиента client1 находятся в каталоге /etc/openvpn/easy-rsa/2.0/keys/, скопируем их клиенту место копирования у клиента зависит от установленной у клиента системы:

ca.crt # сертификат центра сертификации
client1.crt # сертификат клиента
client1.key # приватный ключ клиента

Обратите внимание, приватный ключ центра сертификации ca.key копировать не следует! В случае если произойдет утечка приватного ключа центра сертификации ca.key, то будет необходимо перевыпустить все сертификаты.

Так же скопируем клиенту конфигурационный файл, который создадим из шаблона созданого нами ранее, внеся в него изменения:

cert /etc/openvpn/client1.crt
key /etc/openvpn/client1.key

 

 

Проверяем действуют ли сертификаты:

openssl verify -CAfile ca.crt client.crt
grep -i vpn /var/log/syslog

Задаем сроки действия сертификатов устанавливая параметры в vars:
export KEY_EXPIRE=3650
export CA_EXPIRE=3650

Удаление сертификатов

файл /etc/openvpn/ccd/client_name
iroute 192.168.15.0 255.255.255.0
server.conf push "route 192.168.0.0 255.255.255.0"
route 192.168.15.0 255.255.255.0 10.8.0.2
client-config-dir /etc/openvpn/ccd

Для проверки соединение между openvpn сервером и клиентом

На сервере программой tcpdump слушаем виртуальный интерфейс tun0:
tcpdump -i tun0
На клиенте пингуем сервер, если в консоли сервера должен отображатся прием пакетов

Выводим запущенные процессы openvpn

ps ax | grep openvpn

Таксаномия: 

Комментарии

Спасибо за пост. Смотрел генерацию ключей здесь - http://sysadm.pp.ua/linux/shifrovanie/openvpn-easy-rsa.html . Нехватает CRL листов с примером отзвыа OpenVPN сертификата... Подскажите, как генерировать те же ключи используя openSSL ?

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