WireGuard
Реализация протокола WireGuard в пространстве пользователя для установления туннеля WireGuard с удалённым узлом и отправки исходящего трафика через этот туннель.
DANGER
Протокол WireGuard не предназначен специально для обхода блокировок. При использовании на внешнем уровне его характерные признаки могут привести к блокировке сервера.
OutboundConfigurationObject
OutboundConfigurationObject соответствует элементу settings в OutboundObject.
{
"outbounds": [
{
// ...
"protocol": "wireguard",
"settings": {
"secretKey": "CLIENT_PRIVATE_KEY",
"address": [
"10.0.0.1",
"fd59:7153:2388:b5fd:0000:0000:0000:0001",
"and more..."
],
"peers": [
{
"endpoint": "SERVER_ADDR",
"publicKey": "SERVER_PUBLIC_KEY",
"allowedIPs": ["0.0.0.0/0", "::/0"]
// ...
}
],
"noKernelTun": false,
"mtu": 1420,
"reserved": [0, 0, 0],
"remoteDNS": [
"1.1.1.1",
"1.0.0.1",
"2606:4700:4700::1111",
"2606:4700:4700::1001"
]
}
}
]
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
secretKey: string
Закрытый ключ клиента. Обязательное поле.
Пару ключей клиента можно создать командой xray wg. Укажите здесь полученный PrivateKey; выведенный вместе с ним Password (PublicKey) является открытым ключом клиента. Если Xray используется в качестве сервера WireGuard, открытый ключ клиента следует указать в inbounds[].settings.peers[].publicKey.
address: [ string ]
Задаёт локальные адреса источника для внутренних IP-пакетов, создаваемых исходящим подключением WireGuard, то есть внутренние IP-адреса клиента в туннеле. Можно указать один или несколько адресов IPv4 или IPv6.
Значение по умолчанию — ["10.0.0.1", "fd59:7153:2388:b5fd:0000:0000:0000:0001"].
Xray автоматически выбирает адрес источника нужного семейства в зависимости от адреса назначения. Если настроено несколько адресов одного семейства, подходящий адрес выбирается по внутренним правилам.
Конфигурация входящего подключения на сервере WireGuard должна разрешать эти адреса, и каждый из них должен быть уникальным в конфигурации входящего подключения WireGuard на сервере.
noKernelTun: true | false
Отключает использование TUN. Значение по умолчанию — false; в средах LXC или Docker может потребоваться значение true.
Нужно ли включать noKernelTun?
При значении false Xray автоматически выбирает способ обработки внутренних IP-пакетов: в Linux, если процесс Xray имеет привилегию CAP_NET_ADMIN, создаётся TUN-интерфейс и используется сетевой стек ядра; на других платформах или при недостаточных правах используется работающий внутри процесса сетевой стек gVisor. При значении true используется только сетевой стек gVisor и TUN-интерфейс не создаётся. Использование TUN обычно обеспечивает более высокую производительность.
Этот параметр определяет только способ обработки внутренних IP-пакетов. Сам протокол WireGuard по-прежнему обрабатывается пользовательской реализацией Xray и не связан с модулем WireGuard ядра.
Описанное автоматическое определение не всегда работает точно. Например, некоторые среды LXC могут не позволять использовать TUN даже при наличии привилегии CAP_NET_ADMIN, из-за чего исходящее подключение не будет работать. В таком случае установите значение true.
При использовании TUN задействуется таблица маршрутизации IPv6 с номером 10230. Каждое следующее исходящее подключение WireGuard последовательно использует следующую таблицу: например, второе подключение использует таблицу 10231 и так далее.
Если на том же компьютере запустить второй экземпляр Xray, нумерация таблиц не продолжится: второй экземпляр также попытается использовать таблицу 10230. Поскольку она уже занята первым экземпляром Xray, подключение установить не удастся. Если запуск нескольких экземпляров необходим, используйте этот параметр для отключения TUN.
mtu: int
MTU внутренних IP-пакетов в туннеле WireGuard. Значение по умолчанию — 1420.
Расчёт MTU
Структура пакета WireGuard:
- 20-byte IPv4 header or 40 byte IPv6 header
- 8-byte UDP header
- 4-byte type
- 4-byte key index
- 8-byte nonce
- N-byte encrypted data
- 16-byte authentication tag2
3
4
5
6
7
N-byte encrypted data — требуемое значение MTU. В зависимости от того, использует ли endpoint IPv4 или IPv6, оно может составлять 1440 (IPv4) или 1420 (IPv6). В особых сетевых условиях значение при необходимости следует дополнительно уменьшить, например ещё на 8 байт для домашнего подключения через PPPoE.
reserved[ byte ]
Три зарезервированных байта протокола WireGuard. По умолчанию все три равны 0; при необходимости укажите требуемые значения.
peers: [ PeersObject ]
Список серверов WireGuard, каждый элемент которого содержит конфигурацию одного сервера. Если настроено несколько серверов, Xray сопоставляет IP-адрес назначения с allowedIPs каждого сервера по префиксу и направляет трафик на совпавший сервер. Таким образом, разные сети назначения можно обслуживать через разные серверы WireGuard.
Модель пакетов исходящего подключения Xray WireGuard
TCP- и UDP-соединения, поступающие в исходящее подключение WireGuard, преобразуются сетевым стеком во внутренние IP-пакеты. Внутренний адрес источника выбирается из address, а внутренним адресом назначения становится IP-адрес назначения проксируемого трафика.
Xray сопоставляет внутренний адрес назначения с allowedIPs каждого пира по префиксу. Совпавший пир шифрует и инкапсулирует пакет, после чего внешний UDP-пакет отправляется на endpoint этого пира. Таким образом, address задаёт внутренние адреса источника клиента, allowedIPs служит таблицей маршрутов назначения для выбора пира, а endpoint является адресом сервера для внешнего соединения.
TIP
Каждый сервер WireGuard должен разрешать все адреса из address, семейство которых совпадает с семейством адресов в его allowedIPs: если allowedIPs содержит только сети IPv4, необходимо разрешить все IPv4-адреса из address; если только сети IPv6 — все IPv6-адреса; если присутствуют сети обоих семейств — все указанные адреса.
Если в качестве сервера WireGuard используется Xray, перечислите эти адреса в inbounds[].settings.peers[].allowedIPs.
remoteDNS: [ string ]
Используется для разрешения целевых доменных имён проксируемого трафика. Каждый элемент должен быть IP-адресом. Значение по умолчанию — ["1.1.1.1", "1.0.0.1", "2606:4700:4700::1111", "2606:4700:4700::1001"].
DNS-запросы отправляются через туннель WireGuard; IP-адрес каждого сервера должен входить в allowedIPs одного из пиров и быть доступен через туннель.
remoteDNS и targetStrategy
В отличие от других исходящих подключений, целью внутри туннеля WireGuard должен быть IP-адрес. Если целью проксируемого запроса является доменное имя, параметр targetStrategy исходящего подключения определяет, какой DNS используется для его разрешения:
AsIs: используетсяremoteDNS.UseIP*: сначала используется встроенный DNS Xray, а при ошибке разрешения выполняется переход наremoteDNS.ForceIP*: используется встроенный DNS Xray; ошибка разрешения сразу приводит к ошибке подключения.
Результаты UseIP* или ForceIP* должны содержать хотя бы один IP-адрес того же семейства, что и один из адресов в address; иначе соединение завершится ошибкой. Несовпадение семейств адресов не считается ошибкой разрешения и не запускает никакой переход на резервный вариант.
Что выбрать? remoteDNS работает сразу, без дополнительной настройки, и отправляет запросы через туннель WireGuard, что обычно позволяет получить результаты CDN, соответствующие расположению выхода из туннеля. Для достижения того же результата с помощью встроенного DNS Xray обычно требуется дополнительно настроить DNS-серверы и правила маршрутизации. Однако если встроенный DNS ранее уже разрешил целевое доменное имя — например, при использовании схемы RealIP с TUN/TProxy либо при включённом сниффинге и значении routing.domainStrategy, отличном от AsIs, — рекомендуется использовать встроенный DNS Xray, чтобы избежать дополнительной задержки RTT из-за повторного разрешения.
PeersObject
{
"endpoint": "SERVER_ADDR",
"publicKey": "SERVER_PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY",
"keepAlive": 0,
"allowedIPs": ["0.0.0.0/0", "::/0"]
}2
3
4
5
6
7
endpoint: address
Адрес сервера. Обязательное поле.
Формат URL:порт, например engage.cloudflareclient.com:2408
Формат IP:порт, например 162.159.192.1:2408 или [2606:4700:d0::a29f:c001]:2408
publicKey: string
Открытый ключ сервера, используемый для проверки. Обязательное поле.
Если Xray используется в качестве сервера WireGuard, здесь следует указать Password (PublicKey), соответствующий закрытому ключу сервера в inbounds[].settings.secretKey.
preSharedKey: string
Дополнительный симметричный ключ шифрования. Необязательное поле. Он должен совпадать с ключом в конфигурации сервера.
keepAlive: int
Интервал отправки клиентом этому серверу пакетов persistent keepalive, в секундах. Они поддерживают возможные сопоставления NAT или состояние межсетевого экрана в периоды простоя. Включайте этот параметр только при необходимости и только на стороне клиента. Значение по умолчанию — 0, то есть пакеты не отправляются.
allowedIPs: [ string ]
Задаёт IP-сети назначения, пересылаемые через этот сервер. Каждый элемент указывается в формате CIDR. При наличии только одного сервера поле можно опустить: значение по умолчанию — ["0.0.0.0/0", "::/0"], то есть через сервер направляется весь трафик к адресам IPv4 и IPv6. Если настроено несколько серверов, необходимо явно задать allowedIPs для каждого из них и распределить сети назначения между соответствующими серверами; Xray выбирает сервер путём сопоставления префикса IP-адреса назначения.