Русский
Русский
English
Статистика
Реклама

Wireguard

Что лучше выбрать Wireguard или OpenVPN? Любимый VPN Линуса Торвальдса

12.01.2021 16:20:24 | Автор: admin


Технологии VPN редко становятся объектами пристального внимания: есть и есть. Создатель Wireguard Jason A. Donenfeld оказался везунчиком после нетипичной для Линуса Торвальдса резко хвалебной оценки качества кода.

Can I just once again state my love for it and hope it gets merged soon? Maybe the code isnt perfect, but Ive skimmed it, and compared to the horrors that are OpenVPN and IPSec, its a work of art.

Вскоре после этого Wireguard оказался в основной ветке стабильного ядра Linux. Чем же Wireguard так замечателен и отличается от остальных VPN?

Шифрование: отличия Wireguard от OpenVPN


Wireguard исповедует минималистский и безапелляционный подход к шифрованию, преднамеренно исключив гибкость и альтернативу выбора протоколов, так как это слишком затратно. Если нет выбора протоколов, нет и процесса согласования, в котором традиционно находят дыры безопасности. Кроме того SSL/TLS уязвимости, идущие ровным потоком также не в пользу богатства выбора.

Протоколы шифрования Wireguard


  • Краткость сестра таланта 4000 строк кода стало чуть ли не визитной карточкой Wireguard.
  • Детерминированный набор современных криптографических алгоритмов:
  • ChaCha20 для симметричного шифрования также используется в AEAD структуре RFC7539;
  • Poly1305 для аутентификация, также используется в AEAD структуре RFC7539;
  • Curve25519 эллиптическая кривая для протокола безопасного обмена ключей Diffie-Hellman;
  • Blake2 в RFC7693 соответствующая хеш-функция;
  • SipHash2-4 псевдослучайная функция для поиска расшифрованных открытых ключей инициатора сессии установления связи;
  • HKDF для извлечения ключей;
  • UDP в качестве протокола транспортного уровня;
  • Perfect forward secrecy принцип предотвращения компрометации сессионных ключей.

В отличие от OpenVPN, Wireguard не использует сертификаты X.509 и лишен сопутствующих проблем. Вместо этого Wireguard использует асимметричное шифрование с открытым и закрытым ключом.

Протоколы шифрования OpenVPN


OpenVPN поддерживает множество криптографических алгоритмов, используя библиотеку OpenSSL. Более точно, для шифрования и аутентификации используются следующие алгоритмы.

aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
aes-256-cbc aes-256-ecb aria-128-cbc aria-128-cfb
aria-128-cfb1 aria-128-cfb8 aria-128-ctr aria-128-ecb
aria-128-ofb aria-192-cbc aria-192-cfb aria-192-cfb1
aria-192-cfb8 aria-192-ctr aria-192-ecb aria-192-ofb
aria-256-cbc aria-256-cfb aria-256-cfb1 aria-256-cfb8
aria-256-ctr aria-256-ecb aria-256-ofb base64
bf bf-cbc bf-cfb bf-ecb
bf-ofb camellia-128-cbc camellia-128-ecb camellia-192-cbc
camellia-192-ecb camellia-256-cbc camellia-256-ecb cast
cast-cbc cast5-cbc cast5-cfb cast5-ecb
cast5-ofb des des-cbc des-cfb
des-ecb des-ede des-ede-cbc des-ede-cfb
des-ede-ofb des-ede3 des-ede3-cbc des-ede3-cfb
des-ede3-ofb des-ofb des3 desx
idea idea-cbc idea-cfb idea-ecb
idea-ofb rc2 rc2-40-cbc rc2-64-cbc
rc2-cbc rc2-cfb rc2-ecb rc2-ofb
rc4 rc4-40 rc5 rc5-cbc
rc5-cfb rc5-ecb rc5-ofb seed
seed-cbc seed-cfb seed-ecb seed-ofb
sm4-cbc sm4-cfb sm4-ctr sm4-ecb


Для хеш сумм доступны такие функции.

(1:701)$ openssl dgst --list

Supported digests:

-blake2b512 -blake2s256 -md4
-md5 -md5-sha1 -mdc2
-ripemd -ripemd160 -rmd160
-sha1 -sha224 -sha256
-sha3-224 -sha3-256 -sha3-384
-sha3-512 -sha384 -sha512
-sha512-224 -sha512-256 -shake128
-shake256 -sm3 -ssl3-md5
-ssl3-sha1 -whirlpool

OpenVPN в связке с OpenSSL поддерживает PKI стандарты RSA, DSA и ECDSA, однако не все из них пригодны для любых пользовательских сценариев. Так, ключи ECDSA пока еще не получили широкой поддержки со стороны корневых CA.

  • UDP/TCP в качестве протокола транспортного уровня;
  • Perfect forward secrecy принцип предотвращения компрометации сессионных ключей.

Выводы по стандартам шифрования и безопасности


Архитектурно Wireguard более безопасен за счет того, что поверхность атаки значительно меньше по сравнению с OpenVPN. Тем не менее, OpenVPN считается очень безопасным и надежным, многократно пройдя независимый аудит кода. За счет этого OpenVPN выигрывает при консервативном подходе к выбору VPN-решения.

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

Сравнение производительности


Так как Wireguard реализован в пространстве ядра, а OpenVPN в пользовательском пространстве, у первого должно быть преимущество в скорости. Связано это с тем, что пакеты постоянно копируются из одного пространства в другое и кроме того требуется постоянная фоновая служба OpenVPN.

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

  • Технологии IPSEC, OpenVPN и Wireguard;
  • Процессоры IntelCore i7-3820QM и Intel Core i7-5200U;
  • Сетевые карты Intel 82579LM и Intel I218LM gigabit Ethernet;



Сравнение производительности различных VPN со стороны Jason A. Donenfeld-а

В обеих тестах на пропускную способность и время отклика ping, Wireguard значительно превзошел OpenVPN, а заодно и две вариации IPSec-а. Кроме того, во время теста на пропускную способность с использованием OpenVPN и IPSec утилизация CPU достигала 100%. В то же время использование Wireguard так сильно не загружало центральный процессор, давая тем самым возможность полностью утилизировать ресурсы сетевой карты Gigabit Ethernet.

Естественно предположить, что автор Wireguard может быть предвзятым в составлении сценариев и трактовке результатов замера производительности технологий VPN. Следовательно имеет смысл ознакомиться с другими тестами скорости разных VPN. Благо все, что для этого нужно VPS сервер, VPN и пакет iperf3.

Но и другие подобные тесты показывают превосходство Wireguard в тестах производительности.


Сравнение производительности Wireguard и OpenVPN

Неожиданным фактом можно считать, что openvpn-tcp быстрее openvpn-udp, однако при ближайшем рассмотрении все становится на свои места. TCP-поток имеет меньше завершенных тестов, чем UDP. Во всяком случае и тут Wireguard показывает лучшие результаты производительности.

В той же серии тестов любопытно сравнение скорости VPN-соединения в зависимости от число открытых сокетов. При росте их количества производительность Wireguard скачкообразно падает, хотя продолжает оставаться выше, чем openvpn-tcp и openvpn-udp.


Сравнение производительности Wireguard и OpenVPN в зависимости от числа открытых сокетов. TestID 0-600 соответствует openvpn-udp, 700-1200 openvpn-tcp и 1300-1800 Wireguard

Выводы по скорости VPN-соединения


Синтетические тесты скорости от разных авторов, с использованием пакета iperf3, позволяют предположить, что Wireguard быстрее, чем OpenVPN.

Конфиденциальность данных


VPN-протоколы уделяют гораздо большее внимание безопасности соединения, нежели конфиденциальности. Однако возможность сохранения анонимности тоже имеет значение кому охота писать объяснительные по факту закачки учебника Oracle, или эмулятора топологии Cisco? Ничто так хорошо не выдает факт правонарушения, как IP адрес пользователя.

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

Сама настройка защищенного соединения Wireguard довольно проста. Сперва установка.

(1:530)$ sudo emerge -av wireguard-modules wireguard-toolsThese are the packages that would be merged, in order:Calculating dependencies... done![binary  N     ] net-dns/openresolv-3.11.0  USE="(-selinux)" [binary  N     ] virtual/resolvconf-1 [ebuild  N     ] net-vpn/wireguard-modules-1.0.20201221  USE="module -debug -module-src" [binary  N     ] net-vpn/wireguard-tools-1.0.20200827  USE="wg-quick" Would you like to merge these packages? [Yes/No] 

Создаем открытый и закрытый ключи.

(1:531)$ wg genkey | tee privatekey | wg pubkey > publickey

Далее, необходимо настроить файл /etc/wireguard/wg0.conf.

/etc/wireguard/wg0.conf[Interface]Address = 10.0.0.1/24, fdc9:1f28:04d7:9ee9::1/64SaveConfig = trueListenPort = 51820PrivateKey = 2JtKAUFzecmgIVzbscQh3iUZrZanxIzvbejcIkvC5Hk= #PEER_A_PRIVATE_KEY[Peer]PublicKey = rgqd1cHKgRWX3IkYYSlrKA/SW3qZUhSJMqwTq4+3eFs= #PEER_B_PUBLIC_KEYPresharedKey = PEER_A-PEER_B-PRESHARED_KEYAllowedIPs = 10.0.0.2/32, fdc9:1f28:04d7:9ee9::2/128Endpoint = pb.example.com:51280

Второй участник подключения должен у себя настроить такой же файл, указав в нем свой закрытый ключ и открытый ключ участника A. Для установки соединения каждая из сторон выполняет wg-quick up interface_name.

Из этого видно, что при настройке Wireguard IP адрес, либо имя узла задаются в явном виде и будут видны в системных лог-файлах и таблицах SNMP до момента перезагрузки сервера.
OpenVPN лучше защищает конфиденциальность клиентских подключений, так как не требует до установки защищенного соединения прописывать IP адреса, или сетевое имя клиентских компьютеров.

Выводы по конфиденциальности данных


В этой номинации OpenVPN имеет определенное преимущество ввиду того, что лишь Wireguard предполагает хранение IP-адреса пользователей на VPN-сервере в течение длительного времени.

Итоги: какой же VPN выбрать?


Есть огромное количество пользовательских сценариев использования VPN, и вряд ли одна и та же рекомендация будет хороша для всех. Соответственно, для разных сценариев можно выделить две группы с наиболее подходящим решением для VPN.

  • Если вы обычный пользователь;
  • VPN вам нужен для обхода всяких нелепых ограничений РКН;
  • скорость для вас имеет значение, например для файлообмена, или работы вашего приложения;

Используйте Wireguard.

  • Бизнес пользователи средней и крупной компании использующие VPN для удаленного доступа к внутренней сети;
  • бизнес пользователи, предоставляющие удаленный доступ по VPN к ИТ ресурсам, содержащим конфиденциальные данные, или коммерческую тайну;
  • все, кому нужно надежное и проверенное временем решение для VPN;


То лучше используйте OpenVPN.

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

Подробнее..

Wireguard для MAC win или fail?

24.01.2021 12:05:35 | Автор: admin


В этом посте мы продолжаем обсуждать плюсы и минусы использования Wireguard новаторского подхода к технологиям VPN. Программа доступна не только на Linux, но и на других платформах и ОС.

Понятное дело, что производительность и качество сборки будет наивысшим для Linux и Unix систем с открытым исходным кодом. Однако, как отметили в комментариях для Windows есть вполне приличный графический клиент. Есть таковой и у MacOS, а для Linux отдельного графического клиента нет, если не считать настройку Wireguard из Network Manager.

Wireguard для macOS доступна в App Store и устанавливается стандартным образом. На данный момент последняя версия 1.0.12, средний рейтинг довольно высокий 4.7 из 5. Ничто не предвещало того, что в рождественский день 25-го декабря 2020 г. автору Wireguard Jason A. Donenfeld-у оборвут телефон жалобами и яростными нападками на кошмарно некачественное и неработающее ПО для Mac.

В предыдущий день такое же не рождественское настроение было у пользователя macOS по имени Rachel. Вместо того, чтобы отмечать праздник в кругу родных и близких людей, она написала гневный отчет в своем блоге о том, как неделю назад потратила уйму времени, но так и не смогла обновить Wireguard.

После того, как вышла новая версия Wireguard и появилось соответствующее уведомление от macOS, Rachel запустила обновление текущей версии 1.0.10. Действие завершилось ошибкой в связи с тем, что Wireguard необходимо остановить прежде, чем запустить обновление. Однако особенность программы для macOS в том, что необходимо самостоятельно завершить защищенное соединение, так как программа не делает этого в автоматическом режиме.

Помимо того, Wireguard будет пытаться установить защищенное соединение снова и снова, если в настройках выбран режим on-demand. Для окончательной остановки программы, необходимо сначала отключить этот режим в редакторе настроек.


Рис. 1 Опция on-demand в настройках Wireguard для macOS

Рейчел невысокого мнения о пользовательском интерфейсе Wireguard, она это сравнивает с шебуршанием в темном подвале шаловливыми и немытыми руками в огромных рукавицах.

Just the way it failed told me something was up with the overall model here. It feels like the UI is poking at the thing doing the actual work with very long and wobbly sticks. It's doing this in a dimly-lit room with oversized gloves zip-tied to its hands, and its glasses are smeared with filth. In short, it's not in control of the situation, not really.

Исчерпав попытки обновить программу штатными средствами, блогерша принудительно удалила её и установила свежую версия с Macports, провозившись немного c созданием ключей и конфигурации в ручном режиме. История повторилась 24-го декабря после приобретения новенького Big Sur, чем еще можно заняться на Рождество кроме крэш-теста Wireguard? В этот раз все пошло даже еще хуже.

Обновление опять не сработало и снова программу пришлось останавливать вручную. Однако на этот раз попытка отключить режим on-demand ни к чему не привела, интерфейс Wireguard не подавал признаков жизни. Перейдя к плану Б, Рейчел собиралась и на этот раз установить программу с ресурса Macports. Для этого нужно было экспортировать конфиг в zip файл, однако это тоже не сработало.

Последней каплей стала безуспешная попытка удалить программу, перетащив значок в Корзину из интерфейса Программы. Ведь для этого надо было остановить Wireguard, а он никак не останавливался. Пришлось старым дедовским способом убить процесс с помощью kill -9 PID. Тогда-то Рейчел написала свой отчет, который довольно скоро попал в топ-лист на HackerNews. В комментариях отметили, что пост больше похож на rant ворчание, что видно хотя бы из отрывка:
It later turned out that something or other happened upstream, and now they treated timeouts as failures, or something, I don't know exactly, and I don't really care.

После этого в дискуссию включился сам автор Wireguard, написав обстоятельный ответ на пост Рейчел. Сразу же выяснилось, что столь странное поведение при обновлении свойственно не только Wireguard, но и другим VPN-клиентам на macOS. Все они при должны быть остановлены до запуска обновления, таковы особенности операционной системы от Apple.

This is not unique to Wireguard. Ive had this happen with the Lockdown app too. This is an Apple problem. Apple should notify you that the VPN app needs to close in order to upgrade then offer you a simple way of doing that.

От AppStore не поступает сигналов о том, что приложение VPN должно быть завершено. Обходное решение состоит в том, чтобы отслеживать оповещения из UI, однако этот механизм ненадежен и частенько никаких оповещение не поступает. Приходится постоянно делать снэпшоты VM и ждать завершения циклов обновления на AppStore. Apple должна исправить ситуацию, но не торопится этого делать.

В такой ситуации выбор небольшой. Проводя три четверти своего времени разработки Wireguard в поисках обходных решений различных багов macOS, начинаешь принимать это за данность. И несмотря на то, что программа бесплатна, Jason A. Donenfeld делает все возможное, чтобы качество ПО оставалось на должном уровне. Последнее было в ответ на следующую фразу Рейчел.

What about the problems? Well, it's free. They owe me nothing.

Вторым пунктом Jason A. Donenfeld признает, что в версию 1.0.10 закралась регрессия, которую впрочем оперативно исправили. Однако дальше пошла бюрократия проверки кода в AppStore. В программе была ссылка на страницу пожертвований. Автору предложили поделиться заработанным, или убрать ссылку. Затем они проверили не ту версию, затем что-то еще

Сама регрессия была результатом того, что новый разработчик по неопытности удалил обходное решение для бага ОС при добавлении пакета WireguardKit. Заурядный случай, если ведешь разработку для интегрированной среды Apple NetworkExtension. Как правило исправление дефекта происходит в течении нескольких минут после получения отчета, но проверка кода в AppStore затягивается, а блогеры готовы дать подножку здесь и сейчас.

По поводу странного поведения GUI в режиме on-demand автор Wireguard еще раз прошелся по NetworkExtension и трудностям разработки для macOS. Шаг влево, шаг вправо в AppStore могут зафиксировать нарушения API и в итоге заблокировать учетную запись разработчика. Привязка же к NetworkExtension объясняется тем, что лишь такие приложения можно распространять через AppStore. Никак не помогает в отладке приложений тот факт, что Apple в отличие от Microsoft не предоставляет необходимых DebugSymbols.

and after identifying the issue I'll often have several ideas for clever workarounds. Which of them are acceptable for the App Store? Usually none! C'est la vie.

Тогда возникает естественный вопрос а что же вы так мучаетесь на этом AppStore? Можно конечно выкатить отдельную сборку и самостоятельно распространять её, но тогда придется поддерживать две параллельные версии, потому что Jason A. Donenfeld не хочет оставить пользователей AppStore не с чем. В итоге все-же приходится терпеть и приспосабливаться.
Автор Wireguard призвал Рейчел не только критиковать, но и принять участие в разработке кода. В сообществе пользователей ПО с открытым исходным кодом это считается этической нормой вместо того, чтобы предъявлять претензии присылайте патчи, или хотя бы пишите документацию. В дальнейших планах бесшовная интеграция с NetworkExtension и KeyChain, исправление дефектов и пользовательского интерфейса.

Хотелось бы узнать мнение читателей, терпимо работает Wireguard на неродных платформах, или действительно полный швах?

Подробнее..

Сравнение ZeroTier и WireGuard, а так же других решений

26.01.2021 16:05:52 | Автор: admin


В предыдущих статьях, от RSagittarius, посвящённых ZeroTier было подробно рассмотрено практическое применение данного инструмента и его настройка. Настало время сравнить его с таким, набирающим популярность, решением как WireGuard, что бы понять в каких случаях лучше выбрать ZeroTier, а в каких WireGuard. Так же, на закуску, рассмотрим такую штуку как локалка RuVDS.

Wireguard относительно новый популярный VPN из коробки


Существует огромное множество VPN решений, наиболее известными, на сегодняшний день, являются IPSec, WireGuard и до недавнего времени наиболее популярный, OpenVPN. Так почему-же я решил сравнивать ZeroTier, который производителем не позиционируется как классическое VPN решение, именно с WireGuard? На то есть несколько причин:

  1. Простота настройки низкий порог входа.
  2. Мультиплатформенность наличие клиентов под все распространённые платформы, включая мобильные.
  3. Новизна продуктов и тот и другой стали на слуху сравнительно недавно.
  4. Было интересно сравнить то что идёт прямо в поставке ядра Linux, современных версий (WireGuard) с ZeroTier.

Итак, что-же такое WireGuard: Wireguard классическое, клиент-серверное, VPN решение. Опенсорсное, довольно простое, в настройке и производительное. Давайте пробежимся по пунктам из списка выше.

1. Простота настройки


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


и это только для двух хостов, а ведь ещё WG умеет в топологию звезда и в mesh. Разумеется, в продакшене, всё делается через создание конфигов в /etc/wireguard/interface_name.conf и добавление в автозапуск systemd wg-quick@interface_name.service. Или штатным конфигурированием интерфейса, если используется systemd-networkd. Там-же можно посмотреть как конфигурировать wireguard для других менеджеров сети, включая NetworkManager.

2. Мультиплатформенность


У WireGuard всё более чем хорошо с мультиплатформенностью. Вот что мы имеем на текущий момент:
  • Android
  • iOS
  • Linux
  • FreeBSD
  • MacOS
  • Mikrotik (RouterOS 7.1beta)
  • NetBSD
  • OpenBSD
  • OpenWRT
  • Windows

3. Новизна


WireGuard впервые вышел в свет в конце июня 2016-го и сразу в прод маленькой кучки VPN провайдеров:

> Earliest snapshots of the code base exist from June 30, 2016. Four early adopters of WireGuard were > the VPN service providers Mullvad, AzireVPN, IVPN and cryptostorm.

Wikipedia

ZeroTier виртуальный коммутатор с функцией VPN и файрволом


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

1. Простота настройки


Не буду повторяться, ибо всё уже написано до нас. Отмечу лишь то, что добавление нового хоста это одна команда на клиенте вида zerotier-cli join 7ca3bd9b52f9d96b и и всё! (ну и плюс поставить галочку авторизации, в веб-интерфейсе контроллера, для свеже-добавленного хоста). Роутинг в локалки, например в локалки филиалов, тоже никаких проблем! Галочка в GUI и статик роуты на маршрутизаторах локалок. Вобщем, как минимум, я рекомендую попробовать!

2. Мультиплатформенность


ZT тоже балует обилием клиентов подо всё что движется, включая практически все популярные NAS и даже OpenWRT.

  • Android
  • Docker
  • iOS
  • Linux
  • FreeBSD
  • MacOS
  • OpenWRT
  • QNap
  • Synology
  • WD MyCloud NAS
  • Windows

3. Новизна


ZeroTier уже не мальчик. Всё-таки 10 лет развития, по айтишным меркам, это уже что-то. Но, тем не менее, продукт выглядит свежо, по крайней мере по концепциям. А главное, он работает ровно так, как задумано. Но это всё лирика. Как мне кажется пора переходить к самому главному к сравнению

Сравниваем наших героев


Здесь мы сведём воедино все практические аспекты обоих продуктов, плюс сравним производительность ну и определимся с тем, когда и для чего лучше использовать WireGuard, а когда ZeroTier. Итак:
  1. Простота настройки. Здесь вперёд, со значительным отрывом вырывается ZeroTier. Проще решения я не видел.
  2. Мультиплатформенность. Здесь паритет. Но у WireGuard появилась поддержка маршрутизаторов от Mikrotik, что может стать решающим фактором при выборе решения.
  3. Дополнительные возможности. Наличие встроенного в ZeroTier файрвола (да, там такое есть! Но, к сожалению рассмотрение этой фичи выходит за рамки данной статьи) позволяющего блокировать/разрешать трафик на уровне VPN сети.
  4. Самое интересное. Производительность.


  • Чем тестировали: iperf3 -P 5 -R
  • ОС, клиент и сервер: Ubuntu 20.04.
  • Железо RuVDS клиент + сервер:
    • CPU: 1 X Intel Xeon CPU E5-2680 v4 @ 2.40GHz
    • Mem 0.5Gb
    • ДЦ RuVDS в Королёве iperf3 сервер
    • ДЦ RuVDS в Казани iperf3 клиент



WireGuard, результаты
root@ruvds-9qxnx:~# iperf3 -c 10.0.0.2 -P 5 -R Connecting to host 10.0.0.2, port 5201Reverse mode, remote host 10.0.0.2 is sending[  5] local 10.0.0.1 port 44108 connected to 10.0.0.2 port 5201[  7] local 10.0.0.1 port 44110 connected to 10.0.0.2 port 5201[  9] local 10.0.0.1 port 44112 connected to 10.0.0.2 port 5201[ 11] local 10.0.0.1 port 44114 connected to 10.0.0.2 port 5201[ 13] local 10.0.0.1 port 44116 connected to 10.0.0.2 port 5201[ ID] Interval           Transfer     Bitrate[  5]   0.00-1.00   sec  2.20 MBytes  18.4 Mbits/sec                  [  7]   0.00-1.00   sec  2.12 MBytes  17.8 Mbits/sec                  [  9]   0.00-1.00   sec  1.23 MBytes  10.3 Mbits/sec                  [ 11]   0.00-1.00   sec  1.90 MBytes  15.9 Mbits/sec                  [ 13]   0.00-1.00   sec  1.86 MBytes  15.6 Mbits/sec                  [SUM]   0.00-1.00   sec  9.30 MBytes  78.0 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   1.00-2.00   sec  2.22 MBytes  18.6 Mbits/sec                  [  7]   1.00-2.00   sec  2.24 MBytes  18.8 Mbits/sec                  [  9]   1.00-2.00   sec  1.07 MBytes  9.01 Mbits/sec                  [ 11]   1.00-2.00   sec  2.17 MBytes  18.2 Mbits/sec                  [ 13]   1.00-2.00   sec  2.30 MBytes  19.3 Mbits/sec                  [SUM]   1.00-2.00   sec  10.0 MBytes  84.0 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   2.00-3.00   sec  2.07 MBytes  17.4 Mbits/sec                  [  7]   2.00-3.00   sec  2.83 MBytes  23.7 Mbits/sec                  [  9]   2.00-3.00   sec  1.08 MBytes  9.08 Mbits/sec                  [ 11]   2.00-3.00   sec  2.21 MBytes  18.6 Mbits/sec                  [ 13]   2.00-3.00   sec  2.45 MBytes  20.6 Mbits/sec                  [SUM]   2.00-3.00   sec  10.7 MBytes  89.4 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   3.00-4.00   sec  2.06 MBytes  17.3 Mbits/sec                  [  7]   3.00-4.00   sec  2.87 MBytes  24.1 Mbits/sec                  [  9]   3.00-4.00   sec   890 KBytes  7.29 Mbits/sec                  [ 11]   3.00-4.00   sec  2.10 MBytes  17.6 Mbits/sec                  [ 13]   3.00-4.00   sec  2.12 MBytes  17.8 Mbits/sec                  [SUM]   3.00-4.00   sec  10.0 MBytes  84.1 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   4.00-5.00   sec  2.27 MBytes  19.0 Mbits/sec                  [  7]   4.00-5.00   sec  2.57 MBytes  21.5 Mbits/sec                  [  9]   4.00-5.00   sec   967 KBytes  7.92 Mbits/sec                  [ 11]   4.00-5.00   sec  2.07 MBytes  17.4 Mbits/sec                  [ 13]   4.00-5.00   sec  2.31 MBytes  19.4 Mbits/sec                  [SUM]   4.00-5.00   sec  10.2 MBytes  85.2 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   5.00-6.00   sec  2.20 MBytes  18.4 Mbits/sec                  [  7]   5.00-6.00   sec  2.78 MBytes  23.3 Mbits/sec                  [  9]   5.00-6.00   sec   927 KBytes  7.60 Mbits/sec                  [ 11]   5.00-6.00   sec  2.11 MBytes  17.7 Mbits/sec                  [ 13]   5.00-6.00   sec  2.72 MBytes  22.8 Mbits/sec                  [SUM]   5.00-6.00   sec  10.7 MBytes  89.9 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   6.00-7.00   sec  1.97 MBytes  16.5 Mbits/sec                  [  7]   6.00-7.00   sec  2.66 MBytes  22.3 Mbits/sec                  [  9]   6.00-7.00   sec   840 KBytes  6.88 Mbits/sec                  [ 11]   6.00-7.00   sec  2.22 MBytes  18.6 Mbits/sec                  [ 13]   6.00-7.00   sec  2.65 MBytes  22.3 Mbits/sec                  [SUM]   6.00-7.00   sec  10.3 MBytes  86.6 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   7.00-8.00   sec  1.96 MBytes  16.4 Mbits/sec                  [  7]   7.00-8.00   sec  2.98 MBytes  25.0 Mbits/sec                  [  9]   7.00-8.00   sec   798 KBytes  6.53 Mbits/sec[ 11]   7.00-8.00   sec  1.89 MBytes  15.8 Mbits/sec                  [ 13]   7.00-8.00   sec  2.55 MBytes  21.4 Mbits/sec                  [SUM]   7.00-8.00   sec  10.2 MBytes  85.2 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   8.00-9.00   sec  2.00 MBytes  16.8 Mbits/sec                  [  7]   8.00-9.00   sec  3.05 MBytes  25.6 Mbits/sec                  [  9]   8.00-9.00   sec   826 KBytes  6.76 Mbits/sec                  [ 11]   8.00-9.00   sec  2.03 MBytes  17.1 Mbits/sec                  [ 13]   8.00-9.00   sec  2.58 MBytes  21.6 Mbits/sec                  [SUM]   8.00-9.00   sec  10.5 MBytes  87.7 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   9.00-10.00  sec  1.95 MBytes  16.4 Mbits/sec                  [  7]   9.00-10.00  sec  3.16 MBytes  26.5 Mbits/sec                  [  9]   9.00-10.00  sec   827 KBytes  6.77 Mbits/sec                  [ 11]   9.00-10.00  sec  2.04 MBytes  17.1 Mbits/sec                  [ 13]   9.00-10.00  sec  2.52 MBytes  21.1 Mbits/sec                  [SUM]   9.00-10.00  sec  10.5 MBytes  87.9 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[ ID] Interval           Transfer     Bitrate         Retr[  5]   0.00-10.06  sec  22.1 MBytes  18.4 Mbits/sec    0             sender[  5]   0.00-10.00  sec  20.9 MBytes  17.5 Mbits/sec                  receiver[  7]   0.00-10.06  sec  29.2 MBytes  24.3 Mbits/sec    0             sender[  7]   0.00-10.00  sec  27.3 MBytes  22.9 Mbits/sec                  receiver[  9]   0.00-10.06  sec  10.3 MBytes  8.58 Mbits/sec    0             sender[  9]   0.00-10.00  sec  9.31 MBytes  7.81 Mbits/sec                  receiver[ 11]   0.00-10.06  sec  21.9 MBytes  18.2 Mbits/sec    0             sender[ 11]   0.00-10.00  sec  20.7 MBytes  17.4 Mbits/sec                  receiver[ 13]   0.00-10.06  sec  25.8 MBytes  21.5 Mbits/sec    1             sender[ 13]   0.00-10.00  sec  24.1 MBytes  20.2 Mbits/sec                  receiver[SUM]   0.00-10.06  sec   109 MBytes  91.0 Mbits/sec    1             sender[SUM]   0.00-10.00  sec   102 MBytes  85.8 Mbits/sec                  receiveriperf Done.



ZeroTier, результаты
root@ruvds-9qxnx:~# iperf3 -c 172.28.1.64 -P 5 -R Connecting to host 172.28.1.64, port 5201Reverse mode, remote host 172.28.1.64 is sending[  5] local 172.28.1.91 port 34468 connected to 172.28.1.64 port 5201[  7] local 172.28.1.91 port 34470 connected to 172.28.1.64 port 5201[  9] local 172.28.1.91 port 34472 connected to 172.28.1.64 port 5201[ 11] local 172.28.1.91 port 34474 connected to 172.28.1.64 port 5201[ 13] local 172.28.1.91 port 34476 connected to 172.28.1.64 port 5201[ ID] Interval           Transfer     Bitrate[  5]   0.00-1.00   sec  1.08 MBytes  9.07 Mbits/sec                  [  7]   0.00-1.00   sec   988 KBytes  8.08 Mbits/sec                  [  9]   0.00-1.00   sec   768 KBytes  6.28 Mbits/sec                  [ 11]   0.00-1.00   sec   615 KBytes  5.03 Mbits/sec                  [ 13]   0.00-1.00   sec  1.03 MBytes  8.65 Mbits/sec                  [SUM]   0.00-1.00   sec  4.43 MBytes  37.1 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   1.00-2.00   sec  1.28 MBytes  10.8 Mbits/sec                  [  7]   1.00-2.00   sec  1006 KBytes  8.25 Mbits/sec                  [  9]   1.00-2.00   sec   808 KBytes  6.63 Mbits/sec                  [ 11]   1.00-2.00   sec   660 KBytes  5.41 Mbits/sec                  [ 13]   1.00-2.00   sec  1.26 MBytes  10.6 Mbits/sec                  [SUM]   1.00-2.00   sec  4.96 MBytes  41.6 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   2.00-3.00   sec  1.14 MBytes  9.55 Mbits/sec                  [  7]   2.00-3.00   sec  1.04 MBytes  8.72 Mbits/sec                  [  9]   2.00-3.00   sec   872 KBytes  7.14 Mbits/sec                  [ 11]   2.00-3.00   sec   437 KBytes  3.58 Mbits/sec                  [ 13]   2.00-3.00   sec  1.12 MBytes  9.40 Mbits/sec                  [SUM]   2.00-3.00   sec  4.58 MBytes  38.4 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   3.00-4.00   sec   625 KBytes  5.13 Mbits/sec                  [  7]   3.00-4.00   sec   845 KBytes  6.93 Mbits/sec                  [  9]   3.00-4.00   sec   953 KBytes  7.81 Mbits/sec                  [ 11]   3.00-4.00   sec   400 KBytes  3.28 Mbits/sec                  [ 13]   3.00-4.00   sec   832 KBytes  6.82 Mbits/sec                  [SUM]   3.00-4.00   sec  3.57 MBytes  30.0 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   4.00-5.00   sec   620 KBytes  5.08 Mbits/sec                  [  7]   4.00-5.00   sec   606 KBytes  4.97 Mbits/sec                  [  9]   4.00-5.00   sec  1.12 MBytes  9.37 Mbits/sec                  [ 11]   4.00-5.00   sec   633 KBytes  5.19 Mbits/sec                  [ 13]   4.00-5.00   sec  1.00 MBytes  8.42 Mbits/sec                  [SUM]   4.00-5.00   sec  3.94 MBytes  33.0 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   5.00-6.00   sec   802 KBytes  6.57 Mbits/sec                  [  7]   5.00-6.00   sec   690 KBytes  5.65 Mbits/sec                  [  9]   5.00-6.00   sec  1.53 MBytes  12.8 Mbits/sec                  [ 11]   5.00-6.00   sec   920 KBytes  7.54 Mbits/sec                  [ 13]   5.00-6.00   sec   955 KBytes  7.82 Mbits/sec                  [SUM]   5.00-6.00   sec  4.82 MBytes  40.4 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   6.00-7.00   sec   309 KBytes  2.53 Mbits/sec                  [  7]   6.00-7.00   sec   228 KBytes  1.87 Mbits/sec                  [  9]   6.00-7.00   sec   464 KBytes  3.80 Mbits/sec                  [ 11]   6.00-7.00   sec   322 KBytes  2.64 Mbits/sec                  [ 13]   6.00-7.00   sec   311 KBytes  2.55 Mbits/sec                  [SUM]   6.00-7.00   sec  1.60 MBytes  13.4 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   7.00-8.00   sec   577 KBytes  4.73 Mbits/sec                  [  7]   7.00-8.00   sec   580 KBytes  4.75 Mbits/sec[  9]   7.00-8.00   sec  1.30 MBytes  10.9 Mbits/sec                  [ 11]   7.00-8.00   sec   792 KBytes  6.49 Mbits/sec                  [ 13]   7.00-8.00   sec   655 KBytes  5.36 Mbits/sec                  [SUM]   7.00-8.00   sec  3.84 MBytes  32.2 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   8.00-9.00   sec   781 KBytes  6.40 Mbits/sec                  [  7]   8.00-9.00   sec   561 KBytes  4.59 Mbits/sec                  [  9]   8.00-9.00   sec  1.29 MBytes  10.8 Mbits/sec                  [ 11]   8.00-9.00   sec  1.18 MBytes  9.87 Mbits/sec                  [ 13]   8.00-9.00   sec   631 KBytes  5.17 Mbits/sec                  [SUM]   8.00-9.00   sec  4.39 MBytes  36.8 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   9.00-10.00  sec   961 KBytes  7.87 Mbits/sec                  [  7]   9.00-10.00  sec   762 KBytes  6.24 Mbits/sec                  [  9]   9.00-10.00  sec  1.44 MBytes  12.0 Mbits/sec                  [ 11]   9.00-10.00  sec  1.15 MBytes  9.67 Mbits/sec                  [ 13]   9.00-10.00  sec   717 KBytes  5.87 Mbits/sec                  [SUM]   9.00-10.00  sec  4.97 MBytes  41.7 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[ ID] Interval           Transfer     Bitrate         Retr[  5]   0.00-10.99  sec  8.33 MBytes  6.36 Mbits/sec   33             sender[  5]   0.00-10.00  sec  8.07 MBytes  6.77 Mbits/sec                  receiver[  7]   0.00-10.99  sec  7.32 MBytes  5.58 Mbits/sec   64             sender[  7]   0.00-10.00  sec  7.16 MBytes  6.01 Mbits/sec                  receiver[  9]   0.00-10.99  sec  10.7 MBytes  8.20 Mbits/sec   61             sender[  9]   0.00-10.00  sec  10.4 MBytes  8.76 Mbits/sec                  receiver[ 11]   0.00-10.99  sec  7.25 MBytes  5.53 Mbits/sec   70             sender[ 11]   0.00-10.00  sec  7.00 MBytes  5.87 Mbits/sec                  receiver[ 13]   0.00-10.99  sec  8.61 MBytes  6.57 Mbits/sec   55             sender[ 13]   0.00-10.00  sec  8.42 MBytes  7.07 Mbits/sec                  receiver[SUM]   0.00-10.99  sec  42.3 MBytes  32.2 Mbits/sec  283             sender[SUM]   0.00-10.00  sec  41.1 MBytes  34.5 Mbits/sec                  receiver



Выводы


К сожалению ZeroTier, предсказуемо, проиграл по производительности. По крайней мере для систем на ядре Linux. Но, по моему скромному мнению, ZeroTier победил в простоте и удобстве администрирования. Отсюда вывод. Если вам нужна высокая производительность между серверами и рабочими станциями на линукс, выбирайте WireGuard. Если-же у вас клиенты, по большей части на MacOS, Windows, и мобильных платформах, то я-бы выбрал ZeroTier. Особенно если нужно добавлять / удалять новых клиентов, в большом количестве, раздавать права доступа и так далее. Ну и, для клиентов RuVDS, может стать решающим фактором быстрота и удобство развёртывания собственного контроллера, в один клик. Так-же, для упрощения выбора, приведу сводную таблицу совместимых платформ:



А теперь небольшой сюрприз


На самом деле, для случая соединения между собой серверов размещённых у RuVDS, есть ещё один вариант. Вариант указанный в заголовке статьи. И этот вариант, по производительности, уделывает даже WireGuard, но, при этом, по простоте настройки сравним с ZeroTier. Это Локальная сеть . Под спойлером где искать и как всё это настроить:

Краткий манул, в картинках
В панели управления серверами у любого сервера который хотим добавить в локалку идём на вкладку сеть(1) и смело жмём на капу настроить локальные сети(2).



Далее создаём новую локалку.



Задаём имя локальной сети(1). Выделяем подсеть в любом из частных диапазонов (10.0.0.0/8; 192.168.0.0/16; 172.16.0.0/12 etc), с маской в CIDR нотации(2). Опционально придумываем описание(3). Выбираем сервер который хотим подключить(4), подключаем(5), при необходимости повторяем шаги 4 и 5. Жмём зелёную капу(6).



Выглядит локалка как-то так Проверяем, жмём Deploy.



Мы подключены к сети(2), но пока в оффлайне(1). Ждём пару минут.



После чего жмём обновить список(1) и убеждаемся что сеть перешла в состояние online(2).



После того как сеть поднялась, заходим на виртуалки и проверяем связность. Локалка видна как обычный сетевой интерфейс, с адресом из той подсети которую мы задали(1). Соседний сервер на другом конце страны, прекрасно пингуется(2).




Самое интересное производительность (сервера те-же что и в тестах WireGuard и ZeroTier):

$ iperf3 -c 192.168.0.3 -P 5 -R Connecting to host 192.168.0.3, port 5201Reverse mode, remote host 192.168.0.3 is sending[  5] local 192.168.0.4 port 35816 connected to 192.168.0.3 port 5201[  7] local 192.168.0.4 port 35818 connected to 192.168.0.3 port 5201[  9] local 192.168.0.4 port 35820 connected to 192.168.0.3 port 5201[ 11] local 192.168.0.4 port 35822 connected to 192.168.0.3 port 5201[ 13] local 192.168.0.4 port 35824 connected to 192.168.0.3 port 5201[ ID] Interval           Transfer     Bitrate[  5]   0.00-1.00   sec  14.8 MBytes   124 Mbits/sec                  [  7]   0.00-1.00   sec  14.9 MBytes   125 Mbits/sec                  [  9]   0.00-1.00   sec  14.7 MBytes   123 Mbits/sec                  [ 11]   0.00-1.00   sec  14.7 MBytes   123 Mbits/sec                  [ 13]   0.00-1.00   sec  14.6 MBytes   122 Mbits/sec                  [SUM]   0.00-1.00   sec  73.7 MBytes   617 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   1.00-2.00   sec  20.9 MBytes   176 Mbits/sec                  [  7]   1.00-2.00   sec  20.7 MBytes   174 Mbits/sec                  [  9]   1.00-2.00   sec  20.7 MBytes   174 Mbits/sec                  [ 11]   1.00-2.00   sec  20.6 MBytes   173 Mbits/sec                  [ 13]   1.00-2.00   sec  20.4 MBytes   171 Mbits/sec                  [SUM]   1.00-2.00   sec   103 MBytes   868 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   2.00-3.00   sec  18.3 MBytes   153 Mbits/sec                  [  7]   2.00-3.00   sec  18.5 MBytes   155 Mbits/sec                  [  9]   2.00-3.00   sec  18.6 MBytes   155 Mbits/sec                  [ 11]   2.00-3.00   sec  18.2 MBytes   153 Mbits/sec                  [ 13]   2.00-3.00   sec  18.5 MBytes   155 Mbits/sec                  [SUM]   2.00-3.00   sec  92.0 MBytes   771 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   3.00-4.00   sec  18.3 MBytes   154 Mbits/sec                  [  7]   3.00-4.00   sec  18.4 MBytes   155 Mbits/sec                  [  9]   3.00-4.00   sec  18.2 MBytes   153 Mbits/sec                  [ 11]   3.00-4.00   sec  18.4 MBytes   155 Mbits/sec                  [ 13]   3.00-4.00   sec  18.1 MBytes   152 Mbits/sec                  [SUM]   3.00-4.00   sec  91.4 MBytes   768 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   4.00-5.00   sec  17.0 MBytes   142 Mbits/sec                  [  7]   4.00-5.00   sec  17.2 MBytes   144 Mbits/sec                  [  9]   4.00-5.00   sec  17.0 MBytes   142 Mbits/sec                  [ 11]   4.00-5.00   sec  17.4 MBytes   146 Mbits/sec                  [ 13]   4.00-5.00   sec  16.7 MBytes   140 Mbits/sec                  [SUM]   4.00-5.00   sec  85.3 MBytes   713 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   5.00-6.00   sec  16.5 MBytes   139 Mbits/sec                  [  7]   5.00-6.00   sec  16.7 MBytes   141 Mbits/sec                  [  9]   5.00-6.00   sec  16.7 MBytes   140 Mbits/sec                  [ 11]   5.00-6.00   sec  16.4 MBytes   138 Mbits/sec                  [ 13]   5.00-6.00   sec  16.1 MBytes   136 Mbits/sec                  [SUM]   5.00-6.00   sec  82.4 MBytes   694 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   6.00-7.00   sec  17.7 MBytes   148 Mbits/sec                  [  7]   6.00-7.00   sec  17.8 MBytes   149 Mbits/sec                  [  9]   6.00-7.00   sec  17.6 MBytes   148 Mbits/sec                  [ 11]   6.00-7.00   sec  17.5 MBytes   146 Mbits/sec                  [ 13]   6.00-7.00   sec  17.3 MBytes   145 Mbits/sec                  [SUM]   6.00-7.00   sec  87.9 MBytes   736 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   7.00-8.00   sec  17.7 MBytes   148 Mbits/sec                  [  7]   7.00-8.00   sec  17.9 MBytes   149 Mbits/sec                  [  9]   7.00-8.00   sec  17.6 MBytes   148 Mbits/sec                  [ 11]   7.00-8.00   sec  17.7 MBytes   148 Mbits/sec                  [ 13]   7.00-8.00   sec  17.5 MBytes   147 Mbits/sec                  [SUM]   7.00-8.00   sec  88.5 MBytes   741 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   8.00-9.00   sec  18.7 MBytes   157 Mbits/sec                  [  7]   8.00-9.00   sec  18.8 MBytes   158 Mbits/sec                  [  9]   8.00-9.00   sec  18.9 MBytes   159 Mbits/sec                  [ 11]   8.00-9.00   sec  18.7 MBytes   157 Mbits/sec                  [ 13]   8.00-9.00   sec  18.5 MBytes   155 Mbits/sec                  [SUM]   8.00-9.00   sec  93.6 MBytes   787 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[  5]   9.00-10.00  sec  19.2 MBytes   161 Mbits/sec                  [  7]   9.00-10.00  sec  19.1 MBytes   160 Mbits/sec                  [  9]   9.00-10.00  sec  19.0 MBytes   160 Mbits/sec                  [ 11]   9.00-10.00  sec  19.0 MBytes   160 Mbits/sec                  [ 13]   9.00-10.00  sec  18.8 MBytes   158 Mbits/sec                  [SUM]   9.00-10.00  sec  95.1 MBytes   799 Mbits/sec                  - - - - - - - - - - - - - - - - - - - - - - - - -[ ID] Interval           Transfer     Bitrate         Retr[  5]   0.00-10.05  sec   181 MBytes   151 Mbits/sec  150             sender[  5]   0.00-10.00  sec   179 MBytes   150 Mbits/sec                  receiver[  7]   0.00-10.05  sec   182 MBytes   152 Mbits/sec  144             sender[  7]   0.00-10.00  sec   180 MBytes   151 Mbits/sec                  receiver[  9]   0.00-10.05  sec   181 MBytes   151 Mbits/sec  166             sender[  9]   0.00-10.00  sec   179 MBytes   150 Mbits/sec                  receiver[ 11]   0.00-10.05  sec   181 MBytes   151 Mbits/sec  253             sender[ 11]   0.00-10.00  sec   179 MBytes   150 Mbits/sec                  receiver[ 13]   0.00-10.05  sec   179 MBytes   149 Mbits/sec  168             sender[ 13]   0.00-10.00  sec   176 MBytes   148 Mbits/sec                  receiver[SUM]   0.00-10.05  sec   904 MBytes   755 Mbits/sec  881             sender[SUM]   0.00-10.00  sec   893 MBytes   749 Mbits/sec                  receiver

Очевидные вопросы


1. Что у этого решения под капотом?
VLAN/IPsec, при этом **не используются** ресурсы виртуалки.
2. Где использовать?
Для соединения серверов в рамках RuVDS.
3. Простота настройки?
Сравнима с настройкой ZeroTier.

Окончательные выводы по областям применения


  • Wireguard Соединение линукс хостов между собой, включая клиентские машины и если нужно объединить в VPN хосты у других хостеров. Высокая скорость передачи данных.
  • ZeroTier Мультиплатформенное решение, в основном для объединения клиентских устройств и подсетей, с удобным менеджментом. Средняя скорость передачи данных.
  • Локальная сеть RuVDS объединение в единую, высокопроизводительную, защищённую сеть Linux и Windows хостов, в рамках датацентров хостера. Очень высокая скорость передачи данных.


Подробнее..

Перевод SSH, пользовательский режим, TCPIP и WireGuard

16.04.2021 16:20:16 | Автор: admin
Тому, кто хостит приложение у провайдера наподобие Fly.io (далее просто Fly), вполне может понадобиться подключиться к серверу, на котором работает это приложение, по SSH.

Но Fly это вроде как белая ворона среди других подобных платформ. Наше железо работает в дата-центрах, разбросанных по всему миру. Наши серверы подключены к интернету через Anycast-сеть, а друг с другом они связаны с помощью WireGuard-сети. Мы берём у пользователей Docker-контейнеры и превращаем их в микровиртуальные машины Firecracker. И, когда мы только начали работать, мы поступали именно так для того чтобы дать нашим клиентам возможность запускать пограничные приложения. Такие приложения обычно представляют собой сравнительно небольшие, самодостаточные фрагменты кода, которые весьма чувствительны к качеству работы сетей. Эти фрагменты кода, в результате, нужно запускать на серверах, расположенных как можно ближе к пользователям. В такой среде возможность подключения к серверу по SSH не так уж и важна.



Но теперь не все наши клиенты пользуются Fly по такой схеме. В наши дни в среде Fly можно без труда выполнять весь код, имеющий отношение к некоему приложению. Мы упростили процедуру запуска ансамбля сервисов в кластерной среде. Такие сервисы могут, используя защищённые каналы связи, взаимодействовать друг с другом, могут хранить данные на постоянной основе, могут, по WireGuard-сети, связываться со своими операторами. Если я продолжу рассказ о нашей системе в том же духе, то мне придётся дать ссылки на все материалы, которые мы написали за последние пару месяцев.

Но, в любом случае, нормальной поддержки SSH у нас не было.

Ясно, конечно, что можно было просто собрать контейнер со службой SSH, к которой можно подключиться по SSH. Платформа Fly поддерживает работу с обычными TCP-портами (и с UDP-портами тоже). Если клиент, пользуясь файлом fly.toml, расскажет нашей Anycast-сети о своём странном SSH-порте, система организует маршрутизацию его SSH-подключений, после чего всё будет работать как надо.

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

Часть 1: 6PN и Hallpass


Я много написал о том, как во Fly устроены частные сети. Если рассказать об этом в двух словах, то окажется, что то, что есть у нас, можно сравнить с упрощённой IPv6-версией виртуальных частных облаков GCP или AWS. Мы называем эту систему 6PN. Когда во Fly запускается экземпляр приложения (микровиртуальная машина Firecracker), мы назначаем этому экземпляру особый IPv6-префикс. В префиксе закодировано несколько идентификаторов: идентификатор приложения, организации, которой принадлежит приложение, и аппаратных ресурсов, на которых приложение работает. Мы используем немного eBPF-кода для организации статической маршрутизации подобных IPv6-пакетов в нашей внутренней WireGuard-сети и для обеспечения того, чтобы клиенты не могли бы подключаться к системам организаций, к которым они не имеют отношения.

Кроме того, можно, используя WireGuard, посредством мостов, соединять создаваемые нами частные IPv6-сети с другими сетями. Наш API умеет создавать WireGuard-конфигурации, которые можно, например, применять на EC2-хостах для проксирования RDS Postgres. Или, если надо, можно пользоваться WireGuard-клиентами (в Windows, Linux или macOS) для подключения компьютера, на котором ведётся разработка, к собственной частной сети.

Вероятно, вы уже поняли, к чему я клоню.

Мы написали очень маленький и очень простой SSH-сервер на Go, который назвали Hallpass. Его можно сравнить с Hello, World!, созданным с использованием Go-библиотеки x/crypto/ssh. (Если бы я снова это делал, я, вероятно, просто использовал бы пакет Glider Labs, предназначенный для создания SSH-серверов. С использованием этого пакета наш сервер, в буквальном смысле, был бы программой уровня Hello, World!.) При инициализации всех экземпляров микровиртуальных машин Firecracker выполняется и запуск Hallpass с привязкой к их 6PN-адресам.

Если вы способны работать в 6PN-сети своей организации (предположим, через WireGuard-соединение), это значит, что вы можете войти в экземпляр микровиртуальной машины с помощью Hallpass.

В том, как именно работает Hallpass, есть лишь одна интересная деталь. Она касается аутентификации. Инфраструктурные элементы в нашей рабочей сети обычно не имеют прямого доступа к нашим API или к лежащим в их основе базам данных. И у самих экземпляров Firecracker, конечно, такого доступа тоже нет. Это приводит к некоторым сложностям, связанным с изменением коммуникационных настроек. Как, например, ответить на вопрос о том, какими именно ключами нужно обладать для подключения к неким экземплярам микровиртуальных машин?

Мы нашли обходной путь решения этой задачи, прибегнув к SSH-сертификатам клиентов. Вместо того, чтобы заниматься передачей ключей каждый раз, когда пользователь хочет войти в систему с нового хоста, мы создаём корневой сертификат для организации этого пользователя. Публичный ключ для этого корневого сертификата размещается в нашей частной DNS-системе, а Hallpass обращается к DNS для получения этого сертификата каждый раз, когда происходит попытка входа в систему. Наш API подписывает новые сертификаты для пользователей, эти сертификаты можно применять для входа в систему.

Возможно, у вас есть вопросы по поводу этого решения. Поэтому я раскрою ещё некоторые подробности о нём.

Во-первых поговорим о сертификатах. Десятилетия безумства X.509, возможно, привели к тому, что слово сертификат вызывает у вас неприятное послевкусие. И я вас за это не виню. Но сертификаты стоит использовать при организации SSH-соединений, так как подобные сертификаты в данном случае это хорошее решение. При этом SSH-сертификаты это не X.509-сертификаты. Тут используется собственный формат OpenSSH, и, в общем-то, об этих сертификатах нельзя рассказать больше ничего особенного. У них, как и у всех остальных сертификатов, есть срок годности, что позволяет создавать короткоживущие ключи (а это, почти всегда, именно то, что нужно). И, конечно, они позволяют назначить один публичный ключ целой группе серверов, который может авторизовывать произвольное количество приватных ключей. При этом нет необходимости постоянно обновлять соответствующие серверы.

Далее наш API и подписание сертификатов. Ну что ж! Мы очень осторожны, но эти сертификаты, в целом, так же безопасны, как токены доступа к Fly. В настоящий момент сертификаты не могут быть защищены лучше, чем токены, так как токен позволяет развёртывать новые версии контейнеров приложений. Работа с Web PKI X.509 CA предусматривает массу формальностей. Мы обходимся без них.

И наконец наша DNS. Она, соглашусь, выглядит как полная ерунда. Но она, на самом деле, не так уж и плоха. На каждом хосте, на котором выполняются экземпляры микровиртуальных машин Firecracker, работает и локальная версия нашего частного DNS-сервера (маленькая программа, написанная на Rust). eBPF-код обеспечивает то, что Firecracker-машины могут взаимодействовать только с этим DNS-сервером, обращаясь к нему с 6PN-адреса своего сервера. (С технической точки зрения пользователь может выполнять запросы только к приватному API DNS этого сервера, а запросы всех остальных пользователей будут обрабатываться в рекурсивном режиме.) DNS-сервер может (знаю выглядит это необычно) надёжно идентифицировать организацию, анализируя IP-адреса источников запросов. В общем-то именно так мы и работаем.

Всё это происходит в недрах нашей системы, пользователям всего этого не видно. Пользователи видели лишь команду flyctl ssh issue -a, которая запрашивала новый сертификат у нашего API, а потом передавала его локальному SSH-агенту, после чего SSH-подключения, в общем-то, оказывались работоспособными. Всё это было устроено достаточно аккуратно. Но любое дело всегда можно сделать аккуратнее, чем прежде.

Часть 2: работа в WireGuard-сети из пользовательского режима с применением TCP/IP


В вышеописанной схеме использования SSH кроется одна проблема, которая заключается в том, что не у всех установлен WireGuard. Соответствующую программу, правда, стоило бы установить всем. WireGuard это замечательная технология, она очень помогает управлять приложениями, работающими на платформе Fly. Но, как бы там ни было, у некоторых наших пользователей нет WireGuard.

Правда, и такие пользователи нуждаются в работе со своими системами по SSH.

На первый взгляд то, что у кого-то не установлен WireGuard, может показаться непреодолимой помехой. Ведь как работает WireGuard? На компьютере пользователя создаётся новый сетевой интерфейс. Это либо WireGuard-интерфейс уровня ядра (в Linux), либо туннель с прикреплённым к нему WireGuard-сервисом пользовательского режима (во всех остальных ОС). Без этого сетевого интерфейса работать с WireGuard-сетью нельзя.

Но, если взглянуть на WireGuard под правильным углом, то можно увидеть, что, с технической точки зрения, это не так. А именно, для настройки нового сетевого интерфейса нужны привилегии уровня операционной системы. А вот для отправки пакетов на 51820/udp никаких привилегий не нужно. Всё, что нужно для обеспечения работы протокола WireGuard, можно запустить в виде непривилегированного процесса, функционирующего в пользовательском режиме. Именно так работает пакет wireguard-go.

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

Сложно ли будет написать небольшой фрагмент кода, обеспечивающий работу протокола TCP в пользовательском режиме, рассчитанный исключительно на то, чтобы поддерживать обмен данными по WireGuard-сети, опять же, в пользовательском режиме? Такой код позволил бы пользователям Fly подключаться к своим системам по SSH и при этом не устанавливать у себя того, что обеспечивает работу WireGuard.

Я поступил опрометчиво, рассуждая обо всём этом в Slack-канале, в котором присутствовал Джейсон Доненфельд. А именно, я, поразмышляв вслух, отправился спать. Когда я проснулся, Джейсон уже всё это реализовал, используя gVisor, и включил в состав библиотеки WireGuard.

Самое интересное тут это gVisor. Мы уже о нём писали. Если кто не знает gVisor это, в сущности, ОС Linux, работающая в пользовательском пространстве, Linux, реализованная на Golang, используемая в качестве замены runc для выполнения контейнеров. Это, на самом деле, совершенно безумный проект. И если вы им воспользуетесь, то, полагаю, вы можете с гордостью рассказать об этом окружающим, потому что это ну просто шикарная штука. В его недрах имеется полная реализация TCP/IP, написанная на Go, которая оперирует входными и выходными данными, представленными в виде обычных буферов []byte.

Тогда было твитнуто несколько твитов, а потом, через пару часов, мне пришло очень приятное электронное письмо от Бена Баркерта. Бен уже занимался разными задачами, связанными с сетевой подсистемой gVisor, его заинтересовало то, над чем мы работали, он желал узнать, хотим ли мы с ним скооперироваться. Нам понравилась его идея по совместной работе над этим проектом. И теперь, если не вдаваться в подробности, у нас имеется реализация SSH, основанная на сертификатах, которая работает через gVisor-реализацию TCP/IP пользовательского режима. Всё это взаимодействует с WireGuard-сетью посредством пакета пользовательского режима wireguard-go. И, наконец, эта штука встроена во flyctl.

Для того чтобы воспользоваться SSH с помощью flyctl достаточно ввести команду такого вида:

flyctl ssh shell personal dogmatic-potato-342.internal

А теперь, чтобы вы могли осознать всю невероятность происходящего, немного расскажу об этой команде. Так dogmatic-potato-342.internal это внутреннее DNS-имя, разрешающееся только силами приватного DNS-сервера в сети 6PN. Всё это работоспособно из-за того, что в режиме ssh shell утилита flyctl использует TCP/IP-стек gVisor пользовательского режима. Но в gVisor нет кода для выполнения DNS-поиска. Это всего лишь стандартная Go-библиотека, которую мы обдурили, подсунув ей наш особенный TCP/IP-интерфейс.

Flyctl, между прочим, это опенсорсный проект (он и должен таким быть, так как клиентам нужно пользоваться им на собственных компьютерах, на которых они занимаются разработкой). Поэтому, если интересно, можете просто почитать его код. Бен написал хороший код, находящийся в папке pkg. А весь остальной код, кошмарный, написал я. В Go обеспечение обмена данными по протоколу IP в сети WireGuard выглядит на удивление просто. Если вы когда-нибудь занимались низкоуровневым TCP/IP-программированием, то вам, возможно, эта простота покажется невероятной. Объекты из TCP-стека gVisor подключаются прямо к сетевому коду стандартной библиотеки.

Взгляните на этот код:

tunDev, gNet, err := netstack.CreateNetTUN(localIPs, []net.IP{dnsIP}, mtu)if err != nil {return nil, err}// ...wgDev := device.NewDevice(tunDev, device.NewLogger(cfg.LogLevel, "(fly-ssh) "))

CreateNetTUN это часть wireguard-go. Тут используются возможности gVisor. В нашем распоряжении оказывается, во-первых, синтетическое туннельное устройство, которое можно использовать для чтения и записи обычных пакетов, обеспечивающих работу WireGuard. Во-вторых у нас имеется функция net.Dialer, обёртка для gVisor, которую можно использовать в Go-коде и через неё взаимодействовать с соответствующей WireGuard-сетью.

Это всё? В общем-то да. Вот, например, как мы используем эти механизмы для работы с DNS:

resolv: &net.Resolver{PreferGo: true,Dial: func(ctx context.Context, network, address string) (net.Conn, error) {return gNet.DialContext(ctx, network, net.JoinHostPort(dnsIP.String(), "53"))},},

Это обычный сетевой код, написанный на Go. В общем хорошо получилось.

Очевидно, все должны поступать именно так


Благодаря парам сотен строк кода (это если не считать код реализации Linux для пользовательского режима, которая достаётся нам от gVisor; но что делать от зависимостей никуда не деться) можно получить в своё распоряжение новую сеть с криптографической аутентификацией. Сеть, которая доступна в любое время и практически из любой программы.

Понятно, что такая сеть значительно медленнее, чем та, что основана на реализации TCP/IP уровня ядра. Но часто ли это по-настоящему важно? И, в особенности, часто ли это имеет какое-то значение при решении периодически возникающих задач, для решения которых обычно строят странные, неизвестно из чего собранные, TLS-туннели? Когда скорость имеет значение, можно просто перейти на обычную реализацию WireGuard.

В любом случае, то, о чём я рассказал, решило огромную нашу проблему. Эта система ведь подходит не только для организации работы SSH. Мы, кроме того, хостим базы данных Postgres. Очень удобно, когда есть возможность, выполнив простую команду, буквально откуда угодно открыть оболочку psql, независимо от того, можно ли, именно в нужный момент, установить WireGuard для macOS.

Пользуетесь ли вы WireGuard?

Подробнее..

Превращаем одноплатник Cubietruck в Wi-Fi Hotspot с Captive portal, VPN-шлюзом и Ad block

25.05.2021 10:11:06 | Автор: admin
raspap

Для построения Wi-Fi сети обычно используют готовые маршрутизаторы, функционал которых всегда ограничен прошивкой. А если необходимо добавить блокировщик рекламы, VPN шлюз и красивый Captive portal, покупать новую железку? Стоимость устройства с таким функционалом будет уже весьма высока. Можно взять Linux с Hostapd и сделать точку доступа с Wi-Fi, но в отличие от готовых маршрутизаторов не будет наглядного Web-интерфейса. И для решения этой задачи был создан проект RaspAP, который на базе устройств с ОС Debian создает Wi-Fi Hotspot с Captive portal, VPN-шлюзом, Ad block. Для RaspAP в отличие от OpenWrt не требуется непосредственная поддержка устройства, достаточно поддержки последней версии Debian. RaspAP работает поверх уже установленных ОС: Raspberry Pi OS, Armbian, Debian, Ubuntu. Как сделать Wi-Fi Hotspot на RaspAP прошу под кат.

RaspAP open-source проект создания беспроводного маршрутизатора из многих популярных устройств работающих на ОС Debian, включая Raspberry Pi. Содержит удобный Web-интерфейс для настройки, блокировщик рекламы, осуществляет шлюзование сетевого трафика через OpenVPN или WireGuard.

Используя RaspAP можно быстро развернуть Hotspot с доступом в сеть Интернет, где угодно: в магазине или торговом центре, заправке, кафе и ресторане, библиотеке, больнице, аэропорте и вокзале, а также в совершенно непривычных, уединенных местах, например на вершине горы. Благодаря наличию Captive portal, посетители подключаясь к Сети, обязательно увидят информацию, которую владелец Wi-Fi желает довести до пользователей. Это может быть информация о соглашение использования публичного hotspot, и т.д.

Поддерживаемые устройства и ОС


Для устройств на ARM-архитектуре заявлена официальная поддержка, устройства на x86 процессорах в настоящее время находится в стадии Beta.

raspap

Поддерживаемые ОС и архитектуры RaspAP

Базовой платформой работы RaspAP является устройство Raspberry Pi. Но благодаря поддержки Armbian на основе Debian, список поддерживаемых устройств становится весьма широким.

Wi-Fi Hotspot на RaspAP будет развернут на одноплатном компьютере Cubietruck, процессор AllWinner A20 (ARM32), с ОС Armbian (на базе Debian). Для задач маршрутизации сетевого трафика для нескольких клиентов процессора AllWinner A20 с двумя ядрами Cortex-A7 будет недостаточно, но вы можете взять гораздо более мощное устройства из каталога поддерживаемых проектом Armbian.

RaspAP


raspap

Под капотом RaspAP использует hostapd, dnsmasq, iptables, веб-интерфейс работает на lighttpd с php-скриптами. С точки зрения использования новых функций применяется политика спонсорства. Если оформить ежемесячное спонсорство, то ваш аккаунт на GitHub будет добавлен в группу Insiders, которые первыми получают возможность протестировать новые функции. Функции доступные на данный момент только спонсорам будут помечены Insiders Edition.

raspap

Веб-интерфейс RaspAP

Возможности RaspAP:

  • Графический интерфейс для настройки и отображения графиков активности клиентских устройств;
  • Поддержка сертификатов SSL;
  • Интеграция с Captive portal;
  • Управление DHCP-сервером;
  • Поддержка адаптеров 802.11ac 5 ГГц;
  • Автоопределение внешних беспроводных адаптеров.

Пройдемся коротко по основным функциям RaspAP.

Точка доступа


По умолчанию создается точка доступа со следующими параметрами:

  • Interface: wlan0
  • SSID: raspi-webgui
  • Wireless Mode: 802.11n 2.4GHz
  • Channel: 1
  • Security Type: WPA2
  • Encryption Type: CCMP
  • Passphrase: ChangeMe

К AP можно подключаться по ключевой паре SSID + пароль или по QR-коду. В случае бездействия клиента, AP может его отключить (требуется поддержка в драйверах). В Insiders Edition доступна возможность изменять мощность в dBm. Для обеспечения гарантированной работы можно задать ограниченное количество подключаемых клиентов.

Для Raspberry Pi Zero W доступен режим виртуализации беспроводного устройства. Единственное на борту Wi-Fi устройство будет работать в режиме клиента и точки доступа. Режим виртуализации сетевых интерфейсов работает и на других адаптерах USB Wi-Fi таких как RTL8188.

Блокировщик рекламы (Ad blocking)


Блокирует ads, трекеры и узлы из черного списка. В качестве источника черного списка выступает проект notracking, список обновляется автоматически. Блокируются следующие типы узлов: tracking, поставщики рекламы, сбор аналитики, фишинговые и мошенические сайты, содержащие вредоносные программы, веб-майнеры.

Captive portal


raspap

Captive portal

Из коробки интегрирован nodogsplash. nodogsplash легкое и простое решения создания кастомизируемых порталов. Поддерживает различные политики работы клиентов.

Поддержка дисплея для вывода состояния работы


Статистическую работу можно выводить на TFT-экран Adafruit Mini PiTFT контроллер ST7789. Скрипт вывода информации написан на Python, поэтому программный код можно легко адаптировать и для другого дисплея, например для ILI9341.

raspap

Вывод информации о работе AP

Поддержка различных сетевых устройств в качестве WAN-интерфейса (Insiders Edition)


В качестве доступа к сети Интернет, RaspAP поддерживает несколько различных типов сетевых устройств, такие как:

  • Ethernet interface (eth);
  • Wireless adapter (wlan);
  • Mobile data modem (ppp);
  • Mobile data adapter with built-in router;
  • USB connected smartphone (USB tethering);

Это особенно удобно когда вы путешествуете или работает в полевых условиях.

OpenVPN


raspap

Сетевой трафик можно туннелировать используя клиента OpenVPN. В Insiders Edition доступна возможность хранения нескольких профилей OpenVPN с функцией быстрого переключения между ними.

WireGuard (Insiders Edition)


raspap

WireGuard быстрый и современный VPN, в котором используется самая современная криптография. Он более производителен, чем OpenVPN, и обычно считается наиболее безопасным, простым в использовании и самым простым решением VPN для современных дистрибутивов Linux. Благодаря низкому overhead, если устройство работает от батареи, то время работы при использование WireGuard будет больше, чем при использование OpenVPN.

Доступ к Web-интересу настроек через SSL


raspap

Для защиты сетевого трафика от перехвата, доступно шифрование по SSL в пределах локальной сети. Проект mkcert позволяет в несколько простых шагов развернуть корневой центр сертификации и генерировать сертификаты, подписанные вашим собственным частным ЦС.

Постановка задачи


Установка RaspAP будет произведена из публичного репозитория, на Cubietruck установлена последняя версия Armbian (на основе Debian): Armbian 21.02.3 Buster, Linux 5.10.21-sunxi. На борту имеется встроенный адаптер wlan0, будет выступать в качестве клиентского доступа к сети Интернет (WAN-интерфейс). Для Hotspot подключим RTL8188 USB WiFi dongle wlan1.

  • IP конфигурация для wlan0: address 192.168.43.12 netmask 255.255.255.0 gateway 92.168.43.1.
  • IP конфигурация для wlan1: address 10.3.141.1 netmask 255.255.255.0 gateway 10.3.141.1.

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

  • Диапазон выдаваемых IP-адресов 10.3.141.50 10.3.141.254;
  • Шлюз/DNS-сервер: 10.3.141.1.

Для шлюзования сетевого трафика через OpenVPN установим на VPS сервер SoftEther VPN Server. SoftEther VPN Server мультипротокольный VPN-сервер, который может поднимать L2TP/IPsec, OpenVPN, MS-SSTP, L2TPv3, EtherIP-серверы, а также имеет свой собственный протокол SSL-VPN, который неотличим от обычного HTTPS-трафика (чего не скажешь про OpenVPN handshake, например), может работать не только через TCP/UDP, но и через ICMP (подобно pingtunnel, hanstunnel) и DNS (подобно iodine), работает быстрее (по заверению разработчиков) текущих имплементаций, строит L2 и L3 туннели, имеет встроенный DHCP-сервер, поддерживает как kernel-mode, так и user-mode NAT, IPv6, шейпинг, QoS, кластеризацию, load balancing и fault tolerance, может быть запущен под Windows, Linux, Mac OS, FreeBSD и Solaris и является Open-Source проектом под GPLv2.

Для VPS сервера выберем тариф на vdsina.ru за 330 р./месяц, в который включена квота на 32 ТБ трафика, чего более чем достаточно. SoftEther VPN Server будет развернут в Docker контейнере, поэтому выбор ОС CentOS/Debian/Ubuntu не принципиально важен.

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

raspap

VPS сервер на vdsina.ru

Сервер был развернут в Московской локации, IP-адрес 94.103.85.152, dns-имя: v636096.hosted-by-vdsina.ru. Подключение к серверу будет по DNS имени.

raspap

Итоговая схема сети

Как будет выглядеть Web-интерфейс RaspAP и подключение к Hotspot


Подключение к AP SSID: raspi-webgui


Подключение к AP raspi-webgui

Конфигурационные файлы RaspAP


Для установки RaspAP есть Quick installer, но он выполняется без задания параметров и wlan0 настроен как Hotspot, что нам не подходит. Поэтому воспользуемся Manual installation, с некоторыми изменениями т.к. руководство содержит некоторые ошибки и сам RaspAP работает с некоторыми некритичными багами, из-за этого пришлось немного больше потратить время на установку. О багах будет в ходе установки.

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

Список конфигурационных файлов (GitHub):

  • hostapd.conf служба hostapd
  • default_hostapd служба hostapd
  • 090_raspap.conf служба dnsmasq.d
  • 090_wlan1.conf служба dnsmasq.d
  • defaults.json служба raspap
  • dhcpcd.conf служба raspap
  • config.php портал конфигурации RaspAP

hostapd.conf служба hostapd

Содержит настройки AP по умолчанию такие как: ssid, channel, password и т.д.

hostapd.conf
driver=nl80211ctrl_interface=/var/run/hostapdctrl_interface_group=0beacon_int=100auth_algs=1wpa_key_mgmt=WPA-PSKssid=raspi-webguichannel=1hw_mode=gwpa_passphrase=ChangeMeinterface=wlan1wpa=2wpa_pairwise=CCMPcountry_code=RU## Rapberry Pi 3 specific to on board WLAN/WiFi#ieee80211n=1 # 802.11n support (Raspberry Pi 3)#wmm_enabled=1 # QoS support (Raspberry Pi 3)#ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40] # (Raspberry Pi 3)## RaspAP wireless client AP mode#interface=uap0## RaspAP bridge AP mode (disabled by default)#bridge=br0



default_hostapd служба hostapd

Настройка службы hostapd, параметр DAEMON_CONF определяет путь к настройкам.

default_hostapd
# Location of hostapd configuration fileDAEMON_CONF="/etc/hostapd/hostapd.conf"



090_raspap.conf служба dnsmasq.d

Настройка службы dnsmasq, параметр conf-dir определяет путь к настройкам.

090_raspap.conf
# RaspAP default configlog-facility=/tmp/dnsmasq.logconf-dir=/etc/dnsmasq.d


090_wlan1.conf служба dnsmasq.d

Настройка dnsmasq для сетевого интерфейса wlan1. Содержит диапазон выдаваемых IP-адресов, и другие сетевые настройки. Необходимо обратить внимание на название файла по маске 090_[ИДЕНТИФИКАТОР_ИНТЕРФЕЙСА_HOTSPOT].conf. Если у вас сетевой интерфейс для hostspot будет назваться например wlan2, то следует задать название файла 090_wlan2.conf.

090_wlan1.conf
# RaspAP wlan0 configuration for wired (ethernet) AP modeinterface=wlan1domain-neededdhcp-range=10.3.141.50,10.3.141.255,255.255.255.0,12hdhcp-option=6,10.3.141.1


defaults.json служба raspap

Настройка DHCP серверов для интерфейсов wlan0 и wlan1.

defaults.json
{  "dhcp": {    "wlan1": {       "static ip_address": [ "10.3.141.1/24" ],      "static routers": [ "10.3.141.1" ],      "static domain_name_server": [ "10.3.141.1" ],      "subnetmask": [ "255.255.255.0" ]    },    "wlan0": {      "static ip_address": [ "192.168.43.12/24" ],      "static routers": [ "192.168.43.1" ],      "static domain_name_server": [ "1.1.1.1 8.8.8.8" ],      "subnetmask": [ "255.255.255.0" ]    },    "options": {      "# RaspAP default configuration": null,      "hostname": null,      "clientid": null,      "persistent": null,      "option rapid_commit": null,      "option domain_name_servers, domain_name, domain_search, host_name": null,      "option classless_static_routes": null,      "option ntp_servers": null,      "require dhcp_server_identifier": null,      "slaac private": null,      "nohook lookup-hostname": null    }  },  "dnsmasq": {    "wlan1": {      "dhcp-range": [ "10.3.141.50,10.3.141.255,255.255.255.0,12h" ]    },    "wlan0": {      "dhcp-range": [ "192.168.43.50,192.168.50.150,12h" ]    }  }}


dhcpcd.conf служба raspap

Настройка для сетевого интерфейса wlan0, который выходит в сеть Интернет.

dhcpcd.conf
# RaspAP default configurationhostnameclientidpersistentoption rapid_commitoption domain_name_servers, domain_name, domain_search, host_nameoption classless_static_routesoption ntp_serversrequire dhcp_server_identifierslaac privatenohook lookup-hostname# RaspAP wlan0 configurationinterface wlan0static ip_address=192.168.43.12/24static routers=192.168.43.1static domain_name_server=1.1.1.1 8.8.8.8


config.php портал конфигурации RaspAP

Файл настроек графического Web-интерфейса. Содержит переменные влияющие на отображение настроек. Самый главный параметр define('RASPI_WIFI_AP_INTERFACE', 'wlan1');. В качестве значения указать сетевой интерфейс hotspot wlan1.

config.php
...define('RASPI_WIFI_AP_INTERFACE', 'wlan1');...define('RASPI_ADBLOCK_ENABLED', true);define('RASPI_OPENVPN_ENABLED', false);...


Пошаговая установкаRaspAP


Руководство установки доступно в разделе Manual installation.

Шаг 1 Подключение адаптера USB WiFi RTL8188


Подключаем адаптер в любой доступный USB порт. В Armbian драйвера уже есть, поэтому проверим подключение командой lsusb:

root@bananapim64:~# lsusbBus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubBus 003 Device 004: ID 0bda:c811 Realtek Semiconductor Corp.Bus 003 Device 002: ID 1a40:0101 Terminus Technology Inc. HubBus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubBus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubroot@bananapim64:~#

В списке присутствует Realtek Semiconductor Corp., значит адаптер успешно распознался. Если вывести название интерфейса для подключенного адаптера, то его имя будет wlxe81e0584796d, что несколько далеко от привычного именования вида wlanX. Для задания названия для адаптера wlan1, необходимо выполнить следующие действия (более подробнее почитать про именование сетевых интерфейсов по ссылке1,ссылке2):

$ sudo ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules$ sudo reboot

После перезагрузки в системе будет два беспроводных адаптера: wlan0 и wlan1.

Шаг 2 Настройка сетевых интерфейсов


Настроим сетевые интерфейсы в конфигурационном файле: /etc/network/interfaces.

# Network is managed by Network managerauto loiface lo inet loopback# WANauto wlan0allow-hotplug wlan0iface wlan0 inet dhcp# Wi-Fi APauto wlan1iface wlan1 inet static    address 10.3.141.1    netmask 255.255.255.0    gateway 10.3.141.1

Шаг 3 Установка RaspAP


Теперь приступаем к установке RaspAP.
Обновление системы:

sudo apt-get updatesudo apt-get full-upgrade

Установка зависимостей для не RPi OS:

sudo apt-get install software-properties-common sudo add-apt-repository ppa:ondrej/phpsudo apt-get install dhcpcd5

Установка пакетов:

sudo apt-get install -y lighttpd git hostapd dnsmasq iptables-persistent vnstat qrencode php7.3-cgi

PHP:

sudo lighttpd-enable-mod fastcgi-php    sudo service lighttpd force-reloadsudo systemctl restart lighttpd.service

Создание Web-портала:

sudo rm -rf /var/www/htmlsudo git clone https://github.com/RaspAP/raspap-webgui /var/www/htmlWEBROOT="/var/www/html"CONFSRC="$WEBROOT/config/50-raspap-router.conf"LTROOT=$(grep "server.document-root" /etc/lighttpd/lighttpd.conf | awk -F '=' '{print $2}' | tr -d " \"")HTROOT=${WEBROOT/$LTROOT}HTROOT=$(echo "$HTROOT" | sed -e 's/\/$//')awk "{gsub(\"/REPLACE_ME\",\"$HTROOT\")}1" $CONFSRC > /tmp/50-raspap-router.confsudo cp /tmp/50-raspap-router.conf /etc/lighttpd/conf-available/sudo ln -s /etc/lighttpd/conf-available/50-raspap-router.conf /etc/lighttpd/conf-enabled/50-raspap-router.confsudo systemctl restart lighttpd.servicecd /var/www/htmlsudo cp installers/raspap.sudoers /etc/sudoers.d/090_raspap

Создание конфигурации:

sudo mkdir /etc/raspap/sudo mkdir /etc/raspap/backupssudo mkdir /etc/raspap/networkingsudo mkdir /etc/raspap/hostapdsudo mkdir /etc/raspap/lighttpdsudo cp raspap.php /etc/raspap 

Установка разрешения:

sudo chown -R www-data:www-data /var/www/htmlsudo chown -R www-data:www-data /etc/raspap

Настройка контролирующих скриптов:

sudo mv installers/*log.sh /etc/raspap/hostapd sudo mv installers/service*.sh /etc/raspap/hostapdsudo chown -c root:www-data /etc/raspap/hostapd/*.sh sudo chmod 750 /etc/raspap/hostapd/*.sh sudo cp installers/configport.sh /etc/raspap/lighttpdsudo chown -c root:www-data /etc/raspap/lighttpd/*.shsudo mv installers/raspapd.service /lib/systemd/systemsudo systemctl daemon-reloadsudo systemctl enable raspapd.service

Установка стартовых настроек, настройки в каталоге ~/temp, при необходимости заменить на свои:

sudo apt-get install -y curl unzipmkdir -p ~/tempcurl -SL --output ~/temp/config_ct.zip https://github.com/devdotnetorg/Site/raw/master/Uploads/files/config_ct.zipunzip ~/temp/config_ct.zip -d ~/temprm ~/temp/config_ct.zipесли есть: sudo mv /etc/default/hostapd ~/default_hostapd.oldесли есть: sudo cp /etc/hostapd/hostapd.conf ~/hostapd.conf.oldsudo cp ~/temp/default_hostapd /etc/default/hostapdsudo cp ~/temp/hostapd.conf /etc/hostapd/hostapd.confsudo cp config/090_raspap.conf /etc/dnsmasq.d/090_raspap.confsudo cp ~/temp/090_wlan1.conf /etc/dnsmasq.d/090_wlan1.confsudo cp ~/temp/dhcpcd.conf /etc/dhcpcd.confsudo cp ~/temp/config.php /var/www/html/includes/sudo cp ~/temp/defaults.json /etc/raspap/networking/sudo systemctl stop systemd-networkdsudo systemctl disable systemd-networkdsudo cp config/raspap-bridge-br0.netdev /etc/systemd/network/raspap-bridge-br0.netdevsudo cp config/raspap-br0-member-eth0.network /etc/systemd/network/raspap-br0-member-eth0.network 

Оптимизация PHP:

sudo sed -i -E 's/^session\.cookie_httponly\s*=\s*(0|([O|o]ff)|([F|f]alse)|([N|n]o))\s*$/session.cookie_httponly = 1/' /etc/php/7.3/cgi/php.inisudo sed -i -E 's/^;?opcache\.enable\s*=\s*(0|([O|o]ff)|([F|f]alse)|([N|n]o))\s*$/opcache.enable = 1/' /etc/php/7.3/cgi/php.inisudo phpenmod opcache

Настройка маршрутизации:

echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/90_raspap.conf > /dev/nullsudo sysctl -p /etc/sysctl.d/90_raspap.confsudo /etc/init.d/procps restartsudo iptables -t nat -A POSTROUTING -j MASQUERADEsudo iptables -t nat -A POSTROUTING -s 192.168.43.0/24 ! -d 192.168.43.0/24 -j MASQUERADEsudo iptables-save | sudo tee /etc/iptables/rules.v4

Включение hostapd:

sudo systemctl unmask hostapd.servicesudo systemctl enable hostapd.service

OpenVPN:

sudo apt-get install openvpnsudo sed -i "s/\('RASPI_OPENVPN_ENABLED', \)false/\1true/g" /var/www/html/includes/config.phpsudo systemctl enable openvpn-client@clientsudo mkdir /etc/raspap/openvpn/sudo cp installers/configauth.sh /etc/raspap/openvpn/sudo chown -c root:www-data /etc/raspap/openvpn/*.sh sudo chmod 750 /etc/raspap/openvpn/*.sh

Ad blocking:

sudo mkdir /etc/raspap/adblockwget https://raw.githubusercontent.com/notracking/hosts-blocklists/master/hostnames.txt -O /tmp/hostnames.txtwget https://raw.githubusercontent.com/notracking/hosts-blocklists/master/domains.txt -O /tmp/domains.txtsudo cp /tmp/hostnames.txt /etc/raspap/adblocksudo cp /tmp/domains.txt /etc/raspap/adblock sudo cp installers/update_blocklist.sh /etc/raspap/adblock/sudo chown -c root:www-data /etc/raspap/adblock/*.*sudo chmod 750 /etc/raspap/adblock/*.shsudo touch /etc/dnsmasq.d/090_adblock.confecho "conf-file=/etc/raspap/adblock/domains.txt" | sudo tee -a /etc/dnsmasq.d/090_adblock.conf > /dev/null echo "addn-hosts=/etc/raspap/adblock/hostnames.txt" | sudo tee -a /etc/dnsmasq.d/090_adblock.conf > /dev/nullsudo sed -i '/dhcp-option=6/d' /etc/dnsmasq.d/090_raspap.confsudo sed -i "s/\('RASPI_ADBLOCK_ENABLED', \)false/\1true/g" includes/config.php

При конфигурирование через Web-интерфейс столкнулся с багом, который при изменение настроек DHCP сервера на интерфейсе wlan1 удаляет файл конфигурации 090_wlan1.conf и не создает его заново. В результате DHCP сервер не выдает IP-конфигурацию новым клиентам. Временное решение этой проблемы заключается в блокировке файла на удаление, необходимо выполнить следующую команду (по блокировке файлов почитать по ссылке):

sudo chattr +i /etc/dnsmasq.d/090_wlan1.conf

После установки необходимо перезагрузить систему:

sudo reboot now

После перезагрузке появится Wi-Fi точка доступа с SSID raspi-webgui и паролем ChangeMe. Портал будет доступен по адресу: http://10.3.141.1.

Установка SoftEther VPN Server на VPS сервер


На сервер v636096.hosted-by-vdsina.ru установим Docker по официальному руководству Install Docker Engine on Ubuntu.

Создание сети для Docker контейнеров


Для подсети в которой будет контейнер с SoftEther VPN Server определим следующие параметры:

  • Название сети: vpnnetwork;
  • Subnet: 172.22.0.0/24;
  • Driver: bridge;
  • Range: 172.22.0.0/25;
  • gateway: 172.22.0.127;
  • HostMin: 172.22.0.1;
  • HostMax: 172.22.0.126;
  • Hosts/Net: 126.

Для создание внутренней сети Docker выполним команду:

$ docker network create --driver bridge --subnet 172.22.0.0/24 --ip-range=172.22.0.0/25 --gateway 172.22.0.127 vpnnetwork

Для проверки доступности сети выполнить команду: ping 172.22.0.127.

Создание контейнера с SoftEther VPN Server


Для создание контейнера будем использовать образ siomiz/softethervpn. До запуска основного контейнера необходимо создать конфигурацию, в которой указать пароль для управления сервером параметр SPW и пароль для управления хабом параметр HPW. Файл конфигурации будет располагаться по пути /usr/vpnserver/vpn_server.config. Выполнить следующие команды:

$ mkdir -p /usr/vpnserver$ docker run --name vpnconf -e "SPW={PASSWORD}" -e "HPW={PASSWORD}" siomiz/softethervpn echo$ docker cp vpnconf:/usr/vpnserver/vpn_server.config /usr/vpnserver/vpn_server.config$ docker rm vpnconf

Для уменьшения размера контейнера возьмем образ на основе Alpine, все журналы log в null. Выполнить следующие команды для создание контейнера:

$ docker run --name vps-server-softethervpn -d --cap-add NET_ADMIN --restart always --net vpnnetwork --ip 172.22.0.2 -p 443:443/tcp -p 992:992/tcp \-p 1194:1194/udp -p 5555:5555/tcp -v /usr/vpnserver/vpn_server.config:/usr/vpnserver/vpn_server.config \-v /dev/null:/usr/vpnserver/server_log -v /dev/null:/usr/vpnserver/packet_log -v /dev/null:/usr/vpnserver/security_log siomiz/softethervpn:alpine

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

Настройка SoftEther VPN Server


Для настройки SoftEther VPN Server лучше использовать графическую утилиту для ОС Windows. Для загрузки необходимо перейти на страницу SoftEther Download Center. В списке Select Component, выбрать SoftEther VPN Server Manager for Windows, далее Select Platform windows. Можно выбрать пакет .zip без необходимости установки. Пакет softether-vpn_admin_tools-v4.34-9745-rtm-2020.04.05-win32.zip распаковать и запустить vpnsmgr.exe.

Создаем новый профиль кнопка New Setting, указываем следующие настройка:

  • Setting Name: VDSina_ru_main_server
  • Host Name: v636096.hosted-by-vdsina.ru
  • Port Number: 443
  • Password: пароль который был указан в переменной SPW при создание конфигурационного файла vpn_server.config

Затем подключаемся к серверу кнопка Connect.

При первом подключение появится вопрос об включение поддержки протокола IPSec. Если в дальнейшем планируете подключать мобильные устройства без использования программных клиентов, то выбрать Да. В данном случае поддержка IPSec не требуется, отвеваем Нет.

Для настройки алгоритма шифрования нажать на кнопку Encryption and Network. По умолчанию включен алгоритм DHE-RSA-AES256-SHA. Из списка выбрать другие более стойкие комбинации шифрования, но нужно помнить чем сильнее алгоритм, тем больше нагрузка на CPU сервера и на конечное маршрутизирующее устройство.

По умолчанию будет доступен хаб DEFAULT, удаляем его.

Создаем новый хаб кнопка Create a Virtual Hub. Укажем Virtual Hub Name: VPNROOT. Открываем настройки хаба кнопка Manage Virtual Hub.

Создадим пользователя подключения, кнопка Manage Users, затем кнопка New. Аутентификация будет по паре логин/пароль, укажем имя: officeuser1.

Для отделение подсети клиентов VPN сервера и подсети Docker контейнеров включим NAT, кнопка Virtual NAT and Virtual DHCP Server (SecureNAT), далее кнопка Enable SecureNAT. Изменим подсеть VPN клиентов на: 192.168.30.x, закроем окно, кнопка Exit.

На этом настройка сервера закончена.


Последовательность действий по настройке SoftEther VPN Server

Получение файлов конфигурации *.ovpn


Для подключения OpenVPN клиента необходимо получить файлы конфигурации *.ovpn, для этого переходим на главный экран настроек SoftEther VPN Server и нажимаем на кнопку OpenVPN / MS-SSTP Settings. Далее, в следующем окне генерируем файлы конфигурации, кнопка Generate a Sample Configuration File for OpenVPN Clients. Сохраняем архив OpenVPN_Sample_Config_v636096.hosted-by-vdsina.ru_20210519_150311.zip, для дальнейшего подключения потребуется файл f1167ecd086e_openvpn_remote_access_l3.ovpn.


Последовательность действий по получению файлов конфигурации *.ovpn

Настройка OpenVPN на RaspAP


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

sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADEsudo iptables -A FORWARD -i tun0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPTsudo iptables -A FORWARD -i wlan1 -o tun0 -j ACCEPT

Делаем копию существующих маршрутов и сохраняем новые

cp /etc/iptables/rules.v4 /etc/iptables/rules.v4.baksudo iptables-save | sudo tee /etc/iptables/rules.v4

Настройка профиля OpenVPN

Переходим на портал по адресу 192.168.43.12/openvpn_conf и указываем данные для подключения:

  • Username: officeuser1
  • Password: указанный для officeuser1 в SoftEther VPN Server
  • Для конфигурационного файла выбираем файл f1167ecd086e_openvpn_remote_access_l3.ovpn.

Сохраняем настройки и перезапускаем OpenVPN. Если подключение удалось, но в поле IPV4 ADDRESS будет публичный IP-адрес VPN сервера: 94.103.85.152 (v636096.hosted-by-vdsina.ru).

raspap
Страница настроек OpenVPN в RaspAP

Настройка Captive portal


Установка Captive portal в руководстве Captive portal setup.

Для установки выполним следующие действия:

sudo apt-get updatesudo apt-get install -y libmicrohttpd-devcd ~/git clone https://github.com/nodogsplash/nodogsplash.gitcd nodogsplashmakesudo make install

Далее необходимо внести изменения в конфигурационный файл /etc/nodogsplash/nodogsplash.conf. Указать следующие параметры:

...GatewayInterface wlan1...GatewayAddress 10.3.141.1...

Регистрация службы и запуск:

sudo cp ~/nodogsplash/debian/nodogsplash.service /lib/systemd/system/sudo systemctl enable nodogsplash.servicesudo systemctl start nodogsplash.service sudo systemctl status nodogsplash.service

Страницы html для изменение дизайна страниц располагаются по пути: /etc/nodogsplash/htdocs/. Теперь выполним подключение к AP SSID: raspi-webgui.

Устранение проблем


Первым делом необходимо проверить IP-конфигурацию сетевых интерфейсов, командами: ifconfig или ip a.

Проверить занятость портов, командами:

netstat -ntlp | grep LISTENlsof -i | grep LISTENlsof -nP -i | grep LISTEN

Если установка RaspAP выполняется на Ubuntu, то вы можете столкнуться с конфликтом использования 53 порта, который занят службой systemd-resolved. Для отключения данной службы, воспользоваться материалом How to disable systemd-resolved in Ubuntu.

Проверить статусы используемых служб, выполнить следующие команды:

sudo systemctl status hostapd.servicesudo systemctl status dnsmasq.servicesudo systemctl status lighttpd.servicesudo systemctl status openvpn-client@clientsudo systemctl status nodogsplash.servicesudo systemctl status raspapd.service


Что дальше?


Для проверки совместимости необходимо RaspAP развернуть на Banana Pi BPI-M64 (Armbian 21.02.1 на основе Ubuntu 18.04.5 LTS). Далее, развернуть на x86 с другим более новым адаптером, например USB Realtek 8811CU Wireless LAN 802.11ac. На GitHub размещен репозиторий raspap-docker, который оборачивает RaspAP в контейнер, но по факту запускает скрипт автоматической установки, что несколько неудобно и неправильно. Поэтому для более широкого распространения RaspAP необходимо его правильно обернуть в Docker контейнер для ARM и x86 архитектур.

Итог


Проект RaspAP безусловно заслуживает внимания, основные функции работают отлично. Это единственный проект связанный с Wi-Fi сетями, работающий поверх существующей ОС, у которого работает Web-интерфейс (пока есть небольшие баги). Для личного использования, теста, стоит попробовать. Но для продакшен в бизнесе пока лучше не использовать, необходимо более детально просмотреть исходный код и конфигурацию на предмет безопасности. В любом случае, проект добавил себе в закладки, надеюсь баги исправят в скором времени.



На правах рекламы


VDSina предлагает виртуальные серверы на Linux и Windows выбирайте одну из предустановленных ОС, либо устанавливайте из своего образа.

Присоединяйтесь к нашему чату в Telegram.

Подробнее..

WireGuard без NAT, внутренняя сеть и клиенты с обратной связью

10.11.2020 20:15:48 | Автор: admin

Приветствую, уважаемые читатели. В этой статье, я хотел бы рассказать о своем опыте постройки внутренней сети не привязанной к офисному оборудованию и функционирующий при единственном условии, что доступен интернет. С добавлением в настройки vpn сервера возможности обратной связи к клиенту и управлением доступа в сеть для каждого клиента. И управлять всем этим из одного места через веб интерфейс или удобный GUI.



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


  • подключение клиента автоматически при загрузке ОС
  • автоматически восстанавливать соединение при переключении между WiFi точками
  • VPN клиент должен быть виден из офисной сети
  • кросплатформенность vpn клиента и ПО для удаленного управления
  • минимальное участие пользователя в настройках vpn клиента
  • доступ клиента к хостам и подсетям ограничивается правилами ACL
  • настройка клиентов и ACL из одного удобного GUI
  • отказоустойчивость VPN серверов

Как дополнение


  • логирование (минимум Layer 3)
  • передавать логи в поисковую систему (например ELK стек)


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


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


За основу, где будет развернут vpn сервер была выбрана ОС Ubuntu 18.04.5 LTS.


Для vpn сервера был выбран WireGuard, всем характеристикам он соответствует. Он легковесный, имеет минимум настроек. Клиентская часть запускается при старте ОС, сама поднимает канал и кросплатформенная. Работает через udp протокол. При шифровании канала потеря скорости всего в районе 20%.


В качестве firewall был выбран iptables и его управление через ПО Shorewall. Даже первоначальные настройки Shorewall не вызвали никаких затруднений и в работе он легок для восприятия.


Удаленное управление пользователями в ОС Windows было осуществлено через TightVNC, msi файл которой можно пере собрать по своему усмотрению. Серверная часть ПО не прожорливая, служба не падает, передает только jpeg скриншеты и управление клавиатурой/мышкой. Защищена паролем на подключение и администрирование. Для других ОС есть разные реализации серверной части VNC.


Управление настройками, добавление настроек/клиентов было реализовано через развернутый в инфраструктуре GitLab и CI Pipelines. Все редактирование/создание файлов можно осуществлять через веб интерфейс не используя команду git которую не до конца могут понимать коллеги из поддержки. К тому-же через веб интерфейс визуально будет понятнее.


Сбор логов был реализован через Fluentd и/или Filebeat и все отправлялось в Elasticsearch.


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


Устанавливаем wireguard на Ubuntu 18.04.5 LTS


Установка ПО для различных ОС есть на официальном сайте.


Ubuntu 18.04


sudo apt install wireguard

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


Генерируем публичный и приватный ключи.


Запускаем


wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey

Все ключи лежат /etc/wireguard/


Создаем файл wg0.conf


sudo nano /etc/wireguard/wg0.conf

Собираем конфигурационный файл


[Interface]Address = 192.168.30.1/24       <- выбираем любой диапазонSaveConfig = trueListenPort = 5505               <- выбираем любой портPrivateKey = SERVER_PRIVATE_KEY

Во многих мануалах еще добавляют 2 строчки:


PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADEPostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE

Последние строчки PostUp и PostDown верны если вы хотите клиента спрятать за NAT. В таком случае все клиенты при подключении будут иметь ip адрес внутреннего сетевого интерфейса сервера, но нам это не нужно, поэтому мы их не добавляем.


Перед включением интерфейса wg0, разрешим серверу пересылать пакеты вперед.


Добавим ip_forward


sudo nano /etc/sysctl.conf# ищем строку и убираем комментарийnet.ipv4.ip_forward=1

Возможно после этих настроек сервер нужно будет перезагрузить, если не будет пинговаться ip wireguard.


Сохраняем изменения


sudo sysctl -p

Отключаем ufw


systemctl disable ufw

В iptables сбросим все цепочки правил и пропустим весь трафик


iptables -Fiptables -Xiptables -t nat -Fiptables -t nat -Xiptables -t mangle -Fiptables -t mangle -Xiptables -P INPUT ACCEPTiptables -P FORWARD ACCEPTiptables -P OUTPUT ACCEPT

Проверяем, запустим службу


sudo wg-quick up wg0

Проверим статус


sudo wg

Добавляем wg на запуск при загрузке


sudo systemctl enable wg-quick@wg0

Сделаем копию файла wg0.conf в этой же папке /etc/wireguard/


cp /etc/wireguard/wg0.conf /etc/wireguard/wg0.sempl

Важно чтобы в копии были настройки именно [Interface].


Создадим несколько папок где нибудь в /opt


mkdir /opt/gitmkdir /opt/git/wg

Скопируем wg0.conf в /opt/git/wg и сделаем ссылку на файл


cp /etc/wireguard/wg0.conf /opt/git/wg/wg0.confln -sf /opt/git/wg/wg0.conf /etc/wireguard/wg0.conf

Для чего последние действия нужны? Скопировав настройки интерфейса в файл wg0.sempl мы вынесли приватный ключ сервера в отдельный файл, при написании CI в .gitlab-ci.yml мы будем это учитывать. Перенесли конфиг в папку /opt/git/wg и сделали ссылку для того, чтобы с последствии собирать целый конфигурационный файл в папке отличной от /etc/wireguard. Сам конфигурационный файл будет собираться из 2 частей, часть с настройками [Interface] и часть с [Peer] клиентов, которые будут добавляться из gitlab.


Настраиваем пограничный маршрутизатор пропускать входящие подключения по порту udp: 5505 на наш сервер. Так-же не забываем указать статический маршрут подсети 192.168.30.0/24 на внутренний сетевой интерфейс нашего сервера. При поднятии интерфейса wg0.conf адрес 192.168.30.1 должен пинговаться с любого хоста в нашей внутренней подсети, если не пингуется советую на этом моменте остановится и решить этот вопрос. Проверьте правила фаервола на маршрутизаторе. Чтобы подсеть 192.168.30.0/24 заработала через ipsec достаточно эту подсеть добавить во 2 фазу политики локальных, а с другой стороны удаленных адресов.


Что мы должны передавать клиенту после всех настроек? Создадим шаблон


Address = 192.168.30.X/24DNS = 10.15.1.10, 10.16.1.252[Peer]PublicKey = <server_public_key>AllowedIPs = 0.0.0.0/0Endpoint = 1.2.3.4:5505

Если в AllowedIPs указать 0.0.0.0/0, то мы завернем интернет трафик клиента через VPN. Можно указавать диапазон внутренних подсетей.


На данный момент никаких клиентов и никаких подключений с наружи нам не нужно.


Вступление есть, продолжаем.


Устанавливаем и настраиваем Shorewall


Установка shorewall


apt updateapt install -y shorewall

После установки нужно добавить параметры в файл shorewall.conf и создать несколько файлов с переменными и дополнительными параметрами. Большой мануал есть на официальном сайте.


Начнем по порядку, изменим некоторые параметры shorewall.conf


nano /etc/shorewall/shorewall.confSTARTUP_ENABLED=YesLOG_LEVEL="info(tcp_options,tcp_sequence,macdecode,ip_options)"BLACKLIST_LOG_LEVEL="$LOG_LEVEL"INVALID_LOG_LEVEL="$LOG_LEVEL"LOG_MARTIANS=YesLOG_VERBOSITY=2LOGALLNEW="$LOG_LEVEL"LOGFILE=/opt/logs/shorewall/firewall.logLOGFORMAT="ip-tables %s %s "LOGTAGONLY=No 

Создадим несколько папок в /opt и перенесем логирование. В LOGFORMAT добавляем префикс по которому будем фильтровать системные сообщения от iptables и складировать в /opt/logs/shorewall/firewall.log.


mkdir /opt/logsmkdir /opt/logs/shorewalltouch /opt/logs/shorewall/firewall.log

Сделаем сразу фильтр системных сообщений от iptables. Создаем правило и добавим фильтр по нашему префиксу ip-tables


nano /etc/rsyslog.d/10-my_iptables.conf# Log kernel generated iptables log messages to file:msg,contains,"ip-tables" /opt/logs/shorewall/firewall.log& ~

Если в файл логи не будут записываться, добавьте прав на файл/папку. Не забудьте настроить ротацию лога.


Перезапустим службу


service rsyslog restart

Продолжаем настройку shorewall и создадим несколько файлов.


Создаем файл interfaces, в нем запишем переменные для наших интерфейсов и опции


nano /etc/shorewall/interfaces?FORMAT 2################################################################################ZONE   INTERFACE       OPTIONSlan     eth0            tcpflags,nosmurfs,routefilter,logmartianswg      wg0             tcpflags,nosmurfs,routefilter,logmartians#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Создадим файл с переменными подсетей и хостов и запишем все наши подсети и важные сервера в сети


nano /etc/shorewall/params.mgmt# protocolsALL_T_U=tcp,udp# all services, networks and subnetsAD_DS=10.15.1.10,10.17.2.2IPA=10.16.1.252DNS_INT=10.15.1.10,10.16.1.252,192.168.0.253KASPER=10.15.1.55####NET_OFFICE=10.15.1.0/24NET_OFFICE_PRINTERS=10.15.14.0/24##NET_CLOUD_PROD=172.16.0.0/20,172.16.16.0/20,172.16.32.0/20NET_CLOUD_DEV=192.168.128.0/24,192.168.1.0/24####VPN_01=192.168.30.0/24VPN_02=192.168.40.0/24####ADM_IP=10.17.1.9ADM_IP_VPN=192.168.30.3,192.168.40.3VNC_SERVERS=10.15.1.10###END###

Здесь нет ограничений на переменные, мы расписали все внутренние подсети, добавили контроллер домена, free ipa, внутренние DNS, подсети VPN, и административные ip адреса, добавили группу протоколов.


Добавим этот файл в общие настройки


nano /etc/shorewall/paramsINCLUDE params.mgmt

Напишем политику и правила которые будут работать по умолчанию.


nano /etc/shorewall/policy###SOURCE      DEST           POLICY      LOGLEVEL     LIMIT$FW          lan            ACCEPT       $LOG_LEVEL$FW          wg             DROP         $LOG_LEVELwg           $FW            DROP         $LOG_LEVEL# THE FOLOWING POLICY MUST BE LASTall          all            REJECT       $LOG_LEVEL##

В данном примере логируются все соединения. Переменная $FW обозначает сам фаервол, т.е. любое соединение от любого интерфейса направленного на wg будет сброшено. Эти правила применяются последними.


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


nano /etc/shorewall/zones################################################################################ZONE   TYPE            OPTIONS         IN                      OUT#                                       OPTIONS                 OPTIONSFW      firewalllan     ipv4wg      ipv4#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE

Самый большой файл получается с сервисами, создадим его и заполним


nano /etc/shorewall/services.mgmt # add default rules for all connections# AD DS & LDAPACCEPT   lan:$AD_DS         wg                  $ALL_T_U    42ACCEPT   wg                 lan:$AD_DS          $ALL_T_U    42ACCEPT   lan:$AD_DS         wg                  $ALL_T_U    88ACCEPT   wg                 lan:$AD_DS          $ALL_T_U    88ACCEPT   lan:$AD_DS         wg                  $ALL_T_U    135ACCEPT   wg                 lan:$AD_DS          $ALL_T_U    135.....# Free IPA portsACCEPT   lan:$IPA           wg                  $ALL_T_U    88.....# internal DNSACCEPT   lan:$DNS_INT       wg                  $ALL_T_U    53ACCEPT   wg                 lan:$DNS_INT        $ALL_T_U    53# kasterskyACCEPT   lan:$KASPER        wg                  $ALL_T_U    13000ACCEPT   wg                 lan:$KASPER         $ALL_T_U    13000.....# admin all accessACCEPT   lan:$ADM_IP        wg  ACCEPT   wg:$ADM_IP_VPN     wgACCEPT   lan:$ADM_IP_VPN    wg# vncACCEPT   lan:$VNC_SERVERS   wg                  tcp         7900####END###

Расписываем все порты всех наших внутренних сервисов. Какие порты и какой протокол сервисом используются можно найти на официальном сейте каждого из сервисов.


Напишем правила по умолчанию для всех наших подсетей включая и подсети vpn сбрасывающих все соединения


nano /etc/shorewall/networks.mgmt # drop internal networks to clients and from clientDROP     lan:$NET_OFFICE               wgDROP     lan:$NET_OFFICE_PRINTERS      wgDROP     lan:$NET_CLOUD_PROD           wgDROP     lan:$NET_CLOUD_DEV            wgDROP     wg                            lan:$NET_OFFICE            DROP     wg                            lan:$NET_OFFICE_PRINTERS   DROP     wg                            lan:$NET_CLOUD_PROD           DROP     wg                            lan:$NET_CLOUD_DEV            # wireguard networksDROP     lan:$VPN_01                   wgDROP     lan:$VPN_02                   wgDROP     wg                            lan:$VPN_01DROP     wg                            lan:$VPN_02DROP     wg:$VPN_01                    wgDROP     wg:$VPN_02                    wgDROP     wg                            wg:$VPN_01DROP     wg                            wg:$VPN_02####END###

Остался практически самый послелний и самый главный файл с описанием всех правил и всех включений с определенным порядком, т.к. Shorewall поддерживает включение множества файлов из папки, для начала сделаем 2 папки в которых мы будем заполнять файлы для клиентов vpn с доступом ко внутренней сети/хостам и с доступом в интернет (да, будем выпускать пользователей в интернет через vpn)


Создаем 2 папки


mkdir /etc/shorewall/rules_internet.dmkdir /etc/shorewall/rules_networks.d

В папках будем создавать файлы с расширением .rule, имя можно выбрать например <ip_username>, в итоге все файлы будут выглядеть по шаблону <ip_username>.rule. Создадим 2 файла для примера и потом перейдем к последнему основному файлу.


Разрешим доступ к интернету


nano /etc/shorewall/rules_internet.d/192.168.30.2_tst-client.rule ############################################################################################ACTION         SOURCE            DEST            PROTO   DEST    SOURCE          ORIGINAL        RATE            USER/   MARK#                                                         PORT    PORT(S)         DEST            LIMIT           GROUPACCEPT          wg:192.168.30.2   lan                       ####END###

Разрешим доступ к некоторым хостам из сети (так же можно комбинировать правила)


nano /etc/shorewall/rules_networks.d/192.168.30.2_tst-client.rule ############################################################################################ACTION           SOURCE                     DEST                        PROTO   DEST    SOURCE          ORIGINAL        RATE            USER/   MARK#                                                                                PORT    PORT(S)         DEST            LIMIT           GROUPACCEPT           wg:192.168.30.2            lan:$NET_OFFICEDROP             wg:192.168.30.2            lan:10.15.1.69ACCEPT           wg:192.168.30.2            lan:10.16.1.252              tcp     80####END###

После последнего правила не обязательно писать правило DROP, мы все соединения которые будут сбрасываться реализуем в файле rules.


Итак добавляем файл rules и вносим правила


nano /etc/shorewall/rules############################################################################################ACTION          SOURCE         DEST        PROTO   DEST    SOURCE      ORIGINAL    RATE        USER/   MARK#                                                   PORT    PORT(S)     DEST        LIMIT       GROUPACCEPT           lan             $FWACCEPT           wg              $FW        icmpACCEPT           wg              $FW        tcp     22####### add servicesINCLUDE services.mgmt###### add internal hosts/networks to clientsSHELL cat /etc/shorewall/rules_networks.d/*.rule####### drop all internal networks to wireguard from clients and to clientsINCLUDE networks.mgmt###### add internet to clientsSHELL cat /etc/shorewall/rules_internet.d/*.rule####END###

По порядку:


  • разрешаем соединение сервисов к клиенту и от клиента
  • разрешаем/запрещаем соединения к сетям/хостам
  • запрещаем доступ ко всем внутренним подсетям и подсетям vpn
  • разрешаем доступ в интернет (при наличии файла с правилом)

Структура файлов:


/etc/shorewall/ conntrack interfaces networks.mgmt params params.mgmt policy README.MD rules rules_internet.d  192.168.30.2_tst-client.rule rules_networks.d  192.168.30.2_tst-client.rule services.mgmt shorewall.conf zones

Применяем правила фаервола


shorewall reload

Во всей этой легкости написания правил доступа клиентов во внутреннюю сеть есть одно "но", shorewall сбрасывает цепочку правил и применяет новые только если увидит в корневой папке /etc/shorewall/ изменения хотя-бы в одном файле, т.е. изменения в папке rules_internet.d/rules_networks.d не изменят правил iptables. Мы учтем это когда будем собирать все в gitlab.


На этом этапе можно создать тестового пользователя и тестовое подключение через Wireguard, разрешить все правилами Shorewall и пингануть с любого хоста внутренней сети vpn клиента. Пинги должны проходить и к клиенту должен быть доступ по всем портам. Если vpn клиент не виден из внутренней сети, значит не добавили правила маршрутизации или есть ограничения фаервола как на vpn сервере, так и на маршрутизаторе. Все vpn скиенты должны быть доступны с административных ip адресов, которые мы указывали в переменной ADM_IP и ADM_IP_VPN.


Предлагаю на этом не останавливаться и продолжить, осталось немного :)


Реализация VPN доступа через CI Pipelines в GitLab


Допустим у нас уже есть selfhosted gitlab для внутреннего использования, если нет то его не так сложно развернуть через тот-же docker-compose.


Для начала создадим новую группу и новый проект, создадим репозиторий vpn-01 и создадим следующую структуру


 vpn-01  .gitlab-ci.yml  README.md  shorewall   networks.mgmt   params.mgmt   README.MD   rules_internet.d    192.168.30.2_tst-client.rule   rules_networks.d    192.168.30.2_tst-client.rule   services.mgmt  wireguard      README.MD      wg0.conf

Переносим настройки описанные ранее во все файлы в папке shorewall на gitlab. В README.MD можно вести учет пользователей, написать мануал для суппорта.


В файле wg0.conf будут записи только клиентов. Добавляем одного клиента


[Peer]PublicKey = <client_public_key>AllowedIPs = 192.168.30.2/32

Всё, настройки shorewall перенесли и добавили 1 клиента. Далее настраиваем gitlab-runner, Deploy Token с правами read_repository и заполняем .gitlab-ci.yml.


Устанавливаем gitlab-runner на vpn сервере


apt install gitlab-runner -y

на сайте в настройках репозитория берем token Settings -> CI/CD -> Runners и регестрируем


sudo gitlab-runner register

указываем url сайта, вставляем токен, указываем executor: shell и не забываем поставить tag: vpn-01, если даже где-то ошиблись конфигурацию можно поправить /etc/gitlab-runner/config.toml.


Создадим deploy token, заходим в настройки репозитория Settings -> Repository -> Deploy Tokens создаем с правами read_repository


На vpn сервере добавим права для gitlab-runner и добавим в sudo


#1sudo usermod -a -G sudo gitlab-runner#2nano /etc/sudoers.d/gitlab-runner#3gitlab-runner  ALL=(ALL) NOPASSWD:/usr/bin/wg-quick,/usr/bin/git,/sbin/shorewall,/bin/cp,/bin/rm,/bin/cat,/bin/touch,/bin/chmod

Добавим побольше прав для папки /opt/git/


Переходим в репозиторий и открываем файл .gitlab-ci.yml на редактирование и вставляем следующие строчки


stages:   - alltask-all:  stage: all  script:     - sudo /bin/cp -f /etc/wireguard/wg0.sempl /opt/git/wg/wg0.conf    - sudo /usr/bin/wg-quick up wg0 || if [ $? -ne 0 ]; then echo "wg0 is up"; fi    - sudo /usr/bin/wg-quick down wg0     - sudo /bin/rm -rf /opt/git/vpn-01     - cd /opt/git     - sudo /usr/bin/git clone https://gitlab+deploy-token:<token>@gitlab.company.net/infra/vpn-01.git     - sudo /bin/rm -rf /etc/shorewall/rules_networks.d/*    - sudo /bin/rm -rf /etc/shorewall/rules_internet.d/*    - sudo /bin/cp -rf /opt/git/wgvpn-02/shorewall/* /etc/shorewall/     - sudo /bin/rm -rf /opt/git/wg/wg0.conf     - sudo /bin/cp /etc/wireguard/wg0.sempl /opt/git/wg/wg0.conf    - sudo /bin/chmod 0666 /opt/git/wg/wg0.conf    - sudo /bin/cat /opt/git/vpn-01/wireguard/wg0.conf >> /opt/git/wg/wg0.conf     - sudo /usr/bin/wg-quick up wg0     - sudo /sbin/shorewall reload     - sudo /usr/bin/wg-quick down wg0     - sleep 60 && sudo /usr/bin/wg-quick up wg0  tags:    - 'vpn-01'  allow_failure: true  when: manual

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


  • копируем шаблон конфигурации wg0, в отсутствии файла wg0.conf запущенный/выключенный интерфейс нельзя выключить или включить
  • запускаем интерфейс и добавляем условие вывода сообщения, что-бы при ошибке команды продолжали выполнятся
  • новые настройки интерфейса применяются только когда интерфейс wg0 выключен, тогда можно редактировать файл wg0.conf
  • удаляем папку vpn-01 и сразу клонируем свежию копию репозитория
  • очищаем папки с правилами доступа клиентов и копируем новые вместе с новыми файлами сервисов и переменных, вот здесь при перезапуске правил shorewall увидит измененные файлы и запустит очистку всех правил и потом применит новые
  • собираем wg0.conf из 2 частей, копируем часть настроек интерфейса с приватным ключем сервера и в конец файла вставляем список клиентов, тем самым делая файл полной конфигурации
  • при выключеном интерфейсе wg0 правила shorewall не смогут применится, поэтому включаем, применяем правила и выключаем интерфейс wg0
  • выключаем на 60 секунд, чтобы точно разорвать все установленные соединения, потому-что если есть правило ACCEPT и мы его убираем, то при применении правил без разрыва всех соединений канал клиента с сервером останется и доступ тоже

Запускаем CI/CD -> Pipelines, смотрим последний Commit и запускаем.


Не забываем выдать права кому на Merge Requests, а кому на Pull Requests.


На этом этапе мы уже полностью реализовали задуманное, но нужно идти до конца)


Сбор логов


Допустим по счастливай случайности так оказалось, что в нашей сети есть не только GitLab, но и Elasticsearch с Kibana. Реализуем пересылку и хранение логов в Elasticsearch.


Для начала на vpn сервере исправим значение на открытие файлов


nano /etc/security/limits.confroot soft nofile 65536root hard nofile 65536* soft nofile 65536* hard nofile 65536

После этого нужно будет перезагрузится


Устанавливаем на vpn сервер Fluentd


# td-agent 4curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-bionic-td-agent4.sh | sh

Добавим строчки в /etc/td-agent/td-agent.conf или сделаем в отдельном файле (тогда нужно будет включить файл в основной конфигурации)


'<source>  @type tail  path /opt/logs/shorewall/firewall.log  pos_file /var/log/td-agent/pos-firewall.pos  <parse>    @type syslog  </parse>  tag firewall.raw</source><match firewall.raw.**>    @type elasticsearch    host <server_ip>    port <server_port>    logstash_format true    logstash_prefix infra-vpn-01    flush_interval 10s    flush_thread_count 2</match>

По сути наш лог относится к syslog, поэтому мы его просматриваем и разбираем как syslog


Смотрим в кибану на результат



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


С Filebeat все еще проще. Устанавливаем на сервер.


#1wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -#2sudo apt-get install apt-transport-https#3sudo apt-get update && sudo apt-get install filebeat#4sudo systemctl enable filebeat

Включаем модуль iptables


filebeat modules enable iptables

Изменяем настройки в самом модуле


nano /etc/filebeat/modules.d/iptables.yml - module: iptables  log:    enabled: true    var.input: "file"    var.paths: ["/opt/logs/shorewall/firewall.log"]

И в файле /etc/filebeat/filebeat.yml добавляем наш Elasticsearch сервер


output.elasticsearch:  hosts: ["<ip_address>:9200"]

На последок хотел затронуть тему оптимизации Elasticsearch или как заставить Elasticsearch прожевать 7000 шард на одной ноде и не поперхнуться при характеристиках сервера RAM 10 Gb и vCPU 6.


На эту тему есть много материала и везде пишут одинаково, в файле /etc/security/limits.conf выставляем лимиты, добавляем в /etc/elasticsearch/jvm.options значение -Xms чуть больше половины RAM.


И допустим в лимитах у нас стоит значение


elasticsearch   -      nofile         200000elasticsearch    memlock 200000

или даже так


* soft nofile 265536* hard nofile 265536

и подкручен конфиг /etc/elasticsearch/elasticsearch.yml


cluster.max_shards_per_node: 15000xpack.ml.max_open_jobs: 100cluster.routing.allocation.node_initial_primaries_recoveries: 10thread_pool.search.queue_size: 100000thread_pool.search.max_queue_size: 150000thread_pool.search.size: 35thread_pool.search.auto_queue_frame_size: 10000

Но у нас все равно выскакивает индекс с ошибкой


"type" : "file_system_exception",   "reason" : "/mnt/elk/data/nodes/0/indices/SNMMbQeLRlW0y4Vi_V9L1Q/3/_state: Too many open files"

Тут дело в том что у службы свои лимиты и находятся они в /etc/systemd/system/elasticsearch.service.d/elasticsearch.conf или /etc/systemd/system/multi-user.target.wants/elasticsearch.service и здесь как раз накручиваем значения


LimitNOFILE=200000LimitNPROC=4096LimitAS=infinityLimitFSIZE=infinity

Перезапускаем службу/сервер и смотрим как 7000 шард расфасуются за несколько десятков минут.


Вот в принципе и все чем я хотел с вами поделится, задача поставлена весь процесс написан и вы можете спросить так в чем отказоустойчивость? А она в том, что вас никто не ограничивает в выборе места разворачивания сервера и количества серверов, можно сделать несколько независимых точек входа на разные сервера и каждый будет со своей конфигурацией, что бы это было отказоустойчивым делайте пользователям сразу как минимум 2 конфигурации и все.


На этом, пожалуй, и закончу.


Всем спасибо за внимание!


Используемые источники:


WireGuard https://www.wireguard.com


Shorewall https://shorewall.org


TightVNC https://www.tightvnc.com/download.php


GitLab runners https://docs.gitlab.com/ee/ci/runners/


Linux firewall log format http://www.stearns.org/doc/william_stearns_gcia.html#iptablesformat


Проверка регулярных выражений https://rubular.com/


Fluentd https://docs.fluentd.org/installation/before-install


Filebeat Iptables module https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-iptables.html

Подробнее..

Даже не пытайтесь повторить это в GUI

19.05.2021 10:20:52 | Автор: admin


Есть такое понятие, как дружественный пользователю Linux. Возникло оно оно очень давно, возможно через несколько минут после того, как Линус Торвальдс анонсировал свою разработку в листе comp.os.minix. Трудно сказать принесла-ли пользу данная концепция и различные её воплощения на рабочей станции. Понятно одно, что прогресс на этом пути довольно-таки ощутимо не совпадает с ожиданиями этого самого пользователя.

Возможно дело в том, что производители коммерческих дистрибутивов Linux и производители ПК стараются показать, что вполне реалистично использовать на рабочей станции Linux и при этом не использовать консоль в качестве основного инструмента управления ОС. Возможно, в будущем так и будет, но сегодня консоль на домашнем компьютере так же незаменима, как и на сервере и для этого есть веские основания.

Предлагаем рассмотреть несколько сценариев из реальной жизни, где хочешь не хочешь, все необходимо сделать в CLI. Таких примеров очень и очень много, это всего лишь пара кейсов в огромном множестве подобных.

Кейс 1 настройка пользовательского окружения


Большинство дистрибутивов Linux дают возможность графической установки ОС, которая для продвинутого пользователя Windows, или macOS не представляет из себя ничего сложного. Есть свидетельства в пользу того, что Ubuntu работает из коробки для пользователя, который впервые ставит Linux.

Однако дальше сразу возникает необходимость ручками внести правки в /etc/sudoers для того, чтобы пользователь имел права на исполнение sudo команд. Входить под учетной записью root в DE окружение не удастся, по умолчанию большинство Desktop Manager-ов отключают эту опцию. Придется вручную снимать эти ограничения в консольном режиме, вот и уловка 22. Остается visudo /etc/sudoers, или в крайнем случае vim /etc/sudoers из под супер пользователя.

Так выгладит моя правка файла.

|18:42:09|admin@srv:[~]> sudo diff /etc/sudoers /etc/sudoers.orig

85c85

< %wheel ALL=(ALL) NOPASSWD: ALL

---

> # %wheel ALL=(ALL) NOPASSWD: ALL


Нужно всего лишь отключить комментирование в соответствующей строке, после чего достаточно включить пользователя в группу wheel. Странно было бы это делать в графике, если можно запустить всего лишь gpasswd -a admin wheel из под пользователя root.

Но раз уж у нас есть права sudo надо уметь ими пользоваться. Самое первое для чего эти права понадобятся для установки и обновления программ. Можно конечно воспользоваться графическим фронтендом программ из репозитория, в конце концов даже Gentoo имеет GUI для своего portage. Однако ограниченность и второсортность этих средств настолько выпирают, что буквально подталкивают пользователя в сторону CLI.

Вы же не собираетесь вместо простого sudo aptitude update / sudo dnf update запускать графический фронтенд и беспомощно кататься вверх-вниз по списку пакетов. Если вы собираетесь оставаться на Linux всерьез и надолго, то необходимо освоить необходимый минимум консольных команд для вашего пакетного менеджера.

Чуть менее привычным делом является настройка шрифтов. Одной установкой шрифтов семейства Liberation, Noto, Dejavu и Droid дело не ограничивается. Нужно еще избавиться от использования древних шрифтов Microsoft из пакета corefonts. Проще всего их не ставить совсем, однако часто они проникают в систему, как зависимость для Wine, или других пакетов. В таком случае придется создать, или редактировать файл ~/.fonts.conf. Вот директива по избавлению от Arial.

<match target=pattern><test name=family qual=any><string>Arial</string></test><edit name=family binding=same mode=assign><string>Noto Sans</string></edit></match>

Хочу подчеркнуть, что проблема не в том, что используются шрифты Microsoft, а в том, что это очень старые версии их. Соответственно, на экране они выглядят не очень, мягко говоря. Только их и разрешено использовать в дистрибутивах Linux. Можно делать это в графическом редакторе, но файлы с точкой в начале имени придется хитрым способом открывать во встроенном файловом менеджере каждый раз, а это неудобно.

Кроме того, возможно придется шаманить с симлинками в /usr/share/fonts, или в /etc/fonts для того, чтобы избавиться от ШГ. Так что лучше сразу все делать в командной строке. На самом деле тут многие сходят с дистанции, стараясь как можно дольше делать все с помощью графических приложений, через какое-то время ломаются обновления, слетают драйвера и все катится в тартарары.

Этого нельзя допустить, поэтому сразу переходим к следующему этапу необходимости освоить консольный текстовый редактор: vim, emacs, или их клоны. Поверьте не стоит привязываться к простеньким nano, или mcedit, в которых даже undo еще не завезли. Освоив эти редакторы вы спокойно можете редактировать конфигурационные файлы в /etc, $HOME и получить надежный контроль над системой.

Кейс 2 настроить сетевое окружение в офисе


Сейчас с NetworkManager настраивать сети стало намного проще, а раньше для настройки беспроводного соединения обязательно нужно было редактировать файл wpa_supplicant.conf. Однако и сегодня функционал NetworkManager во многом пока еще ограничен. Например в нем нельзя подключиться к vpn по протоколу Juniper Pulse с двухфакторной аутентификацией только CLI.

|18:29:57|admin@srv:[~]> sudo openconnect --protocol=pulse \--authgroup ТOTP -u jsmith https://my.company-gateway.com

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

Берем важные подсети главной сети и прописываем их статистическим маршрутом.

sudo ip route add 110.10.0.0/8 via 110.10.10.1;

После чего подключаемся ко второстепенной сети и остальной трафик направляем через нее. Так как метрика главной сети меньше в абсолютном значении, у нее приоритет выше и при двух параллельных default route трафик все же упорно идет через нее. Так как поменять метрику маршрута нельзя, проще удалить ненужный default route.

sudo ip route delete default dev eth0;

Для одного раза достаточно запустить эти две команды, но каждый день так подключаться неудобно, надо это автоматизировать. Для этого нужно создать скрипт в папке /etc/NetworkManager/dispatcher.d/.

|17:43:17|admin@srv:[~]> ls /etc/NetworkManager/dispatcher.d/10-openrc-status no-wait.d pre-down.d pre-up.d|17:43:22|admin@srv:[~]> cd /etc/NetworkManager/dispatcher.d/pre-up.d|17:43:27|admin@srv:[~]> sudo chmod +x 10-office-netw.sh

Скрипты, которые следует выполнить перед активацией сетевого соединения должны находиться в pre-up.d. Соответственно, скрипты на случай отключения сетевого соединения следует класть в pre-down.d. Названия могут быть произвольные, если скриптов несколько, то они будут выполняться в алфавитном порядке.

#!/bin/bashif [ $1 == eth0 ] && [ $2 == up ]; thenip route add 110.10.0.0/8 via 110.10.10.1ip route delete default dev eth0#более высокая метрика, чтобы быть ниже основного gw в ip routeip route add default dev eth0 metric 700fi

Объективности ради надо сказать, что директивы ip route add можно реализовать из интерфейса NetworkManager в свойствах в закладке соединения IPv4 => Routes.

Кейс 3 поднять Wireguard VPN


Буквально каждый день мы получаем новые доказательство в пользу того, что неплохо бы обзавестись собственным VPN решением. Сегодня под запретом торренты, зарубежные букмекерские сайты, завтра решат ограничить социальные сети и онлайн-библиотеки, а затем и новостные ресурсы кому-то не понравятся. Благо технологии тоже не стоят на месте и при соответствующих навыках можно за 15 минут настроить Wireguard VPN и обходить все нелепые ограничения. Самое главное наличие Linux сервера с внешним, т е не российским IP адресом.

Вся настройка происходит исключительно с использование CLI и текстовых конфигурационных файлов. Это не полноценный гайд по настройке, так как весь процесс состоит из следующих этапов.

  1. Установить пакет утилит Wireguard.
    aptitude install wireguard-tools
  2. Установить kernel-headers для более ранних версий ядра.
    aptitude install linux-headers
  3. Открыть наружу связующий UDP порт (в нашем примере 51820) с управляющей консоли сервиса виртуального сервера.
  4. Создать открытый и закрытый ключи для Wireguard на клиенте и сервере.
    umask 077; wg genkey | tee privatekey | wg pubkey > publickey
  5. Создать конфигурационный файл в /etc/wireguard.
  6. Проверить наличие L2 соединения.
    wg show, если есть нечто вроде transfer: 4.80 MiB received, 1833.04 KiB sent, то это хороший признак.
  7. Подключить IP Forwarding с помощью sysctl -w net.ipv4.ip_forward=1 и прописать в /etc/sysctl.conf, если этого еще не было сделано.
  8. Настроить маршрутизацию трафика и NAT masquerade.

На самом деле в терминологии Wireguard участники сетевого соединения именуются не клиент и сервер, а peers равные. Однако на деле, все же один из узлов выполняет функцию именно сервера, поэтому логичнее их так и именовать для данного кейса.

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

#client config[Interface]PrivateKey = uJPzgCQ6WNlAUp3s5rabE/EVt1qYh3Ym01sx6oJI0V4Address = 192.168.10.2/24[Peer]PublicKey = qdjdqh2pN3DEMDUDRob8K3bp9BZFJbT59fprBrl99zMAllowedIPs = 0.0.0.0/0Endpoint = 172.105.211.120:51820PersistentKeepalive = 20

Любая неточность в каждом из перечисленных пунктов, кроме проверки OSI L2 соединения приведет к сбою в работе VPN туннеля, но при необходимой сноровке все можно сделать быстро и точно.

#server conifg[Interface]Address = 192.168.10.1/24ListenPort = 51820PrivateKey = eEvqkSJVw/7cGUEcJXmeHiNFDLBGOz8GpScshecvNHUSaveConfig = true[Peer]PublicKey = 2H8vRWKCrddLf8vPwwTLMfZcRhOj10UBdc0j8W7yQAk=AllowedIPs = 192.168.10.2/32

В некоторых примерах AllowedIPs клиента бывает выставлен на внутренний туннельный IP адрес сервера непонятно зачем. Тогда только запросы на этот IP адрес и будут разрешены, если же выставить 0.0.0.0/0 то весь трафик пойдет через Wireguard VPN. Также Endpoint клиента обязательно должен указывать на внешний IP адрес сервера.

Остается настроить NAT masquerade для того, чтобы Wireguard сервер мог осуществлять маршрутизацию трафика в NAT среде.

#IPv4[root@wgsrv ~]$ iptables -A FORWARD -i wg0 -j ACCEPT[root@wgsrv ~]$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE#IPv6[root@wgsrv ~]$ ip6tables -A FORWARD -i wg0 -j ACCEPT[root@wgsrv ~]$ ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE#NAT[root@wgsrv ~]$ iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE

После чего надо сохранить правила в базе iptables, или netfilter. Также и сервис wg-quick, заведующий VPN туннелем Wireguard, необходимо добавить в автозагрузку.

[root@wgsrv ~]$ systemctl enable wg-quick@wg0[root@wgsrv ~]$ systemctl netfilter-persistent save[root@wgsrv ~]$ systemctl enable netfilter-persistent

Заключение


Надеюсь приведенных примеров достаточно для того, чтобы показать насколько необходимо умение работать с CLI и насколько проще выполнять основные действия по системному администрированию даже для домашней рабочей станции с Linux OS.



Облачные серверы от Маклауд быстрые и безопасные.

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Подробнее..

Mikrotik (RouterOS) Wireguard

30.09.2020 22:05:00 | Автор: admin

Вступление

Один из способом сделать доступным некоторые внутренние (домашние) сервисы из Интернета является VPN. Можно, конечно, отдельные порты опубликовать и через ssh, но для более полноценной связи лучше использовать другие решения. Я уже писал и про ZeroTier, и про OpenVPN, и получил упреки, что незаслуженно забыл про Wireguard

Так или иначе, мне стало не хватать VPN клиента (в т.ч. и Wireguard) на отдельно стоящем серверочке, потребовалось связать (в данном случае с vNet в Azure, хотя это не принципиально) всю домашнюю сеть с несколькими ресурсами. И я решил, что пора уже сделать это через роутер, для полноценного site-to-site.

Хотя Keenetic и научился поддерживать Wireguard на новых прошивках, для старенькой Ultra я такой не нашел. С OpenWRT тоже не срослось (для Ultra II есть, а моя моедль старовата). Так что я решил, что пора проапгрейдиться. И, поскольку Mikrotik RouterOS выкатила бету 7 версии с Wireguard, я решил, что пора изучить это чудо.

Действительность оказалась несколько сложнее, чем я рассчитывал, однако все получилось. И сейчас опишу основные моменты, которые нигде не смог найти, и до которых пришлось доходить самому.

Основные моменты

Взял я MikroTik hAP ac2. Модель старая, без излишеств, но все, что нужно, делает.

Хотя дела с Микротиками я раньше не имел, запустил его достаточно быстро. Были некоторые сложности с тем, что в настройке DHCP Server недостаточно установить Network, чтобы IP адреса начали раздаваться из этой сети. Оказалось, что есть еще и отдельный IP Pool. Но это мелочи. Так что довольно быстро я приступил к настройкам именно Wireguard.

Конечно же, ничего не заработало. Более того, на той стороне я даже не видел входящих пакетов.

Потом уже я обратил внимание, что в поле Endpoint указан только IP адрес, но отсутствует порт. Попробовал указать его явно, но обломался. Поле становится красным и не проходит валидацию.

Пошел разбираться с командной строкой. Для меня, в первый раз увидевшего RouterOS, там, конечно, не сахар. Более-менее, разобрался, конечно. Но как узнать, какие вообще параметры имеются, так и не понял. Ну т.е. до /interface wireguard peers я добрался. Даже про add догадался. Только вот при этом система спрашивала только interface, public-key и allowed-address. В общем, всякими переборами подобрал команду:

add allowed-address=192.168.66.128/25,10.10.0.0/16 endpoint=66.166.166.42:51820 \interface=wg0 persistent-keepalive=30 public-key="многобукв="

Т.е. порт можно указать только через командную строку. Впрочем, все равно не заработало.

Напомню, что wg0 был создан ранее через web-интерфейс. Или WinBox, не помню. Он чуток получше, чем веб-интерфейс, но порт тоже не давал указать. И тут до меня дошло, что на обычном Linux я ведь еще IP адрес своего локального хоста указываю. А тут его не задавал. Заработало только после:

/ip addressadd address=192.168.66.253/24 interface=wg0 network=192.168.66.0

Собственно все :) В сети есть инструкции, как установить Wireguard на Mikrotik с OpenWRT. Но как по мне, это извращение. А вот поднять его в родном RouterOS можно за несколько минут. Когда уже знаешь, как. Работает прекрасно, вообще без нареканий.

P.S. Адреса я, конечно, менял. Но allowed-address=192.168.66.128/25 и add address=192.168.66.253/24 не ошибка. Просто у меня к двум серверам подключение. Половина сети класса С на один сервер, половина на другой.

P.P.S. Почему Wireguard, а не OpenVPN? Например, производительность:

https://blog.entrostat.com/openvpn-vs-wireguard-network-performance-tests/

А еще простота настройки и кое-что по мелочи.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru