Skip to content

OpenVPN — mihomo

mihomo می‌تواند یک سرور OpenVPN را به‌عنوان خروجی شماره‌گیری کند و یک کلاینت فضای-کاربر را اجرا کند که یک دستگاه پشتهٔ tun-گونه برپا می‌کند و ترافیک تطبیق‌یافته را از طریق تونل رمزنگاری‌شده مسیریابی می‌کند. کانال کنترل با گواهی‌ها (ca / cert / keytls-crypt اختیاری، و/یا اعتبارنامه‌های auth-user-pass احراز هویت می‌شود؛ کانال داده با cipher توافق‌شده رمزنگاری می‌شود.

خروجی

ورودی زیر proxies: با type: openvpn. این BasicOption (فیلدهای مشترک خروجی) را در خود جای می‌دهد.

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
namestring(required)<string>نام یکتای پراکسی.
serverstring(required)<host>میزبان/IP سرور OpenVPN.
portint(required)<port>پورت سرور.
protostringudpudp | tcpپروتکل ترابرد تونل OpenVPN.
devstringtuntunنوع دستگاه مجازی (مثلاً `tun`).
cipherstringAES-128-GCMAES-128-GCM | AES-192-GCM | AES-256-GCM | AES-128-CBC | AES-192-CBC | AES-256-CBC | CHACHA20-POLY1305رمز کانال داده که وقتی `data-ciphers` تنظیم نشده باشد استفاده می‌شود.
data-ciphers[]string(unset)[<cipher>]فهرست رمزهای کانال داده که برای توافق ارائه می‌شود (`--data-ciphers` در OpenVPN). رمز توافق‌شده نخستین مدخل ارسال‌شده از سرور است که اینجا هم حضور دارد؛ وقتی تنظیم نشود، مقدار تکی `cipher` استفاده می‌شود.
data-ciphers-fallbackstring(unset)<cipher>رمزی که وقتی سرور از توافق رمز پشتیبانی نمی‌کند استفاده می‌شود (`--data-ciphers-fallback` در OpenVPN).
authstringSHA256MD5 | SHA1 | SHA256 | SHA384 | SHA512خلاصه‌سازِ HMAC برای کانال کنترل، مثلاً `SHA256`.
comp-lzostring(unset)yes | no | adaptiveتنظیم فشرده‌سازی LZO.
castring(required)<inline PEM>گواهی CA (بلوک PEM درون‌خطی).
certstring(unset)<inline PEM>گواهی کلاینت (بلوک PEM درون‌خطی).
keystring(unset)<inline PEM>کلید خصوصی کلاینت (بلوک PEM درون‌خطی).
tls-authstring(unset)<inline static key>بلوک درون‌خطی `OpenVPN Static key V1` برای حفاظت HMAC کانال کنترل با tls-auth. با `tls-crypt` و `tls-crypt-v2` ناسازگار است.
key-directionstring(bidirectional)0 | 1جهت کلید برای `tls-auth`. `0` / `1` شکاف‌های کلید جهت‌دار را انتخاب می‌کنند؛ تنظیم‌نشده از یک کلید در هر دو جهت استفاده می‌کند.
tls-cryptstring(unset)<inline static key>کلید ثابت tls-crypt برای رمزنگاری/احراز هویت کانال کنترل.
tls-crypt-v2string(unset)<inline PEM client key>کلید کلاینت tls-crypt-v2 به‌صورت PEM درون‌خطی. با `tls-auth` و `tls-crypt` ناسازگار است.
usernamestring(unset)<string>نام کاربری auth-user-pass.
passwordstring(unset)<string>گذرواژهٔ auth-user-pass.
peer-infomap[string]string{}{<key>: <value>}جفت‌های کلید/مقدار peer-info اضافی (مثلاً `IV_HWADDR`، `UV_*`) که به مدخل‌های داخلی `IV_*` ارسال‌شده هنگام تبادل کلید افزوده می‌شوند.
pingint(unset)<seconds>بازهٔ پینگ نگه‌دارنده (ثانیه).
ping-restartint(unset)<seconds>پس از این تعداد ثانیه بدون پینگ، تونل را راه‌اندازی مجدد کن (ثانیه).
handshake-timeoutint0 (no limit)<seconds>برقراری تونل را وقتی دست‌دهی OpenVPN بیش از این تعداد ثانیه طول بکشد قطع می‌کند. 0 مهلت زمانی را غیرفعال می‌کند.
mtuint1500<integer>MTU تونل.
udpboolfalsetrue | falseاجازهٔ عبور ترافیک UDP از پراکسی.
remote-dns-resolveboolfalsetrue | falseحل نام‌های مقصد با استفاده از DNS تونل.
dns[]string[][<server>]سرورهای DNS مورد استفاده برای تونل.

منبع: adapter/outbound/openvpn.go:42-72 · ثابت‌شده در v1.19.29 (e26714a)

مثال‌ها

خروجی — احراز هویت با گواهی:

yaml
proxies:
  - name: ovpn-cert
    type: openvpn
    server: vpn.example.com
    port: 1194
    proto: udp
    cipher: AES-256-GCM
    auth: SHA256
    ca: |
      -----BEGIN CERTIFICATE-----
      <ca-certificate>
      -----END CERTIFICATE-----
    cert: |
      -----BEGIN CERTIFICATE-----
      <client-certificate>
      -----END CERTIFICATE-----
    key: |
      -----BEGIN PRIVATE KEY-----
      <client-private-key>
      -----END PRIVATE KEY-----
    udp: true

خروجی — احراز هویت با نام کاربری/گذرواژه به‌همراه نگه‌دارنده:

yaml
proxies:
  - name: ovpn-userpass
    type: openvpn
    server: vpn.example.com
    port: 1194
    proto: tcp
    ca: |
      -----BEGIN CERTIFICATE-----
      <ca-certificate>
      -----END CERTIFICATE-----
    username: <username>
    password: <password>
    ping: 10
    ping-restart: 60
    udp: true

نکات

  • proto ترابرد لینک را انتخاب می‌کند: udp (پیش‌فرض) یا tcp.
  • انتخاب رمز کانال داده از معنای OpenVPN 2.5+ پیروی می‌کند: data-ciphers پیشنهاد توافق است (به‌صورت IV_CIPHERS ارسال می‌شود) و رمز توافق‌شده نخستین مدخل ارسال‌شده از سرور است که در آن هم حضور دارد. data-ciphers-fallback سرورهایی را پوشش می‌دهد که نمی‌توانند توافق کنند. وقتی data-ciphers تنظیم نشده باشد، مقدار تکی cipher (پیش‌فرض AES-128-GCM) استفاده می‌شود.
  • ca الزامی است. cert + key احراز هویت با گواهی را فراهم می‌کنند؛ username + password احراز هویت auth-user-pass را فراهم می‌کنند. هنگامی که سرور هر دو را نیاز داشته باشد می‌توان آن‌ها را ترکیب کرد. تمام مواد کلید به‌صورت درون‌خطی (اسکالر بلوکی YAML) داده می‌شوند — مسیرهای فایل خوانده نمی‌شوند.
  • سه پوشانندهٔ کانال کنترل دوبه‌دو ناسازگارند: tls-auth (کانال کنترل را با HMAC احراز هویت می‌کند؛ برای کلیدهای جهت‌دار با key-direction: 0|1 جفت کنید)، tls-crypt (آن را با یک کلید ثابت مشترک رمزنگاری و احراز هویت می‌کند) و tls-crypt-v2 (کلید پوشیده‌شدهٔ به‌ازای هر کلاینت، که به‌صورت کلید کلاینت PEM درون‌خطی داده می‌شود).
  • peer-info جفت‌های کلید/مقدار سفارشی (مثلاً IV_HWADDR، UV_*) را پس از مدخل‌های داخلی IV_VER / IV_PROTO / IV_CIPHERS که کلاینت هنگام تبادل کلید ارسال می‌کند اضافه می‌کند.
  • handshake-timeout مدت مجاز برقراری تونل را محدود می‌کند؛ 0 (پیش‌فرض) به‌طور نامحدود صبر می‌کند.
  • ping یک پینگ نگه‌دارنده را در بازهٔ داده‌شده ارسال می‌کند؛ ping-restart تونل را پس از آن تعداد ثانیه بدون دریافت بسته، برچیده می‌کند تا بتوان آن را دوباره برقرار کرد. هر دو بر حسب ثانیه بیان می‌شوند.
  • mtu مقدار MTU تونل را تنظیم می‌کند و پیش‌فرض آن 1500 است.
  • remote-dns-resolve جستجوهای نام مقصد را از طریق تونل و با استفاده از سرورهای فهرست‌شده در dns مسیریابی می‌کند؛ این گزینه تا زمانی که dns ناتهی نباشد هیچ اثری ندارد.

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

  • OpenVPN در میان این سه هسته مخصوص mihomo است. نه Xray-core و نه sing-box خروجی OpenVPN ارائه نمی‌دهند — برای پل‌زدن یک نقطه‌انتهایی OpenVPN با آن هسته‌ها باید یک کلاینت OpenVPN جداگانه اجرا کنید و یک ورودی socks/http یا TUN را به آن اشاره دهید.

منبع: adapter/outbound/openvpn.go:42-72 · v1.19.29 (e26714a)

Core Tutorial اثر Argsment