
Времето, когато 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 приема и изпраща пакети на базата на публичния ключ на пира. Когато сървърът разшифрова коректно удостоверения пакет, проверява se поле src. Ако то съответства на конфигурацията на
allowed-ipsудостоверения пи, пакетът се приема от интерфейса на WireGuard. При изпращане на изходящ пакет се извършва съответна процедура: взима се поле dst на пакета и на базата на него се избира съответния пир, пакетът се подписва с неговия ключ, шифрова се с ключа на пира и се изпраща на remote endpoint.
Цялата основна логика на WireGuard заема по-малко от 4000 реда код, докато OpenVPN и IPSec имат стотици хиляди реда. За поддръжка на съвременни криптографски алгоритми се предлага в ядрото на Linux да бъде включен нов криптографски API. В момента се обсъжда колко добра е тази идея.
Производителност
Максималното предимство в производителността (в сравнение с 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
