Простой и понятный в использовании
WireGuard — это универсальный VPN, который может работать как с встроенными интерфейсами, так и с суперкомпьютерами. Он подходит для различных условий. Изначально разработанный для ядра Linux, WireGuard теперь доступен на разных платформах, включая Windows, macOS, BSD, iOS и Android. Он широко используется и постоянно развивается.
WireGuard считается одним из самых безопасных, простых в использовании и эффективных VPN-решений в отрасли. Он стремится быть таким же простым в настройке и развёртывании, как SSH.
Подключение к VPN осуществляется путём обмена открытыми ключами. Это происходит так же, как и обмен ключами SSH. Остальное обрабатывается автоматически. WireGuard даже может перемещаться между IP-адресами, как и Mosh.
Вам не нужно управлять подключениями, следить за состоянием, управлять демонами или вникать в детали. WireGuard предоставляет простой, но мощный интерфейс для безопасного и удобного доступа к сети.
Криптографически надежный
WireGuard использует самую современную криптографию, такую как Noise protocol framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF и безопасные доверенные конструкции. Он позволяет делать консервативный и разумный выбор и был проверен криптографами.
Минимальная поверхность атаки
WireGuard был разработан с учетом простоты внедрения. Предполагается, что он будет легко реализован всего за несколько строк кода и легко поддается проверке на наличие уязвимостей в системе безопасности. По сравнению с такими гигантами, как * Swan / IPSec или OpenVPN / OpenSSL, в которых аудит гигантских кодовых баз является непосильной задачей даже для больших команд экспертов по безопасности, WireGuard предназначен для всестороннего анализа отдельными лицами.
Высокая производительность
Сочетание чрезвычайно высокоскоростных криптографических примитивов и того факта, что WireGuard встроен в ядро Linux, означает, что безопасная сеть может быть очень высокоскоростной. Он подходит как для небольших встроенных устройств, таких как смартфоны, так и для полностью загруженных магистральных маршрутизаторов.
Четко определенный и тщательно продуманный
WireGuard - это результат длительного и тщательно продуманного академического процесса, результатом которого стал технический документ, академический исследовательский документ, в котором четко определен протокол и важные соображения, лежащие в основе каждого решения.
Концептуальный обзор
Если вы хотите получить общий концептуальный обзор того, что представляет собой WireGuard, читайте дальше здесь. Затем вы можете перейти к установке и прочтению кратких инструкций по его использованию.
Если вы интересуетесь внутренней работой, вас может заинтересовать краткое описание протокола или более подробное ознакомление с техническим документом, в котором более подробно рассказывается о протоколе, криптографии и основах. Если вы собираетесь внедрить WireGuard для новой платформы, пожалуйста, прочтите кроссплатформенные примечания.
WireGuard надежно инкапсулирует IP-пакеты через UDP. Вы добавляете интерфейс WireGuard, настраиваете его с помощью своего закрытого ключа и открытых ключей ваших коллег, а затем отправляете пакеты по нему. Все вопросы распределения ключей и расширенных конфигураций выходят за рамки WireGuard; эти проблемы лучше оставить для других уровней, чтобы мы не столкнулись с раздутием IKE или OpenVPN. Напротив, он больше имитирует модели SSH и Mosh; обе стороны имеют открытые ключи друг друга, а затем они просто могут начать обмен пакетами через интерфейс.
Простой сетевой интерфейс
WireGuard работает путем добавления сетевого интерфейса (или нескольких), например, eth0 или wlan0, называемый wg0 (или wg1, wg2, wg3 и т.д.). Затем этот сетевой интерфейс можно настроить обычным образом с помощью ifconfig(8) или ip-address(8), добавлять и удалять маршруты для него с помощью route(8) или ip-route(8), и так далее со всеми обычными сетевыми утилитами. Конкретные аспекты интерфейса WireGuard настраиваются с помощью wg(8) инструмента. Этот интерфейс действует как туннельный интерфейс.
WireGuard связывает IP-адреса туннеля с открытыми ключами и удаленными конечными точками. Когда интерфейс отправляет пакет одноранговому узлу, он выполняет следующее:
- Этот пакет предназначен для 192.168.30.8. Что это за одноранговый узел? Дайте мне посмотреть... Хорошо, это для однорангового узла ABCDEFGH. (Или, если он не предназначен для какого-либо настроенного однорангового узла, отбросьте пакет.)
- Зашифруйте весь IP-пакет с помощью открытого ключа peer ABCDEFGH.
- Что такое удаленная конечная точка peer ABCDEFGH? Дайте мне посмотреть... Хорошо, конечная точка - UDP порт 53133 на хосте 216.58.211.110.
- Отправляйте зашифрованные байты с шага 2 через Интернет на номер 216.58.211.110: 53133, используя UDP.
Когда интерфейс получает пакет, происходит следующее:
- Я только что получил пакет с UDP-порта 7361 на хосте 98.139.183.24. Давайте расшифруем его!
- Он расшифрован и аутентифицирован надлежащим образом для однорангового узлаLMNOPQRS. Хорошо, давайте вспомним, что самая последняя конечная точка peer LMNOPQRS в Интернете - 98.139.183.24: 7361 с использованием UDP.
- После расшифровки обычный текстовый пакет будет от 192.168.43.89. Разрешено ли одноранговому узлу LMNOPQRS отправлять нам пакеты от 192.168.43.89?
- Если да, примите пакет на интерфейсе. Если нет, отбросьте его.
За кулисами многое делается для обеспечения надлежащей конфиденциальности, подлинности и совершенной прямой секретности с использованием самой современной криптографии.
Маршрутизация криптоключей
В основе WireGuard лежит концепция, называемая маршрутизацией криптоключей, которая работает путем связывания открытых ключей со списком IP-адресов туннеля, разрешенных внутри туннеля. Каждый сетевой интерфейс имеет закрытый ключ и список одноранговых узлов. У каждого однорангового узла есть открытый ключ. Открытые ключи короткие и простые, и используются одноранговыми узлами для аутентификации друг друга. Их можно передавать для использования в файлах конфигурации любым внеполосным способом, аналогично тому, как можно отправить свой открытый ключ SSH другу для доступа к серверу оболочки.
Например, серверный компьютер может иметь такую конфигурацию:
[Interface]
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
ListenPort = 51820
[Peer]
PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
AllowedIPs = 10.192.122.3/32, 10.192.124.1/24
[Peer]
PublicKey = TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0=
AllowedIPs = 10.192.122.4/32, 192.168.0.0/16
[Peer]
PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=
AllowedIPs = 10.10.10.230/32
И клиентский компьютер может иметь такую более простую конфигурацию:
[Interface]
PrivateKey = gI6EdUSYvn8ugXOt8QQD6Yc+JyiZxIhp3GInSWRfWGE=
ListenPort = 21841
[Peer]
PublicKey = HIgo9xNzJMWLKASShiTqIybxZ0U3wGLiUeJ1PKf8ykw=
Endpoint = 192.95.5.69:51820
AllowedIPs = 0.0.0.0/0
В конфигурации сервера каждый одноранговый узел (клиент) сможет отправлять пакеты на сетевой интерфейс с исходным IP-адресом, соответствующим его соответствующему списку разрешенных IP-адресов. Например, когда сервер получает пакет от однорангового узла gN65BkIK... после расшифровки и аутентификации, если его исходный IP-адрес 10.10.10.230, то он разрешен для доступа к интерфейсу; в противном случае он удаляется.
В конфигурации сервера, когда сетевой интерфейс хочет отправить пакет одноранговому узлу (клиенту), он проверяет IP-адрес назначения этого пакета и сравнивает его со списком разрешенных IP-адресов каждого однорангового узла, чтобы определить, на какой одноранговый узел его отправить. Например, если сетевому интерфейсу будет предложено отправить пакет с IP-адресом назначения 10.10.10.230, он зашифрует его с помощью открытого ключа однорангового узла gN65BkIK..., а затем отправит его на самую последнюю конечную точку Интернета этого однорангового узла.
В конфигурации клиента его единственный одноранговый узел (сервер) сможет отправлять пакеты на сетевой интерфейс с любым исходным IP-адресом (поскольку 0.0.0.0/0 является шаблоном). Например, когда пакет получен от однорангового узла HIgo9xNz..., если он расшифровывается и аутентифицируется правильно с любым исходным IP, то он разрешен для доступа к интерфейсу; в противном случае он удаляется.
В конфигурации клиента, когда сетевой интерфейс хочет отправить пакет своему единственному одноранговому узлу (серверу), он шифрует пакеты для единственного однорангового узла с любым IP-адресом назначения (поскольку 0.0.0.0/0 является шаблоном). Например, если сетевому интерфейсу будет предложено отправить пакет с любым IP-адресом назначения, он зашифрует его с помощью открытого ключа единственного однорангового узла HIgo9xNz..., а затем отправит его на самую последнюю конечную точку Интернета единственного однорангового узла.
Другими словами, при отправке пакетов список разрешенных IP-адресов ведет себя как своего рода таблица маршрутизации, а при приеме пакетов список разрешенных IP-адресов ведет себя как своего рода список контроля доступа.
Это то, что мы называем таблицей маршрутизации Cryptokey: простая ассоциация открытых ключей и разрешенных IP-адресов.
Можно использовать любую комбинацию IPv4 и IPv6 для любого из полей. WireGuard полностью способен инкапсулировать одно в другое, если это необходимо.
Поскольку все пакеты, отправляемые по интерфейсу WireGuard, зашифрованы и аутентифицированы, а также поскольку существует такая тесная связь между идентификатором однорангового узла и разрешенным IP-адресом однорангового узла, системным администраторам не нужны сложные расширения брандмауэра, такие как в случае с IPSec, а скорее они могут просто соответствовать запросу «это с этого IP? в этом интерфейсе?», и будьте уверены, что это безопасный и аутентичный пакет. Это значительно упрощает управление сетью и контроль доступа, а также обеспечивает гораздо большую уверенность в том, что ваши правила iptables действительно выполняют то, что вы от них ожидали.