WireGuard «придет» в ядро Linux — почему?

В конце июля разработчики VPN-туннеля WireGuard предложили набор патчей, которые сделают их ПО для организации VPN-туннелей частью ядра Linux. Однако точная дата реализации «задумки» пока остается неизвестной. Под катом поговорим об этом инструменте подробнее.

fxkzzcbbuj_t6v-lbx8hmb8bocu.jpeg
/ фото Tambako The Jaguar CC

Кратко о проекте


WireGuard — VPN-туннель нового поколения, созданный Джейсоном Доненфельдом (Jason A. Donenfeld), главой компании Edge Security. Проект разрабатывался как упрощенная и шустрая альтернатива OpenVPN и IPsec. Первая версия продукта содержала всего 4 тыс. строк кода. Для сравнения, в OpenVPN порядка 120 тыс. строк, а в IPSec — 420 тыс.

По словам разработчиков, WireGuard несложно настроить, а безопасность протокола достигается за счет проверенных криптографических алгоритмов. При смене сети: Wi-Fi, LTE или Ethernet нужно каждый раз переподключаться к VPN-серверу. Серверы WireGuard же не разрывают соединение, даже если пользователь получил новый IP-адрес.

Несмотря на то что WireGuard изначально заточен под Linux-ядро, разработчики позаботились и о портативной версии инструмента для Android-устройств. Приложение пока недоработано, однако попробовать его в деле можно уже сейчас. Для этого нужно стать одним из тестеров.

В целом WireGuard пользуется довольно большой популярностью и даже был реализован несколькими VPN-провайдерами, например Mullvad и AzireVPNВ. В сети опубликовано большое количество руководств по настройке этого решения. Например, есть гайды, которые создают пользователи, а есть гайды, подготовленные авторами проекта.

Технические подробности


В официальной документации (стр. 18) отмечено, что пропускная способность у WireGuard в четыре раза выше, чем у OpenVPN: 1011 Мбит/с против 258 Мбит/с соответственно. WireGuard опережает и стандартное решение для Linux IPsec ― у того 881 Мбит/с. Превосходит он его и по простоте настройки.

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

-c2mnd3bfapgmgm5u7svoxpip54.jpeg
/ фото Anders Hojbjerg CC

Для установки понадобится дистрибутив с ядром Linux «старше» 4.1. Его можно найти в репозиториях основных дистрибутивов Linux.

$ sudo add-apt-repository ppa:hda-me/wireguard
$ sudo apt update
$ sudo apt install wireguard-dkms wireguard-tools


Как отмечают редакторы xakep.ru, самостоятельная сборка из исходных текстов также несложна. Достаточно поднять интерфейс и сгенерировать открытый и закрытый ключи:

$ sudo ip link add dev wg0 type wireguard
$ wg genkey | tee privatekey | wg pubkey > publickey


WireGuard не использует интерфейс для работы с криптопровайдером CryptoAPI. Вместо него, используется поточный шифр ChaCha20, криптографическая имитовставка Poly1305 и собственные криптографические хеш-функции.

Секретный ключ генерируется с применением протокола Диффи — Хеллмана на базе эллиптической кривой Curve25519. При хешировании задействуются хеш-функции BLAKE2 и SipHash. За счет формата меток времени TAI64N протокол отбрасывает пакеты с меньшим значением timestamp, тем самым предотвращая DoS- и replay-атаки.

При этом WireGuard задействует функцию ioctl для контроля ввода/вывода (раньше использовался Netlink), что делает код чище и проще. Убедиться в этом можно, заглянув в код конфигурации.

Планы разработчиков


Пока что WireGuard — это out-of-tree модуль ядра. Но автор проекта Джейсон Доненфельд говорит, что уже настало время для полноценной реализации в ядре Linux. Так как он проще и надежнее других решений. Джейсона в этом плане поддерживает даже сам Линус Торвальдс — он назвал код WireGuard «произведением искусства».

Но о точных датах внедрения WireGuard в ядро пока никто не говорит. И едва ли это случится с выходом августовского Linux kernel 4.18. Однако есть вероятность, что это произойдет в самом ближайшем будущем: в версии 4.19 или 5.0.

Когда WireGuard будет добавлен в ядро, разработчики хотят доработать приложение для Android-устройств и начать писать приложение под iOS. Кроме того, планируется завершить реализации на Go и Rust и портировать их на macOS, Windows и BSD. Также планируется реализация WireGuard для более «экзотических систем»: DPDK, FPGA, а также множество других занятных вещей. Все они перечислены в to-do-списке авторов проекта.

P.S. Ещё несколько статей из нашего корпоративного блога:


P.P. S. Другие наши материалы из блога на Хабре:

© Habrahabr.ru