Обзор WireGuard
Categories:
Концептуальный обзор
Если вы хотите получить общее концептуальное представление о том, что такое 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-пакет, используя открытый ключ пира
ABCDEFGH.Какова удалённая конечная точка пира
ABCDEFGH? Позвольте мне посмотреть… Хорошо, конечная точка — UDP-порт 53133 на хосте 216.58.211.110.Отправить зашифрованные байты из шага 2 через Интернет на 216.58.211.110:53133 через UDP.
Когда интерфейс получает пакет, происходит следующее:
Я только что получил пакет с UDP-порта 7361 от хоста 98.139.183.24. Давайте расшифруем его!
Он успешно расшифрован и аутентифицирован для пира
LMNOPQRS. Хорошо, давайте запомним, что последняя конечная точка пира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