Настройка OpenVPN Ubuntu 18.04 TUN

Материал из 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 tun интерфейс
# $5 первый dns адрес vpn сервера
# $6 второй dns адрес vpn сервера

# Проверяем сеть на существование
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 {2..63}
do
    let "j=$i*4"
    let "l=$j+1"
    let "k=$j+2"
    echo "ifconfig-push $net.$l $net.$k" > ccd/$1-$l
done 
cd easy-rsa
. ./vars
./clean-all
bash build-dh
bash build-ca
bash build-key-server $1
#Массово генерируем клиентские сертификаты:
for i in {2..63};
do
    let "j=$i*4";
    let "l=$j+1"
    ./build-key $1-$l
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

# Конвертируем переносы строк в 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 tun"                                                                    >> $1/$1-client.conf
echo "proto udp"                                                                  >> $1/$1-client.conf
echo "remote $5 $2"                                                               >> $1/$1-client.conf
echo "remote $6 $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
echo "#up /etc/openvpn/update-systemd-resolved"                                    >> $1/$1-client.conf
echo "#down /etc/openvpn/update-systemd-resolved"                                  >> $1/$1-client.conf

# Создаем конфиг windows клиента
unix2dos -n $1/$1-client.conf $1/$1-client.ovpn
echo "# Игнорировать остальные DNS сервера, если используем DNS сервер через VPN" >> $1/$1-client.ovpn
echo "block-outside-dns"                                                          >> $1/$1-client.ovpn

# Создаем конфиги для каждого клиента linux
set -x

mkdir $1/configs-linux
for i in {2..63};
do
    let "j=$i*4"
    let "l=$j+1"

    cat $1/$1-client.conf > $1/configs-linux/$1-client-$l.conf

    echo "<ca>" >> $1/configs-linux/$1-client-$l.conf
    cat $1/ca.crt >> $1/configs-linux/$1-client-$l.conf
    echo "</ca>" >> $1/configs-linux/$1-client-$l.conf
    echo "<cert>" >> $1/configs-linux/$1-client-$l.conf
    cat $1/key/$1-$l.crt >> $1/configs-linux/$1-client-$l.conf
    echo "</cert>" >> $1/configs-linux/$1-client-$l.conf
 
    echo "<key>" >> $1/configs-linux/$1-client-$l.conf
    cat $1/key/$1-$l.key >> $1/configs-linux/$1-client-$l.conf
    echo "</key>" >> $1/configs-linux/$1-client-$l.conf

    echo "<tls-auth>" >> $1/configs-linux/$1-client-$l.conf
    cat $1/ta.key >> $1/configs-linux/$1-client-$l.conf
    echo "</tls-auth>" >> $1/configs-linux/$1-client-$l.conf
done

# Создаем конфиги для каждого клиента windows
mkdir $1/configs-windows
for i in {2..63};
do
    let "j=$i*4"
    let "l=$j+1"
    unix2dos -n $1/configs-linux/$1-client-$l.conf $1/configs-windows/$1-client-$l.ovpn
    echo "# Игнорировать остальные DNS сервера, если используем DNS сервер через VPN" >> $1/configs-windows/$1-client-$l.ovpn
    echo "block-outside-dns"                                                          >> $1/configs-windows/$1-client-$l.ovpn
done

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

chmod +x /etc/openvpn/keygen.sh

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

mkdir /var/log/openvpn

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

cd /etc/openvpn
./keygen.sh vpnnetwork 60000 10.20.30 tun0 vpn01.domain.ru vpn02.domain.ru

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

#$1 название сети
#$2 порт
#$3 подсеть (например: 10.20.30)
#$4 tap интерфейс
#$5 Первое ДНС имя vpn сервера vpn01.domain.ru
#$6 Второе ДНС имя vpn сервера vpn02.domain.ru

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

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

Установка в Windows

Скачиваем последнюю версию клиента, в соответствии с разрядностью Windows отсюда.

OpenVPN GUI можно не устанавливать

Файл:Ovpn-gui.png

Устанавливаем драйвер виртуального сетевого интерфейса

Файл:Ovpn02-driver.png

Указываем службе запускаться автоматически

Файл:Ovpn04-service.png

В каталог C:\Program Files\OpenVPN\config\ копируем конфигурационный файл (sibway-external-client.ovpn).

Перезапускаем службу OpenVPN

Файл:Ovpn-restart.png

Проверяем, установлено ли соединение. IP адрес для нового сетевого адаптера должен быть из сети 10.xxx.yyy.0/24

Файл:Ovpn-ip.png

Теперь можно проверить связь до какого либо внутреннего адреса (из сети 10.xxx.yyy.0/24). Например до VPN сервера: 10.xxx.yyy.1:

Файл:Ovpn-ping.png

При возникновении проблем, сообщения OpenVPN можно посмотреть в его Log файлах в каталоге C:\Program Files\OpenVPN\logs\(и сразу выслать этот файл системному администратору. После рестарта службы OpenVPN файл перезаписывается!)

Установка в Linux

Устанавливаем OpenVPN:

apt-get install openvpn

В каталог /etc/openvpn копируем конфигурационный файл work-client.conf

Применяем новые параметры и перезапускаем сервис:

systemctl reenable openvpn.service
systemctl restart openvpn.service

Смотрим в логах, как проходит подключение:

tail -f /var/log/syslog

Удачное подключение заканчивается строкой:

Sep 15 16:37:24 vm96078 work-client[1097]: Initialization Sequence Completed

Разное

Добавление 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

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

Тут