Skip to content

WireGuard — mihomo

Исходящий WireGuard в mihomo работает в пользовательском пространстве (на базе gVisor). Схема предлагает и упрощённую однопировую форму (поля пира лежат в корне прокси), и развёрнутую многопировую через peers:. Необязательный блок amnezia-wg-option обеспечивает совместимость с серверами семейства AmneziaWG.

Исходящий

Запись в proxies: с type: wireguard. Встраивает BasicOption, а также упрощённые поля пира из WireGuardPeerOption.

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(required)<string>Уникальное имя прокси.
ipstring(unset)<IPv4 CIDR>Локальный IPv4-адрес туннеля (например, `10.0.0.2/32`).
ipv6string(unset)<IPv6 CIDR>Локальный IPv6-адрес туннеля.
private-keystring(required)<base64 key>Локальный закрытый ключ.
workersint(CPU-based)<int>Число воркеров конвейера шифрования.
mtuint1408<bytes>MTU туннеля.
udpboolfalsetrue | falseВключить ретрансляцию UDP.
persistent-keepaliveint0<seconds>Интервал persistent-keepalive. 0 отключает keepalive.
amnezia-wg-option*AmneziaWGOption(unset)AmneziaWGOptionПараметры обфускации AmneziaWG (мусорные пакеты, маскировка заголовков).
peers[]WireGuardPeerOption(use simplified shape)[WireGuardPeerOption]Развёрнутый список нескольких пиров. Когда задан, встроенные упрощённые поля игнорируются.
remote-dns-resolveboolfalsetrue | falseРазрешать DNS-запросы через туннель WireGuard, используя резолверы на стороне пира.
dns[]string[][<DNS server>]Резолверы, используемые внутри туннеля, когда `remote-dns-resolve` равен true.
refresh-server-ip-intervalint0<seconds>Повторно разрешать имена хостов пиров каждые N секунд. 0 отключает периодическое повторное разрешение.

Исходный код: adapter/outbound/wireguard.go:57-77 · зафиксировано на v1.19.29 (e26714a)

peers[] — многопировая форма

ПолеТипПо умолчаниюДопустимые значенияОписание
serverstring(required)<host>Имя хоста или IP пира.
portint(required)<port>UDP-порт пира.
public-keystring(required)<base64 key>Открытый ключ пира.
pre-shared-keystring(unset)<base64 key>Необязательный PSK.
reserved[]uint8(empty)<3 bytes>Переопределение 3-байтового поля reserved.
allowed-ips[]string[][<CIDR>]Allowed-IPs для этого пира.

Исходный код: adapter/outbound/wireguard.go:79-86 · зафиксировано на v1.19.29 (e26714a)

amnezia-wg-option

ПолеТипПо умолчаниюДопустимые значенияОписание
jcint0<int>Число мусорных пакетов на рукопожатие.
jminint0<bytes>Минимальный размер мусорного пакета.
jmaxint0<bytes>Максимальный размер мусорного пакета.
s1int0<bytes>Длина дополнения перед init-пакетом.
s2int0<bytes>Длина дополнения перед response-пакетом.
s3int0<bytes>AmneziaWG v1.5/v2 — длина дополнения перед cookie-пакетом.
s4int0<bytes>AmneziaWG v1.5/v2 — длина дополнения перед data-пакетом.
h1string(unset)<int or hex>Магическое значение заголовка init-пакета. Число или hex.
h2string(unset)<int or hex>Магическое значение заголовка response-пакета.
h3string(unset)<int or hex>Магическое значение заголовка cookie-пакета.
h4string(unset)<int or hex>Магическое значение заголовка data-пакета.
i1string(unset)<hex>AmneziaWG v1.5/v2 — содержимое специального пакета 1.
i2string(unset)<hex>Содержимое специального пакета 2.
i3string(unset)<hex>Содержимое специального пакета 3.
i4string(unset)<hex>Содержимое специального пакета 4.
i5string(unset)<hex>Содержимое специального пакета 5.
j1string(unset)<hex>Только AmneziaWG v1.5 — содержимое мусорного пакета 1.
j2string(unset)<hex>Только AmneziaWG v1.5 — содержимое мусорного пакета 2.
j3string(unset)<hex>Только AmneziaWG v1.5 — содержимое мусорного пакета 3.
itimeint640<seconds>Только AmneziaWG v1.5 — периодичность отправки мусорных пакетов.

Исходный код: adapter/outbound/wireguard.go:88-109 · зафиксировано на v1.19.29 (e26714a)

Примеры

Упрощённое однопировое исходящее:

yaml
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

Многопировое исходящее (например, топология «хаб и спицы»):

yaml
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:

yaml
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: '0x12345678'
      h2: '0x87654321'
      h3: '0xabcdef01'
      h4: '0x10fedcba'

Примечания

  • 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.0). См. комментарии в исходниках: adapter/outbound/wireguard.go:94-108.

Сравнение с другими ядрами

  • Xray-core всегда использует peers: (без упрощённой формы), предоставляет флаг noKernelTun для быстрого пути в Linux и именует поля в camelCase (secretKey, address, publicKey). См. WireGuard — Xray-core.
  • sing-box перенёс WireGuard в модель конечных точек — он больше не находится в outbounds[]. Имена полей в snake_case (private_key, allowed_ips). См. WireGuard — sing-box.

Исходный код: adapter/outbound/wireguard.go:57-109 · v1.19.29 (e26714a)

Core Tutorial от Argsment