Технологии VPN редко становятся объектами пристального внимания: есть и есть. Создатель Wireguard Jason A. Donenfeld оказался везунчиком после нетипичной для Линуса Торвальдса резко хвалебной оценки качества кода.
Can I just once again state my love for it and hope it gets merged soon? Maybe the code isn’t perfect, but I’ve skimmed it, and compared to the horrors that are OpenVPN and IPSec, it’s 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. Благо все, что для этого нужен
Но и другие подобные тесты показывают превосходство 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-tools
These 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/64
SaveConfig = true
ListenPort = 51820
PrivateKey = 2JtKAUFzecmgIVzbscQh3iUZrZanxIzvbejcIkvC5Hk= #PEER_A_PRIVATE_KEY
[Peer]
PublicKey = rgqd1cHKgRWX3IkYYSlrKA/SW3qZUhSJMqwTq4+3eFs= #PEER_B_PUBLIC_KEY
PresharedKey = PEER_A-PEER_B-PRESHARED_KEY
AllowedIPs = 10.0.0.2/32, fdc9:1f28:04d7:9ee9::2/128
Endpoint = 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.
Ну а какой VPS брать под VPN вы и так знаете.
Автор: ruvds