
Времето настъпи, когато VPN вече не е екзотичен инструмент за сисадмини с дълги бради. Потребностите на потребителите са различни, но фактът е, че VPN стана необходим за всички.
Проблемът с актуалните VPN решения е, че е трудно да се настроят правилно, скъпи са за поддръжка и са пълни с остарял код от съмнително качество.
Преди няколко години канадският специалист по информационна сигурност Jason A. Donenfeld реши, че е време да се сложи край на това и започна работа по . В момента WireGuard се подготвя за включване в ядрото на Linux и дори получи признание от и в .
Обявените предимства на WireGuard пред други VPN решения:
- Лесен за използване.
- Използва съвременна криптография: Noise protocol framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF и т.н.
- Компактен разбираем код, по-лесно за проучване за уязвимости.
- Висока производителност.
- Ясно и обмислено .
Дали не е намерен сребърен куршум? Време е да погребем OpenVPN и IPSec? Реших да се запозная с това, а също така направих .
Принципи на работа
Принципите на работа могат да бъдат описани приблизително така:
- Създава се интерфейс на WireGuard, на който се назначава частен ключ и IP адрес. Зареждат се настройки на други пиринги: техните публични ключове, IP адреси и т.н.
- Всички IP пакети, постъпващи на интерфейса на WireGuard, се инкапсулират в UDP и на другите пиринги.
- Клиентите задават публичния IP адрес на сървера в настройките. Сървърът автоматично разпознава външните адреси на клиентите, когато получи правилно удостоверени данни от тях.
- Сървърът може да променя публичния IP адрес, без да прекъсва работата. При това той ще изпрати уведомление на свързаните клиенти и те ще актуализират конфигурацията си в движение.
- Използва се концепцията за маршрутизация . WireGuard приема и изпраща пакети на основание на публичния ключ на пира. Когато сървърът дешифрира правилно удостоверен пакет, се проверява полето src. Ако то съответства на конфигурацията за
allowed-ipsна удостоверения пир, пакетът се приема от интерфейса на WireGuard. При изпращане на изходящ пакет следва съответната процедура: взема се полето dst на пакета и на основание на него се избира съответстващият пир, пакетът се подписва с неговия ключ, шифрува се с ключа на пира и се изпраща на отдалечения край.
Цялата основна логика на WireGuard заема по-малко от 4 хиляди реда код, докато OpenVPN и IPSec имат стотици хиляди реда. За поддръжка на съвременни криптоалгоритми се предлага да бъде включен нов криптографски API в ядрото на Linux. . В момента тече обсъждане относно колко удачна е тази идея.
Производителност
Максималното предимство в производителността (в сравнение с OpenVPN и IPSec) ще бъде забележимо в Linux системи, тъй като там WireGuard е реализиран като модул на ядрото. Освен това се поддържат macOS, Android, iOS, FreeBSD и OpenBSD, но в тях WireGuard работи в userspace със съответстващите последствия за производителността. Поддръжката на Windows се очаква да бъде добавена в близко бъдеще.
Резултатите от бенчмарковете с :

Моят опит с използването на
Не съм експерт по настройка на VPN. Веднъж конфигурирах OpenVPN ръчно и беше много трудоемко, а IPSec дори не съм опитвал. Твърде много решения трябва да се вземат, много е лесно да си направиш проблем. Затова винаги съм ползвал готови скриптове за настройка на сървър.
Така че, WireGuard, от моя гледна точка, е напълно идеален за потребителя. Всички нискоуровневи решения са записани в спецификацията, така че процесът на подготовка на типичната VPN инфраструктура отнема само няколко минути. Практически е невъзможно да направиш грешка в конфигурацията.
Процес на инсталация на официалния сайт, отделно искам да подчертая отличната .
Генерират се ключове за криптиране с помощта на 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 wg-quick@wg0.service.
На клиентската машина, създай конфигурация /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 прокси, тъй като транспортният протокол е само UDP. Въпросът е, дали е възможно да се обфускира протоколът? Разбира се, това не е пряка задача на VPN, но за OpenVPN, например, съществуват методи за маскировка под HTTPS, което помага на жителите на тоталитарни страни да ползват Интернет пълноценно.
Изводи
В заключение, това е един много интересен и перспективен проект, който може да се използва и на лични сървъри в момента. Какви са ползите? Висока производителност на Linux системи, лесно настройване и поддръжка, компактна и четима кодова база. Все пак е рано да се премине изцяло на WireGuard, нужно е да изчакаме интеграцията му в ядрото на Linux.
С цел икономия на време (вашето и моето) разработих . С него можете да настроите личен VPN за себе си и вашите познати дори без да разбирате нищо по темата.
Източник: habr.com
