Учебное пособие по WireGuard: как работает WireGuard

Linux

Оригинальная ссылка:к черту облако родное.IO/posts/wire G…

WireGuardОтJason Donenfeldдля другихCПротокол Viden с открытым исходным кодом, написанный на языке, рассматриваемом как протокол Viden следующего поколения, предназначенный для решения многих проблем.IPSec/IKEv2,Open威屁恩илиL2TPИ другие проблемы с протоколом Widine. это сTincиMeshBirdМежду другими современными продуктами Widion есть некоторое сходство, а именно передовая технология шифрования и простая конфигурация. С января 2020 года он включен в ядро ​​​​Linux.5.6версия, что означает, что пользователи большинства дистрибутивов Linux будут иметь WireGuard из коробки.

Если вы хотите прорваться через стену или сеть между серверами, WireGuard не подведет вас, это «строительные блоки Lego» для сети, точно так же, как ZFS является «строительными блоками Lego» для создания файловых систем.

Сравнение тестов производительности между WireGuard и другими протоколами Widium:

Видно, что WireGuard напрямую подавляет другие протоколы Widian. Давай поговорим об этомOpen威屁恩, около 100 000 строк кода, в то время как WireGuard имеет только около4000Строки кода, кодовая база довольно оптимизирована, это просто произведение искусства. посмотри сноваOpen威屁恩производительность, забудьте об этом.

Преимущества WireGuard:

  • Конфигурация упрощена, и значение по умолчанию можно использовать напрямую.
  • При минимальных усилиях по управлению ключами на каждый хост требуется только 1 открытый ключ и 1 закрытый ключ.
  • Как и обычный интерфейс Ethernet, он работает как модуль ядра Linux с небольшим объемом ресурсов.
  • Возможность маршрутизировать часть или весь трафик на любой хост в локальной сети через Widium.
  • Возможность автоматического повторного подключения после восстановления сети вызвала боль у других Widines.
  • По сравнению с текущим основным протоколом Widium скорость соединения выше, а задержка ниже (см. рисунок выше).
  • Используется более совершенная технология шифрования с прямым шифрованием и устойчивостью к атакам с понижением версии.
  • Поддерживает любой тип сетевой связи уровня 2, напримерARP,DHCPиICMP, а не только TCP/HTTP.
  • Он может работать на хосте для обеспечения связи между контейнерами или в контейнере для обеспечения связи между хостами.

Чего WireGuard не может:

  • Подобно протоколу сплетен для достижения самовосстановления сети.
  • Преодолеть двойной NAT с сигнальным сервером.
  • Автоматическое распространение и отзыв ключей через центральный сервер.
  • Отправлять необработанные кадры Ethernet уровня 2.

Конечно, вы можете использовать WireGuard в качестве базового протокола, чтобы компенсировать эти недостатки.

Эта серия руководств по WireGuard разделена на две части: первая теоретическая, а вторая практическая. Эта статья является первой частью, приступим к текстовому туториалу.

1. Терминология WireGuard

Peer/Node/Device

Подключитесь к Widine и зарегистрируйте хост с адресом подсети Widine (например, 192.0.2.3). Вы также можете маршрутизировать IP-адреса, отличные от собственных, указав диапазоны подсетей с CIDR, разделенными запятыми.

Сервер отказов

Общедоступный одноранговый узел, который может ретранслировать трафик наNATдругие сверстники позади.Bounce ServerЭто не специальный узел, он такой же, как и другие одноранговые узлы, единственное отличие состоит в том, что он имеет общедоступный сетевой IP-адрес и включена переадресация IP-адресов на уровне ядра, которая может пересылать трафик Widium другим клиентам.

Подсеть

Набор частных IP-адресов, например.192.0.2.1-255или192.168.1.1/24, обычно за NAT, например, в офисной или домашней сети.

CIDR-нотация

Это способ выражения размера подсети с помощью маски, который не нуждается в объяснении.

NAT

Частный IP-адрес подсети предоставляется маршрутизатором. К устройству частной подсети нельзя получить прямой доступ через общедоступную сеть, и преобразование сетевых адресов необходимо выполнять через NAT. Маршрутизатор отслеживает исходящие соединения и перенаправляет ответы на правильный внутренний IP-адрес.

Общедоступная конечная точка

Общедоступный IP-адрес узла: порт, например123.124.125.126:1234, или используйте доменное имя напрямуюsome.domain.tld:1234. Если одноранговый узел не находится в той же подсети, общедоступная конечная точка узла должна использовать общедоступный IP-адрес.

Закрытый ключ

Закрытый ключ WireGuard одного узла, сгенерированный:wg genkey > example.key.

Открытый ключ

Открытый ключ WireGuard одного узла, сгенерированный следующим образом:wg pubkey < example.key > example.key.pub.

DNS

Сервер доменных имен, используемый для преобразования доменных имен в IP-адрес клиента Widine и предотвращения утечки DNS-запросов за пределы Widine.

2. Как работает WireGuard

Как работает сервер ретрансляции

Сервер ретрансляции (Bounce Server) такой же, как и обычный одноранговый узел, он можетNATПоследние клиенты Videen действуют как серверы ретрансляции между ними и могут перенаправлять любой полученный трафик подсети Videen на правильный одноранговый узел. На самом деле WireGuard не волнует, как перенаправляется трафик, это определяется ядром системы иiptablesобработка правил.

Если все одноранговые узлы доступны из общедоступной сети, сервер ретрансляции не нужно рассматривать, только если за NAT есть одноранговые узлы.

В WireGuard клиент и сервер в принципе равны, разница только в том, кто к кому активно подключается. Обе стороны будут прослушивать порт UDP, и тот, кто активно подключается, будет клиентом. Активно подключенному клиенту необходимо указать общедоступный сетевой адрес и порт однорангового узла, а пассивно подключенному серверу не нужно указывать адрес и порт других одноранговых узлов. Если и клиент, и сервер расположены за NAT, необходимо добавить сервер ретрансляции.И клиент, и сервер назначают сервер ретрансляции в качестве равноправного узла, и их коммуникационный трафик сначала поступает на сервер ретрансляции, а затем перенаправляется на сервер ретрансляции. пэр. .

WireGuard поддерживает роуминг, то есть независимо от того, чей адрес был изменен с обеих сторон, WireGuard запомнит свой новый адрес, когда увидит, что другая сторона говорит с нового адреса (то же самое, что и мош, но двунаправленный). Таким образом, если обе стороны постоянно находятся в сети и общаются достаточно часто (например, при настройкеpersistent-keepalive), IP-адреса с обеих сторон не фиксированы и не затрагиваются.

Как Wireguard направляет трафик

С помощью WireGuard можно сформировать очень сложную топологию сети, вот несколько типичных топологий:

① Сквозное прямое соединение

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

② Один конец находится за NAT, а другой конец напрямую открыт через общедоступную сеть.

В этом случае самое простое решение — использовать один конец, открытый общедоступной сетью, в качестве сервера, а другой конец указать общедоступный сетевой адрес и порт сервера, а затем передатьpersistent-keepaliveВозможность поддерживать длительное соединение, позволяющее NAT запомнить соответствующие отношения сопоставления.

③ Оба конца находятся за NAT и подключены через сервер ретрансляции.

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

④ Оба конца находятся за NAT, пробейте отверстия через UDP NAT

Как было сказано выше, когда обе взаимодействующие стороны находятся за NAT, прямое подключение нецелесообразно, поскольку большинство NAT-маршрутизаторов достаточно строго рандомизируют исходные порты, и заранее согласовать фиксированный открытый порт для обеих сторон невозможно. должен использовать сигнальный сервер (STUN), он сообщает в середине, какие случайные исходные порты назначать друг другу. Обе взаимодействующие стороны установят начальное соединение с общедоступным сигнальным сервером, который затем запишет случайный исходный порт и вернет его клиенту. Именно это и происходит в современных P2P-сетях.WebRTCПринцип работы. Иногда, даже при наличии сигнального сервера и известного на обоих концах исходного порта, прямое соединение установить невозможно, поскольку NAT-маршрутизатор строго оговаривает, что принимается трафик только с исходного адреса назначения (сигнального сервера), а новый случайный исходный порт потребуется для приема трафика с других IP-адресов (например, другие клиенты пытаются использовать исходный исходный порт связи). NAT операторского класса делает именно это, например, сотовые сети и некоторые корпоративные сети, которые специально используют этот метод для предотвращения соединений с пробивкой отверстий. Дополнительные сведения см. в главе «Практика подключения NAT-к-NAT» в следующем разделе.

Если определенный конец подключен к нескольким одноранговым узлам одновременно, когда он хочет получить доступ к определенному IP-адресу, если доступен определенный маршрут, этот конкретный маршрут будет использоваться первым, в противном случае трафик будет перенаправлен на сервер ретрансляции и то сервер ретрансляции будет выполнять переадресацию в соответствии с системной таблицей маршрутизации. Вы можете рассчитать длину каждого прыжка, измерив время пинга и проверив вывод пира (wg show wg0), чтобы узнать, как WireGuard маршрутизирует заданный адрес.

Формат сообщения WireGuard

WireGuard использует зашифрованные UDP-пакеты для инкапсуляции всех данных. UDP не гарантирует, что пакеты данных будут доставлены или в порядке, но TCP-соединение в туннеле может обеспечить эффективную доставку данных. Формат сообщения WireGuard показан на следующем рисунке:

Дополнительную информацию о сообщениях WireGuard можно найти в следующих документах:

Производительность WireGuard

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

WireGuard обрабатывает маршрутизацию непосредственно на уровне ядра, напрямую использует модуль шифрования ядра системы для шифрования данных и сосуществует с оригинальной встроенной подсистемой шифрования Linux.APIИспользование WireGuardZincбиблиотека паролей. WireGuard использует протокол UDP для передачи данных и не будет передавать пакеты данных UDP по умолчанию, когда он не используется, поэтому он экономит больше энергии, чем обычный Widian, и может использоваться все время, например, 55, а скорость подавляющее по сравнению с другими видианцами сексуальное преимущество.

Дополнительную информацию о сравнении производительности можно найти в следующих документах:

Модель безопасности WireGuard

WireGuard использует следующие методы шифрования для обеспечения безопасности данных:

  • использоватьChaCha20Для симметричного шифрования используйтеPoly1305Выполните проверку данных.
  • использоватьCurve25519Произвести обмен ключами.
  • использоватьBLAKE2как хэш-функция.
  • использоватьHKDFрасшифровать.

Технология шифрования WireGuard по существуTrevor PerrinизNoiseРеализация структуры проста и эффективна, а остальная часть Уэйна защищена посредством серии переговоров, рукопожатий и сложных автоматов состояний. WireGuard эквивалентен протоколу Widine.qmail, объем кода на несколько порядков меньше, чем у других протоколов Widium.

Для получения дополнительной информации о шифровании WireGuard перейдите по ссылке ниже:

Управление ключами WireGuard

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

В более масштабных развертываниях вы можете использоватьAnsibleилиKubernetes Secretsи другие отдельные службы для создания, распространения и уничтожения ключей.

Вот некоторые службы, которые помогают с распространением и развертыванием ключей:

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

[Interface]
...
PostUp = wg set %i private-key /etc/wireguard/wg0.key <(cat /some/path/%i/privkey)

Технически несколько серверов могут использовать один и тот же закрытый ключ, если клиент не использует один и тот же ключ для одновременного подключения к обоим серверам. Но иногда клиенту нужно будет подключаться к нескольким серверам одновременно, например, вы можете использоватьDNSЦиклический перебор для балансировки соединений между двумя серверами, настроенными одинаково. В большинстве случаев каждый одноранговый узел должен использовать независимый открытый ключ и закрытый ключ, чтобы каждый одноранговый узел не мог читать трафик друг друга, что обеспечивает безопасность.

Теоретическая часть здесь, в следующей статье вы узнаете, как настроить WireGuard с нуля, что будет включать в себя множество расширенных методов настройки, таких как динамический IP, NAT в NAT, IPv6 и так далее.


Kubernetes 1.18.2 1.17.5 1.16.9 1.15.12 Адрес выпуска пакета автономной установкиstore.lameleg.com, добро пожаловать на опыт. Использовалась последняя версия sealos v3.3.6. Конфигурация разрешения имени хоста была оптимизирована, lvscare монтирует /lib/module для решения проблемы загрузки ipvs при загрузке, исправляет несовместимость между netlink сообщества lvscare и ядром 3.10, а sealos генерирует сертификат вековой давности и другие функции. Больше возможностейGitHub.com/Под гневом/Цвет ах.... Добро пожаловать, чтобы отсканировать QR-код ниже, чтобы присоединиться к группе DingTalk.Группа DingTalk объединяет роботов тюленей и может видеть динамику тюленей в режиме реального времени.