Wireguard
Реализация протокола Wireguard в пользовательском пространстве.
DANGER
Протокол Wireguard не предназначен для обхода блокировок. Использование его на внешнем уровне может привести к блокировке сервера из-за характерных признаков.
InboundConfigurationObject
{
"secretKey": "PRIVATE_KEY",
"address": [
// необязательно, по умолчанию ["10.0.0.1", "fd59:7153:2388:b5fd:0000:0000:0000:0001"]
"10.0.0.1/32",
"fd59:7153:2388:b5fd::1/128"
],
"peers": [
{
"publicKey": "PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY",
"endpoint": "ENDPOINT_ADDR",
"keepAlive": 0,
"allowedIPs": ["10.0.0.2/32", "fd59:7153:2388:b5fd::2/128"]
}
],
"mtu": 1420 // необязательно, по умолчанию 1420
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
secretKey: string
Приватный ключ. Обязательное поле.
mtu: int
Размер фрагментации уровня tun в Wireguard.
address: string array
Адреса интерфейса виртуального TUN WireGuard. Поддерживаются два формата:
- IP: например
"10.0.0.1"/"fd59:...::1" - CIDR: допускаются только
/32(IPv4) или/128(IPv6), например"10.0.0.1/32"/"fd59:...::1/128"
Если не указано, используется ["10.0.0.1", "fd59:7153:2388:b5fd:0000:0000:0000:0001"].
Метод расчета MTU
Структура пакета Wireguard выглядит следующим образом:
- 20-байтный IPv4-заголовок или 40-байтный IPv6-заголовок
- 8-байтный UDP-заголовок
- 4 байта — тип
- 4 байта — индекс ключа
- 8 байт — nonce
- N байт — зашифрованные данные
- 16 байт — аутентификационный тег2
3
4
5
6
7
N байт — зашифрованные данные — это и есть значение MTU, которое зависит от того, используется ли IPv4 или IPv6. Значение может быть 1440 (IPv4) или 1420 (IPv6). В особых условиях значение может быть дополнительно уменьшено (например, для PPPoE — минус 8 байт).
peers: [ Peers ]
Список серверов peers, каждая запись представляет конфигурацию одного сервера.
Peers
{
"publicKey": "PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY",
"endpoint": "ENDPOINT_ADDR",
"keepAlive": 0,
"allowedIPs": ["10.0.0.2/32"] // необязательно, по умолчанию ["0.0.0.0/0", "::0/0"]
}2
3
4
5
6
7
publicKey: string
Публичный ключ для верификации.
allowedIPs: string array
WireGuard AllowedIPs. Если не указано, используется ["0.0.0.0/0", "::0/0"].
WARNING
При использовании WireGuard inbound (режим сервера) рекомендуется явно задавать диапазоны адресов для каждого peer (обычно /32 или /128), чтобы избежать некорректной маршрутизации.
preSharedKey: string
Предварительно общий ключ (PSK), необязательно.
endpoint: string
Endpoint peer'а (необязательно). Обычно в формате host:port, например example.com:51820 или 162.159.192.1:2408.
keepAlive: int
Интервал keepalive в секундах. По умолчанию 0 (отключено).
Примечания
WireGuard inbound сейчас не поддерживает kernel TUN (всегда используется gVisor TUN), поэтому noKernelTun не влияет в inbound-режиме.
Следующие поля сейчас актуальны только для WireGuard outbound (inbound их игнорирует):
workersreserved(должно быть пустым или 3 байта)domainStrategy