WireGuard
Реализация протокола WireGuard в пространстве пользователя для установления туннеля WireGuard с удалённым узлом, инкапсулирующая перенаправленные в это исходящее подключение TCP/UDP-запросы в IP-пакеты и отправляющая их через туннель 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"],
"peers": [
{
"endpoint": "example.com:2408",
"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
secretKey: string
Закрытый ключ клиента. Обязательное поле.
При создании пары ключей клиента с помощью команды xray wg здесь указывается выведенный PrivateKey.
address: [ string ]
Список локальных IP-адресов интерфейса WireGuard. При наличии нескольких адресов выбирается автоматически в зависимости от пира.
Значение по умолчанию — ["10.0.0.1", "fd59:7153:2388:b5fd:0000:0000:0000:0001"].
noKernelTun: true | false
Принудительно отключает системный TUN независимо от результатов автоматического определения. Значение по умолчанию — false; в средах LXC или Docker может потребоваться значение true.
О kernel TUN
Способ восстановления IP-пакетов WireGuard обратно в TCP/UDP-нагрузку в Xray. По умолчанию Xray определяет автоматически: в Linux, если процесс Xray имеет привилегию CAP_NET_ADMIN, создаётся TUN-интерфейс и используется сетевой стек ядра; на других платформах или при недостаточных правах используется работающий внутри процесса сетевой стек gVisor. При значении true используется только сетевой стек gVisor и TUN-интерфейс не создаётся. Использование TUN обычно обеспечивает более высокую производительность.
Описанное автоматическое определение не всегда работает точно. Например, некоторые среды LXC могут не позволять использовать TUN даже при наличии привилегии CAP_NET_ADMIN, из-за чего исходящее подключение не будет работать; в таком случае установка noKernelTun в true решает проблему.
Этот параметр определяет только способ обработки внутренних IP-пакетов. Сам протокол WireGuard по-прежнему обрабатывается пользовательской реализацией Xray и не связан с модулем WireGuard ядра.
При использовании 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 для подключения.
remoteDNS: [ string ]
Используется для разрешения целевых доменных имён проксируемого трафика. Каждый элемент должен быть IP-адресом. Значение по умолчанию — ["1.1.1.1", "1.0.0.1", "2606:4700:4700::1111", "2606:4700:4700::1001"].
В отличие от других исходящих подключений, адрес цели внутри туннеля WireGuard обязательно должен быть IP-адресом. Если проксируемая цель является доменным именем, необходим DNS-сервер для преобразования доменного имени в IP-адрес. Эти DNS-серверы настраиваются здесь и отправляют DNS-запросы напрямую через этот туннель WireGuard. Если вы хотите подключить встроенную систему DNS Xray, рассмотрите возможность предварительного разрешения через targetStrategy исходящего подключения.
PeersObject
{
"endpoint": "example.com:2408",
"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
Адрес и порт сервера, может быть IP-адресом или доменным именем. Обязательное поле.
publicKey: string
Открытый ключ пира, используемый для проверки. Обязательное поле.
При создании пары ключей с помощью xray wg здесь указывается выведенный Password (PublicKey).
preSharedKey: string
Дополнительный симметричный ключ шифрования. Необязательное поле. Он должен совпадать с ключом в конфигурации сервера.
keepAlive: int
Интервал отправки клиентом этому серверу пакетов persistent keepalive, в секундах, для поддержания возможных сопоставлений NAT или состояния межсетевого экрана во время простоя. Требуется включать только в особых случаях и только на стороне клиента; значение по умолчанию — 0, то есть пакеты не отправляются.
allowedIPs: [ string ]
Запросы, которые должны пересылаться через этот пир, в формате CIDR. Значение по умолчанию — ["0.0.0.0/0", "::/0"], то есть весь целевой трафик IPv4 и IPv6 пересылается через этот сервер. При совпадении нескольких пиров выбор осуществляется по принципу наибольшего совпадения префикса (longest prefix match).