Основные топологии и конфигурирование WireGuard

Предисловие

Данный материал является компиляцией и переработкой серии статей с сайта https://www.procustodibus.com/, убрал многословности и повторы, реструктурировал и обобщил типовые решения, постарался выстроить в логическую цепь изначально перегруженный гиперссылками и цитированиями материал. Делал для собственных целей, однако надеюсь, что материал будет полезен и сообществу.

Общие сведения о рассмотренных топологиях1

Есть четыре основные топологии, которые следует учитывать при принятии решения о том, как соединить две конечные точки через сеть WireGuard:

  1. Точка-точка
  2. Звезда
  3. Точка-сайт
  4. Сайт-сайт

Все их применяют по обычным причинам, когда вам нужно подключать две конечные точки, например, чтобы разрешить им обмениваться данными через SSH, или одной точки для подключения к HTTP-серверу на другой, или чтобы с одной конечной точки получить доступ к общим папкам другой, и т.д…

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

Но для простоты в этой статье последовательно использованы примеры с «оконечной точкой A», представляющей «клиентскую» конечную точку (например, планшет конечного пользователя), соединяющуюся через туннель WireGuard с «оконечной точкой B», которая представляет конечную точку «сервера» (например, сервер, на котором запущено какое-то веб-приложение, которое конечный пользователь хочет использовать). Для представления однорангового узла туннеля WireGuard будет использован:

  1. на «клиентской» стороне порт 51821,
  2. порт 51822 на «стороне сервера»,
  3. порт 51823 для промежуточного узла WireGuard, если таковой будет.

Общие положения по установке и конфигурированию WireGuard

Следующие шаги нужно выполнить в общем случае в зависимости от требуемой конфигурации:

  1. Установка WireGuard
  2. Создание ключей WireGuard
  3. Настройка WireGuard на конечной точке A
  4. Настройка WireGuard на конечной точке B
  5. Настройка WireGuard на хосте C
  6. Настройка маршрутизации на хосте C
  7. Запуск и проверка работы WireGuard

Установка WireGuard

Установите WireGuard на оконечные точки A и B (а также хост C), следуя инструкциям по установке для соответствующей платформы на странице установки WireGuard. Вы можете убедиться, что вы успешно установили WireGuard, запустив wg help на каждом узле.

Создание ключей WireGuard

Затем сгенерируйте по паре ключей (открытый и закрытый) для каждого узла WireGuard: точек A, B и хоста C. Ключ WireGuard (также известный как «пара ключей») состоит из двух частей, «закрытого ключа» (также известного как «пара ключей»). как «секретный ключ») и «открытый ключ». Этого вид криптографии (с открытым ключом) предполагает, что вычислить открытый ключ, если вы знаете закрытый ключ — тривиально, но обратное — практически невозможно.

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

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

  1. конечной точки A:
$ wg genkey > endpoint-a.key
$ wg pubkey < endpoint-a.key > endpoint-a.pub

  1. конечной точки B:
$ wg genkey > endpoint-b.key
$ wg pubkey < endpoint-b.key > endpoint-b.pub

  1. для хоста C:
$ wg genkey > host-c.key
$ wg pubkey < host-c.key > host-c.pub

Должно быть сгенерировано шесть файлов: endpoint-a.key, endpoint-a.pub, endpoint-b.key, endpoint-b.pub, host-c.key и host-c.pub . *.key файлы содержат закрытые ключи, а *.pub файлы содержат открытые ключи. Содержимое каждого будет состоять из 44 символов текста в кодировке Base64 подобно этому:

$ cat endpoint-a.key
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEE=
$ cat endpoint-a.pub
/TOE4TKtAqVsePRVR+5AA43HkAK5DSntkOCO7nYq5xU=

$ cat endpoint-b.key
ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFA=
$ cat endpoint-b.pub
fE/wdxzl0klVp/IR8UcaoGUMjqaWi3jAd7KzHKFS6Ds=

$ cat host-c.key
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCGA=
$ cat host-c.pub
jUd41n3XYa3yXBzyBvWqlLhYgRef5RiBD7jwo70U+Rw=

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

В топологии Hub and Spoke (Звезда) это означает, что концентратор, хост C, должен быть настроен с использованием открытого ключа каждого луча; тогда как периферийные устройства, конечная точка A и конечная точка B, должны быть настроены только с открытым ключом концентратора.

Настройка WireGuard на конечной точке A

Теперь давайте настроим конечную точку A («клиентский» луч). На конечной точке A создайте новый файл в /etc/wireguard/wg0.conf со следующим содержимым:

# /etc/wireguard/wg0.conf

# **Неизменная часть**
# локальные настройки точки A
[Interface]
PrivateKey = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEE=
Address = 10.0.0.1/32
ListenPort = 51821

# **Изменяемая в зависимости от типа топологии часть**
# настройки удалённого хоста C
[Peer]
PublicKey = jUd41n3XYa3yXBzyBvWqlLhYgRef5RiBD7jwo70U+Rw=
Endpoint = 192.0.2.3:51823
AllowedIPs = 10.0.0.0/24

Установите владельца файла на root и его разрешения на 600 (владелец может читать + писать, а всем остальным доступ запрещен, — файл содержит закрытый ключ конечной точки, который должен храниться в секрете).

Давайте рассмотрим настройки, настройку за настройкой:

Секция [Interface]

PrivateKey

Это закрытый ключ конечной точки A — замените это значение фактическим закрытым ключом, который вы сгенерировали для конечной точки A, оно является секретным, и это единственное место, где оно должно находиться.

Address

Это IP-адрес конечной точки A внутри создаваемой нами WireGuard VPN — замените его на значение из вашей сети.

ListenPort

Это порт WireGuard конечной точки A. Конечная точка A должна иметь возможность получать трафик UDP для установленных подключений через этот порт из Интернета (или откуда бы ни поступал бы трафик с хоста C).

Если вы опустите этот параметр, WireGuard будет выбирать новый случайный неиспользуемый порт из временного диапазона портов операционной системы (который может варьироваться от 1024 до 65535 , в зависимости от операционной системы) при каждом запуске.

Секция [Peer]

PublicKey

Это открытый ключ хоста C. Замените это значение фактическим открытым ключом, который вы сгенерировали для хоста C. Это значение не является секретным, однако это глобально уникальный идентификатор для хоста C.

Endpoint

Это общедоступный IP-адрес (и порт) хоста C — IP-адрес и порт, которые конечная точка A будет использовать для подключения через Интернет к хосту C для настройки туннеля WireGuard. Замените его фактическими значениями (адрес:порт), которые вы будете использовать для подключения к хосту C из конечной точки A.

Хост C должен иметь возможность принимать новые UDP-соединения из Интернета по этому адресу и порту, а конечная точка A должна иметь возможность отправлять UDP-трафик через Интернет на этот адрес и порт.

AllowedIPs

Это адрес (10.0.0.2/32) или блок адресов (10.0.0.0/24), с которых разрешён доступ к конечной точке A внутри создаваемой нами WireGuard VPN — замените это значение на значение из вашей сети.

Настройка WireGuard на конечной точке B

Настройте конечную точку B, на которой создайте новый файл в /etc/wireguard/wg0.conf со следующим содержимым:

# /etc/wireguard/wg0.conf

# Неизменная часть
# локальные настройки точки B
[Interface] PrivateKey = ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFA=
Address = 10.0.0.2/32
ListenPort = 51822

# Изменяемая в зависимости от типа топологии часть
# настройки удалённого хоста C
[Peer]
PublicKey = jUd41n3XYa3yXBzyBvWqlLhYgRef5RiBD7jwo70U+Rw=
Endpoint = 192.0.2.3:51823
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25

Установите владельца файла на root и его разрешения на 600 (владелец может читать и писать, всем остальным доступ запрещен — файл содержит закрытый ключ конечной точки, который должен храниться в секрете).

Назначения настроек точки B аналогичны настройкам точки A, за исключением параметра в секции [Peer]:

PersistentKeepalive

Это количество секунд, между которыми WireGuard будет отправлять пакеты поддержки активности от конечной точки B к хосту C. Если установлено ненулевое число, как только интерфейс WireGuard будет запущен, WireGuard начнет попытки отправить пакеты поддержки активности на хост C, если установлено значение 0 (по умолчанию), — WireGuard не будет отправлять пакеты keepalive на хост C.

Этот механизм проактивно открывает новое соединение через брандмауэры между конечной точкой B и хостом C и поддерживает его в установленном состоянии, чтобы хост C мог пересылать произвольный трафик для конечной точки B (например в форме HTTP-запросов). Без этой настройки трафик, инициированный извне, будет заблокирован правилами брандмауэра, которые разрешают его только через установленные соединения в конечную точку B.

Настройка WireGuard на хосте C

Настройте Host C (хаб), на котором создайте новый файл в /etc/wireguard/wg0.conf со следующим содержимым:

# /etc/wireguard/wg0.conf

# локальные настройки хоста C
[Interface]
PrivateKey = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCGA=
Address = 10.0.0.3/32
ListenPort = 51823

PreUp = sysctl -w net.ipv4.ip_forward=1

# настройки удалённой точки A
[Peer]
PublicKey = /TOE4TKtAqVsePRVR+5AA43HkAK5DSntkOCO7nYq5xU=
AllowedIPs = 10.0.0.1/32

# настройки удалённой точки B
[Peer]
PublicKey = fE/wdxzl0klVp/IR8UcaoGUMjqaWi3jAd7KzHKFS6Ds=
AllowedIPs = 10.0.0.2/32

Установите владельца файла на root и его разрешения на 600 (владелец может читать и писать, всем остальным доступ запрещен — файл содержит закрытый ключ конечной точки, который должен храниться в секрете).

Назначения настроек хоста C аналогичны настройкам точек A и B, за исключением пары параметров в секции [Interface]:

Address

Это IP- адрес хоста C внутри создаваемой нами WireGuard VPN - замените это значение значением из вашей сети. Вы можете использовать для этого любой адрес, но он должен находиться в адресном пространстве IPv4 «Private-Use» или «Unique-Local» IPv6 (например, 10.0.0.0/8 — все доступные блоки адресов см. В RFC 6890 ), и не должны конфликтовать с любыми другими частными подсетями, к которым может подключаться сама конечная точка или любой из ее узлов.

С топологией Звезда вы обычно выбираете один блок IP-адресов для использования для всей WireGuard VPN и назначаете каждому одноранговому узлу IP-адрес из этого блока. Вы будете использовать этот блок как параметр Peer.AllowedIPs в файле конфигурации для каждого луча. В этом сценарии мы собираемся использовать блок 10.0.0.0/24, поэтому и выбрали адрес из этого блока (10.0.0.3) для концентратора.

Обратите внимание, что этот параметр не используется WireGuard напрямую — он используется только вспомогательной службой wg-quick при настройке виртуального сетевого интерфейса для WireGuard. Для правильной маршрутизации сетевых пакетов на этот хост и от него, когда они находятся за пределами туннеля WireGuard, им необходимо использовать IP-адрес, который вы здесь установили.

Хотя вы и можете настроить несколько IP-адресов для этого параметра, однако если вы не используете специальный сценарий, — просто используйте один IP-адрес (ограничив его маской /32 для IPv4 или /64 для IPv6).

ListenPort

Это порт WireGuard хоста C. Узел C должен иметь возможность получать трафик UDP для новых подключений через этот порт из Интернета (или оттуда, откуда исходит трафик других одноранговых узлов WireGuard, с которыми он будет взаимодействовать).

В топологии Звезда этот параметр в файле конфигурации хоста C должен соответствовать порту в настройке [Peer] файлов конфигурации каждой конечной точки.

PreUp

Данная настройка отдаёт команду сервису изменить системные настройки перенаправления пакетов (включает форвардинг). В зависимости от того какие адреса используются в вашей сети IPv4 или IPv6 инструкция PreUp может выглядеть по разному:

PreUp = sysctl -w net.ipv4.ip_forward=1
PreUp = sysctl -w net.ipv6.conf.all.forwarding = 1

Запуск и проверка работы WireGuard

На каждом узле сети (хост C, точки A и B) запустите службу WireGuard: rc-service wireguard start или /etc/init.d/ wireguard start

Вы также можете запустить WireGuard командой:

$ sudo wg-quick up /etc/wireguard/wg0.conf

Обратите внимание, что имя wg0 — это просто стандартное соглашение для вашего первого интерфейса WireGuard. Вы можете создать столько интерфейсов WireGuard, сколько захотите, и называть их, как хотите. Например, вы можете создать другой файл конфигурации с именем /etc/wireguard/mytunnel.conf и запустить его с помощью команды wg-quick up /etc/wireguard/mytunnel.conf, что создаст новый интерфейс WireGuard с именем mytunnel .

После запуска WireGuard вы увидите результат, подобный следующему:

# rc-service wireguard start
wireguard 	| * Starting wireguard ...
wireguard 	| * 	ip link add wg0 type wireguard
wireguard 	| * 	wg setconf wg0 /dev/fd/63
wireguard 	| * 	ip -4 address add 10.0.0.2/32 dev wg0
wireguard 	| * 	ip link set mtu 1420 up dev wg0

Вывод показывает правила маршрутизации, которые wg-quick установил для вас автоматически.

Команда wg без параметров покажет состояние туннелей, активных на узле (например A):

# wg
interface: wg0
	public key: /TOE4TKtAqVsePRVR+5AA43HkAK5DSntkOCO7nYq5xU=
	private key: (hidden)
	listening port: 51821

peer: jUd41n3XYa3yXBzyBvWqlLhYgRef5RiBD7jwo70U+Rw=
	endpoint: 192.0.2.3:51823
	allowed ips: 10.0.0.3/32
	latest handshake: 3 seconds ago
	transfer: 644 B received, 2.36 KiB sent
	persistent keepalive: every 25 seconds

Проверить работоспособность туннеля можно запустив команду ping:

# ping 10.0.0.3
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
64 bytes from 10.0.0.3: icmp_seq=1 ttl=64 time=36.5 ms
64 bytes from 10.0.0.3: icmp_seq=2 ttl=64 time=38.8 ms
64 bytes from 10.0.0.3: icmp_seq=3 ttl=64 time=25.4 ms
^C
--- 10.40.50.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 25.358/33.537/38.765/5.857 ms

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

Однако сначала попробуйте запустить wg show all dump от имени root на обеих конечных точках, чтобы дважды проверить, что интерфейс WireGuard на обоих запущен, работает и настроен должным образом.

На конечной точке A вы, вероятно, увидите такой вывод:

$ sudo wg show all dump
wg0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEE= /TOE4TKtAqVsePRVR+5AA43HkAK5DSntkOCO7nYq5xU= 51821 off
wg0 fE/wdxzl0klVp/IR8UcaoGUMjqaWi3jAd7KzHKFS6Ds= (none) 203.0.113.2:51822 10.0.0.2/32 0 0 1234 off

Для каждого интерфейса (например, wg0) первая строка вывода показывает информацию о самой конечной точке (конечная точка A), а следующие строки показывают информацию об узлах конечной точки (например, конечной точке B), по одному узлу на строку. Предпоследний столбец для однорангового узла показывает байты, отправленные одноранговому узлу, а предпоследний столбец показывает полученные байты. Если предпоследний столбец не равен нулю, но предпоследний столбец равен нулю (как в приведенном выше примере), WireGuard пытается отправить пакеты одноранговому узлу, но ничего не получает взамен.

На конечной точке B вы, вероятно, увидите такой вывод:

$ sudo wg show all dump
wg0 ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFA= fE/wdxzl0klVp/IR8UcaoGUMjqaWi3jAd7KzHKFS6Ds= 51822 off
wg0 /TOE4TKtAqVsePRVR+5AA43HkAK5DSntkOCO7nYq5xU= (none) (none) 10.0.0.1/32 0 0 0 off

Этот вывод не показывает ни отправленных, ни полученных байтов. Если это так для вас, вам нужно заняться вашими брандмауэрами или другой сетевой конфигурацией, пока они не позволят точке A отправлять UDP-пакеты точке B через IP-адрес и порт, настроенные в настройке Endpoint исходной точки туннеля (в данном контексте — A).

Точка-точка

lu489556y71d7_tmp_d60414593c32a529

Самая простая топология это просто точка-точка — одна конечная точка, на которой работает WireGuard, напрямую подключена к другой конечной точке, на которой работает WireGuard. Это ++единственная топология++, которая обеспечивает оконечное шифрование (E2E или End-to-End) — все другие топологии включают дешифровку пакетов WireGuard посредником в какой-то момент между конечными точками.

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

В простейшем сценарии «точка-точка» обе конечные точки будут находиться в одной и той же LAN (локальной сети) с любыми межсетевыми экранами между двумя конечными точками, настроенными так, чтобы одна конечная точка могла подключаться к другому порту WireGuard. В этом случае любая конечная точка может инициировать соединение с другой в любое время.

Рисунок 1.1: Простая топология «точка-точка» от точки A до точки B

В более сложном, но распространенном сценарии обе конечные точки будут находиться за брандмауэрами и NAT ( преобразованием сетевых адресов), а между ними будет Интернет. Здесь межсетевые экраны перед конечной точкой A разрешают только установленные соединения через конечную точку A. Межсетевые экраны перед конечной точкой B разрешают новые соединения через порт 51822, а NAT перед точкой B перенаправляет порт 51822 на конечную точку B.

Рисунок 1.2: Топология точка-точка за межсетевыми экранами и NAT от конечной точки A до конечной точки B

В этом сценарии конечная точка A может в любое время инициировать новое соединение с конечной точкой B. Но поскольку конечная точка A находится за брандмауэром, который разрешает только уже установленные соединения, если вы хотите, чтобы конечная точка B могла инициировать подключения к конечной точке A, вы должны настроить параметр PersistentKeepalive на конечной точке A (значение 25 , означающее отправку пакета поддержки активности каждые 25 секунд, будет работать в большинстве случаев).

По сути, топология Сеть — это просто набор отдельных соединений «точка-точка» между группой конечных точек.

Конфигурация WireGuard «**Точка-Точка»2

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

В этом сценарии у нас будет рабочая станция конечного пользователя, «точка A», в одной локальной сети и HTTP-сервер, прослушивающий порт 80, «конечная точка B», на другом конце, а также Интернет между ними. Исходная точка A находится за NAT (преобразование сетевых адресов) и брандмауэром, который разрешает только установленные соединения. Конечная точка B также находится за NAT и брандмауэром, но ее брандмауэр+NAT позволяет перенаправлять порт 51822 из Интернета на конечную точку B, будем использовать этот порт, 51822 для WireGuard на конечной точке B.

Схема ниже иллюстрирует этот сценарий:

Ключевым требованием для топологии «точка-точка» является то, что одна конечная точка должна разрешить общий доступ (или, по крайней мере, доступ с другой конечной точки) к своему порту WireGuard до того, как будет установлен сам туннель WireGuard. На приведенной выше диаграмме UDP-пакеты из Интернета на IP-адрес 203.0.113.2 на порту 51822 пересылаются в конечную точку B (также на порт 51822), что позволяет исходной точке A получить доступ к порту WireGuard конечной точки B через Интернет и установить туннель WireGuard.

Обратите внимание на IP-адреса, показанные на диаграмме выше, в этом сценарии IP-адрес исходной точки A с точки зрения Интернета 198.51.100.1, но в локальной сети (сайт A) это 192.168.1.11, а в WireGuard VPN это 10.0.0.1. Сходным образом IP-адрес конечной точки B с точки зрения Интернета 203.0.113.2, но в локальной сети (сайт B) это 192.168.200.22 и в WireGuard VPN это 10.0.0.2.

Настройка WireGuard на конечной точке A

Используйте шаблонную конфигурацию для точки A из раздела «Общие положения по установке и конфигурированию WireGuard», в которой замените настройки секции [Peer] для точки B:

# Изменяемая в зависимости от типа топологии часть
# настройки удаленной точки B
[Peer]
PublicKey = fE/wdxzl0klVp/IR8UcaoGUMjqaWi3jAd7KzHKFS6Ds=
Endpoint = 203.0.113.2:51822
AllowedIPs = 10.0.0.2/32

Настройка WireGuard на конечной точке B

Используйте шаблонную конфигурацию для точки A из раздела «Общие положения по установке и конфигурированию WireGuard», в которой измените настройки секций [Interface] и [Peer] для конфигурации точки B:

# /etc/wireguard/wg0.conf

# локальные настройки точки B
[Interface]
PrivateKey = ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFA=
Address = 10.0.0.2/32
ListenPort = 51822

# Изменяемая в зависимости от типа топологии часть
# настройки удаленной точки A
[Peer]
PublicKey = /TOE4TKtAqVsePRVR+5AA43HkAK5DSntkOCO7nYq5xU=
AllowedIPs = 10.0.0.1/32

Запустите и проверьте туннель.

Поддержание активности туннеля

При необходимости поддержания активного соединения в туннеле в секцию [Peer] конфигурации исходной точки туннеля — A добавьте инструкцию PersistentKeepalive:

# Изменяемая в зависимости от типа топологии часть
# настройки удаленной точки B
[Peer]
PublicKey = fE/wdxzl0klVp/IR8UcaoGUMjqaWi3jAd7KzHKFS6Ds=
Endpoint = 203.0.113.2:51822
AllowedIPs = 10.0.0.2/32
PersistentKeepalive = 25

Hub and Spoke (Звезда)

lu489556y71d7_tmp_686f6d3b54d60bb2

Следующая базовая топология — это Hub and Spoke (также известная как топология Звезда), где две конечные точки, на которых работает WireGuard, соединены через третий хост, также работающий с WireGuard. Этот третий хост работает как маршрутизатор среди подключенных к нему конечных точек WireGuard, пересылая пакеты, которые он получает, через туннель WireGuard от одной конечной точки на вторую конечную точку через другой туннель WireGuard.

Таким образом вы часто соединяете более двух конечных точек, такая топология — хороший способ включить управление удаленным доступом между разнообразным набором удаленных конечных точек; или создать виртуальную локальную сеть из нескольких разрозненных удаленных хостов с централизованными правилами маршрутизации, контролем доступа и проверкой трафика в одном месте (концентраторе).

Звезда также может быть полезным инструментом для соединения двух точек, которые находятся за брандмауэрами, не разрешающими новые входящие соединения, или за NAT, который не позволяет переадресацию портов (где вы бы использовали концентратор просто как «сервер возврата»).

В простейшем сценарии звезды все узлы находятся в одной локальной сети с любыми межсетевыми экранами между двумя оконечными точками «луча» (точки A и B) и «промежуточным» хостом (хост C), настроенным так, чтобы позволить периферийным устройствам (через точки A и B) подключаться к сети через WireGuard по порту 51823 и поддерживать соединения по портам 51821 для точки A и 51822 для точки B.

Когда туннель WireGuard между исходной точкой A и хостом C включен, а также включен отдельный туннель WireGuard между конечной точкой B и хостом C, — хост C может перенаправлять пакеты, отправленные от исходной точки A к конечной точке B, и наоборот.

Рисунок 2.1: Простой концентратор и распределитель от точки A до точки B через хост C

В более сложном сценарии и концентратор, и периферийные устройства находятся за межсетевыми экранами и NAT, а Интернет находится между ними. Брандмауэры перед исходной точкой A и конечной точкой B разрешают только установленные соединения через исходную точку A и конечную точку B. Межсетевые экраны перед узлом C разрешают новые подключения через порт 51823, а NAT перед узлом C перенаправляет порт 51823 на узел. С.

Рисунок 2.2: Звезда за межсетевыми экранами и NAT от точки A до точки B через хост C

В этом сценарии, хотя точка A и точка B могут независимо инициировать новые соединения с узлом C, из-за правил брандмауэра для конечных точек A и B узел C не может инициировать новые соединения ни с одним из них. Следовательно, чтобы позволить оконечной точке A инициировать соединения через WireGuard с конечной точкой B, вы должны настроить параметр PersistentKeepalive на конечной точке B. И если вы хотите, чтобы конечная точка B также могла инициировать подключения через WireGuard к оконечной точке A, вы должны настройте параметр PersistentKeepalive на конечной точке A.

Конфигурация WireGuard Звезда 3

Это конфигурация, которую следует использовать, если необходимо соединить две оконечные точки, на которых работает WireGuard, но обе они находятся за ограничительным NAT (преобразование сетевых адресов) или брандмауэрами, которые не позволяют одной из конечных точек принимать новые подключения от другой. Для этого необходимо использовать третий хост WireGuard («концентратор»), который может принимать новые соединения от двух конечных точек («лучевых»).

В этом сценарии у нас будет рабочая станция конечного пользователя, начальная точка A, в одной локальной сети и HTTP-сервер, прослушивающий порт 80 — конечная точка B, а также хост-посредник, концентратор, далее хост C в третьей LAN с Интернетом между каждым из них. Точки A и B находятся за NAT и брандмауэрами, которые разрешают только установленные соединения. Хост C также находится за NAT и брандмауэром, но его NAT и брандмауэр позволяет перенаправлять порт 51823 из Интернета на хост C. Мы будем использовать этот порт (51823) для WireGuard на хосте C.

Схема ниже иллюстрирует этот сценарий:

В этой конфигурации использована шаблонная конфигурация из раздела «Общие положения по установке и конфигурированию WireGuard» без каких-либо изменений, просто используйте её для точек A, B и хоста C.

Точка-Сайт

С топологией Точка-Сайт удаленная исходная точка подключается через WireGuard к другому хосту в другой сети, где этот хост может маршрутизировать пакеты от удаленной исходной точки к различным другим локальным конечным точкам в своей сети. Точка-Сайт похожа на топологию Звезда, за исключением того, что некоторые из лучевых серверов (те, что находятся в той же LAN, что и концентратор) не используют туннель WireGuard.

Точка-Сайт удобен для случаев, когда вы хотите разрешить удаленный доступ с дискретной исходной точки к множеству серверов в одной локальной сети без настройки и управления WireGuard отдельно на каждом из этих серверов. У вас могут быть такие случаи, как:

  • удаленный компьютер, подключенный к различным серверам в офисной локальной сети;
  • рабочая станция в офисной локальной сети, подключенная к нескольким серверам в облачной сети;
  • облачная виртуальная машина, подключающаяся к различным серверам в локальной сети вашего офиса;
  • облачный сервер, подключающийся к другим серверам в другой облачной сети;

В простейшем сценарии Точка-Сайт у вас есть одна исходная точка с запущенным WireGuard (точка A), подключенная напрямую к другому хосту, на котором запущен WireGuard (хост β); и этот хост может служить маршрутизатором для других конечных точек в пределах локальной сети (Сайт B), включая конечную точку B («локальную» конечную точку).

Рисунок 3.1: Простая топология Точка-Сайт от исходной точки A до конечной точки B в сети B

Любые брандмауэры между исходной точкой A и сайтом B в этом сценарии будут настроены так, чтобы конечная точка A могла подключаться к хосту β, и наоборот. Это позволяет удаленной исходной точке (точка A) инициировать подключение к любой локальной конечной точке, а любой локальной конечной точке (например, конечной точке B) инициировать подключение к удаленной исходной точке.

В более сложном сценарии (который вы, скорее всего, увидите) и удаленная исходная точка (точка A), и локальная сеть (сайт B) находятся за брандмауэрами и NAT, а между ними находится Интернет. Брандмауэры перед исходной точкой A разрешают только установленные соединения через точку A. Брандмауэр перед сетью B разрешает новые соединения через порт 51822, где хост, на котором запущен WireGuard (хост β), принимает соединения WireGuard по порту 51822, а маршруты авторизованы трафику из туннелей WireGuard к конечным точкам на сайте (например, к конечной точке B).

Рисунок 3.2: Точка на сайт за межсетевыми экранами и NAT от конечной точки A до конечной точки B на сайте B

Трафик внутри локальной сети (Сайт B) не туннелируется через WireGuard, поэтому на него распространяются любые ограничения брандмауэра или другие ограничения маршрутизации, которым подвержен другой локальный трафик. В этом сценарии HTTP-запрос между исходной точкой A и конечной точкой B будет проходить через туннель WireGuard от точки A к сайту B, а затем будет маршрутизироваться локально, как любой другой локальный трафик из туннеля WireGuard к конечной точке B. Итак, для того чтобы HTTP-трафик проходил весь путь от точки A до порта 80 на конечной точке B, любой межсетевой экран между узлом β и конечной точкой B должен разрешать порт 80 от узла β до конечной точки B.

Как и в случае со сценарием «точка-точка», конечная точка A может в любой момент инициировать новое соединение с конечной точкой B. Но поскольку конечная точка A находится за брандмауэром, который разрешает только уже установленные соединения, если вы хотите разрешить конечной точке B инициировать подключения к конечной точке A , вам нужно будет настроить параметр PersistentKeepalive на конечной точке A.

Конфигурация WireGuard Точка-Сайт4

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

Во многих случаях это делается для обеспечения доступа удаленной конечной точки к локальной сети (LAN), но вы также можете использовать тот же подход для настройки конечной точки для доступа к глобальной сети (WAN), например к Интернету.

В этом сценарии у нас будет рабочая станция конечного пользователя с WireGuard, начальная точка A, в одной локальной сети и другой хост с WireGuard в другой локальной сети, настроенный как маршрутизатор для этой локальной сети — «Хост β» и его локальная сеть — «Сайт B». Внутри сайта B у нас будет еще одна «конечная точка B», на которой запущен HTTP-сервер, прослушивающий порт 80.

Интернет находится между исходной точкой A и сайтом B. Исходная точка A находится за NAT (преобразование сетевых адресов) и межсетевым экраном, который разрешает только установленные соединения. Сайт B также находится за NAT и брандмауэром, но его NAT+брандмауэр позволяет перенаправлять порт 51822 из Интернета на хост β. Мы будем использовать этот порт, 51822, для WireGuard на хосте β. Брандмауэр на сайте B позволяет хосту β инициировать новые подключения к конечной точке B через порт 80.

Схема ниже иллюстрирует этот сценарий:

Исходная точка A подключённая через виртуальную частную сеть WireGuard (VPN) к хосту β сможет получить доступ к HTTP-серверу, работающему на конечной точке B, как если бы точки A и B были в одной сети. Конечная точка B имеет IP-адрес 192.168.200.22 на сайте B, поэтому пользователь с точки A получит доступ к HTTP-серверу на конечной точке B просто перейдя к нему http://192.168.200.22 в своем веб-браузере.

Прежде чем мы начнем, обратите внимание на IP-адреса, показанные на приведенной выше диаграмме: в этом сценарии IP-адрес конечной точки A с точки зрения Интернета — 198.51.100.1, но в ее собственной локальной сети он 192.168.1.11, а в WireGuard VPN, которую мы создадим — 10.0.0.1. Конечная точка B недоступна из Интернета, а в её локальной сети (сайт B) её IP-адрес 192.168.200.22.

IP-адрес хоста β с точки зрения Интернета — 203.0.113.2, но в локальной сети (Сайт B) он 192.168.200.2, а для WireGuard VPN, который мы создадим — 10.0.0.2. С точки зрения конечной точки B (или любых других конечных точек на сайте B) пакеты начальной точки A будут исходить от хоста β, поэтому с точки зрения конечной точки B IP-адрес конечной точки A будет таким же, как IP-адрес для хоста β на сайте в сети — 192.168.200.2.

Настройка WireGuard на конечной точке A

Используйте шаблонную конфигурацию для точки A из раздела «Общие положения по установке и конфигурированию WireGuard», в которой замените настройки секции [Peer] для хоста β:

# Изменяемая в зависимости от типа топологии часть
# настройки удалённого хоста β
[Peer]
PublicKey = fE/wdxzl0klVp/IR8UcaoGUMjqaWi3jAd7KzHKFS6Ds=
Endpoint = 203.0.113.2:51822
AllowedIPs = 192.168.200.0/24

Настройка WireGuard на хосте β

Теперь настроим серверную сторону соединения. На хосте β создайте новый файл /etc/wireguard/wg0.conf со следующим содержимым:

# /etc/wireguard/wg0.conf

# локальные настройки хоста β
[Interface]
PrivateKey = ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFA=
Address = 10.0.0.2/32
ListenPort = 51822

# Изменяемая в зависимости от типа топологии часть
# настройки удаленной точки A
[Peer]
PublicKey = /TOE4TKtAqVsePRVR+5AA43HkAK5DSntkOCO7nYq5xU=
AllowedIPs = 10.0.0.1/32

Заметим, что настройки хоста β полностью повторяют настройки конечной точки B из предыдущего раздела, поскольку такой вариант и является разновидностью соединения «точка-точка» с некоторыми различиями в маршрутизации, которую настраиваем согласно вот этой статьи.

Запустите и проверьте туннель по общим правилам.

Маршрутизация Точка-Сайт5

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

Существует три различных стратегии, которые вы можете использовать для маршрутизации пакетов от VPN к сайту:

  1. Маскарадинг
  2. Перенаправление порта
  3. Шлюз сайта

Мы будем использовать следующую схему сети, чтобы проиллюстрировать различия между стратегиями:

Рисунок 3.1. Пример сети точка-сеть

Здесь:

  • «Точка» это исходная точка A с IP-адресом 10.0.0.1 в WireGuard VPN и 192.168.1.11 в своей локальной сети.
  • «Сайт» это сеть B, в которой есть хост, на котором запущен WireGuard, — хост β с IP-адресом в WireGuard VPN 10.0.0.2 и IP-адресом 192.168.200.2 внутри сети B, конечная точка B также в сети B, но не в WireGuard VPN, её IP-адрес — 192.168.200.22.

Идея всех этих стратегий состоит в том, чтобы позволить конечной точке B, которая не является частью WireGuard VPN, но является частью локальной сети, связываться с конечной точкой A (подключенной к сайту через туннель WireGuard с хостом β).

Маскарадинг (маскировка)

Наиболее часто используемой стратегией является маскировка пакетов, — SNAT (преобразование исходного сетевого адреса). В этой стратегии хост β будет пересылать пакеты от исходной точки A к конечной точке B после перезаписи исходного адреса этих пакетов, используя свой собственный IP-адрес вместо адреса исходной точки A. С точки зрения конечной точки B в локальной сети, удаленные пакеты от исходной точки A будут поступать непосредственно от хоста β (с IP-адресом 192.168.200.2), а не с исходной точки A (с IP-адресом 10.0.0.1).

Маскировка пакетов — наиболее часто используемая стратегия для соединения «точка-сайт», поскольку ее легко настроить и обычно она соответствует «направлению» доступа, которое должна разрешить VPN. Она не требует каких-либо изменений маршрутизации на стороне «сайта», для этого просто требуется несколько простых правил брандмауэра на маскирующем хосте (хост β в приведенном выше примере), что позволяет исходным точкам WireGuard на стороне «Точка» инициировать подключения к конечным точкам, не относящимся к WireGuard, на стороне «Сайт»:

Рисунок 3.2. Инициирование соединения точка-сайт с маскировкой.

Чтобы настроить сеть WireGuard типа «точка-сайт» с маскированием пакетов, следуйте вот этим инструкциям.

Два недостатка маскарадинга:

  1. Конечные точки без WireGuard на стороне «Сайт» не могут инициировать подключения к стороне «Точка».
  2. Конечные точки без WireGuard на стороне «Сайт» не могут отличить разные конечные точки на стороне «Точка».

Поскольку все хосты в сети B будут видеть пакеты, исходящие от точки A исходящими от хоста β, — они не могут отличить пакеты исходящие от узла β от пакетов из точки A (или от любого другого узла WireGuard, подключенного к хосту β). Этот IP-адрес хоста β, который и будет отображаться в их журналах и если они используют IP-адреса для принятия решений об аутентификации или авторизации, то они будут использовать IP-адрес хоста β, а не исходной точки A.

Кроме того, узлы в сети B (кроме самого хоста β) не смогут инициировать какие-либо подключения к конечной точке A. Если вам действительно нужны хосты в локальной сети для инициирования подключений к удаленной точке (например, потому что она работает как веб-сервер или база данных, к которой хосты из локальной сети должны получить доступ), вы можете комбинировать маскировку с перенаправлением портов — или, в качестве альтернативы, вы можете использовать шлюз сайта вместо маскировки пакетов.

Перенаправление порта

Пересылка сообщений, — DNAT (преобразование сетевых адресов назначения), используется с WireGuard, когда у вас есть служба, такая как веб-приложение или база данных, работающая на удаленной конечной точке, которую вы хотите предоставить локальному сайту. С этой стратегией вышеупомянутый хост β будет пересылать пакеты, отправленные ему от конечной точки B через свое соединение WireGuard к исходной точке A — после первой перезаписи адреса назначения этих пакетов, для использования адреса исходной точки A вместо своего собственного. С точки зрения конечной точки B, она подключается к хосту β напрямую (используя его IP-адрес 192.168.200.2), а не к конечной точке A вообще (она не будет видеть IP-адрес точки A 10.0.0.1).

Переадресация портов используется, когда «направление» доступа, которое должна разрешить VPN, является исходящим (вы можете сказать «Сайт-Точка» вместо «Точка-Сайт»):

Рисунок 3.3. Инициирование соединения «точка-точка» с переадресацией портов.

Чтобы настроить сеть WireGuard типа «точка-сеть» с переадресацией портов, следуйте этим инструкциям.

Недостатком переадресации портов является то, что конечные точки WireGuard на стороне «Точка» не могут успешно инициировать соединения со стороной «Сайт». В отличие от маскарадинга, хост β не будет перезаписывать исходный адрес любого пакета, который исходная точка A отправляет конечной точке B (за исключением ответов на пакеты, к которым он недавно применил переадресацию портов), поэтому эти пакеты будут содержать исходный адрес точки A адрес источника 10.0.0.1, а конечная точка B не будет знать, что она должна отправлять пакеты обратно через хост β для ответа на соединения от 10.0.0.1.

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

Шлюз сайта

Шлюз сайта WireGuard используется для полного исключения NAT (трансляции сетевых адресов). С помощью этой стратегии хосты в сети B выше (или, по крайней мере, шлюз по умолчанию сети B) были настроены так, чтобы все пакеты, предназначенные для точки A, перенаправлялись через хост β, поэтому брандмауэр на узле β не требует перезаписи пакетов, для правильной маршрутизации. В этой стратегии, когда конечная точка B хочет отправить пакет точке A, она просто использует IP-адрес точки A в WireGuard VPN (10.0.0.1) как адрес назначения и когда конечная точка B получает пакет от точки A, она будет видеть адрес точки A (10.0.0.1) как источник пакета.

Если вы в силах легко настроить таблицы маршрутизации, используемые сайтом B, — шлюз сайта, как правило, является лучшим выбором для подключения WireGuard «точка-точка», особенно если вам нужно инициировать двусторонние подключения (оба: «точка-точка» и «Сайт-Точка»):

Рисунок 3.4. Двунаправленное инициирование подключений через шлюз сайта.

Рассмотрим пример такой маршрутизации6.

У нас будет рабочая станция конечного пользователя, на которой работает WireGuard — «точка A» на каком-то удаленном сайте и еще один хост, на котором работает WireGuard на нашем локальном сайте «Хост β» в «Сайте B». Внутри сайта B у нас будет еще одна конечная точка, «точка B», на которой запущен HTTP-сервер, прослушивающий порт 80.

Интернет находится между исходной точкой A и сайтом B. Точка A находится за NAT (преобразование сетевых адресов) и межсетевым экраном, который разрешает только установленные соединения. Сайт B также находится за NAT и брандмауэром, но его NAT+брандмауэр позволяют перенаправлять порт 51822 из Интернета на хост β. Мы будем использовать этот порт, 51822, для WireGuard на хосте β. Брандмауэр на сайте B позволяет хосту β инициировать новые подключения к конечной точке B через порт 80.

Схема ниже иллюстрирует этот сценарий:

Чтобы настроить сеть WireGuard типа «точка-сеть» со шлюзом сайта , нам нужно сделать две вещи:

  1. Включить пересылку пакетов на хосте β
  2. Обновить таблицы маршрутизации на сайте B

Измените настройки WireGuard хоста β включив перенаправление пакетов:

# /etc/wireguard/wg0.conf

# локальные настройки хоста β
[Interface]
PrivateKey = ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFA=
Address = 10.0.0.2/32
ListenPort = 51822

# перенаправление пакетов
PreUp = sysctl -w net.ipv4.ip_forward=1

# Изменяемая в зависимости от типа топологии часть
# настройки удаленной точки A
[Peer]
PublicKey = /TOE4TKtAqVsePRVR+5AA43HkAK5DSntkOCO7nYq5xU=
AllowedIPs = 10.0.0.1/32

Если вы используете IPv6-адреса для своей WireGuard VPN, замените net.ipv4.ip_forward на net.ipv6.conf.all.forwarding.

К сожалению, мы не можем сделать второе, — обновить таблицы маршрутизации для сайта B через WireGuard. Если бы у нас было только несколько хостов на сайте B (например, только конечная точка B), которые должны были иметь возможность маршрутизировать к WireGuard VPN, мы могли бы настроить каждый из этих хостов индивидуально с помощью пользовательского маршрута. Однако обычно самое простое — просто обновить конфигурацию маршрутизатора LAN для сайта, чтобы добавить к нему маршрут для WireGuard VPN.

Если это маршрутизатор Linux, запустите на нем команду ip route, чтобы проверить, какие (IPv4) маршруты он использует в настоящее время (для IPv6 запустите ip -6 route). Для нашего LAN-маршрутизатора на сайте B результат может выглядеть примерно так:

$ ip route
203.0.113.0/26 dev eth0 proto kernel scope link src 203.0.113.2
192.168.200.0/24 dev eth1 proto kernel scope link src 192.168.200.1
default via 203.0.113.1 dev eth0

В приведенном выше примере показан шлюз, имеющий IP-адрес 203.0.113.2 на своем eth0 (WAN для глобальной сети) сетевом устройстве и 192.168.200.1 на своем eth1 (LAN) устройстве. Устройство eth1 подключено к подсети сайта B, 192.168.200.0/24.

Выполните следующую команду на маршрутизаторе, чтобы (временно) добавить маршрут к сети WireGuard через Host β на устройстве eth1( LAN ):

$ sudo ip route add 10.0.0.0/24 via 192.168.200.2 dev eth1

Замените подсеть для сайта B (10.0.0.0/24) фактической подсетью, которую вы используете для внутренних IP-адресов в своей WireGuard VPN, замените IP- дрес для хоста β (192.168.200.2) фактическим IP-адресом вашего хоста β и замените имя сетевого устройства (eth1) на фактическое, через которое маршрутизатор подключен к сайту B.

Обратите внимание, что если вы просто хотите маршрутизировать конечную точку A (а не какие-либо другие одноранговые узлы WireGuard, которые вы можете подключиться позже к узлу β), вы можете ограничить маршрут только конечной точкой A, а не всей подсетью WireGuard VPN:

$ sudo ip route add 10.0.0.1/32 via 192.168.200.2 dev eth1

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

Недостатком использования шлюза сайта является то, что вам необходимо иметь возможность настраивать таблицы маршрутизации, используемые сайтом B — либо на отдельных хостах в сайте B вручную, либо через DHCP, либо на самом шлюзе сайта по умолчанию (на небольших сайтах, часто это интернет-роутер).

Сайт-Сайт

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

Как и в случае с топологией Точка-Сайт, на одном конце у вас есть хост, на котором работает WireGuard, и этот хост может маршрутизировать к различным конечным точкам в пределах своей собственной сети. А на другом конце соединения у вас также есть другой хост, с WireGuard с аналогичными возможностями.

В простейшей форме ниже у вас есть две соседние подсети, A и B, соединенные туннелем WireGuard. Трафик в сети A (например от исходной точки A), предназначенный для конечной точки в сети B (например конечной точки B), направляется на хост WireGuard (хост α) в сети A, затем через туннель WireGuard до хоста β в сети B и далее — до конечной точки B в сети B.

Рисунок 4.1: Простой сценарий Сайт-Сайт от исходной точки A в сети A до конечной точки B в сети B

Любые брандмауэры между сетями A и B в этом сценарии должны быть настроены так, чтобы позволить сети A подключаться к порту WireGuard в сети B и наоборот. Это позволяет любой конечной точке из сети A инициировать соединение с любой конечной точкой в сети B и наоборот.

В более сложном сценарии оба сайта будут находиться за межсетевыми экранами и NAT, а Интернет будет между ними. Брандмауэр перед сетью A разрешает новые соединения через порт 51821, где хост α принимает соединения WireGuard через порт 51821 и направляет авторизованный трафик из своего туннеля WireGuard к конечным точкам внутри сайта. Точно так же брандмауэр перед сетью B разрешает новые соединения через порт 51822, где хост β принимает по нему трафик WireGuard и направляет авторизованный трафик из своего туннеля WireGuard к конечным точкам в сети B.

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

Рисунок 4.2: Сценарий Сайт-Сайт за межсетевыми экранами и NAT от исходной точки A в сети A до конечной точки B в сети B

Трафик от исходной точки A к конечной точке B в этом сценарии сначала направляется на хост α, затем через туннель WireGuard между сетями A и B, далее выходит из хоста β и, наконец, оправляется на конечную точку B. Межсетевой экран между точкой A и хостом α разрешает трафик исходящий из точки A (и трафик от установленных подключений обратно); и межсетевой экран между хостом β и конечной точкой B разрешает трафик HTTP (порт 80), входящий в конечную точку B (и соответствующий трафик обратно).

Межсетевые экраны между узлом α и β позволяют одному узлу WireGuard инициировать соединение с другим — и поэтому, как правило, с помощью туннеля WireGuard любая конечная точка на сайте A может инициировать соединение с любой конечной точкой на сайте B, и наоборот. Однако брандмауэр между исходной точкой A и хостом α разрешает только установленные подключения к точке A, защищая ее от новых подключений из сети B.

Если бы мы хотели разрешить конечным точкам на сайте B возможность инициировать новые подключения к конечной точке A, мы бы ничего не сделали, чтобы включить это, специально для WireGuard — мы просто изменили бы наши правила межсетевого экрана для межсетевого экрана между точкой A и хостом α, чтобы разрешить новые подключения (как для конечной точки B, которая разрешает новые HTTP-подключения на порт 80 от хоста β).

Конфигурация WireGuard «Сайт-Сайт»7

Это конфигурация, которую вы бы использовали, когда хотите подключить множество компьютеров из одной сети через один туннель WireGuard к множеству компьютеров в другой сети, например, подключить LAN (локальную сеть) одного офиса к другому или подключить свою офисную сеть к группе серверов, которые вы настроили в облачной сети…

В этом сценарии у нас будет «Хост α», на котором работает WireGuard в одной локальной сети, «Сеть A», подключенный через Интернет к «хосту β», на котором запущен WireGuard в другой локальной сети «Сеть B». Хост α будет настроен как шлюз от сети A к сети B, а хост β как шлюз от сети B к сети A. «Исходная точка A» это рабочая станция оконечного пользователя на сайте A, которая сможет подключаться через наш WireGuard туннель к HTTP-серверу на «конечной точке B» в сети B.

Схема ниже иллюстрирует этот сценарий:

Для этого узел α должен иметь возможность подключаться через брандмауэр сети B к порту UDP 51822 на хосте β, а хост β должен иметь возможность подключаться через межсетевой экран сети A к порту UDP 51821 на хосте α. С точки зрения хоста β и Интернета у хоста α IP-адрес 198.51.100.1, но для сети A IP-адрес хоста α 192.168.1.1, а для туннеля WireGuard α-β IP-адрес хоста α будет 10.0.0.1.

Аналогично и для хоста α и Интернета IP-адрес хоста β - 203.0.113.2, а для сети B IP-адрес хоста β 192.168.200.2, и для туннеля WireGuard α-β IP-адрес узла β будет 10.0.0.2.

Когда туннель WireGuard запущен и работает, пользователь с исходной точки A (IP-адрес 192.168.1.11) сможет получить доступ к HTTP-серверу на конечной точке B (IP-адрес 192.168.200.22), просто перейдя по адресу http://192.168.200.22 в своем веб-браузере.

Настройка WireGuard на конечной точке A

Используйте шаблонную конфигурацию для точки A из раздела «Общие положения по установке и конфигурированию WireGuard», в которой замените настройки секции [Peer] для точки B:

# Изменяемая в зависимости от типа топологии часть
# настройки удаленного хоста β
[Peer]
PublicKey = fE/wdxzl0klVp/IR8UcaoGUMjqaWi3jAd7KzHKFS6Ds=
Endpoint = 203.0.113.2:51822
AllowedIPs = 192.168.200.0/24

Настройка WireGuard на конечной точке B

Используйте шаблонную конфигурацию для точки B из раздела «Общие положения по установке и конфигурированию WireGuard», в которой измените настройки секции [Peer] для конфигурации точки B:

# Изменяемая в зависимости от типа топологии часть
# настройки удаленного хоста α
[Peer]
PublicKey = /TOE4TKtAqVsePRVR+5AA43HkAK5DSntkOCO7nYq5xU=
Endpoint = 198.51.100.1:51821
AllowedIPs = 192.168.1.0/24

Запустите и проверьте туннель.

Если оба хоста WireGuard уже на строены как шлюзы, то вы должны получить работающую систему, в противном случае настройте маршрутизацию как описано ранее для сценария «Точка-Сайт» на каждом узле, вы также можете использовать инструментарий nftables для фильтрации и перенаправления трафика.

Другие топологии

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

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

1Оригинал: Primary WireGuard Topologies | Pro Custodibus

2Оригинал: WireGuard Point to Point Configuration | Pro Custodibus

3Оригинал: WireGuard Hub and Spoke Configuration | Pro Custodibus

4Оригинал: WireGuard Point to Site Configuration | Pro Custodibus

5Оригинал: WireGuard Point to Site Routing | Pro Custodibus

6Оригинал: WireGuard Point to Site With a Site Gateway | Pro Custodibus

7Оригинал: WireGuard Site to Site Configuration | Pro Custodibus

Однозначно в wiki Calculate Wiki
на форуме потеряется