WireGuard - чудовий VPN майбутнього?

WireGuard - чудовий VPN майбутнього?

Настав час, коли VPN не є якимось екзотичним інструментом бородатих сисадмінів. Завдання у користувачів різні, але факт у тому, що VPN став потрібен взагалі всім.

Проблема поточних VPN рішень у тому, що їх важко правильно налаштувати, дорого обслуговувати, а також у них повно legacy коду сумнівної якості.

Декілька років тому канадський фахівець з інформаційної безпеки Jason A. Donenfeld вирішив, що вистачить це терпіти, і почав роботу над WireGuard. Зараз WireGuard готується до включення до складу ядра Linux, він навіть отримав похвали від Лінус Торвальдс і в американському сенаті.

Заявлені переваги WireGuard над іншими VPN рішеннями:

  • Простий у використанні.
  • Використовує сучасну криптографію: Noise protocol framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF і т.д.
  • Компактний код, що читається, простіше досліджувати на вразливості.
  • Висока продуктивність.
  • Чітка та опрацьована специфікація.

Невже знайдено срібну кулю? OpenVPN і IPSec час закопувати? Я вирішив з цим розібратися, а заразом зробив скрипт для автоматичного встановлення особистого VPN сервера.

Принципи роботи

Принципи роботи можна описати приблизно так:

  • Створюється WireGuard інтерфейс, йому призначається приватний ключ і адресу IP. Завантажуються налаштування інших бенкетів: їх публічні ключі, IP-адреси і т.д.
  • Всі IP пакети, що приходять на WireGuard інтерфейс, інкапсулюються в UDP і безпечно доставляються іншим бенкетам.
  • Клієнти задають публічну IP-адресу сервера в налаштуваннях. Сервер автоматично дізнається зовнішні адреси клієнтів, коли від них надходять коректно автентифіковані дані.
  • Сервер може змінювати публічну IP-адресу не перериваючи роботи. При цьому він відішле оповіщення підключеним клієнтам, і вони оновлять свою конфігурацію на льоту.
  • Використовується концепт маршрутизації Cryptokey Routing. WireGuard приймає та відправляє пакети на підставі публічного ключа бенкету. Коли сервер розшифровує коректно автентифікований пакет, перевіряється його поле src. Якщо вона відповідає конфігурації allowed-ips автентифікованого бенкету, то пакет приймається інтерфейсом WireGuard. При відправці вихідного пакета відбувається відповідна процедура: береться dst поле пакета і вибирається відповідний бенкет, пакет підписується своїм ключем, шифрується ключем бенкету і відправляється на remote endpoint.

Вся основна логіка WireGuard займає менше 4 тисяч рядків коду, тоді як OpenVPN та IPSec мають сотні тисяч рядків. Для підтримки сучасних криптоалгоритмів пропонується включити до складу ядра Linux новий криптографічний API цинк. Наразі йде обговорення, наскільки це вдала ідея.

Продуктивність

Максимальна перевага у продуктивності (порівняно з OpenVPN та IPSec) буде помітна на Linux системах, оскільки там WireGuard реалізований у вигляді модуля ядра. Крім цього підтримуються macOS, Android, iOS, FreeBSD і OpenBSD, але в них WireGuard виконується в userspace з усіма наслідками для продуктивності. Підтримку Windows обіцяють додати найближчим часом.

Результати бенчмарків з офіційного сайту:

WireGuard - чудовий VPN майбутнього?

Мій досвід використання

Я не експерт з налаштування VPN. Якось налаштовував OpenVPN ручками і це було дуже моторошно, а IPSec навіть не намагався. Занадто багато рішень потрібно ухвалювати, дуже легко вистрілити собі в ногу. Тому я завжди користувався готовими скриптами для налаштування сервера.

Так ось, WireGuard, на мій погляд, взагалі ідеальний для користувача. Усі низькорівневі рішення прийняті у специфікації, тому процес підготовки типової VPN інфраструктури займає лише кілька хвилин. Нафакапити у конфігурації практично неможливо.

Процес установки детально описаний на офіційному сайті, окремо хочеться відзначити відмінну підтримку OpenWRT.

Генеруються ключі шифрування утилітою wg:

SERVER_PRIVKEY=$( wg genkey )
SERVER_PUBKEY=$( echo $SERVER_PRIVKEY | wg pubkey )
CLIENT_PRIVKEY=$( wg genkey )
CLIENT_PUBKEY=$( echo $CLIENT_PRIVKEY | wg pubkey )

Далі, потрібно створити серверний конфіг /etc/wireguard/wg0.conf з наступним змістом:

[Interface]
Address = 10.9.0.1/24
PrivateKey = $SERVER_PRIVKEY
[Peer]
PublicKey = $CLIENT_PUBKEY
AllowedIPs = 10.9.0.2/32

і підняти тунель скриптом wg-quick:

sudo wg-quick up /etc/wireguard/wg0.conf

У системах з systemd натомість можна використовувати sudo systemctl start [email protected].

На клієнтській машині, створити конфіг /etc/wireguard/wg0.conf:

[Interface]
PrivateKey = $CLIENT_PRIVKEY
Address = 10.9.0.2/24
[Peer]
PublicKey = $SERVER_PUBKEY
AllowedIPs = 0.0.0.0/0
Endpoint = 1.2.3.4:51820 # Внешний IP сервера
PersistentKeepalive = 25 

І так само підняти тунель:

sudo wg-quick up /etc/wireguard/wg0.conf

Залишилося налаштувати NAT на сервері, щоб клієнти могли виходити до Інтернету, і все готове!

Такої простоти використання та компактності кодової бази вдалося досягти за рахунок відмови від функціоналу дистрибуції ключів. Тут немає складної системи сертифікатів і всього цього корпоративного страху, короткі ключі шифрування поширюються приблизно як ключі SSH. Але у зв'язку з цим виникає проблема: WireGuard не так просто впроваджуватиме в деяких вже існуючих мережах.

З недоліків варто відзначити, що WireGuard не запрацює через HTTP proxy, оскільки як транспорт є тільки протокол UDP. Виникає питання, чи можливо обфусуватиме протокол? Звичайно, це не пряме завдання VPN, але для OpenVPN, наприклад, є способи маскування під HTTPS, що допомагає жителям тоталітарних країн повноцінно користуватися Інтернетом.

Висновки

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

Для економії свого (і вашого) часу я розробив автоматичний установник WireGuard. З його допомогою можна підняти власний VPN для себе і своїх знайомих навіть нічого в цьому не розуміючи.

Джерело: habr.com

Додати коментар або відгук