WireGuard — mihomo
Исходящий WireGuard в mihomo работает в пользовательском пространстве на выбираемом IP-стеке (gVisor или собственный стек mips в mihomo — см. ip-stack). Схема предлагает и упрощённую однопировую форму (поля пира лежат в корне прокси), и развёрнутую многопировую через peers:. Необязательный блок amnezia-wg-option обеспечивает совместимость с серверами семейства AmneziaWG.
Исходящий
Запись в proxies: с type: wireguard. Встраивает BasicOption, а также упрощённые поля пира из WireGuardPeerOption.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
name | string | (required) | <string> | Уникальное имя прокси. |
ip | string | (unset) | <IPv4 CIDR> | Локальный IPv4-адрес туннеля (например, 10.0.0.2/32). |
ipv6 | string | (unset) | <IPv6 CIDR> | Локальный IPv6-адрес туннеля. |
private-key | string | (required) | <base64 key> | Локальный закрытый ключ. |
workers | int | (CPU-based) | <int> | Число воркеров конвейера шифрования. |
mtu | int | 1408 | <bytes> | MTU туннеля. |
udp | bool | false | true | false | Включить ретрансляцию UDP. |
persistent-keepalive | int | 0 | <seconds> | Интервал persistent-keepalive. 0 отключает keepalive. |
ip-stack | IPStackOption | (auto) | IPStackOption | IP-стек в пользовательском пространстве, который несёт TCP/UDP-трафик туннеля. См. таблицу ip-stack ниже. |
amnezia-wg-option | *AmneziaWGOption | (unset) | AmneziaWGOption | Параметры обфускации AmneziaWG (мусорные пакеты, маскировка заголовков). |
peers | []WireGuardPeerOption | (use simplified shape) | [WireGuardPeerOption] | Развёрнутый список нескольких пиров. Когда задан, встроенные упрощённые поля игнорируются. |
remote-dns-resolve | bool | false | true | false | Разрешать DNS-запросы через туннель WireGuard, используя резолверы на стороне пира. |
dns | []string | [] | [<DNS server>] | Резолверы, используемые внутри туннеля, когда remote-dns-resolve равен true. |
refresh-server-ip-interval | int | 0 | <seconds> | Повторно разрешать имена хостов пиров каждые N секунд. 0 отключает периодическое повторное разрешение. |
Исходный код: adapter/outbound/wireguard.go:69-91 · зафиксировано на v1.19.31 (ab405ba)
peers[] — многопировая форма
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
server | string | (required) | <host> | Имя хоста или IP пира. |
port | int | (required) | <port> | UDP-порт пира. |
public-key | string | (required) | <base64 key> | Открытый ключ пира. |
pre-shared-key | string | (unset) | <base64 key> | Необязательный PSK. |
reserved | []uint8 | (empty) | <3 bytes> | Переопределение 3-байтового поля reserved. |
allowed-ips | []string | [] | [<CIDR>] | Allowed-IPs для этого пира. |
Исходный код: adapter/outbound/wireguard.go:93-100 · зафиксировано на v1.19.31 (ab405ba)
ip-stack
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
mode | string | auto | auto | gvisor | mips | gvisor — сетевой стек gVisor (только в сборках с тегом with_gvisor, иначе запуск завершится ошибкой); mips — собственный IP-стек mihomo (MIPS — это mihomo IP stack, а не архитектура процессора); auto выбирает gVisor, если он вкомпилирован, иначе mips. |
congestion-controller | string | (stack default) | cubic | reno | bbr | bbr3 | Алгоритм управления перегрузкой TCP для стека mips. gVisor его игнорирует. Любое другое значение отклоняется при запуске. |
Исходный код: adapter/outbound/wireguard.go:143-146 · зафиксировано на v1.19.31 (ab405ba)
amnezia-wg-option
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
version | int | 0 | 3 | <other> | Выбор реализации. 3 переключает на реализацию AmneziaWG v3, которая нужна полям только-v3 ниже; любое другое значение (в том числе незаданное) использует прежнюю реализацию v1.x/v2. |
jc | int | 0 | <int> | Число мусорных пакетов на рукопожатие. |
jmin | int | 0 | <bytes> | Минимальный размер мусорного пакета. |
jmax | int | 0 | <bytes> | Максимальный размер мусорного пакета. |
s1 | int | 0 | <bytes> | Длина дополнения перед init-пакетом. |
s2 | int | 0 | <bytes> | Длина дополнения перед response-пакетом. |
s3 | int | 0 | <bytes> | AmneziaWG v1.5+ — длина дополнения перед cookie-пакетом. |
s4 | int | 0 | <bytes> | AmneziaWG v1.5+ — длина дополнения перед data-пакетом. |
h1 | string | (unset) | <uint32> | <min-max> | Магическое значение заголовка init-пакета. Только десятичное — в v1.x одно значение uint32; v2+ также принимает диапазон min-max. |
h2 | string | (unset) | <uint32> | <min-max> | Магическое значение заголовка response-пакета. Формат как у h1. |
h3 | string | (unset) | <uint32> | <min-max> | Магическое значение заголовка cookie-пакета. Формат как у h1. |
h4 | string | (unset) | <uint32> | <min-max> | Магическое значение заголовка data-пакета. Формат как у h1. |
i1 | string | (unset) | <tag chain> | AmneziaWG v1.5+ — специальный пакет 1, записывается цепочкой тегов, например <b 0xf6ab3267fa><r 100>. |
i2 | string | (unset) | <tag chain> | Специальный пакет 2 (формат как у i1). |
i3 | string | (unset) | <tag chain> | Специальный пакет 3 (формат как у i1). |
i4 | string | (unset) | <tag chain> | Специальный пакет 4 (формат как у i1). |
i5 | string | (unset) | <tag chain> | Специальный пакет 5 (формат как у i1). |
j1 | string | (unset) | <tag chain> | Только AmneziaWG v1.5 — мусорный пакет 1 (цепочка тегов). Отклоняется при version: 3. |
j2 | string | (unset) | <tag chain> | Только AmneziaWG v1.5 — мусорный пакет 2 (цепочка тегов). Отклоняется при version: 3. |
j3 | string | (unset) | <tag chain> | Только AmneziaWG v1.5 — мусорный пакет 3 (цепочка тегов). Отклоняется при version: 3. |
itime | int64 | 0 | <seconds> | Только AmneziaWG v1.5 — периодичность отправки мусорных пакетов. Отклоняется при version: 3. |
header-protection-key | string | (unset) | <base64 key> | AmneziaWG v3 — ключ (base64, например из awg genkey) для шифрования низкоэнтропийных полей заголовка. Требует, чтобы s1–s4 были не меньше 12. |
content-padding-addition | string | (unset) | <bytes> | <a-b> | AmneziaWG v3 — диапазон дополнительного случайного дополнения содержимого пакета, в байтах (a или a-b). Лучше задавать одинаково на обеих сторонах. |
rekey-after-time | string | (unset) | <seconds> | <a-b> | AmneziaWG v3 — через сколько секунд клиент начинает новое рукопожатие (a или a-b). |
rekey-timeout | string | (unset) | <seconds> | <a-b> | AmneziaWG v3 — сколько секунд ждать, прежде чем повторить рукопожатие без ответа. |
reject-after-time | string | (unset) | <seconds> | <a-b> | AmneziaWG v3 — через сколько секунд клиент принудительно выполняет рукопожатие и отклоняет входящие данные старой сессии. |
keepalive-timeout | string | (unset) | <seconds> | <a-b> | AmneziaWG v3 — через сколько секунд после последней отправки данных посылается keepalive. |
max-handshake-attempts | string | (unset) | <int> | <a-b> | AmneziaWG v3 — максимальное число повторов рукопожатия. |
random-trailers | bool | false | true | false | AmneziaWG v3.1 — добавлять к пакетам хвосты случайной длины (и принимать от пира пакеты длиннее ожидаемого). |
disable-cookies | bool | false | true | false | AmneziaWG v3.1 — не отвечать cookie-пакетами даже под нагрузкой (пропускает проверку MAC2 WireGuard против DoS). |
Исходный код: adapter/outbound/wireguard.go:102-141 · зафиксировано на v1.19.31 (ab405ba)
Примеры
Упрощённое однопировое исходящее:
proxies:
- name: wg-simple
type: wireguard
server: wg.example.com
port: 51820
private-key: <base64>
public-key: <base64 peer key>
ip: 10.0.0.2/32
ipv6: fd00::2/128
allowed-ips: ['0.0.0.0/0', '::/0']
udp: true
persistent-keepalive: 25Многопировое исходящее (например, топология «хаб и спицы»):
proxies:
- name: wg-multi
type: wireguard
private-key: <base64>
ip: 10.0.0.2/32
udp: true
peers:
- server: spoke1.example.com
port: 51820
public-key: <base64-spoke1>
allowed-ips: ['10.0.1.0/24']
- server: spoke2.example.com
port: 51820
public-key: <base64-spoke2>
allowed-ips: ['10.0.2.0/24']Исходящее, совместимое с AmneziaWG:
proxies:
- name: awg
type: wireguard
server: awg.example.com
port: 12345
private-key: <base64>
public-key: <base64>
ip: 10.13.13.2/32
allowed-ips: ['0.0.0.0/0']
udp: true
amnezia-wg-option:
jc: 4
jmin: 40
jmax: 80
s1: 0
s2: 0
h1: 123456
h2: 67543
h3: 123123
h4: 32345Исходящее AmneziaWG v3:
proxies:
- name: awg3
type: wireguard
server: awg.example.com
port: 12345
private-key: <base64>
public-key: <base64>
ip: 10.13.13.2/32
allowed-ips: ['0.0.0.0/0']
udp: true
amnezia-wg-option:
version: 3
jc: 4
jmin: 40
jmax: 80
s1: 16
s2: 16
s3: 16
s4: 16
h1: 100000-199999
h2: 200000-299999
h3: 300000-399999
h4: 400000-499999
header-protection-key: <base64 key>
content-padding-addition: 0-32Примечания
- mihomo принимает и упрощённую форму (
server/port/public-key/allowed-ipsна верхнем уровне), и развёрнутый списокpeers:. Когда заданpeers, встроенные упрощённые поля игнорируются. remote-dns-resolve: trueзаставляет WireGuard туннелировать DNS-запросы к резолверам изdns:(вместо использования локального резолвера). Полезно, когда локальный DNS не достигает назначения.refresh-server-ip-intervalимеет значение, только когдаserverпира — имя хоста; поле повторно разрешает его с фиксированным интервалом, что полезно для конечных точек с динамическим DNS.- Поля
amnezia-wg-optionверсионированы:s3/s4/i1-i5— AmneziaWG v1.5+;j1/j2/j3/itime— только v1.5 (в v2 и выше не используются);header-protection-key,content-padding-additionи пять полей таймингов — только v3, аrandom-trailers/disable-cookiesтребуют v3.1. Поля v3 требуютversion: 3и не сочетаются с полями только-v1.5 — каждая реализация отклоняет параметры другой. См. комментарии в исходниках:adapter/outbound/wireguard.go:103-140. ip-stack.mode: autoвыбирает gVisor в сборках, где он есть, и собственный стекmipsmihomo в остальных;congestion-controllerдействует только наmips. Тот же блокip-stackесть у исходящих OpenVPN и MASQUE в mihomo.
Сравнение с другими ядрами
- Xray-core всегда использует
peers:(без упрощённой формы), предоставляет флагnoKernelTunдля быстрого пути в Linux и именует поля в camelCase (secretKey,address,publicKey). См. WireGuard — Xray-core. - sing-box настраивает WireGuard как конечную точку в
endpoints[], а не вoutbounds[]. Имена полей в snake_case (private_key,allowed_ips). См. WireGuard — sing-box.
Исходный код: adapter/outbound/wireguard.go:69-141 · v1.19.31 (ab405ba)
