Skip to content

WireGuard — mihomo ​

خروجی WireGuard در mihomo در فضای کاربر روی یک پشتهٔ IP قابل انتخاب اجرا می‌شود (gVisor یا پشتهٔ mips خود mihomo — به ip-stack مراجعه کنید). طرح هم شکل سادهٔ تک‌همتا (که فیلدهای همتا در ریشهٔ پراکسی قرار دارند) و هم شکل پرکلام چندهمتای از طریق 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 ها را غیرفعال می‌کند.
ip-stackIPStackOption(auto)IPStackOptionپشتهٔ IP فضای کاربر که ترافیک TCP/UDP تونل را حمل می‌کند. به جدول ip-stack در زیر مراجعه کنید.
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:69-91 · ثابت‌شده در v1.19.31 (ab405ba)

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:93-100 · ثابت‌شده در v1.19.31 (ab405ba)

ip-stack ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
modestringautoauto | gvisor | mipsgvisor از پشتهٔ شبکهٔ gVisor استفاده می‌کند (فقط در بیلدهای دارای برچسب with_gvisor؛ در غیر این صورت راه‌اندازی شکست می‌خورد)؛ mips از پشتهٔ IP خود mihomo استفاده می‌کند (MIPS یعنی mihomo IP stack و ربطی به معماری CPU ندارد)؛ auto اگر gVisor کامپایل شده باشد آن را برمی‌گزیند و در غیر این صورت mips را.
congestion-controllerstring(stack default)cubic | reno | bbr | bbr3الگوریتم کنترل ازدحام TCP برای پشتهٔ mips. gVisor آن را نادیده می‌گیرد. هر مقدار دیگری هنگام راه‌اندازی رد می‌شود.

منبع: adapter/outbound/wireguard.go:143-146 · ثابت‌شده در v1.19.31 (ab405ba)

amnezia-wg-option ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
versionint03 | <other>انتخاب‌گر پیاده‌سازی. 3 به پیاده‌سازی AmneziaWG v3 می‌رود که فیلدهای مختص v3 در زیر به آن نیاز دارند؛ هر مقدار دیگر (از جمله تنظیم‌نشده) از پیاده‌سازی قدیمی v1.x/v2 استفاده می‌کند.
jcint0<int>تعداد بسته‌های زباله به ازای هر دست‌دهی.
jminint0<bytes>حداقل اندازهٔ بستهٔ زباله.
jmaxint0<bytes>حداکثر اندازهٔ بستهٔ زباله.
s1int0<bytes>طول پدینگ پیش از بستهٔ init.
s2int0<bytes>طول پدینگ پیش از بستهٔ response.
s3int0<bytes>AmneziaWG v1.5+ — طول پدینگ پیش از بستهٔ cookie.
s4int0<bytes>AmneziaWG v1.5+ — طول پدینگ پیش از بستهٔ data.
h1string(unset)<uint32> | <min-max>ماجیک سرآیند برای بستهٔ init. فقط دهدهی — در v1.x یک uint32 واحد؛ v2+ بازهٔ min-max را نیز می‌پذیرد.
h2string(unset)<uint32> | <min-max>ماجیک سرآیند برای بستهٔ response. قالب همانند h1.
h3string(unset)<uint32> | <min-max>ماجیک سرآیند برای بستهٔ cookie. قالب همانند h1.
h4string(unset)<uint32> | <min-max>ماجیک سرآیند برای بستهٔ data. قالب همانند h1.
i1string(unset)<tag chain>AmneziaWG v1.5+ — بستهٔ خاص ۱، به‌صورت زنجیرهٔ برچسب نوشته می‌شود، مثلاً <b 0xf6ab3267fa><r 100>.
i2string(unset)<tag chain>بستهٔ خاص ۲ (قالب همانند i1).
i3string(unset)<tag chain>بستهٔ خاص ۳ (قالب همانند i1).
i4string(unset)<tag chain>بستهٔ خاص ۴ (قالب همانند i1).
i5string(unset)<tag chain>بستهٔ خاص ۵ (قالب همانند i1).
j1string(unset)<tag chain>فقط AmneziaWG v1.5 — بستهٔ زبالهٔ ۱ (زنجیرهٔ برچسب). وقتی version برابر 3 باشد رد می‌شود.
j2string(unset)<tag chain>فقط AmneziaWG v1.5 — بستهٔ زبالهٔ ۲ (زنجیرهٔ برچسب). وقتی version برابر 3 باشد رد می‌شود.
j3string(unset)<tag chain>فقط AmneziaWG v1.5 — بستهٔ زبالهٔ ۳ (زنجیرهٔ برچسب). وقتی version برابر 3 باشد رد می‌شود.
itimeint640<seconds>فقط AmneziaWG v1.5 — آهنگ ارسال بستهٔ زباله. وقتی version برابر 3 باشد رد می‌شود.
header-protection-keystring(unset)<base64 key>AmneziaWG v3 — کلید (base64، مثلاً تولیدشده با awg genkey) برای رمزگذاری فیلدهای کم‌آنتروپی سرآیند. نیاز دارد s1 تا s4 دست‌کم 12 باشند.
content-padding-additionstring(unset)<bytes> | <a-b>AmneziaWG v3 — بازهٔ پدینگ تصادفی اضافه برای محتوای بسته، بر حسب بایت (a یا a-b). بهتر است در هر دو سمت یکسان تنظیم شود.
rekey-after-timestring(unset)<seconds> | <a-b>AmneziaWG v3 — ثانیه‌هایی که پس از آن کلاینت دست‌دهی تازه‌ای آغاز می‌کند (a یا a-b).
rekey-timeoutstring(unset)<seconds> | <a-b>AmneziaWG v3 — ثانیه‌های انتظار پیش از تکرار دست‌دهی بی‌پاسخ.
reject-after-timestring(unset)<seconds> | <a-b>AmneziaWG v3 — ثانیه‌هایی که پس از آن کلاینت دست‌دهی را اجباری می‌کند و دادهٔ ورودی نشست قدیمی را نمی‌پذیرد.
keepalive-timeoutstring(unset)<seconds> | <a-b>AmneziaWG v3 — ثانیه‌هایی از آخرین ارسال داده که پس از آن keepalive فرستاده می‌شود.
max-handshake-attemptsstring(unset)<int> | <a-b>AmneziaWG v3 — بیشینهٔ دفعات تکرار دست‌دهی.
random-trailersboolfalsetrue | falseAmneziaWG v3.1 — دنباله‌هایی با طول تصادفی به انتهای بسته‌ها می‌افزاید (و بسته‌های بلندتر از انتظار را از همتا می‌پذیرد).
disable-cookiesboolfalsetrue | falseAmneziaWG v3.1 — حتی زیر بار هم پاسخ cookie نمی‌فرستد (بررسی MAC2 ضد DoS در WireGuard را رد می‌کند).

منبع: adapter/outbound/wireguard.go:102-141 · ثابت‌شده در v1.19.31 (ab405ba)

مثال‌ها ​

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

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: 123456
      h2: 67543
      h3: 123123
      h4: 32345

خروجی AmneziaWG v3:

yaml
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 همتا یک نام میزبان باشد؛ این فیلد آن را در یک بازهٔ ثابت بازتحلیل می‌کند، برای نقاط پایانی dynamic-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 همان را برمی‌گزیند و در غیر این صورت پشتهٔ mips خود mihomo را؛ congestion-controller فقط روی mips اثر دارد. همین بلوک ip-stack در خروجی‌های OpenVPN و MASQUE در mihomo نیز وجود دارد.

نکات بین‌هسته‌ای ​

  • 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:69-141 · v1.19.31 (ab405ba)

Core Tutorial اثر Argsment