HOWTO OpenVPN в режиме сервера TAP

Сначало Ядро:
Device Drivers - >
<*> Network device support - >
<*> Universal TUN/TAP device driver support

Установка:

Cмотрим флаги

# emerge -pv openvpn

и устанавливаем

# emerge openvpn

Настройка:

1.Сначала настроим файл переменных для генерации ключей

# cd /usr/share/openvpn/easy-rsa/
# vi vars

Здесь нас интересует переменная KEY_DIR, туда будут падать генерированные ключи. При чем папка не должна существовать т.к. в последствии запускаемый скрипт все равное ее убьет и пересоздаст заново.
Последние пять строчек правим по своему усмотрению. В названиях не должно быть пробелов.

export EASY_RSA="`pwd`"
export KEY_CONFIG="$EASY_RSA/openssl.cnf"
export KEY_DIR="/etc/openvpn/keys"
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
export KEY_SIZE=1024
export CA_EXPIRE=3650
export KEY_EXPIRE=3650
export KEY_COUNTRY="RU"
export KEY_PROVINCE="RU"
export KEY_CITY="Mocsow"
export KEY_ORG="YITO"
export KEY_EMAIL="ad@mpk.ru"

2.Первая генерация ключей

Загружаем переменные

# source ./vars

Запускаем скрипт создающий каталог указанный в KEY_DIR, а так же два необходимыx файла
index.txt и serial, причем в файл serial приписывается 01.

ВНИМАНИЕ — если в каталоге что то существует это будет удалено безвозвратно rm -rf
# ./clean-all

Генерируем:

# openvpn --genkey  --secret ta.key

Генерация ключа для использования tls-auth
Файл ключа создастся в /usr/share/openvpn/easy-rsa/.
Остальные ключи там, куда указывает KEY_DIR.
Файл ta.key можно свободно копировать в нужное место.

Дальше:

# ./build-dh 

Генерация ключа Диффи-Хеллмана . Этот процесс может занять некоторое время.

# ./pkitool --initca 

Certificate Authority для сервера.

# ./pkitool --server hydra 

Генерируем сертификат X.509 для сервера hydra.

# ./pkitool lazy

Генерируем сертификат X.509 для клиента lazy.

Все, все необходимые ключи созданы, раздаем ключи клиентам:

Всем клиентам:

 ca.crt
 dh1024.pem 
 ta.key

Клиенту для которого предназначен сертификат:

 lazy.crt
 lazy.csr (не нашел применение)
 lazy.key

Файлы *.key необходимо пересылать на клиентские машины через заведомо защищённый канал.

3.Конфигурируем сервер:

# vi /etc/openvpn/openvpn_srv.conf
# режим сервера
mode server
# использовать TLS-аутентифкацию
tls-server
tls-timeout 120 
# прослушивание по tcp-протоколу
proto tcp-server
# использовать tap устройство
dev tap
# прослушиваемый порт 1194
port 1194
# скрипт который будет выполнятся при поднятии впн туннеля
# up /etc/openvpn/upscript.sh
# режим демона
daemon
# TLS-ключ
tls-auth /etc/openvpn/keys/ta.key 0
# указываем файл с CA
ca /etc/openvpn/keys/ca.crt
# сертификат сервера
cert /etc/openvpn/keys/hydra.crt
# указываем ключ сертификата
key /etc/openvpn/keys/hydra.key
# файл Диффи-Хеллмана
dh /etc/openvpn/vserver/keys/dh1024.pem
# указываем IP-адрес сервера и маску виртуальной сети
ifconfig 172.16.1.1 255.255.255.224
# описываем наш vpn пул
# IP-адрес через push "ifconfig адрес маска"
ifconfig-pool 172.16.1.2 172.16.1.30
# Если вы хотите, что бы за клиентами закреплялись постоянные адреса, 
# добавьте следующий параметр:
# Он определяет файл, в котором будет сохраняться информация о машине и ее IP. 
# Файл содержит строки:
# Имя машины,IP адрес. Во время работы. 
# Cервер с периодичностью в 600 секунд обновляет содержимое этого файла.
# При включении, сервер читает содержимое файла.
# Эта обция НЕ РАБОТАЕТ если включено duplicate-cn
ifconfig-pool-persist /var/log/openvpn-ipp.txt
# В этом файле сохраняется информация о текущих соединениях сервера.
status /var/log/openvpn-status.log 1
status-version 2
# Добавляем клиенту необходимые маршруты на локальные подсети, например:
push "route 195.87.105.0 255.255.255.0"
# Шлюз для вышеуказанных маршрутов
push "route-gateway 172.16.1.1"
# разрешаем обмен трафиком между клиентами 
client-to-client
# разрешаем дублирование сертифкатов
# если упустить эту опцию то на каждого клиента надо
# генерировать отдельный сертификат с помощью pkitool
#duplicate-cn
# включаем режим отладки
verb 3
# алгоритм шифрования.Список алгоритмов можно получить
# с помощью команды openvpn --show-ciphers
cipher DES-EDE3-CBC
# не перечитывать ключ при сбросе соединения
persist-key
# лог файл
log-append /var/log/openvpn.log
persist-tun
# включаем сжатие
comp-lzo

При такой конфигурации сервера, каждому клиенту необходимо генерировать свой ключ.

Генерация нового ключа клиента:

# cd /usr/share/openvpn/easy-rsa/
# source ./vars
# ./pkitool petrov

Получаем в коталоге KEY_DIR три файла petrov.* и отдаем их Петрову ...

Запуск сервера:

# cd /etc/init.d/
# ln -s openvpn openvpn_srv
# /etc/init.d/openvpn_srv start

Настройка клиентской части

4.Конфигурация клиентов:

Windows: (проверял, работает)

с:\Program Files\OpenVPN\config\client.ovpn
# работа в режиме клиента с TLS-аутентифкацией
tls-client 
ns-cert-type server
# протокол tcp
proto tcp-client
# удаленный сервер
remote server.domain.ru
# устройство 
dev tap
port 1194
cd C:\\key
# принимать команды push от сервера.то есть позволять переконфигурировать клиента
pull
# файл для авторизации
tls-auth C:\\key\\ta.key 1
# указываем файл Диффи-Хеллмана
dh C:\\key\\dh1024.pem 
# указываем файл CA
ca C:\\key\\ca.crt 
# указываем файл с сертификатом клиента
cert C:\\key\\lazy.crt 
# указываем файл с ключем клиента
key C:\\key\\lazy.key 
# алгоритм шифрования
cipher DES-EDE3-CBC
# использовать сжатие
comp-lzo

Два слеша ' \\ ' не ошибка, именно так Windows OpenVPN понимает пути.

Gentoo Linux: (не проверял, но должно работать)

# emerge openvpn
# vi /etc/openvpn/openvpn_client
# работа в режиме клиента с TLS-аутентифкацией
tls-client 
# протокол tcp
proto tcp-client
# удаленный сервер
remote server.domain.ru
# устройство 
dev tap
port 1194
cd /etc/openvpn/
# принимать команды push от сервера.то есть позволять переконфигурировать клиента
pull
# файл для авторизации
tls-auth /etc/openvpn/keys/ta.key 1
# указываем файл Диффи-Хеллмана
dh /etc/openvpn/keys/dh1024.pem 
# указываем файл CA
ca /etc/openvpn/keys/ca.crt 
# указываем файл с сертификатом клиента
cert /etc/openvpn/keys/lazy.crt 
# указываем файл с ключем клиента
key /etc/openvpn/keys/lazy.key 
# алгоритм шифрования
cipher DES-EDE3-CBC
# использовать сжатие
comp-lzo

Запуск клиента:

# cd /etc/init.d/
# ln -s openvpn openvpn_client
# /etc/init.d/openvpn_client start

Теперь, ситуация, мы сделали кучу ключей и раздали их пользователям, и вдруг нам нужно один ключ отозвать (заблокировать пользователя)
Для этого, на стороне сервера должна быть прописанная директива с указанием пути к файлу crl.pem
!!! Важно: дать права на чтение этого файла OpenVPN серверу.

crl-verify /etc/openvpn/keys/crl.pem

Теперь, переходим в дерикторию

cd /usr/share/openvpn/easy-rsa/

Считываем файл с настройками

source ./vars

Отзываем неугодный нам ключ

./revoke-full lazy

Все, данный ключ больше не сможет подключится к нашему серверу.
При выполнении скрипта ./revoke-full может произойти ошибка

error 23 at 0 depth lookup:certificate revoked

Пока не разобрался что он хочет, но ключи при этом уже не работают ...

По мотивам статьи Создание шифрованных туннелей с помощью OpenVPN

(FAQ) По командам OpenVPN