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 цынк. Цяпер ідзе абмеркаванне, наколькі гэта ўдалая ідэя.

Proizvoditelnost

Максімальная перавага ў прадукцыйнасці (у параўнанні з 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 проксі, паколькі ў якасці транспарта ёсць толькі пратакол UDP. Узнікае пытанне, ці магчыма будзе абфусцыраваць пратакол? Вядома, гэта не прамая задача VPN, але для OpenVPN, напрыклад, існуюць спосабы маскіроўкі пад HTTPS, што дапамагае жыхарам таталітарных краін паўнавартасна карыстацца Інтэрнетам.

Высновы

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

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

Крыніца: habr.com

Дадаць каментар