Full-Mesh VPN fastd, tinc, VpnCloud
Last updated
Was this helpful?
Last updated
Was this helpful?
Привет, Хабр! Меня зовут Олег, я архитектор клиентских решений в Selectel. Недавно мы столкнулись с интересным клиентским кейсом при создании Full-Mesh сети. Расскажу, как пришлось тестировать VPN-сервисы, чтобы найти оптимальное решение.
Все результаты собрал в сводной таблице, чтобы наглядно показать разницу и аргументировать выбор.
К нам обратился клиент с задачей по переносу данных с арендованных выделенных серверов одного популярного в России поставщика услуг из Германии. На то было две причины:
Невозможность простой и быстрой оплаты услуг, поскольку привязанная карта российского банка перестала работать.
Защита от возможной эскалации санкционного давления (то есть полный запрет работы).
Компания арендовала в Германии такую инфраструктуру:
два сервера-гипервизора на базе Qemu/KVM с управлением через libvirtd,
два сервера c Docker-контейнерами для разработчиков и их заказной CRM/ERP-системой,
несколько виртуальных машин на Linux и Windows Server 2019.
Со схемой можно ознакомиться ниже:
Сначала мы изучили текущее клиентское решение и предложили на его основе свою схему миграции, которая бережно относилась к текущей IT-инфраструктуре и при этом не теряла в отказоустойчивости.
На этапе миграции остановились на следующей организации сетевой топологии. Так мы обеспечили единую L2-связность между дата-центром Selectel и зарубежным ЦОД:
Дело осталось за малым — подобрать VPN, который прост в настройке, поддерживает L2, полносвязную топологию и использует быстрые, криптостойкие алгоритмы шифрования.
OpenVPN — в данном случае не лучший выбор, так как имеет клиент-серверную архитектуру. В случае возникновения проблем или при регламентном обслуживании сервера связность на L2 потеряется. Нам не хотелось создавать точку отказа.
Во время миграции можно было бы использовать OpenVPN, но хотелось сразу подготовить решение, которое не нужно дорабатывать.
Рассматривались следующие варианты:
fastd,
VpnCloud,
Tinc.
Стоит отметить, что у разработчика VpnCloud удобный
Выбирать, основываясь на субъективном мнении пользователей и разработчиков, не хотелось, поэтому решили провести лабораторное тестирование VPN-систем и составить свое предвзятое мнение 🙂.
Критерии, по которым оценивались кандидаты:
скорость передачи данных через туннель,
стабильность работы,
простота и удобство настройки,
кроссплатформенность, наличие готовых пакетов под различные дистрибутивы Linux,
документация.
При использовании VPN мы имеем дело с инкапсуляцией пакетов, поэтому важно правильно выставить значение MTU. Новый туннель добавляет дополнительные заголовки к пакету и снижает возможное количество передаваемых полезных данных (payload). Накладные расходы зависят как от типа туннельного интерфейса, так и от используемых алгоритмов шифрования данных.
Например, для нашего проекта получаем:
Базовый MTU — 1 500 байт (стандарт для IEEE 802.3 Ethernet).
TAP-интерфейс — дополнительно 28+14=42 байта.
IPv4 дополнительных байт не добавляет. Если бы использовался IPv6, то общий MTU уменьшился еще на 20 байт.
Шифрование — еще 24 байта.
Итого: 1500-42-24 = 1 434 байта
Что это означает на практике:
При создании сетевого моста Linux или программного коммутатора (если вы захотите использовать Open vSwitch), в который предполагается добавить VPN-интерфейс, то MTU моста/свитча, как и MTU всех подключенных к нему Ethernet и виртуальных интерфейсов должен быть одинаковый, но при этом меньше или равен 1 434 байтам.
Нужно убедиться, что в ОС на виртуальной машине на сетевом адаптере также выставлен правильный MTU, например, для ВМ с ОС Windows:
План тестирования:
На нашей облачной платформе создаются три виртуальные машины в разных зонах доступности (и регионах). При этом используются разные дистрибутивы Linux (rpm-based и deb-based).
Один раз запускаем iperf для измерения скорости передачи данных между машинами без VPN, фиксируем результат.
Средствами пакетного менеджера из репозиториев устанавливаем тестируемый VPN на все серверы и настраиваем его для взаимодействия с другими пирами. Также настраиваем автоматический старт при перезагрузке машины. Если позволяет ПО, выставляем либо самый быстрый, либо рекомендуемый разработчиком алгоритм шифрования трафика. Важно: VpnCloud не позволяет задать алгоритм шифрования вручную — только автоматически после запуска внутреннего бенчмарка.
Запускаем iperf на 30 минут, фиксируем скорость передачи данных, задержки, затем заносим данные в таблицу.
Последовательно осуществляем остановку и запуск VPN-сервиса на всех виртуальных машинах и фиксируем прохождение трафика между остальными включенными пирами (убеждаемся, что VPN действительно полносвязный).
После теста пакет с машины удаляется.
Оцениваем VPN-сервисы по объявленным выше критериям, выставляя места от 1 до 3.
Виртуальные машины создаются с образами AlmaLinux 8 64-bit, CentOS 7 Minimal 64-bit и Ubuntu 22.04 LTS 64-bit. Так мы достигли следующей сетевой топологии:
Переходим к тестированию.
По установке все тривиально. Для RHEL-based дистрибутивов собранный пакет присутствует в EPEL, для Ubuntu — в universe.
Для Ubuntu устанавливаем штатно:
Конфигурирование идентично для всех дистрибутивов в тесте. Смотрим на unit, поставляемый с пакетом:
Создаем каталог и конфигурационный файл в нем:
Генерируем публичный и приватный ключ для каждой машины:
Вывод будет иметь следующий вид (ключи в production-конфигурациях не используются):
Содержимое раздела с пирами уникально на каждой виртуальной машине. У каждого будет свой secret и скрипты on up/down, а также закомментирован peer, в котором фигурирует непосредственно хост. Для примера здесь приведена конфигурация fastd на peer-01:
Что получилось
Запускаем демон и задействуем его при включении сервера:
Проверяем:
После подключения всех пиров в логах будут следующие строки:
Устанавливаем iperf. Для RHEL-based дистрибутивов:
Для Debian соответственно:
Запускаем утилиту в режиме сервера на одном из пиров, на втором — в режиме клиента и замеряем скорость соединения без использования туннеля:
Результат
ICMP-пинги:
Далее повторяем измерения, но уже через VPN-туннель:
Результат (только полезные данные)
Для Ubuntu подключаем репозиторий и устанавливаем:
Далее для конфигурирования можно воспользоваться мастером, который предоставляет TUI, работающий в трех режимах: базовом, продвинутом и экспертном. Запускается мастер следующим образом:
Вводим запрашиваемые данные и после его успешного выполнения по пути /etc/vpncloud/${your_network_name}.net
создастся YAML-файл с настройками. Я мастером пользоваться не стал, изучил man vpncloud, пример из /etc/vpncloud/example.net.disabled
и сделал конфигурацию самостоятельно, предварительно сгенерировав ключи. На каждом из peer запускаем:
Приведенные ключи в production-конфигурациях не используются.
Вносим ключи в конфигурацию на каждой виртуальной машине, не забываем добавить публичную часть ключа в доверенные на других серверах.
Пример файла конфигурации на peer-02
Как и для предыдущего участника теста, изучаем Unit systemd пакета:
Что получилось
Запускаем его и задействуем старт при включении сервера:
Проверяем журнал:
Теперь все готово для замера скорости в iperf.
Результат (представлены только полезные данные):
Результат идентичен показателям fastd в пределах погрешности.
Для AlmaLinux и CentOS убеждаемся, что EPEL задействован и ставим пакет:
Для Ubuntu/Debian устанавливаем с помощью пакетного менеджера APT:
Посмотрим, какой systemd-юнит нам предлагает мейнтейнер пакета:
Создаем каталог и конфигурационный файл в нем:
Генерируем ключи:
Создадим конфигурацию. Для примера здесь приведена конфигурация Tinc на peer-01:
sudo cat /etc/tinc/vpntest/tinc.conf
Затем в папке /etc/tinc/vpntest/hosts нужно создать конфигурационные файлы для других участников mesh-сети с сгенерированными публичными ключами (даны для примера, в production не используются и не должны использоваться).
Пример для peer-01
Создаем скрипт, который будет выполняться при запуске tincd:
sudo touch /etc/tinc/vpntest/tinc-up && sudo chmod +x /etc/tinc/vpntest/tinc-up
со следующим содержимым (пример: опять же, для peer-01, для peer-02 и peer-03 вносятся соответствующие сетевой схеме адреса):
Запускаем сервис и проверяем:
Тестируем задержки и скорость передачи данных через туннель:
Получившийся результат
Скорость у Tinc заметно «просела», а задержки оказались выше.
Скорость передачи данных. Первое место между собой поделили VpnCloud и fastd, Tinc — на втором месте.
Стабильность работы. Все программы работали стабильно: ошибок, аварийных завершений и утечек памяти во время тестирования не наблюдалось. Все участники теста разделили первое (или последнее третье, если угодно) место.
Простота, удобство настройки. Этот пункт для оценки достаточно субъективный. Мне показалось, что fastd гибче в настройке, так как позволяет создать как монолитную конфигурацию, так и «разнести» по отдельным файлам.
Также для fastd был создан Ansible Playbook для его массового развертывания и настройки. Если эта тема интересна — могу написать отдельную статью или добавить ссылку в GitHub gists без подробного разбора.
Из плюсов — VpnCloud поддерживает beaconing. Это позволяет облегчить конфигурирование, но я его не использовал ни в тестировании, ни в production, так как ни в одном из случаев не было большого количества узлов.
Кроссплатформенность, наличие готовых пакетов. Как уже было упомянуто, пакеты собраны для всех распространенных дистрибутивов Linux. Но что касается других платформ (Windows, MacOS X, BSD), то тут Tinc — безусловный лидер. На втором месте — fastd (без поддержки Windows), а на третьем — VpnCloud, который на данный момент поддерживает только Linux.
1
fastd
v22
C
да/нет/да
UDP
вручную
AES-256, AES-128, ChaCha20
2
VpnCloud
2.3.0
Rust
да/нет/нет
UDP
авто
AES-128-CTR, Salsa20, Salsa2012
3
Tinc
1.0.36
C
да/да/да
UDP+TCP
вручную
AES-256 (все поддерживаемые OpenSSL)
По результатам тестирования был выбран fastd, который и был использован в проекте.
Демоны fastd были сконфигурированы на всех серверах и при старте добавлялись в уже работающие мосты с предварительно настроенным MTU 1 400 байт, которые использует libvirtd, настроена сеть на серверах с Docker. После чего была осуществлена миграция виртуальных машин и persistent-данных для контейнеров. В эксплуатации новая информационная система находится с апреля текущего года и проблем с сетью и стабильностью работы мы не наблюдаем. Стоит отметить, что такое решение можно при необходимости использовать и в Proxmox VE.
Нам удалось предоставить клиенту кастомное решение, которое полностью закрывало его потребности во время миграции. Для этого пришлось проделать исследование и провести ряд тестов, что положительно сказалось на результате и комфорте эксплуатации проекта.
Если в первом случае мы помогли временно решить проблему, то во втором никаких гарантий дать не могли. Поэтому клиент принял решение мигрировать в Selectel, .
Далее мы занялись обеспечением сетевой связности на втором уровне стека протоколов TCP/IP. Так мы смогли обеспечить клиенту «бесшовный» перенос виртуальных машин и сохранить IP-адреса. Чтобы оптимизировать бюджет, клиент выбрал серверы линейки , в которых отсутствует «приватная сеть».
Вариант с был отброшен сразу: он не работает по L2, только по L3, хотя продукт достойный.
К сожалению, там нет даже упоминания , который использовался в проекте.
Во избежании проблем с на хостах Qemu/KVM нужно создать правило netfilter. Например, при использовании iptables: sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
С дополнительной информацией по решению проблемы можно ознакомиться и .
Для AlmaLinux и CentOS убеждаемся, что задействован и ставим пакет:
Разработчик предоставляет готовые пакеты, которые доступны для скачивания и установки в разделе на GitHub. Для Debian/Ubuntu также можно воспользоваться .
Для установки последней стабильной версии в AlmaLinux и CentOS :
Tinc — весьма популярный проект. Готовые бинарные пакеты присутствуют, пожалуй, во всех дистрибутивах Linux и BSD. Для RHEL-based дистрибутивов собранный пакет присутствует в , для Ubuntu — в universe.
Документация. Выскажу субъективное мнение. Считаю, что документация fastd лучше структурирована, используется со всеми вытекающими. Безусловно, стоит отметить VpnCloud. Документация Tinc хороша, если рассматривать ее с точки зрения принципа : вся нужная информация в одном man-файле. Отдаю приз fastd, а второе место делят VpnCloud и Tinc.