Инструкция по настройке сервера и клиента OpenVPN —

B. настройка сервера.

Переменная port – указываем UDP-порт (или TCP-порт, если вы сменили протокол в переменной proto, нужно только чтобы значение proto совпадало на сторонах клиента и сервера), который сервер будет слушать. Можно выбрать любое значение от 1025 до 65535, важно чтобы оно не конфликтовало с другим серверным софтом, если таковой имеется (или другими программами, которые могут быть привязаны к конкретному порту, например торрент-качалки).

Аналогично клиентским, переменные ключей и сертификатов:ca «C:\Program Files\OpenVPN\easy-rsa\keys\ca.crt» (сертификат СА один, клиенту и серверу указывается один и тот же)

cert «C:\Program Files\OpenVPN\easy-rsa\keys\<имя_сервера>.crt»

key «C:\Program Files\OpenVPN\easy-rsa\keys\<имя_сервера>.key»

Плюс ключ Диффи-Хелмана:dh «C:\Program Files\OpenVPN\easy-rsa\keys\dh1024.pem»

Переменная server. Определяет частную («серую») сеть, из диапазона которой будут выбраны IP-адреса для соединяемых компьютеров. При организации VPN средствами OpenVPN на сервере и на клиенте появляются новые виртуальные сетевые интерфейсы, которые винда, благодаря драйверам в комплекте, считает вполне полноценными реальными сетевыми картами. Их настройки и определяются этой переменной. В большинстве случаев можно оставить по умолчанию.

Остальные переменные так же можно не менять, упомяну еще только про переменную verb. Она определяет подробность логов, которые будут вестись на стороне сервера про все события и ошибки. Значение 1 – самый минимум подробности, значение 9 вас впечатлит.

5. Теперь необходимо расположить нужные файлы на сторонах сервера и клиента. Самый простой вариант – установить на каждой стороне программу и все файлы, настроенные по алгоритму выше, скопировать в соответствующие папки. Если подходить тщательно и канонично – на стороне клиента оставить только клиентские ключи, сертификаты и сертификат центра сертификации, удалив все, что касается СА и сервера, на стороне сервера удалить все клиентское. Разумно – предварительно забекапив.

Включение маршрутизации трафика на openvpn сервере


На данном этапе, если бы кто-то подключился к OpenVPN серверу, то он не сможет подключаться к глобальной сети. Чтобы это стало возможным нужно настроить маршрутизацию трафика.

Для этого создайте файл vpn_route.sh.

Обратите внимание, что я создаю скрипт в папке /root/bin/, если у вас её нет, то создайте её предварительно

mkdir /root/bin/


Если вы хотите разместить скрипт в другой папке, то отредактируйте последующие данные под свои.

Создаём файл:

vim /root/bin/vpn_route.sh

B этот файл скопируйте следующее содержимое, отредактировав его под свои нужды. Обратите внимание на:

  • PRIVATE=10.8.0.0/24 – измените подсеть в соответствии с вашими настройками. Если делали по этой инструкции, то менять ничего не нужно.
  • Укажите значение DEV! Впишите там имя вашего сетевого интерфейса. Это имя можно посмотреть командой
ip a


Если вы не впишите имя, то есть вероятность, что при загрузке компьютера скрипт не сможет автоматически получить имя сетевого интерфейса и поэтому маршрутизация трафика не будет работать правильно!

#!/bin/sh

# укажите имя интерфейса, иначе скрипт попытается выбрать его автоматически
#DEV='eth0'
DEV='ens3'
PRIVATE=10.8.0.0/24

if [ -z "$DEV" ]; then
	DEV="$(ip route | grep default | head -n 1 | awk '{print $5}')"
fi
# Включаем форвардинг пакетов, чтобы из туннельного интерфейса
# они попадали на внешний интерфейс
sysctl net.ipv4.ip_forward=1
# Убеждаемся, что iptables не блокируют перенаправляемый трафик:
iptables -I FORWARD -j ACCEPT
# Преобразование адресов (NAT) для приходящих из туннеля пакетов
# При включенной пересылке пакеты по умолчанию перенаправляются 
# с исходным адресом без изменений, то есть в нашем случае 10.8.0.*
# такие пакеты либо удаляются на шлюзе ISP, либо даже если они
# отправляются в пункт назначения, ответ никогда не находит обратного пути.
# Эти частные адреса не маршрутизируются в Интернете.
#
# Решением является преобразование адресов (NAT) исходящего трафика, 
# то есть заменить частный 10.8.0.* адрес общедоступным IP адресом VPN-сервера. 
# Это позволит ответам достичь VPN-сервера, 
# и там они будут отправлены обратно в туннель.
iptables -t nat -I POSTROUTING -s $PRIVATE -o $DEV -j MASQUERADE

Сделайте файл исполняемым:

chmod 755 /root/bin/vpn_route.sh

Чтобы изменения вступили прямо сейчас, до перезапуска компьютера, выполните:

bash /root/bin/vpn_route.sh


Если всё нормально, то для добавления его в автозагрузку создайте файл /etc/systemd/system/enable-openvpn-routing.service:

vim /etc/systemd/system/enable-openvpn-routing.service

Со следующим содержимым:

Запуск.

6. Настройка завершена, можно пытаться запустить все это. (Не забудьте открыть нужные порты и IP-адреса в файерволах!) Для этого есть два варианта:

a. Переходим на сервере в C:Program FilesOpenVPNconfig, правая кнопка мыши на server.ovpn -> Start OpenVPN on this config file. Аналогично на стороне клиента с файлом client.ovpn. В каждом случае наблюдаем сообщения и в случае удачи на клиенте увидим в последней строке: «Initialization Sequence Completed»

илиb. Запускаем графическую оболочку C:Program FilesOpenVPNbin openvpn-gui-1.0.3.exe – Правая кнопка мыши на значке в трее – server – connect (для клиента – client – connect). В случае удачи на клиенте увидим поп-ап окошко из трея вида: «Assigned IP: 10.8.0.6» и значок позеленеет.

7. Еще одни, последние грабли, с которыми мне довелось столкнуться. Если системная служба “DHCP-клиент” не запущена на клиенте (а я ее намеренно отключил сразу после установки винды, так как IP-адрес у машины постоянный), он не сможет получить IP-адрес, который ему будет пытаться выдать сервер.

Настройка openvpn сервера

Чтобы случайно всё не удалить, создадим папку C:Program FilesOpenVPNssl и скопируем в неё сертификаты. Это будет рабочая папка сервера.

mkdir "C:Program FilesOpenVPNssl"
copy "C:Program FilesOpenVPNeasy-rsakeys" "C:Program FilesOpenVPNssl"

Создадим конфигурационный файл сервера C:Program FilesOpenVPNconfigserver.ovpn:

copy "C:Program FilesOpenVPNsample-configserver.ovpn" "C:Program FilesOpenVPNconfigserver.ovpn"

Открываем блокнотом и редактируем:

notepad "C:Program FilesOpenVPNconfigserver.ovpn"

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

port 1194
proto udp
dev tun
ca "C:\Program Files\OpenVPN\ssl\ca.crt"
cert "C:\Program Files\OpenVPN\ssl\server.crt"
key "C:\Program Files\OpenVPN\ssl\server.key"  # This file should be kept secret
dh "C:\Program Files\OpenVPN\ssl\dh2048.pem"
server 10.8.0.0 255.255.255.0
tls-auth "C:\Program Files\OpenVPN\ssl\ta.key" 0 # This file is secret
keepalive 10 120
comp-lzo
persist-key
persist-tun
cipher AES-256-CBC
status "C:\Program Files\OpenVPN\log\status.log"
log "C:\Program Files\OpenVPN\log\openvpn.log"
verb 4
mute 20

Указываем параметры сервера, пути к ключам и сертификатам. Здесь же пути к логам. Для тестирования можно использовать tcp протокол:

proto tcp

Переходим к службам:

services.msc

Находим службу OpenVPNService.

Настраиваем на автоматический запуск при загрузке сервера.

Запускаем службу.

Согласно настройкам сервера в папке C:Program FilesOpenVPNlog должны появиться логи. Это один из инструментов администратора OpenVPN сервера.

Активировался сетевой адаптер TAP-Windows Adapter V9.

Согласно настройкам сервера IP адрес 10.8.0.1.

Проверяем поднялся ли порт tcp 1194:

netstat -tan | find "1194"

Порт должен прослушиваться.

Теперь нужно настроить firewall. Открываем Windows Defender Firewall with Advanced Security.

Переходим в Inbound Rules.

Создаём правило — New Rule…

Тип правила — Port. Next.

Протоколы и порты — UDP 1194. Как в настройках сервера. Next.

Действия — Allow the connection. Next.

Для всех сетей. Next.

Указываем название правила — OpenVPN. Next.

Правило создано, теперь firewall не блокирует входящие UDP соединения на 1194 порту.

Читайте также:  Экспорт сертификата из контейнера КриптоПро CSP – ЭЦП SHOP 🚩 Центр выдачи ЭЦП

Настройка уц


Для начала установим системные компоненты, необходимые для работы Рутокен ЭЦП:

  • CCID-драйвер
    sudo apt-get install libccid
    

  • PC/SC
    sudo apt-get install libpcsclite1 pcscd
    

Установим XCA:

sudo apt-get install xca

Запустим XCA:

sudo xca

Следует создать новую базу File->New Database.

Создадим ключ УЦ: Private Keys-> New Key, newcakey, RSA, 1024.
Создадим сертификат УЦ:
image

Создадим ключ сервера OpenVPN: Private Keys-> New Key, newserver, RSA, 1024.Создадим сертификат сервера OpenVPN:

ВАЖНО! У сертификата сервера OpenVPN должно присутствовать специальное расширение (extendedKeyUsage — serverAuth)
image

Экспортируем сертификат УЦ в файл ca.crt, ключ сервера в файл server.key и сертификат сервера в файл server.crt, чтобы их можно было подсунуть серверу OpenVPN (Private Keys->Export, Certificates->Export).

Обход блокировок с помощью российских vps

Начнём с небольшого лайф-хака: если у вас уже есть VPS (виртуальный частный сервер – разновидность хостинга, когда в отличие от совместного (shared-хостинга) вам в аренду дают не папку на сервере, а целую виртуальную машину, в которую вы можете установить любую операционную систему и настроить её как вам заблагорассудится), так вот, если у вас уже есть VPS и даже если виртуальный сервер находится в РФ, то весьма вероятно, что он подойдёт для обхода блокировок Роскомнадзора.

Чтобы это проверить, необязательно настраивать VPN – подключитесь к вашему удалённому серверу (например, по SSH) и попробуйте выполнить что-то вроде:

curl заблокированный_URL_или_IP

Вполне вероятно, что вы получите HTML код страницы заблокированного ресурса – это означает, что на вашем российском VPS можно настроить VPN для обхода блокировок.

В принципе, причина очевидна: оборудование для блокировок заставили установить только провайдеров «последней мили». Т.е. это разные ростелекомы, билайны и т.п. – те, кому вы платите за Интернет.


У кого есть российские VPS – пишите в комментариях, у вас через VPS открываются заблокированные сайты или нет? Будет интересно собрать некоторую статистику. Также указывайте, настроен ли IPv6 – возможно, дело просто в этом.

Создание ключей openvpn

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

Для простоты, я буду выполнять действия на одной системе (на OpenVPN сервере), а потом перенесу клиентские ключи на нужный компьютер.

Имя файлаНужен дляЦельСекретный
ca.crt сервер все клиенты Публичный ключ (сертификат) корневого центра сертификации (CA) НЕТ
ca.key только для машины, подписывающей ключи Приватный ключ корневого центра сертификации (CA) ДА
dh{n}.pem только сервер Параметры Диффи Хеллмана НЕТ
ta.key сервер все клиенты HMAC подпись к пакетам SSL/TLS ДА
server.crt только сервер Сертификат (публичный ключ) сервера НЕТ
server.key только сервер Приватный ключ сервера ДА
client1.crt только client1  Сертификат (публичный ключ) Client1 НЕТ
client1.key только client1  Приватный ключ Client1 ДА
client2.crt только client2  Сертификат (публичный ключ) Client2 НЕТ
client2.key только client2  Приватный ключ Client2 ДА
client3.crt только client3  Сертификат (публичный ключ) Client3 НЕТ
client3.key только client3  Приватный ключ Client3 ДА


Ключи могут генерироваться на любой операционной системе – они будут работать также на любой ОС. Например, сервер работает на Arch Linux и ключи созданы на нём, а затем клиентские ключи передаются в ОС под управлением Windows или Ubuntu.

В зависимости от вашей системы, выберите нужную инструкцию: для производных Debian или для производных Arch Linux.

Создание ключей openvpn в debian, ubuntu, linux mint, kali linux

Начинаем с инициализации центра сертификации:

cd /usr/share/easy-rsa
export EASYRSA=$(pwd)
sudo ./easyrsa init-pki
sudo dd if=/dev/urandom of=pki/.rand bs=256 count=1 
sudo dd if=/dev/urandom of=pki/.rnd bs=256 count=1 
sudo ./easyrsa build-ca


Нужно будет придумать и два раза ввести пароль от 4 до 1023 символов.

Будет создано два файла:

  • /usr/share/easy-rsa/pki/ca.crt
  • /usr/share/easy-rsa/pki/private/ca.key

Первый (ca.crt) – это сертификат, т.е. открытый ключ центра сертификации. Он нужен и для сервера и для каждого клиента – с помощью него они будут проверять, что публичные ключи других действительно подписаны центром сертификации и что не появился кто-то «левый», не одобренный центром сертификации.


Создаём папку, где будут все сертификаты сервера OpenVPN:

mkdir /etc/openvpn/certs/

и сразу копируем туда первый файл:

cp /usr/share/easy-rsa/pki/ca.crt /etc/openvpn/certs/ca.crt

Создание ключей OpenVPN сервера

Теперь нам нужно сгенерировать пару ключей OpenVPN сервера.

./easyrsa gen-req server nopass


Нужно подписать сертификат ключами Центра Сертификации, для этого:

./easyrsa sign-req server server

Будет задан вопрос, точно ли мы хотим подписать, наберите yes, затем введите пароль от Центра Сертификации (CA).

Когда появится фраза:

Enter pass phrase for /usr/share/easy-rsa/pki/private/ca.key:

Нужно будет ввести пароль Центра Регистрации, который установили на предыдущем шаге.


Копируем в нужную папку файлы, которые нужны для запуска сервера OpenVPN:

cp /usr/share/easy-rsa/pki/issued/server.crt /etc/openvpn/certs/
cp /usr/share/easy-rsa/pki/private/server.key /etc/openvpn/certs/

Файл параметров Diffie-Hellman (DH) нужен для протокола обмена публичными ключами.

openssl dhparam -out /etc/openvpn/certs/dh2048.pem 2048

Создайте ключ HMAC:

sudo openvpn --genkey secret /etc/openvpn/certs/ta.key

Теперь у нас 5 файлов, необходимые для запуска сервера OpenVPN, размещены в папке /etc/openvpn/certs/. Проверьте, все ли файлы на месте:

ls -l /etc/openvpn/certs/

Создание и подпись ключей клиентов OpenVPN

./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1

Аналогично нужно будет ответить на вопрос yes и ввести пароль вашего Центра Сертификации.

Тестирование и запуск сервера openvpn

Протестировать настройки OpenVPN сервера можно так:

openvpn /etc/openvpn/server/server.conf


Если есть ошибки в файле конфигурации, то программа сразу завершиться с ошибкой. Для решения проблем включите логи в файле настроек, увеличьте вербальность до 6 и изучайте журнал ошибок:

cat /var/log/openvpn.log
cat /var/log/openvpn-status.log

А если всё в порядке запустите OpenVPN сервер и добавьте его в автозагрузку

systemctl start openvpn-server@server.service
systemctl status openvpn-server@server.service
systemctl enable openvpn-server@server.service

Обратите внимание, что с systemctl используется команда вида openvpn-server@<configuration>.service, где <configuration> — это файл конфигурации, который лежит в папке /etc/openvpn/server/, но без расширения .conf


Если вы следовали этой инструкции и не меняли название файла, то вышеприведённые команды вам подойдут, их не нужно менять.

Если вы столкнулись с ошибкой:

Options error: --explicit-exit-notify cannot be used with --mode server

То из файла /etc/openvpn/server/server.conf

Удалить директиву

explicit-exit-notify 1


Причина ошибки в том, что поддержка директивы explicit-exit-notify 1 была добавлена в OpenVPN начиная с версии 2.4. А на вашей машине, очевидно, OpenVPN более старой версии.

Если вы столкнулись с ошибкой «Address already in use», например:

TCP/UDP: Socket bind failed on local address [AF_INET][undef]:53: Address already in use
Exiting due to fatal error

Это означает, что порт занят другой программой. Проверить, какая программа использует порт, можно командой:

sudo netstat -tulpn | grep ":НОМЕР_ПОРТА"

К примеру, для проверки порта 53:

sudo netstat -tulpn | grep ":53"


Используйте любой другой, не занятый порт – для этого в конфигурационных файлах OpenVPN сервера и клиента отредактируйте директиву port 53.

Управление ключами и сертификатами openvpn в xca

yum install wget -y
yum install unzip zip -y
yum install openvpn -y

mkdir /etc/openvpn/keys
cd /etc/openvpn/keys

wget https://github.com/OpenVPN/easy-rsa/archive/master.zip

unzip master.zip

cp vars.example vars

cd /etc/openvpn/keys/easy-rsa-master/easyrsa3

./easyrsa build-ca

./easyrsa gen-dh

cd /etc/openvpn/keys/easy-rsa-master/easyrsa3

./easyrsa gen-req client_name nopass

./easyrsa sign-req client client_name

./easyrsa gen-req my_home_pc nopass
./easyrsa sign-req client my_home_pc

./easyrsa gen-req my_smartphone
./easyrsa sign-req client my_smartphone

systemctl start openvpn@server

systemctl status -l openvpn@server

Управление пользователями

Добавление

В случае, если не используются токены, добавление пользователя осуществляется через тот же скрипт. Скрипт по сути генерит пользовательский ovpn-конфиг и вставляет туда сертификат, подписанный корневым сертификатом.

Если используются токены (см. ниже раздел про токены) тогда сертификат выписывается руками на основе запроса на сертификат, который генерится на токене. Пользовательский конфиг надо делать руками из имеющегося шаблона (из того же самого, из которого генерит конфиг скрипт).

УдалениеУдаление пользователей производится через тот же скрипт установки. Сертификат добавляется в CRL, новый CRL подпихивается vpn-серверу. Все сертификаты, которые есть в CRL сервер считает недействительными и принимать отказывается.

Как отозвать сертификат вручную:

cd /etc/openvpn/easyrsa

# отозвать сертификат
./easyrsa revoke $CLIENT
# сгенерировть новый crl
./easyrsa gen-crl

# удалить старый crl
rm -rf /etc/openvpn/crl.pem
# подменить его новым
cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/crl.pem
# openvpn должен уметь читать crl, когда он уже дропнул привилегии до nobody
chown nobody:nobody /etc/openvpn/crl.pem

Фильтрация доступных хостов для клиентов

Клиентов необходимо ограничивать по тем хостам на которые им можно ходить внутри сети, когда они подключаются к openvpn.

Вручную

Идея в том, чтобы ловить пакеты еще на интерфейсе tun0, в который они приходят от клиентов и фильтровать их до того как они попадают в NAT. После NAT фильтровать их будет уже не почему — у них у всех будет ip-адрес openvpn сервера во внутренней сети.

Пакеты, которые проходят сквозь систему (не исходят непосредственно из нее и не являются входящими, т.е. по сути роутятся системой) обрабатываются таблицей FORWARD. Таблицы в iptables обрабатываются сверху вниз, если ни одно из правил в таблице не привело к решению судьбы пакета, тогда срабатывает дефолтное правило.

Подготовка таблицы FORWARD:

# сбросить все
iptables -F FORWARD
# дефолтное правило для таблицы FORWARD - не пропускать ничего
iptables -P FORWARD DROP
# пропускать уже установленные соединения
iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT


Пример правил для конкретного клиента. Поскольку дефолтное правило для таблицы — DROP, осталось только разрешить те пары хост порт, куда можно. Разрешить доступ к порту на хосте пинговать сам хост:

Отзыв сертификата

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

cd "C:Program FilesOpenVPNeasy-rsa"
vars.bat
revoke-full client

Где client — это имя клиента.

В папке C:Program FilesOpenVPNkeys появляется файл:

Копируем его с заменой в рабочую директорию сервера C:Program FilesOpenVPNssl.

Добавляем строчку в конфигурационный файл сервера:

crl-verify "C:\Program Files\OpenVPN\keys\crl.pem"  

Перезапускаем службу OpenVPN сервера.

net stop OpenVPNService
net start OpenVPNService

Если в конфигурационном файле уже был ранее указан путь к crl.pem, то службу можно не перезапускать, OpenVPN перечитывает CRL один раз в час. Но в течении этого часа клиенты с отозванными сертификатами смогут продолжать подключаться и работать.

Для клиента с отозванным сертификатом процесс подключения будет «зависать». В логе можно увидеть:

TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
TLS Error: TLS handshake failed

Чтобы клиент не стучался постоянно на сервер, у него в конфиге есть опция:

connect-retry-max 25

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector