Настройка OpenVPN Ubuntu 18.04 TUN
Предварительная настройка
Устанавливаем сервер и дополнительные утилиты:
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 можно не устанавливать
Устанавливаем драйвер виртуального сетевого интерфейса
Указываем службе запускаться автоматически
В каталог C:\Program Files\OpenVPN\config\ копируем конфигурационный файл (sibway-external-client.ovpn).
Перезапускаем службу OpenVPN
Проверяем, установлено ли соединение. IP адрес для нового сетевого адаптера должен быть из сети 10.xxx.yyy.0/24
Теперь можно проверить связь до какого либо внутреннего адреса (из сети 10.xxx.yyy.0/24). Например до VPN сервера: 10.xxx.yyy.1:
При возникновении проблем, сообщения 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