Skip to content

OpenVPN — mihomo ​

mihomo می‌تواند یک سرور OpenVPN را به‌عنوان خروجی شماره‌گیری کند و یک کلاینت فضای-کاربر را اجرا کند که یک دستگاه پشتهٔ tun-گونه برپا می‌کند و ترافیک تطبیق‌یافته را از طریق تونل رمزنگاری‌شده مسیریابی می‌کند. کانال کنترل با گواهی‌ها (ca / cert / key)، tls-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 (--auth در OpenVPN)، مثلاً SHA256. خلاصه‌ساز HMAC در tls-auth را نیز تعیین می‌کند.
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 ناسازگار است. خلاصه‌ساز HMAC آن از auth پیروی می‌کند.
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_* ارسال‌شده هنگام تبادل کلید افزوده می‌شوند. مدخل IV_VER رشتهٔ نسخهٔ داخلی را جایگزین می‌کند.
pingint(unset)<seconds>بازهٔ پینگ نگه‌دارنده (ثانیه).
ping-restartint(unset)<seconds>پس از این تعداد ثانیه بدون پینگ، تونل را راه‌اندازی مجدد کن (ثانیه).
tran-window*int3600<seconds>ثانیه‌هایی که کلید دادهٔ قدیمی پس از rekey همچنان قابل استفاده می‌ماند (--tran-window در OpenVPN). تنظیم‌نشده یعنی 3600؛ مقدار صریح 0 کلید قدیمی را فوراً منقضی می‌کند. با --tran-window سرور هماهنگ کنید. مقادیر منفی رد می‌شوند.
handshake-timeoutint0 (no limit)<seconds>برقراری تونل را وقتی دست‌دهی OpenVPN بیش از این تعداد ثانیه طول بکشد قطع می‌کند. 0 مهلت زمانی را غیرفعال می‌کند.
mtuint1500<integer>MTU تونل.
udpboolfalsetrue | falseاجازهٔ عبور ترافیک UDP از پراکسی.
ip-stackIPStackOption(auto)IPStackOptionپشتهٔ IP فضای کاربر برای تونل: { mode: auto|gvisor|mips, congestion-controller: cubic|reno|bbr|bbr3 } — همان بلوک ip-stack در WireGuard.
remote-dns-resolveboolfalsetrue | falseحل نام‌های مقصد با استفاده از DNS تونل.
dns[]string[][<server>]سرورهای DNS مورد استفاده برای تونل.

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

مثال‌ها ​

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

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 درون‌خطی داده می‌شود).
  • HMAC در tls-auth مانند خود OpenVPN از خلاصه‌ساز auth (پیش‌فرض SHA256) استفاده می‌کند. اگر سرور از پیش‌فرض OpenVPN یعنی auth SHA1 استفاده می‌کند، auth: SHA1 را صریحاً تنظیم کنید.
  • peer-info جفت‌های کلید/مقدار سفارشی (مثلاً IV_HWADDR، UV_*) را پس از مدخل‌های داخلی IV_VER / IV_PROTO / IV_CIPHERS که کلاینت هنگام تبادل کلید ارسال می‌کند اضافه می‌کند. مقدار IV_VER کاربر جایگزین مقدار داخلی می‌شود؛ IV_PROTO / IV_CIPHERS همیشه خودکار ساخته می‌شوند و قابل بازنویسی نیستند.
  • handshake-timeout مدت مجاز برقراری تونل را محدود می‌کند؛ 0 (پیش‌فرض) به‌طور نامحدود صبر می‌کند.
  • ping یک پینگ نگه‌دارنده را در بازهٔ داده‌شده ارسال می‌کند؛ ping-restart تونل را پس از آن تعداد ثانیه بدون دریافت بسته، برچیده می‌کند تا بتوان آن را دوباره برقرار کرد. هر دو بر حسب ثانیه بیان می‌شوند.
  • tran-window کلید دادهٔ قبلی را پس از rekey به همین تعداد ثانیه زنده نگه می‌دارد تا بسته‌های در راه همچنان رمزگشایی شوند؛ مگر آن‌که سرور --tran-window غیرپیش‌فرض داشته باشد، آن را تنظیم‌نشده (3600 ثانیه) بگذارید.
  • mtu مقدار MTU تونل را تنظیم می‌کند و پیش‌فرض آن 1500 است.
  • remote-dns-resolve جستجوهای نام مقصد را از طریق تونل و با استفاده از سرورهای فهرست‌شده در dns مسیریابی می‌کند؛ این گزینه تا زمانی که dns ناتهی نباشد هیچ اثری ندارد.

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

  • Xray-core از OpenVPN پشتیبانی نمی‌کند — برای پل‌زدن یک نقطه‌انتهایی OpenVPN با Xray باید یک کلاینت OpenVPN جداگانه اجرا کنید و یک ورودی socks/http یا TUN را به آن اشاره دهید. sing-box OpenVPN را به‌صورت نقطه‌انتهایی (نه خروجی) پیاده‌سازی می‌کند (openvpn-client و openvpn-server، سازگار با همتایان استاندارد OpenVPN)، به‌همراه یک سرور DNS از نوع openvpn که از گزینه‌های DNS ارسال‌شده توسط سرور استفاده می‌کند. به OpenVPN — sing-box مراجعه کنید.

منبع: adapter/outbound/openvpn.go:40-73 · v1.19.31 (ab405ba)

Core Tutorial اثر Argsment