Настройка OpenVPN Ubuntu 14.04

Материал из First-Leon
Перейти к навигации Перейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

Предварительная настройка

Устанавливаем сервер и дополнительные утилиты:

apt-get install openvpn dos2unix easy-rsa
mkdir /etc/openvpn/new
mkdir /etc/openvpn/new/key
cp -r /usr/share/easy-rsa/ /etc/openvpn/new/
cp /etc/openvpn/new/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/new/easy-rsa/openssl.cnf
mkdir /etc/openvpn/new/ccd

Отключаем интерактивный ввод данных для генерируемых ключей (удаляем ключ --interact):

sed -i "s/--interact/ /g" /etc/openvpn/new/easy-rsa/build-ca
sed -i "s/--interact/ /g" /etc/openvpn/new/easy-rsa/build-key-server
sed -i "s/--interact/ /g" /etc/openvpn/new/easy-rsa/build-key

Укажем параметры генерации ключей:

mcedit /etc/openvpn/new/easy-rsa/vars
# 2048 бит. Чтоб совсем спокойно спалось
export KEY_SIZE=2048
# 20 лет валидности сертификата, для рекордного аптайма )
export CA_EXPIRE=7300
export KEY_EXPIRE=7300
# Страна
export KEY_COUNTRY="RU"
# Регион
export KEY_PROVINCE="ALT"
# Населенный пункт
export KEY_CITY="BARNAUL"
export KEY_ORG="Organization"
export KEY_EMAIL="почта@админа.ru"
export KEY_OU=IT

Создаем скрипт автоматической генерации ключей и конфигов

mcedit /etc/openvpn/keygen.sh
#!/bin/bash

# $1 название сети
# $2 порт
# $3 подсеть (например: 10.0.0)
# $4 tap интерфейс

# Проверяем сеть на существование
if [ -e /etc/openvpn/$1 ]; then
    echo "Сеть существует!!!"
    exit 0
else
    echo "Сеть не существует. Всё Ok. Продолжаем."
fi

net=${3%%.} #Удаляем точку в конце. Для не внимательных ) 

# Генерируем ключи
cp -r /etc/openvpn/new /etc/openvpn/$1/
cd /etc/openvpn/$1
for i in {002..254};
do
    echo  "ifconfig-push $net."`echo $i | sed 's/^[0^t]*//'`" 255.255.255.0" > ccd/$1-$i
done
cd easy-rsa
. ./vars
./clean-all
bash build-dh
bash build-ca
bash build-key-server $1
#Массово генерируем клиентские сертификаты:
for i in {002..254};
do
    ./build-key $1-$i
done
openvpn --genkey --secret ta.key
cp ta.key ../
cp keys/ca.crt ../
cp keys/ca.key ../
cp keys/dh*.pem ../
cp keys/$1.key ../
cp keys/$1.crt ../
cd ../../

mv $1/easy-rsa/keys/$1-*.key $1/key
mv $1/easy-rsa/keys/$1-*.crt $1/key

# Создаем конфиг linux сервера
echo "port $2"                                           > $1/$1-server.conf
echo "proto udp"                                        >> $1/$1-server.conf
echo "dev $4"                                           >> $1/$1-server.conf
echo "ca /etc/openvpn/$1/ca.crt"                        >> $1/$1-server.conf
echo "cert /etc/openvpn/$1/$1.crt"                      >> $1/$1-server.conf
echo "key /etc/openvpn/$1/$1.key"                       >> $1/$1-server.conf
echo "dh /etc/openvpn/$1/dh2048.pem"                    >> $1/$1-server.conf
echo "server $net.0 255.255.255.0"                      >> $1/$1-server.conf
echo "client-config-dir /etc/openvpn/$1/ccd"            >> $1/$1-server.conf
echo "tls-auth /etc/openvpn/$1/ta.key 0"                >> $1/$1-server.conf
echo "comp-lzo"                                         >> $1/$1-server.conf
echo "max-clients 253"                                  >> $1/$1-server.conf
echo "status /var/log/openvpn/$1-status.log"            >> $1/$1-server.conf
echo "log /var/log/openvpn/$1-vpn.log"                  >> $1/$1-server.conf
echo "log-append /var/log/openvpn/$1-vpn.log"           >> $1/$1-server.conf
echo "script-security 2"                                >> $1/$1-server.conf
# Уровень отладочной информации verb                    >> $1/$1-server.conf
echo "verb 2"                                           >> $1/$1-server.conf
echo "multihome"                                        >> $1/$1-server.conf
# Разрешаем обмен пакетами между клиентами              >> $1/$1-server.conf
echo "client-to-client"                                 >> $1/$1-server.conf
echo "keepalive 10 60"                                  >> $1/$1-server.conf

# Создаем конфиг windows сервера
echo "port $2"                                                                             > $1/$1-server.ovpn
echo "proto udp"                                                                          >> $1/$1-server.ovpn
echo "dev $4"                                                                             >> $1/$1-server.ovpn
echo "ca \"$1\\\\ca.crt\""                                                                >> $1/$1-server.ovpn
echo "cert \"$1\\\\$1.crt\""                                                              >> $1/$1-server.ovpn
echo "key \"$1\\\\$1.key\""                                                               >> $1/$1-server.ovpn
echo "dh \"$1\\\\dh2048.pem\""                                                            >> $1/$1-server.ovpn
echo "server $net.0 255.255.255.0"                                                        >> $1/$1-server.ovpn
echo "client-config-dir \"$1\\\\ccd\""                                                    >> $1/$1-server.ovpn
echo "tls-auth \"C:\\\\Program\ Files\\\\OpenVPN\\\\config\\\\$1\\\\ta.key\" 0"           >> $1/$1-server.ovpn
echo "comp-lzo"                                                                           >> $1/$1-server.ovpn
echo "max-clients 253"                                                                    >> $1/$1-server.ovpn
echo "status \"C:\\\\Program\ Files\\\\OpenVPN\\\\log\\\\$1-status.log\""                 >> $1/$1-server.ovpn
echo "log \"C:\\\\Program\ Files\\\\OpenVPN\\\\log\\\\$1-vpn.log\""                       >> $1/$1-server.ovpn
echo "script-security 2"                                                                  >> $1/$1-server.ovpn
# Уровень отладочной информации verb                                                      >> $1/$1-server.ovpn
echo "verb 2"                                                                             >> $1/$1-server.ovpn
# Разрешаем обмен пакетами между клиентами                                                >> $1/$1-server.ovpn
echo "client-to-client"                                                                   >> $1/$1-server.ovpn
echo "keepalive 10 60 "                                                                   >> $1/$1-server.ovpn
echo "block-outside-dns"                                                                  >> $1/$1-server.ovpn
# Конвертируем переносы строк в Win стиль
unix2dos $1/$1-server.ovpn

# Настраиваем логирование
touch /var/log/openvpn/$1-vpn.log
touch /var/log/openvpn/$1-status.log
chown root:adm /var/log/openvpn/$1-*
chmod 640 /var/log/openvpn/$1-*

# Создаем конфиг linux клиента
echo "client"                                           >> $1/$1-client.conf
echo "dev tap"                                          >> $1/$1-client.conf
echo "proto udp"                                        >> $1/$1-client.conf
echo "remote  $2"                                       >> $1/$1-client.conf
echo "resolv-retry infinite"                            >> $1/$1-client.conf
echo "nobind"                                           >> $1/$1-client.conf
echo "persist-key"                                      >> $1/$1-client.conf
echo "persist-tun"                                      >> $1/$1-client.conf
echo "ca $1/ca.crt"                                     >> $1/$1-client.conf
echo "cert $1/$1-000.crt"                               >> $1/$1-client.conf
echo "key $1/$1-000.key"                                >> $1/$1-client.conf
# Проверяем сертификат, предъявленный сервером.         >> $1/$1-client.conf
echo "ns-cert-type server"                              >> $1/$1-client.conf
echo "tls-auth $1/ta.key 1"                             >> $1/$1-client.conf
echo "comp-lzo"                                         >> $1/$1-client.conf
# отправку ping-подобных сообщений для того, чтобы каждая сторона знала что другая перестала отвечать
# Пинг каждые 5 секунд, если в течение 20 секунд нет ответа, то считается что удаленных хост не доступен
echo "keepalive 4 16"                                   >> $1/$1-client.conf
echo "verb 3"                                           >> $1/$1-client.conf
echo "route-method exe"                                 >> $1/$1-client.conf
echo "route-delay 5"                                    >> $1/$1-client.conf

# Создаем конфиг windows клиента
unix2dos -n $1/$1-client.conf $1/$1-client.ovpn

Права на запуск скрипта:

chmod +x /etc/openvpn/keygen.sh

Создаем каталог логов:

mkdir /var/log/openvpn

Генерация ключей

cd /etc/openvpn
./keygen.sh vpnnetwork 60000 10.20.30 tap0

Список параметров:

#$1 название сети
#$2 порт
#$3 подсеть (например: 10.20.30)
#$4 tap интерфейс

В результате выполнения скрипта, в каталоге "название сети" будут расположены следующие файлы и директории:

ccd
key                         # ключи клиентов
ca.crt
dh512.pem
ta.key
название_сети-client.conf   # Линуксовый клиентский конфиг
название_сети-client.ovpn   # Виндовый клиентский конфиг
название_сети-server.conf   # Линуксовый серверный конфиг
название_сети-server.ovpn   # Виндовый серверный конфиг

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

Если запускаем сервер на другой машине, чем та, на которой создавали конфиги и ключи, то копируем в /etc/openvpn каталог "название сети".

OpenVPN устроен так: сколько конфигурационных файлов в директории для конфигов - столько он и запускает клиентов/серверов.

Стало быть для запуска сервера нужно:

cp /etc/openvpn/"название сети"/"название сети"-server.conf /etc/openvpn/

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

Для Win сервера меняется путь расположения каталога с ключами:

C:\Program Files\OpenVPN\config\"название сети"

Конфигурационный файл будет лежать тут:

C:\Program Files\OpenVPN\config\название_сети-server.ovpn

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

Для запуска клиента, копируем ключи:

/etc/openvpn/название_сети/ca.crt
/etc/openvpn/название_сети/ta.key
/etc/openvpn/название_сети/название_сети-000.key
/etc/openvpn/название_сети/название_сети-000.crt
/etc/openvpn/название_сети-client.conf

Указываем ip и порт сервера в /etc/openvpn/название_сети-client.conf:

remote 8.9.10.11 1234

Рестартуем сервис:

/etc/init.d/openvpn restart название_сети-client

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

Тут можно и поподробнее :)

Обратить внимание на разрядность системы! Устанавливайте клиента соответствующей разрядности.

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

Копируем ключи:

C:\Program Files\OpenVPN\config\название_сети\ca.crt
C:\Program Files\OpenVPN\config\название_сети\ta.key
C:\Program Files\OpenVPN\config\название_сети\название_сети-000.key
C:\Program Files\OpenVPN\config\название_сети\название_сети-000.crt

И конфигурационный файл:

C:\Program Files\OpenVPN\config\название_сети-client.ovpn

Указываем ip и порт сервера в C:\Program Files\OpenVPN\config\название_сети-client.ovpn:

remote 8.9.10.11 1234

И номер ключа:

cert название_сети\\название_сети-000.crt
key название_сети\\название_сети-000.key

Рестартуем службу в оснастке управления службами и при необходимости настраиваем автозапуск:

Проверяем существование нового сетевого подключения

В случае возникновения проблем, смотрим логи

В данном примере, в логе сказано: "Все хорошо, соединение установлено!"

Разное

Добавление tap адаптера в Windows

При установке openvpn в систему автоматически добавляется tap адаптер. Он и будет использоваться при запуске первого сервера/клиента.

Для каждого дополнительного сервера/клиента необходимо вручную добавить дополнительные адаптеры путем запуска скрипта:

C:\Program Files\TAP-Windows\bin\addtap.bat

Проблемы при добавлении маршрутов в Windows

Попробуйте увеличить значение

route-delay 5

На практике не более 1% машин требуют значения более 5-ти (в большинстве случаев хватает 2)

Добавление маршрута по умолчанию через vpn соединение

Добавить в конфиг клиента: В Linux:

redirect-gateway

В Windows:

redirect-gateway def1
#Или
redirect-gateway local def1

Отзыв сертификата

В случае, если вам нужно запретить подключение к серверу для какого либо клиента, необходимо отозвать сертификат этого клиент. Для этого необходимо выполнить следующее:

cd /etc/openvpn/название_сети/easy-rsa/2.0/
. ./var
./revoke-full название_сети-xxx

Где xxx - номер клиента.

После этих операция, в каталоге /etc/openvpn/название_сети/easy-rsa/2.0/keys появится файл crl.pem содержащий изъятые сертификаты.

Необходимо указать серверу принимать во внимание этот файл. Для этого в конфиге сервера /etc/openvpn/"название сети"/"название сети"-server.conf добавить параметр:

crl-verify /etc/openvpn/"название_сети"/easy-rsa/2.0/keys/crl.pem

Вопросы, предложения, обсуждения

Тут