Установка и настройка OpenVPN на Debian 10 и Ubuntu 18.

Установка и настройка OpenVPN на Debian 10 и Ubuntu 18.

В данном руководстве рассматривается установка и настройка OpenVPN сервера под управлением Debian 10 и Ubuntu 18.

OpenVPN-cервер имеет внешний IP-адрес 1.1.1.1 , подключаемые устройства будет получать адреса из сети 10.8.0.0/24

При данной схеме клиенты подключаются на адрес 1.1.1.1 , во внешний мир они также будут выходить с адреса 1.1.1.1. Если на сервере присутствует несколько внешних IP-адресов, то схему можно видоизменить: клиенты подключаются на 1.1.1.1, во внешний мир выходят с 1.1.1.2 ( не путать с double vpn ).

 

Итак, в наличии имеется свежеустановленный сервер на Debian 10.

Выполняем обновление:

# apt-get update

# apt-get upgrade

Производим установку пакетов, в том числе вспомогательных:

# apt-get install mc aptitude net-tools htop openvpn easy-rsa

Пакет easy-rsa требуется нам для создания собственного центра сертификации. Для безопасности его можно разместить на другом сервере, для простоты демонстрации создание ключей и сертификатов будем производить на этом же сервере. Для удобства работы создаём символическую ссылку на каталог с easy-rsa в /etc/openvpn:

# ln -s /usr/share/easy-rsa/ /etc/openvpn/

Для настройки переменных центра сертификации создаём файл vars:

# touch /etc/openvpn/easy-rsa/vars
и вносим в него следующие строки:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="EKB"
export KEY_CITY="EKB"
export KEY_ORG="SYSAD"
export KEY_EMAIL="info@sysad.su"
export KEY_CN="IT"
export KEY_OU="IT"
export KEY_NAME="openvpn.sysad.su"

И выполняем:

# ./vars

Сейчас всё готово к созданию центра сертификации. Выполняем инициализацию:

# cd /etc/openvpn/easy-rsa/

# ./easyrsa init-pki

В результате должны увидеть на экране результат работы:

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/easy-rsa/pki

Создаём корневой сертификат:

# ./easyrsa build-ca
При запросе скрипта

Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:

дважды задаём пароль.

На запрос

Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

можно нажать клавишу Enter.

Создаем ключ Диффи-Хеллмана:

# ./easyrsa gen-dh

Для создания сертификата сервера на первом этапе создаём файл запроса:

# ./easyrsa gen-req server01 nopass

И затем создаём сертификат сервера:

# ./easyrsa sign-req server server01

На вопрос Type the word ‘yes’ to continue, or any other input to abort вводим: yes

И затем пароль, который использовался для создания корневого сертификата.

Для создания ta ключа используем команду:

# openvpn --genkey --secret pki/ta.key

Приступаем к настройке OpenVPN сервера.

Копируем файлы ca.crt, dh.pem, server01.crt, server01.key, ta.key в /etc/openvpn

Создаём файл конфигурации server.conf со следующим содержимым:


local 1.1.1.1
port 1194
proto udp
dev tun

ca ca.crt
cert server01.crt
key server01.key
dh dh.pem
tls-auth ta.key 0

server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
client-to-client
keepalive 10 120

cipher AES-256-CBC
auth SHA256

user nobody
group nogroup

persist-key
persist-tun

status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 3

# for udp only
explicit-exit-notify 1

Включаем автозапуск OpenVPN сервера:

# systemctl enable openvpn@server

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

# systemctl start openvpn@server

Проверяем лог-файлы и наличие интерфейса tun0:

# ip a

Если в вводе команды ip a присутствуют нижеследующие строки, значит сервис успешно стартовал:


3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
<pre>

 

Для того, чтобы сервер мог транслировать пакеты с клиента во внешний мир выполняем следующие действия.

В файл /etc/sysctl.conf добавляем строку

net.ipv4.ip_forward=1

Для вступления изменений в силу выполняем:
# sysctl -p
Также потребуется установить файрвол UFW.

# apt install ufw

Открываем файл /etc/ufw/before.rules

Это файл содержит настройки UFW, которое применяются перед применением правил UFW. Добавьте в начало файла нижеследующие строки. Это настроит правила, применяемые по умолчанию, к цепочке POSTROUTING в таблице nat и будет скрывать весь трафик от VPN:

# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0] 
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

# Don't delete these required lines, otherwise there will be errors
. . .

Теперь мы должны сообщить UFW, что ему по умолчанию необходимо разрешать перенаправленные пакеты. Для этого откройте файл /etc/default/ufw:

Найдите в файле директиву DEFAULT_FORWARD_POLICY. Мы изменим значение с DROP на ACCEPT:

DEFAULT_FORWARD_POLICY="ACCEPT"

Открываем в файрволе необходимые порты:

# ufw allow 22
# ufw allow 1194/udp

Теперь деактивируем и активируем UFW для применения внесённых изменений:

# ufw disable
# ufw enable

 

Для настройки клиента потребуется создание клиентских сертификатов, ключей и файла конфигурации. Автоматизируем этот процесс.

В каталоге /etc/openvpn/client создадим файл make_config.sh со следующим содержимым:

#!/bin/bash

# First argument: Client identifier

cd /etc/openvpn/easy-rsa
/etc/openvpn/easy-rsa/easyrsa gen-req ${1} nopass
/etc/openvpn/easy-rsa/easyrsa sign-req client ${1}

cp /etc/openvpn/easy-rsa/pki/private/${1}.key /etc/openvpn/client/${1}.key
cp /etc/openvpn/easy-rsa/pki/issued/${1}.crt /etc/openvpn/client/${1}.crt
cp /etc/openvpn/easy-rsa/pki/ca.crt  /etc/openvpn/client/ca.crt
cp /etc/openvpn/easy-rsa/pki/ta.key  /etc/openvpn/client/ta.key

cd /etc/openvpn/client

KEY_DIR=/etc/openvpn/client
OUTPUT_DIR=/etc/openvpn/client
BASE_CONFIG=/etc/openvpn/client/base.conf

cat ${BASE_CONFIG} \
    <(echo -e '<ca>') \
    ${KEY_DIR}/ca.crt \
    <(echo -e '</ca>\n<cert>') \
    ${KEY_DIR}/${1}.crt \
    <(echo -e '</cert>\n<key>') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '</key>\n<tls-auth>') \
    ${KEY_DIR}/ta.key \
    <(echo -e '</tls-auth>') \
    > ${OUTPUT_DIR}/${1}.ovpn

Создадим файл шаблона для клиентского конфига base.conf:

client
dev tun
proto udp
remote 1.1.1.1 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
auth SHA256
verb 3
key-direction 1

 

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

# bash /etc/openvpn/client/make_config.sh client01

где client01 желаемое имя файла конфигурации. На выходе получим client01.ovpn со встроенными ключами. Данный файл нужно перенести на клиентский компьютер и поместить в соответствующий каталог.

На этом настройка завершена.

Nicko

13 комментариев

mishka_kosolapiy Опубликовано7:18 дп - 11 октября, 2024

Благодарствую! Понятный и главное рабочий мануал.

Alex Опубликовано2:00 пп - 7 июня, 2023

Лучше подскажите, если в курсе, как сделать так, чтобы клиент, подключенный к серверу VPN мог пинговать устройства внутри сети не только по ip, но и по NetBIOS-имени? Так как при такой конфигурации по имени устройства не пингуются.

    Alex Опубликовано2:19 пп - 7 июня, 2023

    Возможно немного напутал. Может не NetBIOS-имя. Имеется ввиду по имени ПК или сервера внутри сети.

      Nicko Опубликовано4:13 пп - 7 июня, 2023

      В файле конфигурации сервера замените гугловские ДНС-серверы на свои внутренние:
      push «dhcp-option DNS 8.8.8.8»
      push «dhcp-option DNS 8.8.4.4»

        Alex Опубликовано6:46 дп - 8 июня, 2023

        Дело в том, что у нас в локальной сети нет AD, DHCP и своего DNS. В качестве шлюза UTM Firewall DFL от D-Link, и все машины в локалке со статическими ip.

          Alex Опубликовано8:09 дп - 8 июня, 2023

          Нужно, чтобы через VPN-тоннель работал WINS.

          Nicko Опубликовано8:14 дп - 8 июня, 2023

          Посмотрите в документации: https://openvpn.net/community-resources/pushing-dhcp-options-to-clients/

          Добавьте в конфиг сервера строку:
          push «dhcp-option WINS ИмяWINSсервера»

          Nicko Опубликовано3:26 дп - 9 июня, 2023

          Хотя, если у вас одноранговая сеть на основе рабочей группы, то рабочие станции проводят выборы WINS-сервера и адрес WINS-сервера может изменяться.
          Поэтому включите удалённый компьютер в ту же рабочую группу, что и компьютеры в офисе.

          push «dhcp-option WINS ИмяWINSсервера» — не требуется.

Alex Опубликовано6:54 дп - 7 июня, 2023

Спасибо! VPN поднялся. Только как настроить, чтобы клиент при подключенном VPN мог видеть локальную сеть, в которой находится сервер? Собственно VPN мне нужен для удаленного подключения к локальной сети офиса. Сеть, условно, 172.20.10.0/16. У сервера ip из этой же сети, а на каналообразующем оборудовании сделана переадресация на адрес сервера. И даже если делаю так, что клиенты получают адрес из сети, например, 172.20.15.0/24, то они не видят ничего из локальной сети офиса. Может быть это ограничивается 24 подсетью, но скажем при попытке установить 16 — начинает ругаться.

    Alex Опубликовано9:32 дп - 7 июня, 2023

    Спасибо, уже разобрался. Почему-то net.ipv4.ip_forward=1 в файле /etc/sysctl.conf сразу не сработало. Возможно вышел без сохранения сначала. Поправил — заработало.

      Nicko Опубликовано10:41 дп - 7 июня, 2023

      Отлично!
      Рад, что статья помогла.

Эндрю Опубликовано11:45 дп - 23 февраля, 2023

Спасибо! Автору пива! Всё чётко, а то в других манах муть да и с ошибками

Ivan Baikal Опубликовано4:06 пп - 4 ноября, 2022

Спасибо за гайд, друг)

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