OpenVPN 2.3.10, SSL X.509, PKCS#12

A- | A+

openvpnЯ не буду рассказывать Вам, что такое OpenVPN в чем его преимущества, в Интернете полно информации на эту тему, например на wikipedia.org. Это статья о том как тонко настроить OpenVPN сервер с максимальной степенью безопасности. Также мы подробно рассмотрим тонкости настройки клиентов под Windows, Linux, iOS (iPhone, iPad), Android.

Загрузки

Получить исходный код OpenVPN, а так же бинарные пакеты для Windows последней версии можно со страницы загрузок на сайте разработчика OpenVPN.

Для мобильных клиентов:

icon-androidGoogle playhttps://play.google.com/store/apps/details?id=net.openvpn.openvpnAPK файл:http://www.apk4fun.com/apk/6697/
icon-ioshttps://itunes.apple.com/us/app/openvpn-connect/id590379981

В некоторых странах домен openvpn.net заблокирован. Если вам не повезло то необходимые пакеты для Linux и Windows можете скачать здесь:

Source Tarball (gzip)openvpn-2.3.10.tar.gz
Installer (64-bit), Windows Vista and lateropenvpn-install-2.3.10-I603-x86_64.exe

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

Устанавливаем необходимые пакеты, если не будем собирать их вручную.

aptitude update
aptitude install liblzo2-2 liblzo2-dev openssl libsslcommon2 libsslcommon2-dev ssl-cert-check ssl-cert openssl-blacklist openssl-blacklist-extra

См. Установка LZO и OpenSSL из исходников.

Если OpenVPN будем собирать с поддержкой PAM авторизации.

aptitude install libpam-dev

Если OpenVPN будем собирать с поддержкой PKCS#11 (если вы планируете использовать аппаратные ключи) “—enable-pkcs11″ то нужно установить следующие пакеты:

aptitude install libengine-pkcs11-openssl libpkcs11-helper1 libpkcs11-helper1-dev

Установим wipe он нам нужен для скриптов генерации SSL ключей.

aptitude install wipe

Загружаем архив с исходным кодом OpenVPN 2.3.10:

wget -c http://swupdate.openvpn.org/community/releases/openvpn-2.3.10.tar.gz

Распаковываем полученный tar архив:

tar -xvzf openvpn-2.3.10.tar.gz
cd openvpn-2.3.10

Собираем, компилируем и устанавливаем OpenVPN 2.3.10:

export PKG_CONFIG_LIBDIR="/opt/lib/openssl-1.0.1r/lib/pkgconfig/"
export CPPFLAGS="-I/opt/lib/openssl-1.0.1r/include/"
export LDFLAGS="-L/opt/lib/openssl-1.0.1r/lib/"
export OPENSSL_SSL_LIBS="-L/opt/lib/openssl-1.0.1r/lib/ -lssl"
export OPENSSL_SSL_CFLAGS="-I/opt/lib/openssl-1.0.1r/include/openssl/"
export OPENSSL_CRYPTO_LIBS="-L/opt/lib/openssl-1.0.1r/lib/ -lcrypto"
export OPENSSL_CRYPTO_CFLAGS="-I/opt/lib/openssl-1.0.1r/include/openssl/"
export LZO_LIBS="-L/opt/lib/lzo-2.09/lib/ -llzo2"
export LZO_CFLAGS="-I/opt/lib/lzo-2.09/include/lzo/"
./configure \
--prefix=/opt/openvpn-2.3.10 \
--enable-static \
--enable-iproute2 \
--enable-x509-alt-username \
--disable-plugin-auth-pam
#--enable-systemd \
#--disable-plugins

make && make install

Можно проверить установленную версию OpenVPN и ключей с которыми была произведена сборка.

openvpn --version

Пример вывода:

OOpenVPN 2.3.10 x86_64-unknown-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [MH] [IPv6] built on Feb 11 2016
library versions: OpenSSL 1.0.1r 6 Jan 2014, LZO 2.09
Originally developed by James Yonan
Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net>
Compile time defines: enable_crypto=yes enable_crypto_ofb_cfb=yes enable_debug=yes enable_def_auth=yes enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown enable_fast_install=yes enable_fragment=yes enable_http_proxy=yes enable_iproute2=yes enable_libtool_lock=yes enable_lzo=yes enable_lzo_stub=no enable_management=yes enable_multi=yes enable_multihome=yes enable_pam_dlopen=no enable_pedantic=no enable_pf=yes enable_pkcs11=no enable_plugin_auth_pam=no enable_plugin_down_root=yes enable_plugins=yes enable_port_share=yes enable_selinux=no enable_server=yes enable_shared=yes enable_shared_with_static_runtimes=no enable_small=no enable_socks=yes enable_ssl=yes enable_static=yes enable_strict=no enable_strict_options=no enable_systemd=no enable_win32_dll=yes enable_x509_alt_username=yes with_crypto_library=openssl with_gnu_ld=yes with_mem_check=no with_plugindir='$(libdir)/openvpn/plugins' with_sysroot=noЕсли Вы хотите использовать OpenVPN клиент по Linux, то выше описанные действия ничем не будут отличаться, различая будут только в конфигурационном файле, о котором я расскажу позже.

Создаем системного пользователя и группу openvpn

useradd openvpn -UMr -c OpenVPN

Напомню Вам, что каждый демон должен запускаться под своим пользователем и использовать пользователя nobody и группу nogroup никогда нельзя!

Генерация сертификатов безопасности X.509

В версии openvpn 2.3.4 набор скриптов easy-rsa вынесен в отдельный проект, загрузить их можно здесь. В интернете полно мест, где в основном перепечатана одна и та же инструкция по использованию easy-rsa, например здесь. Скрипты easy-rsa мало оптимизируют процесс генерации ключей и выдачи сертификатов пользователям, особенно если у Вас предполагается большое кол-во пользователей. Мы же все будем делать своими руками и автоматизируем процесс до максимума.

Мы будем использовать:

  • Алгоритм асимметричного шифрования RSA длиной ключа 4096 бит;
  • Алгоритм симметричного шифрования AES-256 для зашиты закрытых ключей;
  • Хэш функцию SHA2 размером 512 бит (SHA-512).

Почему RSA 4096 бит?

По моему мнению на данный момент использовать RSA ключи длиной меньше чем 4096 бит небезопасно, например почитайте статьи здесь и здесь.

Почему AES-256?

OpenSSL сегодня поддерживает только два алгоритма, действительно стойкого, симметричного шифрования, это AES-256 и CAMELLIA-256. Поддержка AES (и только его) на аппаратном уровне введена Intel в семейство процессоров x86 начиная с Intel Core i7-980X Extreme Edition, а затем на процессорах Sandy Bridge. Обработка AES процессором на аппаратном уровне дает значительный прирост производительности, т.е. по туннелю OpenVPN можно передавать данные со значительно большей скоростью без нагрузки на процессор с достаточным уровнем безопасности.

Почему SHA2 (SHA-512)?

Это самая стойкая, на ряду с Wirlpool, хэш функция на данный момент. Мой OpenSSL 1.0.1e собран с поддержкой Wirlpool, но использовать для генерации сертификатов отказывается.

В замен RSA можно использовать криптографию на эллиптических кривых, что даст экспоненциальный рост криптостойкости при меньшей длине ключа. Например популярным сегодня ключам RSA с длиной 1024-2048 бит соответствует всего навсего 160-224 битный ключ ECC (Elliptic Curve Cryptography). Пример использования криптографии на эллиптических кривых можно посмотреть на HabraHabr здесь.

С применением эллиптических кривых в OpenVPN не все так однозначно. Проблема использования криптографии на эллиптических кривых в OpenVPN обсуждается на официальном форуме разработчиков OpenVPN здесь. На странице http://www.gagliardoni.net можно найти инструкцию на английском языке от пользователя gaglia по практическому применению эпилептических кривых в OpenVPN. Статья называется “(Mar 17th, 2013) HowTo: OpenVPN with Elliptic Curve Cryptography (ECC) and SHA2 on Linux Debian”.

Ключи, сертификаты и т.д.

Мы будем использовать самописный набор скриптов на замену стандартному easy-rsa.

Скачать мой набор скриптов можно здесь.

Скрипт ca-gen.sh для создания корневого центра сертификации

Перед использование скрипта необходимо отредактировать необходимые переменные.

После запуска скрипта нужно будет 2 раза подряд ввести пароль для шифрования секретного ключа центра сертификации.

#!/bin/sh
 
#---------------------------------------------------------------
USER="openvpn"
GROUP="openvpn"
 
KEY_LENGTH="4096"
HASH="sha512"
ENC="aes256"
 
COUNTRY="COUNTRY"
STATE="STATE"
CITY="CITY"
COMMON_NAME="OpenVPN_Root_Certificat"
O1="example.com"
OU1="name"
EMAIL="mail@example.com"
DAYS="3650"
 
SSLCONF="/etc/openvpn/ssl-cripts/openssl-OpenVPN.cnf"
KEYDIR="/etc/openvpn/keys"
CAKEY="/root/CA-private-keys/openvpn/ca.key"
CACERT="$KEYDIR/CA/ca.crt"
#---------------------------------------------------------------
 
# Создадим пользователя с одноименной группой
useradd $USER -UM -c OpenVPN
 
mkdir -p /root/CA-private-keys/openvpn
mkdir -p $KEYDIR/CA
mkdir $KEYDIR/newcerts
mkdir -p $KEYDIR/server/private
mkdir -p $KEYDIR/subscribers/tcp
mkdir $KEYDIR/subscribers/udp
 
touch $KEYDIR/newcerts/index.txt
echo 01 > $KEYDIR/newcerts/serial
 
chmod 600 $KEYDIR/newcerts/index.txt
chmod 600 $KEYDIR/newcerts/serial
 
chown $USER:$GROUP $KEYDIR/server
chown $USER:$GROUP $KEYDIR/server/private
chown $USER:$GROUP $KEYDIR/subscribers
 
chmod 600 /root/CA-private-keys
chmod 600 $KEYDIR/newcerts
chmod 600 $KEYDIR/server
chmod 600 $KEYDIR/server/private
chmod 600 $KEYDIR/subscribers
 
# Генерируем секретный ключ для корневого центра сертификации
openssl genrsa -$ENC -out $CAKEY $KEY_LENGTH
 
chmod 400 $CAKEY
chmod 400 /root/CA-private-keys/openvpn
chattr +i $CAKEY
 
#Создаем X.509 корневой сертификат центра сертификации
openssl req -new -x509 -days $DAYS -key $CAKEY -config $SSLCONF -extensions v3_ca -subj \
'/C='${COUNTRY}'/ST='${STATE}'/L='${CITY}'/CN='${COMMON_NAME}'/O='${O1}'/OU='${OU1}'/emailAddress='${EMAIL}'' \
-$HASH -out $CACERT
 
chmod 400 $CACERT
chmod 400 $KEYDIR/CA
chattr +i $CACERT
 
#Просмотр атрибутов созданного корневого сертификата
openssl x509 -text -in $CACERT
openssl x509 -fingerprint -noout -in $CACERT -$HASH

Скрипт server-key-enc-gen.sh для создания необходимых сертификатов и ключей для сервера

Перед использование скрипта необходимо отредактировать необходимые переменные.

После запуска скрипта нужно будет 3 раза подряд ввести пароль для шифрования секретного ключа сервера, а затем пароль для открытия секретного ключа центра сертификации (введенный при создании корневого центра сертификации), затем нужно 2 раза утвердительно ответить на вопросы, ввести “y”.

Если не задавать тип шифрования закрытого ключа сервера то не нужно будет задавать пароль на закрытый ключ сервера и при запуске OpenVPN сервера так же не нужно будет вводить пароль (см. комментарий в коде скрипта). Я не рекомендую использовать не зашифрованные ключи OpenVPN сервера. Но обращаю внимание на то, что если используются шифрованные ключи это может привести к блокировки загрузки операционной системы. Если сервер настроен на автоматический запуск OpenVPN демона при загрузке ОС то в момент запуска демона OpenVPN будет предлагаться ввести пароль для открытия ключа и дальнейшая загрузка остальных демонов будет приостановлена, но пароль можно спокойно ввести через SSH.

#!/bin/sh
 
#------------------------------------------------------------------------------------------
USER="openvpn"
GROUP="openvpn"
 
#SERVER_MODE="tcp"
SERVER_MODE="udp"
SERVER_NAME="servername-$SERVER_MODE"
 
KEY_LENGTH="4096"
HASH="sha512"
ENC="aes256"
 
COUNTRY="COUNTRY"
STATE="STATE"
CITY="CITY"
COMMON_NAME="OpenVPN_Server_Certificate_("${SERVER_NAME}")"
O1="example.com"
OU1="OpenVPN_"$SERVER_NAME""
EMAIL="mail@example.com"
DAYS="3650"
 
SSLCONF="/etc/openvpn/ssl-cripts/openssl-OpenVPN.cnf"
KEYDIR="/etc/openvpn/keys"
CAKEY="/root/CA-private-keys/openvpn/ca.key"
CACERT="$KEYDIR/CA/ca.crt"
SERVERKEY="$KEYDIR/server/private/"${SERVER_NAME}".key"
SERVERCERT="$KEYDIR/server/"${SERVER_NAME}".crt"
#------------------------------------------------------------------------------------------
 
#Генерируем закрытый ключ сервера (server.key) и шифруем его с помощью ${ENC}:
#-----------------
openssl genrsa -"${ENC}" -out ${KEYDIR}/server/private/"${SERVER_NAME}".key ${KEY_LENGTH}
 
# Если не задавать тип шифрования закрытого ключа сервера
#то не нужно будет задавать пароль на закрытый ключ сервера и
#при запуске OpenVPN сервера так же не нужно будет вводить пароль
#openssl genrsa -out ${KEYDIR}/server/private/"${SERVER_NAME}".key ${KEY_LENGTH}
 
chown $USER:$GROPUP $SERVERKEY
chmod 400 $SERVERKEY
chattr +i $SERVERKEY
 
#Генерируем запрос на сертификат сервера (servercsr.pem):
#--------------
openssl req -new -key $SERVERKEY -config $SSLCONF -extensions server -subj \
'/C='${COUNTRY}'/ST='${STATE}'/L='${CITY}'/CN='${COMMON_NAME}'/O='${O1}'/OU='${OU1}'/emailAddress='${EMAIL}'' \
-days "${DAYS}" -"${HASH}" -out "${KEYDIR}"/server/server.csr
 
#Просмотр атрибутов созданного запроса:
#----------------
openssl req -in $KEYDIR/server/server.csr -noout -text
 
#Выдаем сертификат сервера и подписываем его закрытым ключом корневого сертификата ЦС:
#-------------------
openssl ca -config $SSLCONF -extensions server -policy policy_anything \
-out $SERVERCERT -md $HASH -cert $CACERT -keyfile $CAKEY -infiles $KEYDIR/server/server.csr
 
chown $USER:$GROPUP $SERVERCERT
chmod 400 $SERVERCERT
chattr +i $SERVERCERT
 
#Просмотр атрибутов созданного сертификата сервера:
#-----------------
openssl x509 -in $KEYDIR/server/"${SERVER_NAME}".crt -noout -text -purpose
 
#Удаляем запрос на сертификат:
#--------------
wipe -rf -S r -P 4 $KEYDIR/server/server.csr
#----------------------------------------------------------
 
# Генерируем статический ключ HMAC для подписи пакетов при авторизации
openvpn --genkey --secret $KEYDIR/server/"${SERVER_NAME}"-ta.key
 
chown $USER:$GROPUP $KEYDIR/server/"${SERVER_NAME}"-ta.key
chmod 400 $KEYDIR/server/"${SERVER_NAME}"-ta.key
chattr +i $KEYDIR/server/"${SERVER_NAME}"-ta.key
 
# Генерируем ключ Диффи-Хеллмана длиной ${KEY_LENGTH} бит
openssl dhparam -out $KEYDIR/server/"${SERVER_NAME}"-dh"${KEY_LENGTH}".pem ${KEY_LENGTH}
 
chown $USER:$GROPUP $KEYDIR/server/"${SERVER_NAME}"-dh"${KEY_LENGTH}".pem
chmod 400 $KEYDIR/server/"${SERVER_NAME}"-dh"${KEY_LENGTH}".pem
chattr +i $KEYDIR/server/"${SERVER_NAME}"-dh"${KEY_LENGTH}".pem

Скрипт subscriber-gen-*.sh для создания необходимых сертификатов для клиента OpenVPN

Мы будем автоматически генерировать :

  1. Сертификат подписчика;
  2. Контейнер PKS#12 с вложенным сертификатом корневого центра сертификации;
  3. Контейнер PKS#12 без вложенного сертификата корневого центра сертификации (для iOS).

Перед использование скрипта необходимо отредактировать необходимые переменные.

Скрипт необходимо запускать с указанием переменных (см. комментарии в начале скрипта). При запуске перед именем скрипта необходимо поставить пробел благодаря чему выполнение команды не будет занесено в $HOME/.bash_history и соответственно пароль который мы указали в переменной.

Все необходимые файлы для клиента (подписчика) будут скопированы в каталог $KEYDIR/subscribers/tcp/$subscriber или $KEYDIR/subscribers/udp/$subscriber

Подготовленные для подписчика файлы необходимо забирать с сервера по защищенному каналу, для этих целей очень удобно использовать программу WinSCP для работы которой достаточно SSH. Узнать подробнее о WinSCP и бесплатно загрузить текущую весрсию можно на сайте разработчиков по ссылке: http://winscp.net/eng/docs/lang:ru

#$1 Имя пользователя (CN - Common Name)
#$2 Пароль для шифрования закрытого ключа
#$3 Пароль для экспорта PKCS#12 (в контейнере PKCS#12 заменяет $1)
 
#!/bin/sh
 
# Задаем настройки сервера, как они были указаны при генерации ключей сервера
SERVER_MODE="tcp"
#SERVER_MODE="udp"
SERVER_NAME="server_name-$SERVER_MODE"
 
# Задаем данные подписчика
COMMON_NAME="${1}_OVPN-$SERVER_NAME"
EMAIL="mail@example.com"
COUNTRY="UK"
STATE="STATE"
CITY="CITY"
DAYS="365"
 
KEY_LENGTH="4096"
HASH="sha512"
ENC="aes256"
 
SSLCONF="/etc/openvpn/ssl-cripts/openssl-OpenVPN.cnf"
KEYDIR="/etc/openvpn/keys"
SKEYDIR="$KEYDIR/subscribers/tcp/$1"
CAKEY="/root/CA-private-keys/openvpn/ca.key"
CACERT="$KEYDIR/CA/ca.crt"
 
#wipe -r -S r -P 10 $SKEYDIR
mkdir -p $KEYDIR/subscribers/tcp/$1
 
# Копируем статический HMAC ключь сервера для подписи пакетов при авторизации в каталог создаваемого подписчика
cp $KEYDIR/server/$SERVER_NAME-ta.key $SKEYDIR/ta.key
cp $KEYDIR/CA/ca.crt $SKEYDIR/ca.crt
 
#Создаем закрытый ключь подписчика
#-------
openssl genrsa -$ENC -passout pass:$2 -out $SKEYDIR/$1.key $KEY_LENGTH
 
chmod 400 $SKEYDIR/$1.key
 
#Генерируем запрос на сертификат подписчика
#------------
openssl req -new -key $SKEYDIR/$1.key -passin pass:$2 -config $SSLCONF -extensions client -subj \
'/C='${COUNTRY}'/ST='${STATE}'/L='${CITY}'/CN='${COMMON_NAME}'/emailAddress='${EMAIL}'' \
-days $DAYS -$HASH -out $SKEYDIR/$1.csr
 
#Просмотр запроса на сертификацию:
openssl req -in $SKEYDIR/$1.csr -noout -text
 
#Подписываем сертификат клинта сертификатом сервера
#------------
openssl ca -config $SSLCONF -policy policy_anything -extensions client -out \
$SKEYDIR/$1.crt -md $HASH -cert $KEYDIR/CA/ca.crt -keyfile $CAKEY -infiles $SKEYDIR/$1.csr
 
chmod 400 $SKEYDIR/$1.crt
 
#Просмотр атрибутов созданного сертификата клиента:
#-----------------
openssl x509 -in $SKEYDIR/$1.crt -noout -text -purpose
 
#Удаляем запрос на сертификат:
#--------------
wipe -rf -S r -P 4 $SKEYDIR/$1.csr
 
#Создаем контейнер PKS#12 подписчика с вложенным сертификатом CA:
 
openssl pkcs12 -$ENC -export -in  $SKEYDIR/$1.crt -inkey $SKEYDIR/$1.key -passin pass:$2 -passout pass:$3 -certfile $KEYDIR/CA/ca.crt -name ${COMMON_NAME} -out $SKEYDIR/"$1".p12
 
chmod 400 $SKEYDIR/"$1".p12
 
# Просмотр созданного контейнера PKS#12
openssl pkcs12 -info -in $SKEYDIR/"$1"-iOS.p12 -passin pass:$3 -passout pass:$2
 
#Создаем PKS#12 клиента без вложенного сертификата CA для iOS:
 
openssl pkcs12 -$ENC -export -in  $SKEYDIR/$1.crt -inkey $SKEYDIR/$1.key -passin pass:$2 -passout pass:$3 -name ${COMMON_NAME} -out $SKEYDIR/"$1"-iOS.p12
 
chmod 400 $SKEYDIR/"$1"-iOS.p12
chmod 400 $SKEYDIR
 
# Просмотр созданного контейнера PKS#12
openssl pkcs12 -info -in $SKEYDIR/"$1"-iOS.p12 -passin pass:$3 -passout pass:$2
Конфигурационный файл OpenSSL ./openssl-OpenVPN.cnf

Конфигурационный файл демона OpenVPN

https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage

Мы будем запускать сразу два сервера OpenVPN на одном IP адресе для возможности подключения по UDP и TCP.

Подключение по UDP предпочтительнее, это экономит трафик и уменьшает время отклика (важно для WWW), но при плохом канале от клиента до UDP OpenVPN сервера в случае потери пакетов связь будет неустойчивой вплоть до невозможности установить соединение в этом случае нас спасет TCP OpenVPN сервер. Причем мы будем использовать tcp/443 порт (https), что даст нам дополнительную лазейку если провайдер клиента блокирует остальные порты, tcp/443 порт в 99,9% случаях нигде не блокируется. Благодаря новой функции port-share можно научить наш OpenVPN сервер распознавать запрос на 443 порт пришел от OpenVPN клиента или это https запрос и в случае обнаружения https запроса переадресовывать его на другой порт, это может быть как другой порт на этом же IP так и на другом (см. конфиг ниже).

Создаем конфигурационный файл OpenVPN (UDP):

touch /etc/openvpn/server_name-udp.conf
chown openvpn:openvpn /etc/openvpn/server_name-udp.conf
chmod 400 /etc/openvpn/server_name-udp.conf
mc -e /etc/openvpn/server_name-udp.conf

При запуске сервера через стартовый скрипт, будет запущено сразу несколько демонов с разными параметрами. О стартовом скрипте я расскажу ниже.

Конфигурационные файлы для UDP и TCP будут немного различаться.

Сжатие трафика LZO мы использовать не будет так как это приводит к повышенной нагрузке на CPU и самое главное с нестабильному пингу.

Конфиг для UDP OpenVPN сервера:

local 1.1.2.4
#local 192.168.1.1
#local 1a01:8f7:d27:3e95::4
port 25000
proto udp

;tun-ipv6

;dev tap
dev tun0

#link-mtu 1400
#tun-mtu 1500
#tun-mtu-extra 32
mssfix 1024
fragment 1400
#mtu-test

management localhost 7505

# TLS
# ----------------------------------------------------------------
tls-server
ns-cert-type client
tls-auth        /etc/openvpn/keys/server/server_name-udp-ta.key 0
tls-timeout     30
# ----------------------------------------------------------------

auth            SHA512                  # openvpn --show-digests
cipher          CAMELLIA-256-CBC        # openvpn --show-ciphers
cipher          AES-256-CBC

dh      /etc/openvpn/keys/server/sfo1-udp-dh4096.pem
ca      /etc/openvpn/keys/CA/ca.crt
cert    /etc/openvpn/keys/server/sfo1-udp.crt
key     /etc/openvpn/keys/server/private/sfo1-udp.key
;crl-verify /etc/openvpn/keys/CA/crl.pem

server 192.168.240.0 255.255.255.0
topology subnet

;ifconfig-pool-persist ipp.txt

;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
;server-bridge

;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"

;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
# EXAMPLE: Suppose you want to give
# Thelonious a fixed VPN IP address of 10.9.0.1.
# First uncomment out these lines:
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
# Then add this line to ccd/Thelonious:
#   ifconfig-push 10.9.0.1 10.9.0.2

# Suppose that you want to enable different
# firewall access policies for different groups
# of clients.  There are two methods:
# (1) Run multiple OpenVPN daemons, one for each
#     group, and firewall the TUN/TAP interface
#     for each group/daemon appropriately.
# (2) (Advanced) Create a script to dynamically
#     modify the firewall in response to access
#     from different clients.  See man
#     page for more info on learn-address script.
;learn-address ./script


push "redirect-gateway def1 bypass-dhcp"

push "dhcp-option DNS 8.8.8.8"
;push "dhcp-option DNS 208.67.220.220"

;client-to-client

;duplicate-cn

script-security 2
up /etc/openvpn/up-test-udp.sh

daemon
writepid /var/run/openvpn.server_name-udp.pid

;comp-lzo

max-clients 10

user openvpn
group openvpn

#user root
#group root

keepalive 5 15
;ping 5
;ping-restart 6
;ping-timer-rem

persist-key
persist-tun

# LOG
#--------------------------------------------------------------
status          /var/log/openvpn/openvpn-server_name-udp-status.log
;log            openvpn.log
log-append      /var/log/openvpn/openvpn-server_name-udp.log

mute 20

verb 4
# 0 - ничего, за исключением фатальных ошибок
# 4 - подойдет для получения общих сведений
# 5 и 6 пригодяться для отладки проблем соединения
# 9 - максимально возможная информация
#--------------------------------------------------------------

Конфиг для TCP OpenVPN сервера

Создаем конфигурационный файл OpenVPN (TCP):

touch /etc/openvpn/server_name-udp.conf
chown openvpn:openvpn /etc/openvpn/server_name-tcp.conf
chmod 400 /etc/openvpn/server_name-tcp.conf
mc -e /etc/openvpn/server_name-tcp.conf

Непосредственно конфиг.

local 1.1.2.4
#local 192.168.1.1
#local 2a02:9f8:d14:5e14::4
port 443
port-share 8.8.5.3 444
;proto tcp
proto tcp

;tun-ipv6

;dev tap
dev tun1

#link-mtu 1400
#tun-mtu 1300
#tun-mtu-extra 32

mssfix 1024
#fragment 1400

management localhost 7506

# TLS
# ----------------------------------------------------------------
tls-server
ns-cert-type client
tls-auth        /etc/openvpn/keys/server/server_name-tcp-ta.key 0
tls-timeout     30
# ----------------------------------------------------------------

auth            SHA512                  # openvpn --show-digests
cipher          CAMELLIA-256-CBC        # openvpn --show-ciphers
cipher          AES-256-CBC

dh      /etc/openvpn/keys/server/sfo1-tcp-dh4096.pem
ca      /etc/openvpn/keys/CA/ca.crt
cert    /etc/openvpn/keys/server/sfo1-tcp.crt
key     /etc/openvpn/keys/server/private/sfo1-tcp.key
;crl-verify /etc/openvpn/keys/CA/crl.pem

server 192.168.241.0 255.255.255.0
topology subnet

;ifconfig-pool-persist ipp.txt

;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
;server-bridge

;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"

;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
# EXAMPLE: Suppose you want to give
# Thelonious a fixed VPN IP address of 10.9.0.1.
# First uncomment out these lines:
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
# Then add this line to ccd/Thelonious:
#   ifconfig-push 10.9.0.1 10.9.0.2

# Suppose that you want to enable different
# firewall access policies for different groups
# of clients.  There are two methods:
# (1) Run multiple OpenVPN daemons, one for each
#     group, and firewall the TUN/TAP interface
#     for each group/daemon appropriately.
# (2) (Advanced) Create a script to dynamically
#     modify the firewall in response to access
#     from different clients.  See man
#     page for more info on learn-address script.
;learn-address ./script


push "redirect-gateway def1 bypass-dhcp"

push "dhcp-option DNS 8.8.8.8"
;push "dhcp-option DNS 208.67.220.220"

;client-to-client

;duplicate-cn

script-security 2
up /etc/openvpn/up-test-tcp.sh

daemon
writepid /var/run/openvpn.server_name-tcp.pid

;comp-lzo

max-clients 10

user openvpn
group openvpn

#user root
#group root

keepalive 5 15
;ping 5
;ping-restart 6
;ping-timer-rem

persist-key
persist-tun

# LOG
#--------------------------------------------------------------
status          /var/log/openvpn/openvpn-server_name-tcp-status.log
;log            openvpn.log
log-append      /var/log/openvpn/openvpn-server_name-tcp.log

mute 20

verb 4
# 0 - ничего, за исключением фатальных ошибок
# 4 - подойдет для получения общих сведений
# 5 и 6 пригодяться для отладки проблем соединения
# 9 - максимально возможная информация

Создаем директорию /var/log/openvpn/ и 2 файла где будут храниться логи:

mkdir /var/log/openvpn/
touch /var/log/openvpn/openvpn-status.log
touch /var/log/openvpn/openvpn.log
chown openvpn:openvpn /var/log/openvpn/openvpn-status.log
chown openvpn:openvpn /var/log/openvpn/openvpn.log
chmod 600 /var/log/openvpn/openvpn-status.log
chmod 600 /var/log/openvpn/openvpn.log

Стартовый скрипт

В случае ручной сборки OpenVPN необходимо вручную создать стартовый скрипт и разместить его в каталоге “/etc/init.d/openvpn”. Для приведенного ниже примера стартового скрипта необходим файл конфигурации “/etc/default/openvpn”

Создаем файл стартового скрипта:

touch /etc/init.d/openvpn
chown root:root /etc/init.d/openvpn
chmod 755 /etc/init.d/openvpn
mc -e /etc/init.d/openvpn
Стартовый скрипт /etc/init.d/openvpn

Также необходимо вручную создать конфигурационный файл для стартового скрипта и разместить его в каталоге “/etc/default/openvpn”.

Создаем конфигурационный файл стартового скрипта /etc/default/openvpn:

touch /etc/default/openvpn
chown root:root /etc/default/openvpn
chmod 444 /etc/default/openvpn
mc -e /etc/default/openvpn
Конфигурационный файл стартового скрипта /etc/default/openvpn

Запуск демона openvpn.

invoke-rc.d openvpn start

Автоматический запуск демона OpenVPN при загрузки операционной системы

Автоматический запуск демона openvpn при загрузки операционной системы на уровне выполнения 3

chkconfig --level 3 openvpn on

Проверка работы демона

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>