Настройка OpenVPN Ubuntu 18.04
Предварительная настройка
Устанавливаем сервер и дополнительные утилиты:
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 интерфейс # $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 {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 # Конвертируем переносы строк в 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 $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 # Создаем конфиги для каждого клиента mkdir $1/config for i in {002..254}; do cat $1/$1-client.conf > $1/config/$1-client-$i.conf echo "<ca>" >> $1/config/$1-client-$i.conf cat $1/ca.crt >> $1/config/$1-client-$i.conf echo "</ca>" >> $1/config/$1-client-$i.conf echo "<cert>" >> $1/config/$1-client-$i.conf cat $1/key/$1-$i.crt >> $1/config/$1-client-$i.conf echo "</cert>" >> $1/config/$1-client-$i.conf echo "<key>" >> $1/config/$1-client-$i.conf cat $1/key/$1-$i.key >> $1/config/$1-client-$i.conf echo "</key>" >> $1/config/$1-client-$i.conf echo "<tls-auth>" >> $1/config/$1-client-$i.conf cat $1/ta.key >> $1/config/$1-client-$i.conf echo "</tls-auth>" >> $1/config/$1-client-$i.conf done # Создаем конфиг 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 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
Настройка клиента в 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
Вопросы, предложения, обсуждения
Разное
Добавить в мануал:
sudo apt install openvpn-systemd-resolved
В config.ovpn:
script-security 2 up /etc/openvpn/update-systemd-resolved down /etc/openvpn/update-systemd-resolved down-pre
А на сервере:
push "dhcp-option DNS 10.62.3.2" push "dhcp-option DNS 10.62.3.3" push "dhcp-option DOMAIN example.office" push "dhcp-option DOMAIN example.lan" push "dhcp-option DOMAIN-SEARCH example.com" push "dhcp-option DOMAIN-ROUTE example.net" push "dhcp-option DOMAIN-ROUTE example.org"
https://askubuntu.com/questions/1032476/ubuntu-18-04-no-dns-resolution-when-connected-to-openvpn/1036209 https://github.com/jonathanio/update-systemd-resolved/blob/master/README.md