ServerAdmin.ru
31K subscribers
569 photos
46 videos
22 files
2.82K links
Авторская информация о системном администрировании.

Информация о рекламе: @srv_admin_reklama_bot
Автор: @zeroxzed

Второй канал: @srv_admin_live
Сайт: serveradmin.ru

Регистрация в РКН: https://vk.cc/cG1Urj
Download Telegram
Регулярно вижу сообщения на тему того, что OpenVPN работает медленно. Чаще всего это результат каких-то локальных проблем, а не распространённого мнения о том, что openvpn это медленный туннель. Всё познаётся в сравнении, а максимальная производительность туннеля зачастую больше всего зависит от сложности шифрования, которое используется.

В общем случае, при канале интернет в 100-200 мегабит в секунду вы не заметите проблем со скоростью в туннеле OpenVPN, если он будет поднят на базе PC, а не какого-то роутера с маломощным железом. По крайней мере я не сталкиваюсь с проблемами, когда на виртуальных машинах использую OpenVPN для объединения сетей через интернет.

Если вы видите, что ваше OpenVPN соединение работает значительно ниже исходного канала в интернет, то проверять стоит следующие вещи:
Сжатие. Попробуйте его отключить, если включено, и посмотрите, как это повлияет на скорость.
Если у вас используется TCP транспорт, поменяйте на UDP и проверьте скорость.
Попробуйте более простой шифр, например AES-128-CBC вместо AES-256-CBC. Для верности можно вообще что-то совсем простое поставить и проверить, действительно ли из-за шифра проседает скорость.
Посмотрите загрузку ядер процессора во время тестирования канала. Есть вероятность упереться в производительность одного ядра.

Далее идут более сложные вещи, в которые можно погрузиться, чтобы решить проблему с быстродействием:
Иногда могут возникать проблемы с буферами. Гуглите параметры sndbuf и rcvbuf. Пробуйте их менять или отключать управление со стороны OpenVPN. Тема большая, гуглится хорошо, всё найдёте. Не забудьте, что эти параметры можно не только поменять на сервере, но и передать их клиенту. Это суперспособность OpenVPN - передавать практически любые настройки клиенту.
Попробуйте поменять MTU с помощью параметра tun-mtu. Часто в этом может быть причина неадекватно низкой скорости туннеля.
Попробуйте поменять параметр длины очереди отправки txqueuelen. В общем случае дефолтное значение трогать не обязательно, но если ничего из вышеприведённого не помогло, можно попробовать изменить. Я видел ситуации, когда это помогало.

Само собой получился чек лист по исправлению проблем производительности OpenVPN туннеля. Можно забрать в закладки. Изначально хотел написать, как можно ускорить VPN туннели, в том числе и на базе OpenVPN, с помощью готового решения, но отложу это на завтра.

Почему я чаще всего использую OpenVPN - Подробный ответ.

#openvpn
Расскажу вам про решение проблемы с Openvpn Client на Windows, которая меня донимала последний год примерно, может чуть меньше. Вчера терпение лопнуло и я разобрался с ней раз и навсегда.

Проблема плавающая и выражалась она в том, что время от времени одно из настроенных подключений openvpn не подключалось. Ошибка была примерно такая:
MANAGEMENT: Socket bind failed on local address [AF_INET]127.0.0.1:25349
Ошибка возникала случайным образом на различных соединениях.

По тексту не очень понятно, в чём дело. Первое, что приходит в голову - указанный порт уже кем-то занят. Но netstat показывает, что ничего не занято. При этом любое другое подключение openvpn сработает нормально. А какое-то одно ни в какую. У меня около 5-ти подключений используется в разное время. Помогает только перезагрузка. Несколько раз пытался разобраться, но так как ошибка не очень информативна, быстро решить вопрос не получалось. Спасала банальная перезагрузка. Я думал, что она возможно как-то связана с тем, что у меня добавлено несколько сетевых интерфейсов для openvpn, а в дефолте обычно только одно устанавливается.

Дело вот в чём. После какого-то обновления Windows, она стала резервировать некоторые диапазоны портов для работы Hyper-V. Посмотреть эти диапазоны можно командой:
# netsh int ipv4 show excludedportrange tcp

И как оказалось, там есть диапазон локальных портов, который пересекается с диапазоном, который использует OpenVPN. Решение вопроса - изменить его в OpenVPN GUI:
Settings ⇨ Advanced ⇨ Management interface ⇨ Port offset.
После этого проблема исчезла.

Такая вот ерунда сожрала кучу моего времени. В логах самой винды никакой информации нет. По логу openvpn невозможно понять, в чём дело. А оказывается винда каким-то своим механизмом бронирует целые диапазоны портов и не даёт их использовать. При этом никак в системе не помечает их занятыми, иначе бы ошибка была другая. Что-то в духе local address [AF_INET]127.0.0.1:25349 is busy. А тут просто ошибка, которая говорит о том, что сокет не поднимается. Причин этому может быть много. Банальная нехватка прав или что-то ещё.

#openvpn #windows #ошибка
​​Существует необычный и полезный продукт - UDPspeeder, который способен улучшить качество связи VPN туннелей на каналах с большими задержками и потерями пакетов с помощью коррекции ошибок (Forward Error Correction).

Разработчики заявляют встроенную поддержку следующих VPN туннелей - OpenVPN, L2TP, ShadowVPN. Работает UDPspeeder следующим образом. Сначала организуете туннель с его помощью, а потом поверх пускаете тот же OpenVPN или что-то подобное.

В репозитории подробно описан принцип работы UDPspeeder. В основе лежит технология FEC (Forward Error Correction). С её помощью возможно обнаружить ошибки передачи данных и скорректировать их методом упреждения. Эффект реальный и очень заметный. В репозитории есть наглядный пример снижения количества потерянных пакетов без увеличения latency, что существенно увеличивает скорость передачи данных.

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

Настраивается UDPspeeder максимально просто и быстро. Работает только под Linux, есть пакет для openwrt.

# Запускаем на сервере:
./speederv2 -s -l0.0.0.0:4096 -r 127.0.0.1:7777 -f20:10
# Запускаем на клиенте
./speederv2 -c -l0.0.0.0:3333 -r 44.55.66.77:4096 -f20:10

Все запросы к порту 3333 клиента будут переадресовываться на порт 7777 сервера. Есть отдельная инструкция по настройке связки UDPspeeder + OpenVPN.

Если вам нужна готовая реализация VPN туннеля на базе UDPspeeder для быстрого запуска, можете взять tinyfecVPN от этого же автора. Там в пару команд настраивается VPN Site-to-Site.

Исходники - https://github.com/wangyu-/UDPspeeder

#vpn #openvpn
Существуют программы, которые на основе типа трафика могут направлять его в разные направления. Расскажу вам про одну такую программу - SSLH. Её можно запустить на каком-то TCP порту, например 8080. Если на этот порт направить HTTP трафик, SSLH его перенаправит на веб сервер, если это SSH трафик - на SSH сервер, если OpenVPN, то на его сервер. Таким образом можно маскировать какие-то сервисы, оставляя их при этом полностью доступными.

С одним из вариантов использования подобного подхода я сталкивался сам. Допустим, есть у вас где-то в Америке VPS, там живёт веб сервер. А ещё вам хочется держать там же OpenVPN на 443 порту, чтобы использовать для обхода блокировок и проходить через сети, где всё закрыто, кроме HTTP и HTTPS портов. SSLH отлично решает эту задачу.

Она есть в базовых репозиториях Debian:
# apt install sslh

Далее запускаем:
# sslh-select -f --listen 0.0.0.0:443 \
--tls 127.0.0.1:443 \
--ssh 127.0.0.1:22 \
--openvpn 127.0.0.1:1194

Теперь, если зайти браузером на сервер, то запрос будет перенаправлен на 443 порт веб сервера, если SSH клиентом, то на 22-й порт, если OpenVPN клиентом, то на дефолтный 1194 порт openvpn сервера.

То же самое через Docker:
docker run --rm -it sslh:latest \
 --listen=0.0.0.0:443 \
 --ssh=hostname:22 \
 --tls=hostname:443
--openvpn=hostname:1194

Более функциональный вариант через docker-compose. Пример конфига, где трафик уходит в разные контейнеры:

version: "3"

services:
 sslh:
  image: sslh:latest
  hostname: sslh
  ports:
   - 443:443
  command: --listen=0.0.0.0:443 --tls=nginx:443 --openvpn=openvpn:1194
  depends_on:
   - nginx
   - openvpn

 nginx:
  image: nginx

 openvpn:
  image: openvpn

Исходники

#openvpn #webserver
Когда настраиваете OpenVPN сервер, обязательно обращайте внимание на срок жизни сертификатов. Я знаю, что раньше в наборе скриптов EasyRSA по умолчанию срок жизни сертификатов был 10 лет. Но даже с таким сроком мне один раз пришлось столкнуться с тем, что CA и сертификат сервера, который много раз переезжал на разные машины с сохранением настроек, протух и мне пришлось оперативно решать эту проблему без перевыпуска клиентских сертификатов. Даже статью об этом написал в то время.

Недавно со мной приключилась похожая история. Клиенты перестали подключаться к серверу. Причём я сам это заметил, когда переносил все настройки с одного ноута на другой. И примерно в это же время истёк срок действия сертификата сервера OpenVPN (не CA). Я долго не мог сообразить, в чём проблема. На клиентском сертификате ещё и пароль был. Я сначала думал, что перепутал его. Но потом уже, когда стал детальнее разбираться с ошибкой, понял, что дело не в пароле.

Пошёл на сервер и стал смотреть, в чём дело. Залез в скрипты EasyRSA и обнаружил, что там срок жизни CA так и остался 10 лет, а сгенерированных и подписанных сертификатов только 3 года. В итоге первым протух сертификат самого сервера, потом потихоньку начали клиенты отваливаться. Пришлось всё перевыпускать.

Так что когда настраиваете OpenVPN и выпускаете для него сертификаты, обязательно сморите, какой срок жизни для них установлен. Это поначалу кажется, что 3-5-10 лет это так много. А на деле неизвестно, как всё обернётся. Может оказаться, что время закончилось, а система всё ещё жива и используется. Тем более нет никаких проблем переносить сертификаты вместе с конфигурацией, а один и тот же CA может использоваться для разных задач много лет.

#openvpn
​​Занимался вчера перенастройкой OpenVPN сервера. Потратил немало времени из-за маленького нюанса, про который забыл. Поделюсь информацией для тех, кто тоже использует OpenVPN. Всем остальным читать большого смысла нет.

Люблю OpenVPN Server за гибкость в настройках. У меня обычное дело, когда на небольшой виртуалке под VPN поднято несколько туннелей. Пример разделения.

1️⃣ В этот туннель заводим все устройства Mikrotik. Так как у них своеобразная реализация OpenVPN, для них приходится поднимать отдельный туннель со своими настройками.

2️⃣ Стандартный туннель на UDP для удалённых пользователей. Типовые настройки.

3️⃣ Тот же туннель, что и выше, только на 443 TCP порту для обхода некоторых ограничений.

4️⃣ Ещё один туннель для удалённых филиалов, только уже не на базе Mikrotik. Тут тоже свои настройки, маршруты и т.д.

Я обычно не боюсь сильно дробить абонентов по разным туннелям, так ими удобнее управлять. Главное сильно не переусложнить, иначе можно запутаться.

Я одних абонентов, за которыми есть свои подсети, к которым нужен доступ через VPN, пересадил с одного туннеля на другой. Добавил новый и подключил их к нему. Перенастроил клиентов, они подключились. На вид всё нормально. Но вижу, что к некоторым сеткам за этими клиентами не могу подключиться.

Начинаю всё проверять. Для начала проверил на всех сторонах firewall. Вроде всё правильно. Для надёжности включил логирование всех заблокированных пакетов, там моих пакетов нет. Из чего делаю вывод, что проблема в маршрутизации.

Смотрю внимательно на маршруты. Иногда это непростая задача, когда путь пакета длинный, особенно если проходит через несколько VPN, как было у меня. Хоть садись и схему пути рисуй, сопоставляя с маршрутами на каждом устройстве. Какое-то время не могу понять в чём проблема, но в итоге заметил.

Оказалось, что я ошибся в настройках туннелей и не полностью перенёс подсети, за которые отвечают абоненты из настроек одного туннеля в другой. Заметил это в маршрутах на сервере. Банально, подсеть 192.168.13.0/24 уехала на интерфейс tun4, а я её оставил в старом конфиге с tun2. В итоге OpenVPN все запросы отправлял в tun2 и они там пропадали.

Во время диагностики просто не обратил внимание на разные имена туннелей. Проверяю, что маршрут завёрнут в tun и на этом успокаиваюсь, ожидая, что OpenVPN сама разберётся в какой туннель отправить запрос. Но на самом деле нет. Надо аккуратно самому расписать, какой туннель за какую подсеть отвечает в конфигах сервера. В итоге всё перепроверил и аккуратно расписал все подсетки по своим туннелям. И трафик поехал как надо.

Я мало работал с другими реализациями VPN. Немного pptp делал, и на микротиках l2tp. На Linux всегда использую OpenVPN. Мне он нравится за простоту и удобство реализации. У каждого туннеля свой отдельный конфиг, где описаны все настройки и маршрутизация, относящаяся к этому туннелю. Удобно быстро оценить настройки, сделать копию туннеля, поменяв пару параметров. Можно по отдельности перезапускать туннели, не трогая остальные. При этом база пользователей со своими персональными сертификатами и настройками может быть общей для всех туннелей. Их можно спокойно перемещать между ними. Где-то ещё есть подобная реализация?

#openvpn
Решил собрать в одну публикацию все варианты настройки и управления OpenVPN сервера через web интерфейс. Я напишу то, что знаю сам. Буду рад, если кто-то ещё поделится рабочими и удобными вариантами.

Access Server — родное решение от авторов OpenVPN. Это платный продукт, а бесплатная версия ограничена двумя пользователями. Для единоличного использования подходит. Если нужно больше, то есть лекарство, легко ищется. Если вас это не смущает, то можно пользоваться.

Pritunl — один из лучших веб интерфейсов для OpenVPN и Wireguard. К сожалению, платный. Бесплатная версия практически не имеет настроек, но при этом нет никаких ограничений по пользователям. В целом, если вам нужен базовый vpn сервер, то это нормальное решение. Возможно, лучшее.

Рутокен VPN — open source решение от авторов Рутокен. Настройки базовые, можно менять конфигурацию сервера и добавлять пользователей. Бонусом идёт свой клиент под Windows, который поддерживает аутентификацию через ключи рутокен. Только последним он и интересен, так как аналогов не видел.

Veeam PN — это было отличное бесплатное решение для организации vpn сервера от компании Veeam. Поддерживалась как OpenVPN, так и Wireguard. Когда писал эту заметку, с сожалением узнал, что этот проект закрыт, новых версий больше нет. Его интегрировали в платную версию DR Services.

Webmin + OpenVPN-admin — известная веб панель для управления сервером и модуль для OpenVPN. Решение удобно в том плане, что это будет обычный Linux сервер на ваш вкус, в который можно лазить и что-то доделывать, изменять вручную. Я не раз пользовался подобной связкой. Не скажу, что сильно удобно, но в целом нормально для управления пользователями, когда не хочется каждый раз лазить в консоль и скриптами генерить сертификаты и настройки.

PfSense, OPNSense, Clearos и т.д. — в этих продуктах тоже есть раздел для управления OpenVPN. С учётом того, что эти системы нетребовательны к ресурсам, можно поднять и для одной роли vpn сервера. Решение вполне нормальное, с заделом на больший функционал.

Отдельно отмечу полезный инструмент для нестабильных каналов связи, который может немного улучшить связь - UDPspeeder. В заметке рассказано для чего он и как работает.

#openvpn #подборка
​​Вчера немного успел застать вебинара Ребрейн про OpenVPN. Попал на самый конец, но всё равно успел получить очень полезную для себя информацию, которой поделюсь с вами.

1️⃣ Первое прям открытие для меня — параметр ccd-exclusive. Если установлен этот параметр, то пользователь даже при наличие актуального сертификата сможет пройти аутентификацию только в том случае, если для него существует файл конфигурации пользователя в директории, заданной параметром client-config-dir.

Объясняю, зачем это может понадобиться. Чтобы запретить подключения какому-то пользователю, необходимо отозвать его сертификат, подготовить файл отозванных сертификатов и прописать их в конфигурации сервера с помощью параметра crl-verify. И после каждого отзыва файл надо перезаписывать.

С помощью ccd-exclusive можно отключать пользователей, просто удаляя их файл конфигурации. Я лично их почти всегда использую. Даже если там нет отдельных параметров, привык создавать эти файлы пустыми, чтобы для каждого пользователя был его файл конфигурации. На основе этих файлов делаю мониторинг подключений openvpn.

Да, сертификаты отключенных пользователей всё равно надо отзывать. Так правильно. Но можно это делать разово по регламенту, к примеру, раз в месяц. А если надо просто отключить пользователя, удаляем ему файл конфигурации и всё. Это намного проще и удобнее. Потом можно его снова вернуть и пользователь сможет подключиться с тем же сертификатом.

Лет 10 активно использую openvpn, а этот параметр никогда не попадался на глаза. Не знал, что так можно было сделать.

2️⃣ Работы по переводу OpenVPN из контекста пользователя в ядро Linux ведутся. Более того, модуль ядра уже написан и он реально работает. Пока ещё его не добавили в популярные дистрибутивы. Скорее всего это рано или поздно состоится. Уже сейчас можно скачать исходники модуля, скомпилировать их и всё заработает с некоторыми ограничениями по параметрам. К примеру, при обработке ядром не работает сжатие.

Поясню, в чём тут проблема. OpenVPN работает в пространстве пользователя, в отличите от WireGuard, которая обрабатывается напрямую в ядре Linux. Этим объясняется её быстродействие. Разработчики OpenVPN озадачились и решили тоже перенести обработку в ядро и написали свой модуль для этого. Так что в скором времени большой разницы в скоростях между OpenVPN и Wireguard не должно быть.

#openvpn
​​Любопытный проект для поднятия VPN сервера на базе OpenVPN в пару кликов — dockovpn. Собран на базе Docker, не хранит ни логов, ни своего состояния. То есть запустили, получили конфиг пользователя, попользовались, остановили контейнер, всё удалилось. При желании, конфиги можно сделать постоянными.

Запускаете вот так:
# docker run -it --rm --cap-add=NET_ADMIN \
-p 1194:1194/udp -p 80:8080/tcp \
-e HOST_ADDR=$(curl -s https://api.ipify.org) \
--name dockovpn alekslitvinenk/openvpn

Если 80-й порт на хосте занят, выберите любой другой. Он нужен для того, чтобы после запуска контейнера на нём поднялся web сервер. Обратившись по его адресу, вы скачиваете конфиг клиента и после этого веб сервер завершает свою работу.

Далее отдаёте этот конфиг любому клиенту OpenVPN и подключаетесь. На сервере должен быть белый IP адрес. Dockovpn использует его для работы openvpn. Если не хотите, чтобы после остановки контейнера удалялся клиентский конфиг, запустите его с volume, где будут храниться конфигурации:

# docker run -it --rm --cap-add=NET_ADMIN \
-p 1194:1194/udp -p 80:8080/tcp \
-e HOST_ADDR=$(curl -s https://api.ipify.org) \
-v openvpn_conf:/opt/Dockovpn_data \
--name dockovpn alekslitvinenk/openvpn

Я посмотрел исходники проекта. Там нет ничего особенного. Обычная настройка openvpn сервера, правил iptables и генерация сертификатов с помощью easy-rsa. В репозитории есть Dockerfile и все скрипты с конфигами. Можете собрать контейнер сами, если не доверяете готовому:

# git clone https://github.com/dockovpn/dockovpn
# cd dockovpn
# # docker build -t dockovpn .

Идеальный инструмент для запуска в виртуалках с почасовой оплатой. Не задаёт никаких вопросов. Запустили, попользовались, погасили. Хотя для личного пользования можно и на постоянку оставить, если не хочется заморачиваться с установкой и настройкой. Там вполне адекватный конфиг, можно посмотреть в директории dockovpn/config. Используются DNS сервера OpenDNS. Можно их заменить на какие-то свои, если есть необходимость.

Исходники

#openvpn
​​Популярный вопрос по поводу OpenVPN. Как на одном сервере с несколькими внешними IP адресами настроить независимую работу VPN на каждом IP адресе. Сделать это очень просто. Фактически, это штатная работа службы OpenVPN, даже ничего колхозить не придётся.

Настраиваете OpenVPN как обычно для одного IP адреса. Допустим, вся конфигурация у вас описана в /etc/openvpn/server/server1.conf. Запускаете вы этот сервер так (если установили в Debian из базовых реп):
# systemctl start openvpn-server@server1.service

Теперь добавим ещё один сервер и запустим 2 экземпляра OpenVPN, каждый на своём внешнем ip. Для этого в конфигурацию server1.conf добавляем параметр local, указав внешний IP адрес, и сразу обозначим tun интерфейс, на котором он будет работать и адресное пространство этого туннеля:
local 1.2.3.4
dev tun1
server 10.8.1.0 255.255.255.0

Копируем этот конфиг для запуска второго сервера:
# cp server1.conf server2.conf
В него добавляем свои параметры:
local 4.3.2.1
dev tun2
server 10.8.2.0 255.255.255.0

Все остальные настройки могут быть как идентичными первому серверу, в том числе использовать те же сертификаты и CA, так и совершенно разными. Они между собой никак не будут связаны. Это будут два отдельных сервера OpenVPN. Запускаем второй сервер:
# systemctl start openvpn-server@server2.service

Проверяем:
# ip a | grep 'global tun'
  inet 10.8.1.1/24 scope global tun1
  inet 10.8.2.1/24 scope global tun2

# netstat -tulnp | grep openvpn
udp    0   0 1.2.3.4:1194     0.0.0.0:*              1330/openvpn     
udp    0   0 4.3.2.1:1194   0.0.0.0:*              1321/openvpn     

Таким же образом вы можете копировать конфигурации сервера и запускать разные туннели на разных портах, с разным шифрованием, настройками и т.д. Если у вас есть возможность докупать внешние IP на VPS, то вы сможете настроить многофункциональный VPN сервер под любые запросы. Это очень удобно. К тому же просто и быстро настраивается. И так же потом обслуживается. Каждый туннель можно настроить на свой лог файл, свою статистику и т.д. Всё это мониторить, анализировать, ограничивать доступ к каким-то туннелям, настраивать для них правила файрвола, разным туннелям пушить разные маршруты, разные настройки пользователям. В общем, красота. Я не знаю, где ещё подобные вещи настраиваются так же легко и просто.

#openvpn #vpn
​​В современном интернете очень активно используется протокол шифрования TLS. Чаще всего с ним сталкиваешься в HTTPS, VPN, STARTTLS (imap и smtp в основном). В Linux (и Unix в целом) этот протокол в основном реализован посредством OpenSSL. Это библиотека libssl и утилита командной строки openssl. Работа с этой утилитой настоящий вынос мозга. Там море всяких ключей, длиннющих конструкций и команд. Сталкиваться с этим напрямую приходится, например, при настройке своего OpenVPN сервера.

Чтобы упростить задачу управления сертификатами с помощью OpenSSL, придумали набор скриптов EasyRSA, которые даже в винду портировали. Именно с ними я всегда взаимодействовал, когда нужно было создать CA, серверные и клиентские ключи для OpenVPN (вот пример из моей статьи). Да и не только. Для всех подобных задач использовал EasyRSA и не знал, что есть инструменты проще.

В одном из комментариев увидел информацию, что есть CFSSL. Это утилита от cloudflare, с помощью которой можно создать и управлять CA, только без лишних костылей и подпорок. У неё вполне простой и понятный CLI, которым пользоваться в разы удобнее и проще, чем у openssl. Покажу сразу на примере создания CA и выпуска сертификатов для нужд OpenVPN сервера. Использую потом эту заметку при очередном обновлении статьи (уже назрело).

CFSSL это просто бинарник, скомпилированный из исходников на GO. В репозиториях Debian 12 он живёт под названием golang-cfssl:
# apt install golang-cfssl
Версия почему-то очень древнючая - 1.2.0, когда в репе уже 1.6.4 есть. Можно вручную скачать свежий бинарник.

Для cfssl нужно готовить конфиги в формате json. Сделать это нужно будет 1 раз. Интерактивного ввода, как у easyrsa, как я понял, нет. Готовим простой конфиг для выпуска СА:
{
 "CN": "My Root CA",
 "key": {
  "algo": "rsa",
  "size": 2048
 },
 "ca": {
  "expiry": "87600h"
 },
 "names": [
  {
   "C": "RU",
   "L": "Moscow",
   "O": "Serveradmin Company",
   "OU": "OpenVPN",
   "ST": "Moscow"
  }
 ]
}

Сохранили с именем ca-csr.json. Тут срок действия стоит 10 лет. Кажется, что много. Но на самом деле у меня лично был случай, когда 10-ти летний CA протух.

Генерируем ключ для CA:
# mkdir keys && cd keys
# cfssl gencert -initca ca-csr.json | cfssljson -bare ca

Получили 3 файла:
ca-key.pem - приватный ключ для подписи сертификатов
ca.pem - сам сертификат удостоверяющего центра
ca.csr - запрос на сертификат

Подготовим конфиг профилей, которые нужны будут для сертификата сервера и клиентов:

{
"signing": {
"profiles": {
"server": {
"expiry": "87600h",
"usages": [
"digital signature",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "87600h",
"usages": [
"signing",
"client auth"
]
}
}
}
}

Сохранили с именем ca.json. И делаем конфиг для запроса, такой же как для CA, только секцию с CA убираем:

{
 "CN": "My Root CA",
 "key": {
  "algo": "rsa",
  "size": 2048
 },
 "names": [
  {
   "C": "RU",
   "L": "Moscow",
   "O": "Serveradmin Company",
   "OU": "OpenVPN",
   "ST": "Moscow"
  }
 ]
}

Сохранили с именем csr.json. Выпускаем сертификат сервера:
# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \
-config=ca.json -profile="server" \
-cn="openvpn.server.local" -hostname="openvpn" \
csr.json | cfssljson -bare server

Получили 3 файла:
# ls | grep server
server.csr
server-key.pem
server.pem

Выпускаем сертификат для клиента:
# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \
-config=ca.json -profile="client" \
-cn="client01"  -hostname="User 01" \
csr.json | cfssljson -bare client01

Проверяем:
# ls | grep client01
client01.csr
client01-key.pem
client01.pem

Вот и всё. Подготовили удостоверяющий центр и выпустили сертификаты клиента и сервера. Выглядит действительно удобнее и проще EasyRSA.

#security #openvpn
Сколько лет использую OpenVPN, а только недавно случайно узнал, что он умеет в маршрутах использовать не только ip адреса, но и fqdn, то есть доменные имена. Для этого есть параметр allow-pull-fqdn.

Увидел упоминание этого параметра случайно. Решил сразу попробовать, как он работает. И так, и сяк его на сервере применял, не работает. Оказалось, что это параметр клиента и автоматически передать его через push нельзя. То есть надо явно в конфиг клиента прописать:

allow-pull-fqdn

И после этого ему можно пушить маршруты с сервера в таком виде:

push "route whoer.net 255.255.255.255"

При подключении к openvpn серверу клиент получит маршруты и если там будет указан домен, автоматически отрезолвит этот домен в IP адрес и добавит его в таблицу маршрутизации. Так что никакой магии тут нет, openvpn в реальности не умеет оперировать доменами в маршрутах. Он просто чуть упрощает задачу, делая автоматически резолв. Тем не менее, даже в таком виде это довольно удобно. Буду применять.

Для тех, кто не знаком с OpenVPN, поясню подробнее, что это такое. Вы можете на сервере в настройках клиента, каждому в отдельности настраивать маршруты, по которым он будет ходить через vpn сервер. Это очень удобная возможность, так как не надо менять конфигурацию клиента. Всё управление маршрутами происходит централизованно на сервере. А с помощью описанного параметра, вы любому клиенту можете указать, что на такой-то сайт ходи через vpn сервер. Самому клиенту при этом ничего настраивать не надо. Он просто переподключится и получит обновлённые маршруты. У WireGuard такой возможности нет. Ему надо каждый раз конфиг обновлять, когда вносятся изменения в маршрутизацию.

#openvpn
Для OpenVPN на первый взгляд кажется, что существует много различных веб панелей. Но когда начинаешь в них разбираться, оказывается, что одна платная, а бесплатная версия урезана, другая уже давно не поддерживается, третья в какой-то своей логике всем управляет и хранит данные. На деле выбирать особо то и не из чего. Я когда-то давно собрал список известных мне панелей:

Управление OpenVPN сервером через web интерфейс

Сегодня покажу ещё один вариант, который поначалу показался каким-то костыльным из-за недостатка документации, но когда немного разобрался, решение понравилось. Речь пойдёт про open source проект от известного аутсорсера flant - ovpn-admin.

📌 У ovpn-admin следующие возможности:

◽️Запуск через одиночный бинарник с передачей всех параметров через ключи. Есть готовый контейнер для автоматического запуска. Я тестировал в нём.
◽️Веб интерфейс для добавления и удаления пользователей, просмотра статуса их подключения и передачи маршрутов
◽️Экспортер для Prometheus и шаблон для Grafana с метриками: срок жизни сертификата, кол-во подключенных пользователей, информация о подключенных пользователях (время подключения, ip адрес, трафик)
◽️Подключение пользователем с использованием пароля или без, возможность скачать готовый конфиг сразу с включённым в него сертификатом
◽️Helm чарт для запуска в Kubernetes, собственно, продукт оптимизирован для запуска в кубере, может хранить сертификаты в секретах

Мне понравилось это решение тем, что оно, во-первых, полностью автоматизирует запуск сервера, а во-вторых, максимально похоже на администрирование стандартного openvpn сервера, установленного вручную. Тут всё на своих местах: конфиг сервера, шаблон конфига пользователей, директория с сертификатами, с настройками пользователей. Для тех, кто знаком с openvpn сервером не будет никаких проблем с тем, чтобы разобраться, как это всё работает.

Показываю, как запустить ovpn-admin в рабочем режиме. Не знаю, почему в самой репе не оставили краткой инструкции. Либо я её не нашёл. В общем, сделал в итоге так:

# git clone https://github.com/flant/ovpn-admin.git
# cd ovpn-admin

Теперь правим некоторые параметры docker-compose.yaml:

OVPN_PASSWD_AUTH: "true" # включена аутентификация по паролю, можно отключить, если не надо
OVPN_SERVER: "1.2.3.4:7777:tcp" # ip адрес, на котором запущен сервер и к которому будут подключаться клиенты, соответственно порт и протокол, по которому будут подключаться
OVPN_METRICS_PATH: "/metrics" # url, на котором будут жить метрики Prometheus

Остальные параметры я оставил по умолчанию. Собираем и запускаем контейнер:

# ./start.sh

Дожидаемся запуска и идём в веб интерфейс управления: http://1.2.3.4:8080/. Он будет доступен без аутентификации. Его нужно закрыть либо файрволом, либо basic_auth на прокси.

Расскажу про несколько полезных директорий и файлов:
- .ovpn-admin/easyrsa_master/pki - сертификаты пользователей
- .ovpn-admin/ccd_master - файлы конфигурации пользователей
- .ovpn-admin/setup/openvpn.conf - параметры сервера openvpn
- .ovpn-admin/templates - шаблон конфигурации клиента, настроек ccd

Структура и расположение файлов типичны для openvpn сервера. На эту панель легко переехать с работающего сервера, либо наоборот съехать, если не понравится, забрав все настройки и пользователей. Можно спокойно залезть в какие-то файлы и руками поправить параметры. Это ничего не сломает, так как всё состояние хранится только в них.

Я всё это запустил, настроил, попробовал. Добавил метрики Прома, установил шаблон Графаны. Забрать можно тут. У меня заработало сразу. На деле вроде бы и ничего особенного, но задачу по управлению и тем более мониторингу сильно упрощает. Не нужно самому парсить статус лог сервера. Там хоть и ничего сложного, я парсил для Zabbix, но тут это сделали за нас.

4️⃣ Исходники

#openvpn
Please open Telegram to view this post
VIEW IN TELEGRAM
Продолжу начатую утром тему OpenVPN. В Linux без проблем можно запустить сколько угодно экземпляров сервера и клиента. Достаточно копировать конфигурационный файл, указывать разные tun или tap интерфейсы, порты и запускать каждый экземпляр службы со своим конфигом.

В Windows несколько сложнее. Про сервер ничего не скажу, я его на винде никогда не поднимаю. А вот для запуска нескольких подключений клиента, чтобы иметь возможность одновременно подключаться к нескольким OpenVPN серверам, нужно добавить дополнительные сетевые адаптеры в систему. Сделать это несложно.

Запускаем консоль cmd с правами администратора и делаем там следующее:

> cd C:\Program Files\OpenVPN\bin
> tapctl.exe create

В Панели управления, в списке сетевых адаптеров должен появиться ещё один TAP-Windows Adapter V9 #2, #3 и так далее, если нужно больше двух. Теперь можно одновременно подключиться к разным OpenVPN серверам.

Добавлю несколько ссылок на полезные и неочевидные возможности OpenVPN сервера:

▪️ Маршруты для клиента на основе url, а не ip адреса
▪️ Запуск OpenVPN сервера на разных внешних IP адресах
▪️ Блокировка подключения пользователя без отзыва сертификата
▪️ Диагностика низкой скорости через OpenVPN
▪️ Запускаем OpenVPN сервер за 443 портом веб сервера

Подход из последней ссылки недавно помог восстановить хождение трафика на зарубежные VPS по OpenVPN. Просто поменял порт на 443 TCP и всё заработало.

Предвещая вопросы на тему того, зачем сейчас использовать OpenVPN, сразу оставлю ссылку, так как много раз отвечал на него. И добавлю, что OpenVPN использую в первую очередь для объединения и доступа к сетям, а не обхода блокировок.

#openvpn #windows
Занимался на днях в очередной раз перенастройкой своих VPN каналов. Честно говоря уже надоело этим заниматься, но внешние обстоятельства постоянно меняются. Хочу рассказать об одной особенности OpenVPN, которую я постоянно использую, и которая видится мне весьма полезной и функциональной.

OpenVPN сервер умеет управлять маршрутами внутри своих VPN сетей. Это получается второй контур маршрутизации поверх системного. Расскажу кратко, как это работает.

Допустим, у вас есть OpenVPN сервер, к которому подключаются разные клиенты. Будь то динамические подключения от удалённых сотрудников, либо другие одиночные сервера, маршрутизаторы своих внутренних подсетей. На сервере у вас указано, что все запросы к подсетям:

10.1.3.0/24
10.1.4.0/24
10.1.5.0/24

Отправляются в VPN сеть, конкретно в tun0 интерфейс. Настроить это можно сразу в конфиге openvpn для туннеля tun0:

route 10.1.3.0 255.255.255.0
route 10.1.4.0 255.255.255.0
route 10.1.5.0 255.255.255.0

OpenVPN сервер при запуске добавляет указанные маршруты в систему. Это можно сделать и вручную. Сервер при старте просто использует /sbin/ip route add для добавления маршрутов.

За каждую указанную выше подсеть у нас отвечают разные клиенты VPN. Это может быть указано в его конфигурационном файле. Делается это так:

iroute 10.1.3.0 255.255.255.0

При подключении клиента с этой настройкой OpenVPN сервер понимает, что весь трафик в эту подсеть стоит адресовать этому клиенту. Если клиент поменяется, то эта настройка может переехать к другому.

Глобально настройки сервера и других VPN клиентов не меняются. Они просто подключаются и получают общую маршрутизацию. А по каким маршрутам внутри VPN побегут пакеты определяют настройки отдельных клиентов, которые выполняют роль маршрутизаторов. И этих клиентов можно легко заменить без необходимости менять какие-либо ещё настройки.

Подробнее об этом можно прочитать в документации. Искать по параметру --iroute для внутренней маршрутизации и --client-config-dir для персональных настроек клиентов.

Мне пришлось заменить одного клиента на другого, через которого ходил трафик в youtube. Настройки остальных пользователей трогать не пришлось. У меня используется схема с единым OpenVPN сервером в РФ, к которому подключаются все клиенты. А он уже раскидывает трафик в зависимости от потребностей.

Набросал ниже схему, чтобы было понятно, о чём идёт речь.

#openvpn
Всем привет. Поздравляю с окончанием праздников. Наконец-то можно снова заняться полезными и интересными делами. Как у вас, без происшествий прошли выходные? У меня было ровно одно небольшое событие, которое потребовало моего участия. Решил сразу рассказать, пока не забыл.

Разом отвалились постоянно подключенные клиенты одного OpenVPN сервера. Сразу подумал на протухшие сертификаты либо клиентов, либо самого сервера. Не раз такое случалось. При генерации значения по умолчанию обычно год-два, редко больше. Если специально не изменишь, то потом перевыпускать придётся.

Проверил сначала клиентов, всё ОК. Немного удивился. Ожидал увидеть, что просрочены они. В логах самих клиентов не было подробностей, только невозможность установить TLS соединение. Проверил сертификат сервера, с ним тоже всё в порядке.

Тут уже немного повнимательнее стал смотреть. Проверил лог сервера. Там ошибка прямым текстом указана. Надо было с него начинать:

TLS: Initial packet from [AF_INET]1.2.3.4:40564
VERIFY ERROR: depth=0, error=CRL has expired
OpenSSL: error:1417C086:SSL routines:tls_process_client_certificate:certificate verify failed
TLS_ERROR: BIO read tls_read_plaintext error
TLS Error: TLS object -> incoming plaintext read error
TLS Error: TLS handshake failed

Основное тут: CRL has expired. Файл со списками отозванных сертификатов оказался просрочен. Сколько лет использую OpenVPN, в том числе с CRL (Certificate Revocation List), а первый раз с таким сталкиваюсь (поправочка, 7 лет назад уже сталкивался, но забыл).

Файл crl.pem был сгенерирован с помощью набора скриптов easy-rsa. В них по умолчанию параметр EASYRSA_CRL_DAYS выставлен в 180 дней. Если за этот срок не будет нового отзыва и пересоздания файла crl.pem, то сервер OpenVPN перестанет принимать соединения с указанной выше ошибкой.

Просто пересоздал файл, увеличив срок жизни файла до 10 лет. В своём случае не вижу смысла ограничивать срок жизни этого файла. К тому же последнее время обхожусь без него. Для тех, кто не знает, напомню, что нежелательных клиентов OpenVPN сервера можно отключать с помощью настройки сервера ccd-exclusive.

Если указана эта настройка, то для того, чтобы подключение клиента состоялось, для него должен существовать файл с настройками в client-config-dir. Если его там нет, он не подключится. Я всегда пользуюсь этими настройками, так что файлы конфигураций для клиентов есть. Если надо кого-то отключить, то достаточно просто удалить этот файл. И клиент не сможет подключиться.

Это не отменяет процедуры отзыва сертификатов. Сертификаты неактивных клиентов на всякий случай лучше отзывать. Но можно это делать по плану в какой-то определённый день, а не сразу после принятия решения об отключении. Для этого надо отозвать сертификат, сформировать новый список CRL, заменить существующий и перезапустить службу OpenVPN. Просто удалить файл конфигурации быстрее и проще.

📌 Полезные материалы по теме OpenVPN:

▪️Одновременный запуск нескольких клиентов OpenVPN
▪️Маршруты для клиента на основе url, а не ip адреса
▪️Запуск OpenVPN сервера на разных внешних IP адресах
▪️Диагностика низкой скорости через OpenVPN
▪️Запускаем OpenVPN сервер за 443 портом веб сервера
▪️Бесплатная веб панель для управления сервером
▪️Создание туннелей с коррекцией ошибок (Forward Error Correction)

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

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

#openvpn
Впервые увидел и попробовал очень удобную панель управления для OpenVPN. Если быть точным, то это скорее панель наблюдения за пользователями OpenVPN сервера. Речь пойдёт про проект openvpn-monitor.

С его помощью можно посмотреть следующую информацию о пользователях:

▪️имя пользователя;
▪️время подключения;
▪️внутренний и внешний IP пользователя;
▪️суммарный трафик;
▪️время подключения и соответственно время онлайна;
▪️расположение пользователя на географический карте.

При желании пользователя можно отключить через веб интерфейс.

Openvpn-monitor представляет из себя веб интерфейс, написанный на Python, запущенный через обычный веб сервер Nginx или Apache. Информацию о пользователях он берёт через стандартную management console сервера OpenVPN. Её надо включить. Для этого достаточно добавить в конфиг сервера:

management 127.0.0.1 5555

или

management 0.0.0.0 5555

Не забудьте ограничить доступ к консоли с помощью файрвола. Можно ещё паролем закрыть, но я бы не рассчитывал только на него. Лучше полностью скрыть. Также можно открыть доступ к ней через unix socket. Подробности в документации.

Openvpn-monitor можно запускать на любой машине, откуда будет доступ к открытой консоли. Проще всего запустить её в Docker, чтобы не устанавливать все пакеты и зависимости, хотя такая возможность тоже есть. Можно посмотреть в документации.

Я тестировал в Docker. Показываю сразу рабочий вариант, на котором я остановился:

# docker run -d --name openvpn-monitor \
  -e OPENVPNMONITOR_DEFAULT_DATETIMEFORMAT="%%d/%%m/%%Y" \
  -e OPENVPNMONITOR_DEFAULT_LATITUDE=55 \
  -e OPENVPNMONITOR_DEFAULT_LONGITUDE=37 \
  -e OPENVPNMONITOR_DEFAULT_MAPS=True \
  -e OPENVPNMONITOR_DEFAULT_MAPSHEIGHT=500 \
  -e OPENVPNMONITOR_DEFAULT_SITE=Test \
  -e OPENVPNMONITOR_SITES_0_ALIAS=UDP \
  -e OPENVPNMONITOR_SITES_0_HOST=97.145.145.233 \
  -e OPENVPNMONITOR_SITES_0_NAME=OVPN-UDP \
  -e OPENVPNMONITOR_SITES_0_PORT=5555 \
  -e OPENVPNMONITOR_SITES_0_SHOWDISCONNECT=True \
  -p 8181:80 ruimarinho/openvpn-monitor

Здесь указана широта и долгота Москвы как стартовая точка на карте и IP адрес VPN сервера. SITES_0 задаёт параметры одного сервера. Можно в одну панель добавить несколько, задавая настройки соответственно SITES_1_, SITES_2_ и т.д.

Это вся настройка. Теперь можно идти в IP интерфейс на порт 8181 и смотреть информацию о пользователях. Не забудьте его тоже скрыть от посторонних глаз либо за Firewall, либо за любой веб сервер с режимом обратного прокси. Встроенной аутентификации у openvpn-monitor нет.

🌐 Сайт / Исходники

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

#openvpn
Возник вопрос вчера на тему OpenVPN. Можно как-то собирать статистику по подключениям пользователей и выводить отчёт? В целом, задача эта решаема, так как OVPN сервер выдаёт всю статистику о своём состоянии и пользователях как через встроенную консоль управления, так и через лог файл, который задаётся параметром status в конфигурационном файле.

Расскажу, как эту задачу решаю я. Вроде бы в контексте именно статистики по пользователям я про неё не писал. В интернете можно найти много вариантов настройки мониторинга за пользователями OpenVPN. Я лично по старинке использую тот, что когда-то давно попробовал и внедрил. Видел варианты более элегантные и удобные. Я уже просто привык к своему, он нормально работает, так что использую:

Мониторинг openvpn подключений пользователей в zabbix

Идея сбора статистики в том, что при подключении пользователя срабатывает триггер, при отключении он гаснет. И всё. Zabbix сам собирает всю статистику. Потом по ней можно какой-то отчёт сделать и выгрузить его в CSV. Триггерам можно повесить отдельный тэг и самую низкую важность, чтобы они больше нигде не отсвечивали.

Тут получается немного нецелевое использование системы мониторинга, но зато ничего самому по аналитике делать не надо: искать какую-то панель для этого, агрегировать данные и т.д.

Дополнительно можно сделать отдельный Dashboard с информацией об активных сессиях. Там же добавить виджет с историей подключений и отключений и т.д. В целом удобно и заменяет многие простые панели без непосредственно управления. При этом лично мне именно в Zabbix функциональность подобного рода нравится больше, чем примерно то же самое, но в Grafana с метриками от какого-нибудь экспортера Prometheus. По крайней мере из тех, что я видел.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

#zabbix #openvpn
В настоящее время есть много технологий VPN, с помощью которых можно объединять подсети и подключать к ним внешних клиентов. Речь идёт не о блокировках и всем, что с этим связано, а об условно корпоративных VPN. Определённую популярность набрали сервисы на основе WireGuard, которые строят с его помощью mesh сети. Это не чистый WG, а программная обвязка вокруг него на дополнительном ПО. Примеры: Nebula, Tailscale, ZeroTier, Netmaker.

Я же хочу рассказать про старый добрый OpenVPN, который несмотря на все прочие современные реализации VPN остаётся актуален и удобен. И это не привычка и нежелание переходить на что-то новое, а объективное удобство. Перечислю несколько основных фактов, которые держат на OpenVPN.

1️⃣ Первый и самый главный – OpenVPN сервер умеет передавать клиенту во время подключения различные настройки, в том числе сетевые маршруты. Например, клиент подключается и мы ему тут же сообщаем, что он весь свой трафик должен завернуть в VPN. А когда нам это не нужно, перечисляем только список подсетей, которые заворачиваются в VPN.

Например, у меня есть несколько VPN серверов с внешними IP. Я их использую для доступа к закрытым ресурсам, куда разрешён доступ только мне. На этих VPN серверах перечислены по IP адресам те серверы, куда я должен подключаться через VPN. В момент моего подключения к OVPN серверу я получаю список маршрутов до этих IP адресов через VPN сервер. И только туда. Весь остальной трафик будет ходить напрямую.

Помимо маршрутов можно передавать и другие настройки. Несколько примеров:
- настройка своего внутреннего DNS сервера;
- разрешение клиентов взаимодействовать друг с другом;
- настройки внутреннего IP адреса;
- разрешение, запрет на подключение;
- разрешение, запрет сжатия трафика;
- и многие другие.

Всё это управляется централизованно на сервере. На клиентах никаких настроек менять не надо. Один раз передали конфиг с зашитыми сертификатами и всё.

2️⃣ Помимо передачи маршрутов клиентам внутри OVPN сети есть своя реализация динамической маршрутизации. Если у вас филиальная сеть объединена с помощью OVPN, вы у пользователей весь нужный трафик направляете в VPN туннель. А на OVPN сервере управляете, какие подсети какой филиал обслуживает. Добавился новый филиал - добавили его в список маршрутов и указали, что за новую подсеть отвечает новый сервер в филиале. Настройки клиентов трогать не надо, пускать поверх VPN сети ospf и bgp тоже. Реализация очень простая в настройке и управлении. Возможно для очень больших сетей этого будет недостаточно, но для малых и средних вполне.

3️⃣ Гибкость в возможностях аутентификации. Вы можете использовать традиционную для OVPN аутентификацию по сертификатам, можно оставить только логин с паролем, можно подключать внешний скрипт для аутентификации, а там уже реализовывать любую логику.

Можно всё убрать и настроить простой туннель вообще без какой-либо аутентификации и шифрования:

# openvpn --remote 1.2.3.4 --dev tun1 --ifconfig 10.4.0.1 10.4.0.2
# openvpn --remote 4.3.2.1 --dev tun1 --ifconfig 10.4.0.2 10.4.0.1

Всё, серверы видят друг друга по указанным внутренним IP адресам.

4️⃣ OVPN сервер поддерживает оба протокола TCP и UDP, можно использовать любой порт. Вкупе с предыдущим пунктом, одна технология VPN покрывает очень широкий спектр задач. Вы можете все потребности закрывать только с помощью OpenVPN.

5️⃣ Есть клиенты под все системы. Сервер очень старый, есть куча инструкций, понятны параметры, много специалистов. Всё расписано и изучено за многие годы.

6️⃣ Проблему с производительностью решили отдельным модулем ядра для OpenVPN. Я не слежу за его изменениями. Приехал он уже или нет в ядро или хотя бы в виде пакета в базовые репозитории. Но уже года два его можно скачать и самостоятельно установить, если сильно нужно.

Заметка получилась большая. Написал сходу, какие мысли пришли в голову. Я OpenVPN люблю и использую давно. При этом другие реализации и настраиваю, и использую. Как минимум WG и L2TP использую постоянно, а раньше ещё PPTP.

#openvpn
Please open Telegram to view this post
VIEW IN TELEGRAM
Расскажу кратенько с конкретными примерами, как я настраиваю ограничение на доступ к серверам и сервисам по статическим IP адресам и потом подключаюсь к ним, используя некоторое количество арендованных VPS для этих целей.

Я уже давно практикую и остальным советую не оставлять публичный доступ через интернет к сервисам, которые не являются публичными. Например, тот же SSH я открываю только для белого списка своих IP адресов. Для iptables это обычно выглядит так:

SSH_WLIST=100.189.229.125,141.73.66.12,187.91.13.196,83.208.103.44,194.139.219.214
iptables -A INPUT -i enp5s0 -s $SSH_WLIST -p tcp --dport 22 -j ACCEPT

В скрипте с правилами задана переменная со списком моих IP адресов и правило для SSH на его основе.

На VPS с перечисленными IP адресами настроены сервера OpenVPN. Они используются для различных задач, в том числе в качестве шлюзов для подключения к закрытым серверам. При подключении со своих рабочих машин я не направляю весь трафик в VPN. Это неудобно и мешает работе. В общем случае я использую прямой выход в интернет для типовых задач в виде сёрфинга в интернете, просмотра видео и т.д.

При подключении по VPN я получаю только те маршруты, что мне нужны. Например, я хочу подключаться к серверу c IP адресом 233.129.58.85 через конкретный OpenVPN сервер. Я иду на него и добавляю на сервере к конфигурации, привязанной к сертификату, который я использую при подключении, следующую настройку:

push "route 233.129.58.85 255.255.255.255"

При подключении по VPN ко мне в систему приедет маршрут до 233.129.58.85 через этот сервер. Подключение по SSH к этому серверу пойдёт через VPN. В настройке маршрута можно указать не только IP адрес, но и DNS имя. Примерно так:

push "route ya.ru 255.255.255.255"

Чтобы это сработало, в конфигурации клиента, для которого добавлен такой маршрут, должен быть добавлен параметр:

allow-pull-fqdn

В итоге на рабочей машине у меня настроен клиент OpenVPN с готовыми подключениями к различным VPN серверам. Когда мне надо подключиться к той или иной инфраструктуре, я подключаюсь к нужному VPN серверу и получаю маршруты только туда. Всё остальное остаётся неизменным. Весь трафик в VPN я не направляю, уже существующие соединения не рвутся. Одновременно могут быть активны разные OpenVPN соединения. Все маршруты управляются с серверов. На самом клиенте я ничего не меняю.

В такую схему легко добавляются новые VPS, новые пользователи (❗️), новые сертификаты со своими привязанными к ним настройками, и всё это управляется централизованно через сервера. Сами клиенты трогать не надо.

📌 Полезные ссылки по теме:

▪️Основные преимущества OpenVPN сервера
▪️Настройка allow-pull-fqdn
▪️Одновременный запуск нескольких клиентов OpenVPN
▪️Запуск OpenVPN сервера на разных внешних IP адресах
▪️Запускаем OpenVPN сервер за 443 портом веб сервера

На днях на одном из моих серверов протух CA, который был выпущен 10 лет назад. Такие встречаются долгожители. И это не первый случай. Писал и заметки здесь по этой теме, и статья на сайте есть.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

#openvpn