WireGuard ื•ื•ืขื˜ "ืงื•ืžืขืŸ" ืฆื• ื“ื™ ืœื™ื ื•ืงืก ืงืขืจืŸ - ื•ื•ืึธืก?

ืื™ืŸ ื“ื™ ืกื•ืฃ ืคื•ืŸ ื™ื•ืœื™, ื“ื™ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืคื•ืŸ ื“ื™ WireGuard VPN ื˜ื•ื ืขืœ ืคืืจื’ืขืœื™ื™ื’ื˜ ืœืึทื˜ืข ืฉื˜ืขืœืŸ, ื•ื•ืึธืก ื•ื•ืขื˜ ืžืึทื›ืŸ ื–ื™ื™ืขืจ ื•ื•ืคึผืŸ ื˜ืึทื ืึทืœื™ื ื’ ื•ื•ื™ื™ื›ื•ื•ืืจื’ ื˜ื™ื™ืœ ืคื•ืŸ ื“ื™ ืœื™ื ื•ืงืก ืงืขืจืŸ. ืึธื‘ืขืจ, ื“ื™ ืคึผื™ื ื˜ืœืขืš ื“ืึทื˜ืข ืคื•ืŸ โ€‹โ€‹ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ "ื’ืขื“ืื ืง" ื‘ืœื™ื™ื‘ื˜ ืื•ืžื‘ืึทืงืึทื ื˜. ื•ื ื˜ืขืจ ื“ืขืจ ื“ื•ืจื›ืฉื ื™ื˜ ืžื™ืจ ื•ื•ืขืœืŸ ืจืขื“ืŸ ื•ื•ืขื’ืŸ ื“ืขื ื’ืขืฆื™ื™ึทื’ ืื™ืŸ ืžืขืจ ื“ืขื˜ืึทืœ.

WireGuard ื•ื•ืขื˜ "ืงื•ืžืขืŸ" ืฆื• ื“ื™ ืœื™ื ื•ืงืก ืงืขืจืŸ - ื•ื•ืึธืก?
/ ืคืึธื˜ืึธ ื˜ืึทืžื‘ืึทืงืึธ ื“ื™ ื“ื–ืฉืึทื’ื•ืึทืจ CC

ื‘ืขืงื™ืฆืขืจ ื•ื•ืขื’ืŸ ื“ืขื ืคึผืจื•ื™ืขืงื˜

WireGuard ืื™ื– ืึท ื•ื•ื™ื™ึทื˜ืขืจ-ื“ื•ืจ ื•ื•ืคึผืŸ ื˜ื•ื ืขืœ ื‘ืืฉืืคืŸ ื“ื•ืจืš Jason A. Donenfeld, ืกืขืึธ ืคื•ืŸ Edge Security. ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื™ื– ื“ืขื•ื•ืขืœืึธืคึผืขื“ ื•ื•ื™ Simplified ืื•ืŸ ืึท ืฉื ืขืœ ืื ื“ืขืจ ื‘ืจื™ืจื” ืฆื• OpenVPN ืื•ืŸ IPsec. ื“ืขืจ ืขืจืฉื˜ืขืจ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืคึผืจืึธื“ื•ืงื˜ ืงืึทื ื˜ื™ื™ื ื“ ื‘ืœื•ื™ื– 4 ื˜ื•ื™ื–ื ื˜ ืฉื•ืจื•ืช ืคื•ืŸ ืงืึธื“. ืคึฟืึทืจ ืคืึทืจื’ืœื™ื™ึทืš, OpenVPN ื”ืื˜ ื•ื•ืขื’ืŸ 120 ื˜ื•ื™ื–ื ื˜ ืฉื•ืจื•ืช ืื•ืŸ IPSec - 420 ื˜ื•ื™ื–ื ื˜.

ืื•ื™ืฃ ืœื•ื™ื˜ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก, WireGuard ืื™ื– ื’ืจื™ื ื’ ืฆื• ืงืึทื ืคื™ื’ื™ืขืจ ืื•ืŸ ืคึผืจืึธื˜ืึธืงืึธืœ ื–ื™ื›ืขืจื”ื™ื™ื˜ ืื™ื– ืึทื˜ืฉื™ื•ื•ื“ ื“ื•ืจืš ืคึผืจืึธื•ื•ืขืŸ ืงืจื™ืคึผื˜ืึธื’ืจืึทืคื™ืง ืึทืœื’ืขืจื™ื“ืึทืžื–. ื•ื•ืขืŸ ื˜ืฉืึทื ื’ื™ื ื’ ื ืขืฅ: Wi-Fi, LTE ืึธื“ืขืจ ืขื˜ื”ืขืจื ืขื˜ ื“ืึทืจืคึฟืŸ ืฆื• ืจื™ืงืึทื ืขืงื˜ ืฆื• ื“ื™ ื•ื•ืคึผืŸ ืกืขืจื•ื•ืขืจ ื™ืขื“ืขืจ ืžืึธืœ. WireGuard ืกืขืจื•ื•ืขืจืก ื˜ืึธืŸ ื ื™ื˜ ืคืึทืจืขื ื“ื™ืงืŸ ื“ื™ ืงืฉืจ, ืืคื™ืœื• ืื•ื™ื‘ ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ื”ืื˜ ื‘ืืงื•ืžืขืŸ ืึท ื ื™ื™ึทืข IP ืึทื“ืจืขืก.

ื˜ืจืึธืฅ ื“ืขื ืคืึทืงื˜ ืึทื– WireGuard ืื™ื– ืขืจื™ื“ื–ืฉื ืึทืœื™ ื“ื™ื–ื™ื™ื ื“ ืคึฟืึทืจ ื“ื™ ืœื™ื ื•ืงืก ืงืขืจืŸ, ื“ื™ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ื’ืขื ื•ืžืขืŸ ื–ืึธืจื’ืŸ ืคื•ืŸ ืื•ืŸ ื•ื•ืขื’ืŸ ืึท ืคึผืึธืจื˜ืึทื˜ื™ื•ื• ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ื’ืขืฆื™ื™ึทื’ ืคึฟืึทืจ ืึทื ื“ืจื•ื™ื“ ื“ืขื•ื•ื™ืกืขืก. ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ื– ื ืึธืš ื ื™ืฉื˜ ื’ืึธืจ ื“ืขื•ื•ืขืœืึธืคึผืขื“, ืึธื‘ืขืจ ืื™ืจ ืงืขื ืขืŸ ืคึผืจื•ื‘ื™ืจืŸ ืขืก ืื™ืฆื˜. ืคึฟืึทืจ ื“ืขื ืื™ืจ ื“ืึทืจืคึฟืŸ ื•ื•ืขืจืŸ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ื˜ืขืกื˜ืขืจืก.

ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ, WireGuard ืื™ื– ื’ืึทื ืฅ ืคืึธืœืงืก ืื•ืŸ ืื™ื– ืืคื™ืœื• ื’ืขื•ื•ืขืŸ ื™ืžืคึผืœืึทืžืขื ืึทื“ ืขื˜ืœืขื›ืข ื•ื•ืคึผืŸ ืคึผืจืึทื•ื•ื™ื™ื“ืขืจื–, ืึทื–ืึท ื•ื•ื™ Mullvad ืื•ืŸ AzireVPN. ืคึฟืึทืจืขืคึฟื ื˜ืœืขื›ื˜ ืึธื ืœื™ื™ืŸ ืึท ื’ืจื•ื™ืก ื ื•ืžืขืจ ืกืขื˜ืึทืคึผ ืคื™ืจืขืจ ื“ืขื ื‘ืึทืฉืœื•ืก. ืœืžืฉืœ, ืขืก ื–ืขื ืขืŸ ืคื™ืจืขืจ, ื•ื•ืึธืก ื–ืขื ืขืŸ ื‘ืืฉืืคืŸ ื“ื•ืจืš ื™ื•ื–ืขืจื–, ืื•ืŸ ืขืก ื–ืขื ืขืŸ ืคื™ืจืขืจ, ืฆื•ื’ืขื’ืจื™ื™ื˜ ื“ื•ืจืš ื“ื™ ืžื—ื‘ืจื™ื ืคื•ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜.

ื˜ืขื›ื ื™ืฉ ื“ืขื˜ืึทื™ืœืก

ะ’ ื‘ืึทืึทืžื˜ืขืจ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ (ื–' 18) ืขืก ืื™ื– ื‘ืืžืขืจืงื˜ ืึทื– ื“ื™ ื˜ืจื•ืคึผื•ื˜ ืคื•ืŸ WireGuard ืื™ื– ืคื™ืจ ืžืึธืœ ื”ืขื›ืขืจ ื•ื•ื™ ื“ื™ ืคื•ืŸ OpenVPN: 1011 Mbit/s ืงืขื’ืŸ 258 Mbit/s, ืจื™ืกืคึผืขืงื˜ื™ื•ื•ืœื™. WireGuard ืื™ื– ืื•ื™ืš ืคืึธืจื•ื™ืก ืคื•ืŸ ื“ื™ ื ืึธืจืžืึทืœ ืœื™ื™ื–ื•ื ื’ ืคึฟืึทืจ ืœื™ื ื•ืงืก IPsec - ืขืก ื”ืื˜ 881 ืžื‘ื™ื˜ / s. ืขืก ืื•ื™ืš ืกืขืจืคึผืึทืกื™ื– ืขืก ืื™ืŸ ื™ื– ืคื•ืŸ ืกืขื˜ืึทืคึผ.

ื ืึธืš ื“ื™ ืงื™ื– ื–ืขื ืขืŸ ืคืืจื‘ื™ื˜ืŸ (ื“ื™ VPN ืคึฟืึทืจื‘ื™ื ื“ื•ื ื’ ืื™ื– ื™ื ื™ื˜ื™ืึทืœื™ื™ื–ื“ ืคื™ืœ ื•ื•ื™ SSH) ืื•ืŸ ื“ื™ ืงืฉืจ ืื™ื– ื’ืขื’ืจื™ื ื“ืขื˜, WireGuard ื›ืึทื ื“ืึทืœื– ืึทืœืข ืื ื“ืขืจืข ื˜ืึทืกืงืก ืื•ื™ืฃ ื–ื™ืš: ืขืก ืื™ื– ื ื™ื˜ ื“ืึทืจืคึฟืŸ ืฆื• ื–ืึธืจื’ ื•ื•ืขื’ืŸ ืจื•ื˜ื™ื ื’, ืฉื˜ืึทื˜ ืงืึธื ื˜ืจืึธืœ, ืืื–"ื• ื•. ื ืึธืš ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื”ืฉืชื“ืœื•ืช ื•ื•ืขื˜ ื ืึธืจ ื–ื™ื™ืŸ ืคืืจืœืื ื’ื˜ ืื•ื™ื‘ ืื™ืจ ื•ื•ื™ืœืŸ ืฆื• ื ื•ืฆืŸ ืกื™ืžืžืขื˜ืจื™ืง ืขื ืงืจื™ืคึผืฉืึทืŸ.

WireGuard ื•ื•ืขื˜ "ืงื•ืžืขืŸ" ืฆื• ื“ื™ ืœื™ื ื•ืงืก ืงืขืจืŸ - ื•ื•ืึธืก?
/ ืคืึธื˜ืึธ ืึทื ื“ืขืจืก ื”ืึทื“ื–ืฉื‘ืขืจื’ CC

ืฆื• ื™ื ืกื˜ืึทืœื™ืจืŸ, ืื™ืจ ื“ืึทืจืคึฟืŸ ืึท ืคืึทืจืฉืคึผืจื™ื™ื˜ื•ื ื’ ืžื™ื˜ ืึท ืœื™ื ื•ืงืก ืงืขืจืŸ ืขืœื˜ืขืจ ื•ื•ื™ 4.1. ืขืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ืื™ืŸ ื“ื™ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ื– ืคื•ืŸ ื”ื•ื™ืคึผื˜ ืœื™ื ื•ืงืก ื“ื™ืกื˜ืจื™ื‘ื™ื•ืฉืึทื ื–.

$ 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 ื˜ื•ื˜ ื ื™ืฉื˜ ื ื•ืฆืŸ ืฆื•ื‘ื™ื ื“ ืคึฟืึทืจ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ืึท ืงืจื™ืคึผื˜ืึธ ืฉืคึผื™ื™ึทื–ืขืจ ืงืจื™ืคึผื˜ืึธืึทืคึผื™. ืึทื ืฉื˜ืึธื˜, ืึท ื˜ื™ื™ึทืš ืกื™ืคืขืจ ืื™ื– ื’ืขื ื™ืฆื˜ ChaCha20, ืงืจื™ืคึผื˜ืึธื’ืจืึทืคื™ืง ื ืึธื›ืžืึทืš ืึทืจื™ื™ึทื ืœื™ื™ื’ืŸ ืคึผืึธืœื™1305 ืื•ืŸ ืคึผืจืึทืคึผืจื™ื™ืึทื˜ืขืจื™ ืงืจื™ืคึผื˜ืึธื’ืจืึทืคื™ืง ื”ืึทืฉ ืคืึทื ื’ืงืฉืึทื ื–.

ื“ืขืจ ืกื•ื“ ืฉืœื™ืกืœ ืื™ื– ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ื ื™ืฆืŸ ื“ื™ืคื™-ื”ืขืœืžืึทืŸ ืคึผืจืึธื˜ืึธืงืึธืœ ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื™ืœื™ืคึผื˜ื™ืงืึทืœ ื•ื™ืกื‘ื™ื™ื’ ืงื•ืจื•ื•ืขืงืกื ื•ืžืงืก. ื•ื•ืขืŸ ื›ืึทืฉื™ื ื’, ื–ื™ื™ ื ื•ืฆืŸ ื”ืึทืฉ ืคืึทื ื’ืงืฉืึทื ื– ื‘ืœื™ื™ืง2 ะธ SipHash. ืจืขื›ื˜ ืฆื• ื“ืขืจ ื˜ื™ืžืขืกื˜ืึทืžืคึผ ืคึฟืึธืจืžืึทื˜ TAI64N ื“ืขืจ ืคึผืจืึธื˜ืึธืงืึธืœ ื“ื™ืกืงืึทืจื“ื– ืคึผืึทืงื™ืฅ ืžื™ื˜ ืึท ืงืœืขื ืขืจืขืจ ื˜ื™ืžืขืกื˜ืึทืžืคึผ ื•ื•ืขืจื˜, ื“ืขืจืžื™ื˜ ืคึผืจืขื•ื•ืขื ื˜ื™ื ื’ ื“ืึธืก- ะธ ืจื™ืคึผืœื™ื™ ืื ืคืืœืŸ.

ืื™ืŸ ื“ืขื ืคืึทืœ, WireGuard ื ื™ืฆื˜ ื“ื™ ioctl ืคื•ื ืงืฆื™ืข ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื™ / ืึธ (ืคืจื™ืขืจ ื’ืขื•ื•ื™ื™ื ื˜ ื ืขื˜ืœื™ื ืง), ื•ื•ืึธืก ืžืื›ื˜ ื“ื™ ืงืึธื“ ืงืœื™ื ืขืจ ืื•ืŸ ืกื™ืžืคึผืœืขืจ. ืื™ืจ ืงืขื ืขืŸ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ืขื ื“ื•ืจืš ืงื•ืงืŸ ืื™ืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืงืึธื“.

ื“ืขื•ื•ืขืœืึธืคึผืขืจ ืคึผืœืึทื ื–

ื“ืขืจื•ื•ื™ื™ึทืœ, WireGuard ืื™ื– ืึทืŸ ืึทืจื•ื™ืก-ืคื•ืŸ-ื‘ื•ื™ื ืงืขืจืŸ ืžืึธื“ื•ืœืข. ืื‘ืขืจ ื“ืขืจ ืžื—ื‘ืจ ืคื•ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื™ื– Jason Donenfeld ื–ืื’ื˜, ืึทื– ื“ื™ ืฆื™ื™ื˜ ืื™ื– ื’ืขืงื•ืžืขืŸ ืคึฟืึทืจ ืคื•ืœ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืื™ืŸ ื“ื™ ืœื™ื ื•ืงืก ืงืขืจืŸ. ื•ื•ื™ื™ึทืœ ืขืก ืื™ื– ืกื™ืžืคึผืœืขืจ ืื•ืŸ ืžืขืจ ืคืึทืจืœืึธื–ืœืขืš ื•ื•ื™ ืื ื“ืขืจืข ืกืึทืœื•ืฉืึทื ื–. Jason ืื™ืŸ ื“ืขื ืึทื›ื˜ื•ื ื’ ืฉื˜ื™ืฆื˜ ืืคื™ืœื• Linus Torvalds ื–ื™ืš ื’ืขืจื•ืคืŸ ื“ื™ WireGuard ืงืึธื“ ืึท "ื•ื•ืขืจืง ืคื•ืŸ ืงื•ื ืกื˜."

ืึธื‘ืขืจ ืงื™ื™ืŸ ืื™ื™ื ืขืจ ืื™ื– ื’ืขืจืขื“ื˜ ื•ื•ืขื’ืŸ ื“ื™ ืคึผื™ื ื˜ืœืขืš ื“ืึทื˜ืขืก ืคึฟืึทืจ ื“ื™ ื”ืงื“ืžื” ืคื•ืŸ WireGuard ืื™ืŸ ื“ื™ ืงืขืจืŸ. ืื•ืŸ ืงื•ื™ื ื“ืึธืก ื•ื•ืขื˜ ืคึผืึทืกื™ืจืŸ ืžื™ื˜ ื“ื™ ืžืขืœื“ื•ื ื’ ืคื•ืŸ ื“ื™ ืื•ื™ื’ื•ืกื˜ ืœื™ื ื•ืงืก ืงืขืจืŸ 4.18. ืึธื‘ืขืจ, ืขืก ืื™ื– ืึท ืžืขื’ืœืขื›ืงื™ื™ื˜ ืึทื– ื“ืึธืก ื•ื•ืขื˜ ืคึผืึทืกื™ืจืŸ ืื™ืŸ ื“ืขืจ ื ืึธืขื ื˜ ืฆื•ืงื•ื ืคึฟื˜: ืื™ืŸ ื•ื•ืขืจืกื™ืข 4.19 ืึธื“ืขืจ 5.0.

ื•ื•ืขืŸ WireGuard ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ ืงืขืจืŸ, ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ื•ื•ื™ืœืŸ ืคื™ื™ื ืึทืœื™ื™ื– ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืคึฟืึทืจ ืึทื ื“ืจื•ื™ื“ ื“ืขื•ื•ื™ืกืขืก ืื•ืŸ ืึธื ื”ื™ื™ื‘ืŸ ืฉืจื™ื™ื‘ืŸ ืึท ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืคึฟืึทืจ ื™ืึธืก. ืขืก ื–ืขื ืขืŸ ืื•ื™ืš ืคึผืœืึทื ื– ืฆื• ืคืึทืจืขื ื“ื™ืงืŸ ื™ืžืคึผืœืึทืžืึทื ืฅ ืื™ืŸ Go ืื•ืŸ Rust ืื•ืŸ ืคึผืึธืจื˜ ื–ื™ื™ ืฆื• macOS, Windows ืื•ืŸ BSD. ืขืก ืื™ื– ืื•ื™ืš ืคึผืœืึทื ื ืขื“ ืฆื• ื™ื ืกื˜ืจื•ืžืขื ื˜ WireGuard ืคึฟืึทืจ ืžืขืจ "ืขืงื–ืึธื˜ื™ืฉ ืกื™ืกื˜ืขืžืขืŸ": DPDK, ืคืคึผื’ืึท, ื•ื•ื™ ืื•ื™ืš ืคื™ืœืข ืื ื“ืขืจืข ื˜ืฉื™ืงืึทื•ื•ืข ื–ืื›ืŸ. ืึทืœืข ืคื•ืŸ โ€‹โ€‹ื–ื™ื™ ื–ืขื ืขืŸ ืœื™ืกื˜ืขื“ ืื™ืŸ ืœื™ืกื˜ืข ืฆื• ืขืจืœืขื™ื“ื™ื’ืŸ ืžื—ื‘ืจื™ื ืคื•ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜.

ืคึผืก ืขื˜ืœืขื›ืข ืžืขืจ ืึทืจื˜ื™ืงืœืขืŸ ืคื•ืŸ ืื•ื ื“ื–ืขืจ ืคึฟื™ืจืžืข ื‘ืœืึธื’:

ื“ื™ ื”ื•ื™ืคึผื˜ ืจื™ื›ื˜ื•ื ื’ ืคื•ืŸ ืื•ื ื“ื–ืขืจ ื˜ืขื˜ื™ืงื™ื™ื˜ ืื™ื– ื“ื™ ืฆื•ืฉื˜ืขืœืŸ ืคื•ืŸ ื•ื•ืึธืœืงืŸ ื‘ืึทื“ื™ื ื•ื ื’ืก:

ื•ื•ื™ืจื˜ื•ืขืœ ื™ื ืคืจืึทืกื˜ืจืึทืงื˜ืฉืขืจ (IaaS) | PCI DSS ื”ืึธืกื˜ื™ื ื’ | ื•ื•ืึธืœืงืŸ ืคื–-152 | SAP ื”ืึธืกื˜ื™ื ื’ | ื•ื•ื™ืจื˜ื•ืึทืœ ืกื˜ืึธืจื™ื“ื–ืฉ | ืขื ืงืจื™ืคึผื˜ื™ื ื’ ื“ืึทื˜ืŸ ืื™ืŸ ื“ื™ ื•ื•ืึธืœืงืŸ | ื•ื•ืึธืœืงืŸ ืกื˜ืึธืจื™ื“ื–ืฉ

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’