OpenVPN. Centos 7. Сервер + клиенты: различия между версиями
Cless (обсуждение | вклад) |
Cless (обсуждение | вклад) |
||
| (не показаны 4 промежуточные версии этого же участника) | |||
| Строка 144: | Строка 144: | ||
; маршрут на стороне клиента до хостов в локальной сети сервера | ; маршрут на стороне клиента до хостов в локальной сети сервера | ||
push "route 192.168.199.0 255.255.255.0" | push "route 192.168.199.0 255.255.255.0" | ||
; push DNS to clients | |||
push "dhcp-option DNS 10.192.16.10" | |||
; инфо о подключенных клиентах | ; инфо о подключенных клиентах | ||
| Строка 157: | Строка 160: | ||
keepalive 10 120 | keepalive 10 120 | ||
max-clients 100 | max-clients 100 | ||
user nobody | user nobody | ||
# CENTOS | |||
group nobody | group nobody | ||
# UBUNTU | |||
;group nogroup | |||
persist-key | persist-key | ||
persist-tun | persist-tun | ||
| Строка 179: | Строка 189: | ||
; с разных устройств будет выдаватьcя один и тот же IP | ; с разных устройств будет выдаватьcя один и тот же IP | ||
duplicate-cn | duplicate-cn | ||
; база отозванных сертификатов | |||
; РАСКОММЕНТИТЬ ТОЛЬКО ПОСЛЕ ГЕНЕРАЦИИ crl.pem - БАЗА ОТОЗВАННЫХ СЕРТИФИКАТОВ | |||
;crl-verify crl.pem | |||
<code>systemctl enable openvpn@server</code> | <code>systemctl enable openvpn@server</code> | ||
| Строка 289: | Строка 303: | ||
remote-cert-tls server | remote-cert-tls server | ||
cipher AES-256-CBC | cipher AES-256-CBC | ||
dhcp-option DNS 10.54.100.227 | |||
dhcp-option DNS 10.54.100.228 | |||
| Строка 315: | Строка 331: | ||
${echo} "Please enter new Client Name:" | ${echo} "Please enter new Client Name:" | ||
read clientName | read clientName | ||
cd ./easy-rsa | |||
./easyrsa gen-req ${clientName} nopass | |||
./easyrsa sign-req client ${clientName} | |||
cd .. | |||
# declare client files paths | # declare client files paths | ||
| Строка 399: | Строка 420: | ||
Проверяем что '''test01''' НЕ может подключиться к серверу | Проверяем что '''test01''' НЕ может подключиться к серверу | ||
=== Статус подключенных клиентов === | |||
<code>cat /var/log/openvpn/openvpn-status.log</code> | |||
== OpenVPN клиенты == | == OpenVPN клиенты == | ||
Текущая версия на 10:05, 10 июля 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" ; push DNS to clients push "dhcp-option DNS 10.192.16.10" ; инфо о подключенных клиентах 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 # CENTOS group nobody # UBUNTU ;group nogroup 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 ; база отозванных сертификатов ; РАСКОММЕНТИТЬ ТОЛЬКО ПОСЛЕ ГЕНЕРАЦИИ crl.pem - БАЗА ОТОЗВАННЫХ СЕРТИФИКАТОВ ;crl-verify crl.pem
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 dhcp-option DNS 10.54.100.227 dhcp-option DNS 10.54.100.228
Скрипт генерации конфигурации
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
cd ./easy-rsa
./easyrsa gen-req ${clientName} nopass
./easyrsa sign-req client ${clientName}
cd ..
# 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 (на нём тестировалось и работает)
Отзыв сертификата клиента
https://server-gu.ru/easy-rsa-revoke-certificate/
Создание клиента с сертификатом
Создаем клиента test01 с доступом по сертификату
Проверяем что он подключается к серверу
Отзыв сертификата клиента
Переходим в директорию easy-rsa
cd /etc/openvpn/easy-rsa
Отзываем сертификат
./easyrsa revoke test01
Генерируем БД с отозванными сертификатами, копируем crl.pem в /etc/openvpn, назначаем права чтения
./easyrsa gen-crl && cp pki/crl.pem ../ && chmod ugo+r ../crl.pem
Настройка конфигурации сервера
Добавляем в конфиг
vim /etc/openvpn/server.conf
... ; база отозванных сертификатов crl-verify crl.pem
systemctl restart openvpn
Проверяем что test01 НЕ может подключиться к серверу
Статус подключенных клиентов
cat /var/log/openvpn/openvpn-status.log
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\
Подключаемся к серверу