Технологии VPN редко изучаются глубоко: есть и есть. Изобретателю Wireguard Джейсону А. Доненфельду повезло после того, как Линус Торвальдс похвалил его за качество кода, а вскоре после этого 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 Derby автора Wireguard. Вот некоторые подробности и результаты измерений.
- Технологии — IPSEC, OpenVPN и Wireguard;
- Процессоры IntelCore i7-3820QM и Intel Core i7-5200U;
- Сетевые карты — Intel 82579LM и Intel I218LM gigabit Ethernet;
Сравнение производительности различных VPN со стороны Jason A. Donenfeld-а
Как в тестах пропускной способности, так и в тестах отклика на пинг Wireguard значительно превзошел OpenVPN, а также два варианта IPSec. Кроме того, во время теста пропускной способности с использованием OpenVPN и IPSec загрузка ЦП достигла 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-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;
Что касается безопасности, оба протокола могут многое предложить: высокозащищенные шифры и 256-битное шифрование. Однако, если не будут предприняты шаги, гарантирующие, что WireGuard может использовать TCP и порт 443 без обходных путей, сетевому администратору будет намного проще заблокировать их, чем OpenVPN, который может использовать как UDP, так и TCP, и порт 443.