Найти тему
DevOps & DevSecOps

WireGuard

Оглавление

Простой и понятный в использовании

WireGuard — это универсальный VPN, который может работать как с встроенными интерфейсами, так и с суперкомпьютерами. Он подходит для различных условий. Изначально разработанный для ядра Linux, WireGuard теперь доступен на разных платформах, включая Windows, macOS, BSD, iOS и Android. Он широко используется и постоянно развивается.

WireGuard считается одним из самых безопасных, простых в использовании и эффективных VPN-решений в отрасли. Он стремится быть таким же простым в настройке и развёртывании, как SSH.

Подключение к VPN осуществляется путём обмена открытыми ключами. Это происходит так же, как и обмен ключами SSH. Остальное обрабатывается автоматически. WireGuard даже может перемещаться между IP-адресами, как и Mosh.

Вам не нужно управлять подключениями, следить за состоянием, управлять демонами или вникать в детали. WireGuard предоставляет простой, но мощный интерфейс для безопасного и удобного доступа к сети.

Криптографически надежный

WireGuard использует самую современную криптографию, такую как Noise protocol frameworkCurve25519ChaCha20Poly1305BLAKE2SipHash24HKDF и безопасные доверенные конструкции. Он позволяет делать консервативный и разумный выбор и был проверен криптографами.

Минимальная поверхность атаки

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-адреса туннеля с открытыми ключами и удаленными конечными точками. Когда интерфейс отправляет пакет одноранговому узлу, он выполняет следующее:

  1. Этот пакет предназначен для 192.168.30.8. Что это за одноранговый узел? Дайте мне посмотреть... Хорошо, это для однорангового узла ABCDEFGH. (Или, если он не предназначен для какого-либо настроенного однорангового узла, отбросьте пакет.)
  2. Зашифруйте весь IP-пакет с помощью открытого ключа peer ABCDEFGH.
  3. Что такое удаленная конечная точка peer ABCDEFGH? Дайте мне посмотреть... Хорошо, конечная точка - UDP порт 53133 на хосте 216.58.211.110.
  4. Отправляйте зашифрованные байты с шага 2 через Интернет на номер 216.58.211.110: 53133, используя UDP.

Когда интерфейс получает пакет, происходит следующее:

  1. Я только что получил пакет с UDP-порта 7361 на хосте 98.139.183.24. Давайте расшифруем его!
  2. Он расшифрован и аутентифицирован надлежащим образом для однорангового узлаLMNOPQRS. Хорошо, давайте вспомним, что самая последняя конечная точка peer LMNOPQRS в Интернете - 98.139.183.24: 7361 с использованием UDP.
  3. После расшифровки обычный текстовый пакет будет от 192.168.43.89. Разрешено ли одноранговому узлу LMNOPQRS отправлять нам пакеты от 192.168.43.89?
  4. Если да, примите пакет на интерфейсе. Если нет, отбросьте его.

За кулисами многое делается для обеспечения надлежащей конфиденциальности, подлинности и совершенной прямой секретности с использованием самой современной криптографии.

Маршрутизация криптоключей

В основе 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 действительно выполняют то, что вы от них ожидали.