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. ۰ 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 ثانیه. ۰ بازتحلیل دوره‌ای را غیرفعال می‌کند.

منبع: adapter/outbound/wireguard.go:57-77 · ثابت‌شده در v1.19.24 (a847246)

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>بازنویسی فیلد رزرو ۳ بایتی.
allowed-ips[]string[][<CIDR>]Allowed-IPs برای این همتا.

منبع: adapter/outbound/wireguard.go:79-86 · ثابت‌شده در v1.19.24 (a847246)

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 — بار بستهٔ خاص ۱.
i2string(unset)<hex>بار بستهٔ خاص ۲.
i3string(unset)<hex>بار بستهٔ خاص ۳.
i4string(unset)<hex>بار بستهٔ خاص ۴.
i5string(unset)<hex>بار بستهٔ خاص ۵.
j1string(unset)<hex>فقط AmneziaWG v1.5 — بار بستهٔ زبالهٔ ۱.
j2string(unset)<hex>فقط AmneziaWG v1.5 — بار بستهٔ زبالهٔ ۲.
j3string(unset)<hex>فقط AmneziaWG v1.5 — بار بستهٔ زبالهٔ ۳.
itimeint640<seconds>فقط AmneziaWG v1.5 — آهنگ ارسال بستهٔ زباله.

منبع: adapter/outbound/wireguard.go:88-109 · ثابت‌شده در v1.19.24 (a847246)

مثال‌ها

خروجی سادهٔ تک‌همتا:

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

خروجی چندهمتا (مثلاً پیکربندی hub-and-spoke):

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 همتا یک نام میزبان باشد؛ این فیلد آن را در یک بازهٔ ثابت بازتحلیل می‌کند، برای نقاط پایانی dynamic-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 را برای مسیر سریع لینوکس ارائه می‌دهد و نام فیلدهایی مانند secretKey، address، publicKey (camelCase) به کار می‌برد. به WireGuard — Xray-core مراجعه کنید.
  • sing-box WireGuard را به مدل endpoints منتقل کرده است — دیگر زیر outbounds[] نیست. نام فیلدها snake_case هستند (private_key، allowed_ips). به WireGuard — sing-box مراجعه کنید.

منبع: adapter/outbound/wireguard.go:57-109 · v1.19.24 (a847246)

Core Tutorial اثر Argsment