OpenVPN. Centos 7. Сервер + клиенты: различия между версиями

Материал из Wiki
Перейти к навигации Перейти к поиску
Строка 174: Строка 174:
  status /var/log/openvpn/openvpn-status.log
  status /var/log/openvpn/openvpn-status.log
  log /var/log/openvpn/openvpn.log
  log /var/log/openvpn/openvpn.log
; Возможность нескольких подключений под одним клиентом с одним сертификатом
; Иначе одному клиенту с одним сертификатом при попытке подключений
; с разных устройств будет выдаватьcя один и тот же IP
duplicate-cn
<code>systemctl enable openvpn@server</code>
<code>systemctl enable openvpn@server</code>



Версия 23:12, 14 февраля 2025

OpenVPN сервер

Настройка конфигурации сервера

Разрешим пересылку пакетов между интерфейсами

nano /etc/sysctl.conf

...
net.ipv4.ip_forward = 1
...

Сохраним изменения и выполним:

sysctl -p

Если OpenVPN сервер находится в локальной сети за маршрутизатором - на маршрутизаторе 192.168.199.1 пробросим внешний порт 11194 на внутренний порт 1194 нашего ovpn-сервера

// 1194 с внешки у ростелеком, например, не работает, возможно блокировка

Этот пункт делаем только если интерфейс Tun, и на локальном интерфейсе openvpn-сервера не настроен NAT

На маршрутизаторе 192.168.199.1 добавим маршрут до сети впн (10.10.10.0/24)через ip-адрес нашего овпн-сервера (centos), чтобы компы из сети 192.168.199.0/24 за маршрутизатором 192.168.199.1, ходя на него (или отвечая на запрос) знали через что идти до сети впн клиентов (10.10.10.0/24)

ЧЕРЕЗ IP-АДРЕС НАШЕГО ОВПН-СЕРВЕРА (CENTOS), ЧТОБЫ КОМПЫ ИЗ СЕТИ 192.168.199.0/24 ЗА МАРШРУТИЗАТОРОМ 192.168.199.1,

ХОДЯ НА НЕГО (ИЛИ ОТВЕЧАЯ НА ЗАПРОС) ЗНАЛИ ЧЕРЕЗ ЧТО ИДТИ ДО СЕТИ ВПН КЛИЕНТОВ (10.10.10.0/24)

yum install -y epel-release

yum install -y openvpn easy-rsa –y

mkdir -p /etc/openvpn/easy-rsa

mkdir -p /etc/openvpn/keys

mkdir -p /var/log/openvpn

cp -rf /usr/share/easy-rsa/3.0.8/* /etc/openvpn/easy-rsa

Создадим файл с переменными для создания сертификатов

KEY_NAME: Следует указать значение server, иначе придется вносить изменения в конфигурационные файлы, в которых упоминается server.key и server.crt.

KEY_CN: здесь надо написать домен или поддомен, который указывает на ваш сервер.

nano /etc/openvpn/easy-rsa/vars

export KEY_COUNTRY="RU"
export KEY_PROVINCE="Moscow"
export KEY_CITY="Moscow"
export KEY_ORG="OOO Romashka"
export KEY_EMAIL="ivan@example.com"
export KEY_OU="Community"
export KEY_NAME="server"
export KEY_CN=openvpn.example.com

cp /etc/openvpn/easy-rsa/openssl-easyrsa.cnf /etc/openvpn/easy-rsa/openssl.cnf

cd /etc/openvpn/easy-rsa

source ./vars

Создадим удостоверяющий центр CA

./easyrsa init-pki

./easyrsa build-ca

Вводим пароль

Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

Имя сервера

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

Не забудьте указанный при запросе пароль.

Его нужно будет вводить каждый раз при создании нового сертификата openvpn.

Мы получили 2 ключа:

Ключ секретный, его нужно оставить на сервере и никому не отдавать

    /etc/openvpn/easy-rsa/pki/private/ca.key

Ключ открытый, его мы будем вместе с пользовательскими сертификатами передавать клиентам.

    /etc/openvpn/easy-rsa/pki/ca.crt

Создаем запрос сертификата для сервера без пароля с помощью опции nopass, иначе придется вводить пароль с консоли при каждом запуске сервера:

./easyrsa gen-req server nopass

Сгенерированные файлы

    req: /etc/openvpn/easy-rsa/pki/reqs/server.req
    key: /etc/openvpn/easy-rsa/pki/private/server.key

Подписываем запрос на получение сертификата у нашего CA:

./easyrsa --days=3650 sign-req server server

 Request subject, to be signed as a server certificate for 3650 days:

В процессе работы скрипта вводим пароль от CA, который указывали раньше и отвечаем на вопрос yes.

Мы получили подписанный удостоверяющим центром сертификат для сервера

    /etc/openvpn/easy-rsa/pki/issued/server.crt

Генерируем ключ Диффи-Хелмана

./easyrsa gen-dh

Файл dh сертификата

    /etc/openvpn/easy-rsa/pki/dh.pem

Копируем в папку /etc/openvpn все необходимые для работы openvpn сервера ключи:

cp pki/ca.crt /etc/openvpn/keys/ca.crt

cp pki/dh.pem /etc/openvpn/keys/dh.pem

cp pki/issued/server.crt /etc/openvpn/keys/server.crt

cp pki/private/server.key /etc/openvpn/keys/server.key

Конфигурация сервера    

nano /etc/openvpn/server.conf

; интерфейс, на котором работает ovpn, если не указано - то работает на всех
local 192.168.199.225

; настройки сети
port 1194
proto udp
dev tun

; пути до ключей
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh.pem

; настройки для статического адреса сервера в туннелях впн
mode server
tls-server

; статический адрес туннеля сервера
ifconfig 10.10.10.1 255.255.255.0

; пул адресов клиентов
ifconfig-pool 10.10.10.100 10.10.10.200

; маршрут на стороне сервера до сети клиентов
route 10.10.10.0 255.255.255.0

; маршрут на стороне клиента (клиенту необходимы админские права для создания маршрутов)
push "route 10.10.10.1"

; маршрут на стороне клиента до хостов в локальной сети сервера
push "route 192.168.199.0 255.255.255.0"

; инфо о подключенных клиентах
ifconfig-pool-persist /etc/openvpn/ipp.txt

; директория с настройками для каждого клиента
;client-config-dir /etc/openvpn_tun/ccd

; клиенты могут видеть друг друга
client-to-client

; каждые 10 секунд посылать ping на удаленный хост, и, если за 120 секунд не было получено ни одного пакета — то перезапускать туннель
keepalive 10 120
max-clients 100
user nobody
group nobody
persist-key
persist-tun

; алгоритм шифрования
cipher AES-256-CBC

; Не писать в логи повторяющиеся сообщения:
;mute 20

; Уровень подробности логов (от 0 до 9)
;verb 3

; логи
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log

; Возможность нескольких подключений под одним клиентом с одним сертификатом
; Иначе одному клиенту с одним сертификатом при попытке подключений
; с разных устройств будет выдаватьcя один и тот же IP
duplicate-cn

systemctl enable openvpn@server

systemctl start openvpn@server

ПРИ ЗАПРОСЕ С ВПН-КЛИЕНТА (НАПРИМЕР) 10.10.10.202, К ХОСТУ ЛОКАЛЬНОЙ СЕТИ 192.168.199.0/24 ЗА МАРШРУТИЗАТОРОМ,

НАПРИМЕР 192.168.199.16, ТРАФИК ИДЕТ ЧЕРЕЗ ВПН СЕРВЕР (Tun0 интерфейс) 10.10.10.1, ПОТОМ К ХОСТУ 192.168.199.16,

НО ХОСТ 192.168.199.16 НЕ ЗНАЕТ О СУЩЕСТВОВАНИИ СЕТИ 10.10.10.0/24,

ПОЭТОМУ ОБРАТНЫЙ ТРАФИК ПОЙДЕТ ЧЕРЕЗ ДЕФОЛТНЫЙ ШЛЮЗ, ТО ЕСТЬ МАРШРУТИЗАТОР 192.168.199.1,

НО ОН ТОЖЕ НЕ ЗНАЕТ О СУЩЕСТВОВАНИИ СЕТИ 10.10.10.0/24, ПОЭТОМУ ПИНГА ОТ 10.10.10.202 до 192.168.199.16 НЕ БУДЕТ.

ДЛЯ РЕШЕНИЯ ЭТОЙ ПРОБЛЕМЫ ЕСТЬ 3 ВАРИАНТА:

1. На маршрутизаторе 192.168.199.1 прописать маршрут до 10.10.10.0/24 через IP openvpn-сервера (192.168.199.225)

Тогда трафик от клиента дойдя по дефолтному шлюзу завернется на 192.168.199.225, а оттуда к клиенту 10.10.10.202

2. Прописать NAT-маскарадинг на локальном интерфейсе (ens32)

openvpn-сервера (192.168.199.225) от сети 10.10.10.0/24:

iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o ens32 -j MASQUERADE

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

systemctl disable firewalld

yum install iptables-services

systemctl enable iptables

service iptables save

В таком случае весь трафик от впн-клиентов сети 10.10.10.0/24

будет натится на локальном интерфейсе openvpn-сервера

3. !!! НЕ ТЕСТИРОВАЛ !!!

Для этого способа необходимо настраивать openvpn сервер

с использованием интерфейса 2-го (канального) уровня - TAP,

так как TUN это интерфейс 3-го (сетевого) уровня и собираться в бридж не может.

Далее надо объединить физический интерфейс ens32 с интерфейсом Tap0 в бридж.

Бриджу назначаем адрес 192.168.199.225 (какой был у ens32).

Изменения в конфиге openvpn-сервера будут выглядеть примерно так:

...

dev tap0

...

; 192.168.168.225 255.255.255.0 - адрес и маска бриджа

; 192.168.168.100 192.168.168.200 - пул адресов, которые будут выдаваться клиентам

server-bridge 192.168.168.225 255.255.255.0 192.168.168.100 192.168.168.200

...

Таким образом впн-клиенты сразу будут оказываться в диапазоне сети за маршрутизатором

и общаться с хостами на уровне коммутации.

Настройка конфигурации клиентов

Вариант 1. Создание конфигураций вручную

Создадим ключ для клиента openvpn:

./easyrsa gen-req client1 nopass

./easyrsa sign-req client client1

Процедура аналогична созданию сертификата для сервера. Так же вводим пароль, отвечаем yes.

В результате получаем подписанный сертификат клиента:

    /etc/openvpn/easy-rsa/pki/issued/client1.crt
    /etc/openvpn/easy-rsa/pki/private/client1.key

Клиенту нужно будет передать следующий набор файлов:

    client.crt
    client.key
    ca.crt

Вариант 2. Генерируем файл-конфигурацию клиента со встроенными ключами

Шаблон конфигурации клиента

vim /etc/openvpn/client.template

client
dev tun
proto udp
remote 176.192.22.222 11194
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
;comp-lzo
verb 3
;mute 20
remote-cert-tls server
cipher AES-256-CBC


Скрипт генерации конфигурации

vim /etc/openvpn/makeClientConf.sh

#!/bin/bash

# Default Variable Declarations
mkdir=`which mkdir`
echo=`which echo`
cat=`which cat`
printf=`which printf`

clientsConfDir="/etc/openvpn/clientsConf"
templateClientConfFile="/etc/openvpn/client.template"
caFile="/etc/openvpn/keys/ca.crt"

# create conf dir
if ! [ -d "${clientsConfDir}/" ]; then
   ${mkdir} -p ${clientsConfDir}
fi

# Ask for a new Client name
${echo} $'\r'
${echo} "Please enter new Client Name:"
read clientName

# declare client files paths
clientConfFile="${clientName}-config.ovpn"
clientCrtFile="/etc/openvpn/easy-rsa/pki/issued/${clientName}.crt"
clientKeyFile="/etc/openvpn/easy-rsa/pki/private/${clientName}.key"

# line break
${printf} $'\n\n' >> ${clientsConfDir}/${clientConfFile}

# template to conf file
${cat} ${templateClientConfFile} > ${clientsConfDir}/${clientConfFile}

# ca to conf file
${echo} "<ca>" >> ${clientsConfDir}/${clientConfFile}
${cat} ${caFile} >> ${clientsConfDir}/${clientConfFile}
${echo} "</ca>" >> ${clientsConfDir}/${clientConfFile}

# line break
${printf} $'\n' >> ${clientsConfDir}/${clientConfFile}

# crt to conf file
${echo} "<cert>" >> ${clientsConfDir}/${clientConfFile}
${cat} ${clientCrtFile} >> ${clientsConfDir}/${clientConfFile}
${echo} "</cert>" >> ${clientsConfDir}/${clientConfFile}

# line break
${printf} $'\n' >> ${clientsConfDir}/${clientConfFile}

# crt to conf file
${echo} "<key>" >> ${clientsConfDir}/${clientConfFile}
${cat} ${clientKeyFile} >> ${clientsConfDir}/${clientConfFile}
${echo} "</key>" >> ${clientsConfDir}/${clientConfFile}

# show info about output conf file
${echo} $'\r'
${echo} "Client's \"${clientName}\" Configuration: ${clientsConfDir}/${clientConfFile}"


chmod +x /etc/openvpn/makeClientConf.sh


Генерируем конфигурацию клиента (имя клиента такое же как при создании пользователя через easy-rsa - в нашем случае: client1)

cd /etc/openvpn

./makeClientConf.sh

Готовая конфигурация клиента будет создана в директории /etc/openvpn/clientsConf

Передаем её клиенту по зашифрованному каналу (она содержит приватный ключ)

Клиент загружает конфигурацию в OpenVPN-Connect (на нём тестировалось и работает)

OpenVPN клиенты

OpenVPN клиент на Windows

Содержимое файлов client.crt, client.key, ca.crt помещаем в файл client1.conf

client1.conf

client
dev tun
proto udp
remote 176.192.22.222 11194
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
;comp-lzo
verb 3
;mute 20
remote-cert-tls server
cipher AES-256-CBC

<ca>
...
</ca>

<cert>
...
</cert>

<key>
...
</key>

Устанавливаем openvpn-install-2.4.6-I602.exe в режиме службы

Запускаем openvpn client gui

Импортируем созданные на сервере файл client1.conf

Конфигурация после импорта появится в C:\Users\admin\OpenVPN\config\

Подключаемся к серверу