Skip to content

VMess — mihomo

mihomo در هر دو سمت VMess را پشتیبانی می‌کند. شکل خروجی همهٔ ترابردها (ws، http، h2، grpc)، TLS، REALITY، ECH و دو کلید توسعهٔ احراز هویت را در خود دارد. ورودی عمداً سبک‌تر است — فهرست کاربران مستقیماً روی شنونده قرار می‌گیرد.

خروجی

ورودی تحت proxies: با type: vmess. این ساختار BasicOption را جاسازی می‌کند (فیلدهای مشترک خروجی: interface-name، routing-mark، ip-version، dialer-proxy، …) که در صفحهٔ Proxies مستند شده است (تکمیل فاز ۳).

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
namestring(required)<string>نام یکتای پراکسی.
serverstring(required)<host>میزبان یا IP سرور بالادست.
portint(required)<port>پورت سرور بالادست.
uuidstring(required)<UUID>UUID کاربری که سرور می‌پذیرد.
alterIdint00 | <int>سازگاری قدیمی MD5-AEAD. برای حالت مدرن صرفاً AEAD آن را ۰ نگه دارید.
cipherstringautoauto | aes-128-gcm | chacha20-poly1305 | none | zeroمجموعه‌رمز متقارن. نام `security` در mihomo.
udpboolfalsetrue | falseاجازه به بازپخش بسته‌های UDP از این خروجی.
networkstringtcptcp | ws | http | h2 | grpcترابرد زیرین.
tlsboolfalsetrue | falseپوشاندن جریان با TLS.
alpn[]string[]h2 | http/1.1فهرست ALPN ارائه‌شده در دست‌دهی TLS.
skip-cert-verifyboolfalsetrue | falseغیرفعال‌سازی راستی‌آزمایی گواهی TLS (فقط آزمایش).
fingerprintstring(unset)<SHA256 hex>تثبیت گواهی TLS سرور به این اثرانگشت SHA-256.
certificatestring(unset)<PEM file path>گواهی کلاینت (mTLS).
private-keystring(unset)<key file path>کلید خصوصی مطابق با `certificate`.
servernamestring(unset)<SNI>بازنویسی SNI در TLS.
ech-optsECHOptions(disabled)ECHOptionsپیکربندی Encrypted Client Hello.
reality-optsRealityOptions(disabled)RealityOptionsپیکربندی کلاینت REALITY.
http-optsHTTPOptions(unset)HTTPOptionsتنظیمات `network: http`.
h2-optsHTTP2Options(unset)HTTP2Optionsتنظیمات `network: h2`.
grpc-optsGrpcOptions(unset)GrpcOptionsتنظیمات `network: grpc`.
ws-optsWSOptions(unset)WSOptionsتنظیمات `network: ws`.
packet-addrboolfalsetrue | falseاستفاده از کدگذاری قدیمی packet-addr برای UDP.
xudpboolfalsetrue | falseاستفاده از کدگذاری xudp برای بسته‌های UDP (پیش‌فرض مدرن). با packet-addr ناسازگار.
packet-encodingstring(use udp/xudp flags)packetaddr | xudpانتخاب‌گر صریح packet-encoding؛ هنگام تنظیم بر پرچم‌های بولی اولویت دارد.
global-paddingboolfalsetrue | falseتمام نوشتن‌ها را به طول یکنواخت پدینگ کنید. سرور باید مطابق باشد.
authenticated-lengthboolfalsetrue | falseاستفاده از قاب‌بندی authenticated-length. سرور باید مطابق باشد.
client-fingerprintstring(global)chrome | firefox | safari | ios | edge | random | randomizedاثرانگشت client-hello مبتنی بر uTLS.

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

ws-opts

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
pathstring//<path>مسیر WebSocket.
headersmap[string]string{}{<header>: <value>}سرآیندهای HTTP اضافی در درخواست upgrade.
max-early-dataint0<bytes>حداکثر بایت‌های early-data بافر شده پیش از اتمام دست‌دهی WS.
early-data-header-namestring(unset)<header name>نام سرآیندی که برای حمل early-data به‌صورت base64 استفاده می‌شود وقتی سرور انتظار آن را دارد.
v2ray-http-upgradeboolfalsetrue | falseاستفاده از ترابرد HTTP-upgrade سبک V2Ray به جای WebSocket واقعی.
v2ray-http-upgrade-fast-openboolfalsetrue | falseارسال بار کلاینت همراه با درخواست HTTP-upgrade برای صرفه‌جویی یک RTT.

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

grpc-opts

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
grpc-service-namestring(required)<name>مسیر نام سرویس gRPC.
grpc-user-agentstring(unset)<UA string>بازنویسی User-Agent کلاینت gRPC.
ping-intervalint0<seconds>بازهٔ فریم PING در HTTP/2. مقدار ۰ غیرفعال می‌کند.
max-connectionsint0<int>حداکثر کانال‌های همزمان gRPC (پراکنش mux).
min-streamsint0<int>حداقل جریان‌ها در هر کانال پیش از تخصیص کانال جدید.
max-streamsint0<int>حداکثر جریان‌ها در هر کانال.

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

ورودی

ورودی تحت listeners: با type: vmess. BaseOption را جاسازی می‌کند (listen، port).

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
users[]VmessUser(required)<VmessUser array>کلاینت‌های پذیرفته‌شده.
ws-pathstring(unset)/<path>مسیر WebSocket ارائه‌شده در این شنونده.
grpc-service-namestring(unset)<name>نام سرویس gRPC پذیرفته‌شده در این شنونده.
certificatestring(unset)<PEM file path>گواهی TLS سرور.
private-keystring(unset)<key file path>کلید خصوصی TLS.
client-auth-typestring(none)no-client-cert | request-client-cert | require-any-client-cert | verify-client-cert-if-given | require-and-verify-client-certحالت احراز هویت متقابل TLS کلاینت.
client-auth-certstring(unset)<PEM file path>بستهٔ CA پذیرفته‌شده به‌عنوان ریشهٔ کلاینت.
ech-keystring(unset)<ECH config>مواد Encrypted Client Hello.
reality-configRealityConfig(disabled)RealityConfigپیکربندی سرور REALITY.
mux-optionMuxOption(disabled)MuxOptionتنظیمات چندسوسازی (سبک sing mux).

منبع: listener/inbound/vmess.go:12-24 · ثابت‌شده در v1.19.24 (a847246)

users[]

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
usernamestring(unset)<string>نام نمایشی.
uuidstring(required)<UUID>UUID کاربر.
alterIdint00 | <int>سازگاری قدیمی MD5-AEAD.

منبع: listener/inbound/vmess.go:26-30 · ثابت‌شده در v1.19.24 (a847246)

مثال‌ها

خروجی — VMess روی WebSocket با TLS:

yaml
proxies:
  - name: vmess-ws
    type: vmess
    server: example.com
    port: 443
    uuid: a3482e88-686a-4a58-8126-99c9df64b7bf
    alterId: 0
    cipher: auto
    udp: true
    network: ws
    tls: true
    servername: example.com
    ws-opts:
      path: /vm
      headers:
        Host: example.com

خروجی — VMess روی gRPC با REALITY:

yaml
proxies:
  - name: vmess-grpc
    type: vmess
    server: example.com
    port: 443
    uuid: a3482e88-686a-4a58-8126-99c9df64b7bf
    alterId: 0
    cipher: auto
    network: grpc
    tls: true
    servername: www.cloudflare.com
    client-fingerprint: chrome
    reality-opts:
      public-key: <reality public key>
      short-id: <short id>
    grpc-opts:
      grpc-service-name: GunService

ورودی تحت listeners:

yaml
listeners:
  - name: vmess-in
    type: vmess
    listen: 0.0.0.0
    port: 443
    users:
      - username: alice
        uuid: a3482e88-686a-4a58-8126-99c9df64b7bf
        alterId: 0
    certificate: /etc/mihomo/server.crt
    private-key: /etc/mihomo/server.key

نکات

  • خروجی mihomo برای الگوریتم متقارن از cipher استفاده می‌کند. هم Xray (security) و هم sing-box (security) این فیلد را با نامی متفاوت می‌خوانند. مقادیر مجاز در همه یکسان است: auto، aes-128-gcm، chacha20-poly1305، none، zero.
  • سه کلید مختلف برای کدگذاری UDP در خروجی نمایش داده می‌شود: udp (بولی — فعال‌سازی کلی بازپخش UDP)، xudp / packet-addr (انتخاب‌گرهای بولی قدیمی) و packet-encoding (انتخاب‌گر صریح مدرن). هنگامی که packet-encoding تنظیم شود، انتخاب‌گرهای بولی نادیده گرفته می‌شوند.
  • global-padding و authenticated-length معادل global_padding / authenticated_length در sing-box هستند — هر دو طرف باید توافق داشته باشند.
  • ws-opts.v2ray-http-upgrade دست‌دهی WebSocket را با ترابرد HTTP-upgrade سبک V2Ray عوض می‌کند؛ v2ray-http-upgrade-fast-open با پیوست‌کردن بار کلاینت یک RTT دیگر را نیز ذخیره می‌کند.

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

  • Xray فقط AEAD است و alterId را کاملاً حذف کرده است؛ نام فیلد security است (نه cipher). به VMess — Xray-core مراجعه کنید.
  • sing-box alterId را حفظ می‌کند (در خروجی alter_id و در کاربران ورودی alterId)، از security به جای cipher استفاده می‌کند و چندسوسازی را از طریق بلوک اختصاصی multiplex ارائه می‌دهد. به VMess — sing-box مراجعه کنید.

منبع: adapter/outbound/vmess.go:43-72 · v1.19.24 (a847246)

Core Tutorial اثر Argsment