Skip to content

OpenVPN — sing-box ​

sing-box به‌طور بومی OpenVPN را از راه دو نقطه‌انتهایی پشتیبانی می‌کند — openvpn-client و openvpn-server زیر endpoints[] — به‌علاوهٔ یک سرور DNS از نوع openvpn که از طریق حل‌کننده‌هایی که سرور به کلاینت ارسال می‌کند، نام‌ها را حل می‌کند. هر دو نقطه‌انتهایی با همتایان استاندارد OpenVPN سازگارند، از جمله حالت کلید ایستا، رمزها و چکیده‌های قدیمی و بررسی‌های گواهی به سبک OpenVPN.

برچسب‌های ساخت

OpenVPN فقط با برچسب ساخت with_openvpn کامپایل می‌شود؛ پشتهٔ شبکهٔ داخلی پیش‌فرض (system: false) به with_gvisor هم نیاز دارد. بدون آن‌ها نقطه‌انتهایی‌ها و سرور DNS هنگام راه‌اندازی با پیشنهاد ساخت دوباره خطا می‌دهند.

فیلدهای مشترک رابط ​

هر دو نقطه‌انتهایی این فیلدها را در خود دارند:

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
systemboolfalsetrue | falseاستفاده از رابط سیستمی (به امتیاز نیاز دارد و نباید با رابط موجود تداخل کند). آدرس‌ها و MTU روی آن پیکربندی می‌شوند، اما هیچ مسیر یا DNS سیستم‌عامل نصب نمی‌شود. false از پشتهٔ شبکهٔ داخلی استفاده می‌کند.
namestring(auto, ovpn…)<interface name>نام رابط وقتی system برابر true است.
mtuuint321500<bytes>MTU رابط تونل. در کلاینت تا وقتی سرور مقداری ارسال نکرده، 1500 به کار می‌رود.
udp_mappingUDPNATBehaviorendpoint_independentendpoint_independent | address_dependent | address_and_port_dependentرفتار نگاشت UDP NAT: برای هر آدرس و پورت مبدأ یک نگاشت برای همهٔ مقصدها (پیش‌فرض)، یا نگاشت جداگانه برای هر آدرس مقصد / هر آدرس و پورت مقصد.
udp_filteringUDPNATBehaviorendpoint_independentendpoint_independent | address_dependent | address_and_port_dependentرفتار فیلتر UDP NAT: پذیرفتن بسته از هر نقطهٔ دور (پیش‌فرض)، یا فقط از آدرس‌ها / جفت‌های آدرس و پورتی که پیش‌تر به آن‌ها بسته فرستاده شده است.
udp_nat_maxuint320 (auto)<uint32>بیشینهٔ نشست‌های UDP NAT؛ با رسیدن به حد، نشستی که مدت بیشتری استفاده نشده بسته می‌شود. مقدار 0: در iOS برابر 4096 و در دیگر پلتفرم‌ها بر اساس کل حافظه بین 4096 تا 16384.

منبع: option/openvpn.go:10-17 · ثابت‌شده در v1.14.2 (af6e64c)

نقطه‌انتهایی کلاینت (openvpn-client) ​

type: "openvpn-client" زیر endpoints[]. علاوه بر فیلدهای زیر، server / server_port (در تعارض با servers) و فیلدهای شماره‌گیری را می‌پذیرد که بر اتصال به سرور OpenVPN اعمال می‌شوند.

اتصال و آدرس‌دهی ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
modestringtlstls | static_keyحالت نشست. static_key یک حالت سازگاری منسوخ است، بدون کانال کنترل TLS و بدون محرمانگی پیشرو؛ tls، نام کاربری/گذرواژه، گزینه‌های دریافتی و مذاکرهٔ دوباره را نادیده می‌گیرد.
networkstringudpudp | tcp | udp4 | udp6 | tcp4 | tcp6ترابرد پیش‌فرض به سرور. برای server و برای مدخل‌های servers که network خودشان را ندارند اعمال می‌شود.
servers[]OpenVPNRemoteOptions[][{server, server_port, network}]سرورهایی که به ترتیب امتحان می‌شوند و با شکست اتصال به بعدی می‌روند. هر مدخل به server و server_port نیاز دارد و می‌تواند network را بازنویسی کند. با server سطح بالا تعارض دارد؛ یکی از این دو لازم است.
remote_randomboolfalsetrue | falseترتیب servers را پیش از اتصال بر هم می‌زند.
addressbadoption.Listable[netip.Prefix][][<CIDR>]پیشوندهای محلی IPv4 / IPv6 تونل. در حالت static_key لازم است؛ در حالت TLS اختیاری است و سرور می‌تواند آن را ارسال کند.
peer_address*badoption.Addr(unset)<IPv4>همتای IPv4 تونل و دروازهٔ VPN. در حالت static_key با یک address از نوع IPv4 لازم است.
peer_address_ipv6*badoption.Addr(unset)<IPv6>همتای IPv6 تونل و دروازهٔ VPN. در حالت static_key با یک address از نوع IPv6 لازم است.
topologystring(pushed)net30 | p2p | subnetتوپولوژی تونل. اگر خالی باشد در حالت TLS توپولوژی ارسالی سرور به کار می‌رود.
udp_timeoutUDPTimeoutCompat5m<duration>مهلت نشست UDP NAT برای ترافیک درون تونل.
explicit_exit_notifyuint320<count>تعداد اعلان‌های خروج که هنگام بستن اتصال UDP با فاصلهٔ یک ثانیه فرستاده می‌شوند. 0 آن‌ها را غیرفعال می‌کند.

منبع: option/openvpn.go:19-73 · ثابت‌شده در v1.14.2 (af6e64c)

احراز هویت و کلیدها ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
usernamestring(unset)<string>نام کاربری برای احراز هویت نام کاربری/گذرواژهٔ OpenVPN. فقط در حالت TLS.
passwordstring(unset)<string>گذرواژه برای احراز هویت نام کاربری/گذرواژه.
auth_retrystringnonenone | nointeract | interactرفتار پس از شکست احراز هویت: none آن را نهایی می‌داند؛ nointeract و interact اجازهٔ تلاش دوباره می‌دهند.
static_challengestring(unset)<text>متن چالش ایستا که هنگام درخواست پاسخ احراز هویت (مثلاً رمز یک‌بارمصرف) نمایش داده می‌شود.
static_challenge_echoboolfalsetrue | falseپاسخ چالش ایستا هنگام وارد کردن به‌صورت متن ساده نمایش داده شود.
static_keybadoption.Listable[string](unset)<key content>محتوای کلید ایستای OpenVPN. در حالت static_key لازم است مگر اینکه static_key_path تنظیم شده باشد؛ با آن تعارض دارد.
static_key_pathstring(unset)<path>مسیر فایل کلید ایستای OpenVPN. با static_key تعارض دارد.
key_directionstring(bidirectional)server | clientجهت کلید ایستا، فقط در حالت static_key. اگر خالی باشد کلید در هر دو جهت به کار می‌رود.
tls*OpenVPNOutboundTLSOptions(required in tls mode)OpenVPNOutboundTLSOptionsپیکربندی TLS کانال کنترل؛ جدول tls در پایین را ببینید.

منبع: option/openvpn.go:19-73 · ثابت‌شده در v1.14.2 (af6e64c)

کانال داده ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
cipherstringBF-CBC<cipher name>مجموعه‌رمز کانال داده فقط برای حالت static_key. پیش‌فرض بالادست یعنی BF-CBC یک رمز قدیمی با بلوک 64 بیتی است — رمز سرور را صریحاً تنظیم کنید. NONE هیچ محرمانگی‌ای ندارد.
data_ciphersbadoption.Listable[string]AES-256-GCM, AES-128-GCM, CHACHA20-POLY1305[<cipher name>]مجموعه‌رمزهای مجاز کانال داده در مذاکره. فقط در حالت TLS. رمزهای قدیمی CBC / CFB / OFB و NONE وجود دارند اما به‌طور پیش‌فرض فعال نیستند.
data_ciphers_fallbackstring(disabled)<cipher name>رمزی که با سرورهای ناتوان از مذاکره به کار می‌رود. فقط در حالت TLS.
authstringSHA1<digest name>چکیدهٔ HMAC کانال داده. فقط بر رمزهای غیر AEAD و tls_auth اثر دارد؛ چکیده‌های قدیمی مانند MD5 و RIPEMD160 در صورت تنظیم صریح پذیرفته می‌شوند.
mss_fixuint32(OpenVPN default)<bytes>بیشینهٔ اندازهٔ بستهٔ OpenVPN برای محدود کردن MSS اتصال‌های TCP درون تونل. اگر خالی باشد پیش‌فرض بالادست به کار می‌رود: fragment در صورت تنظیم، وگرنه 1492 یا MTU پیکربندی‌شدهٔ تونل.
mss_fix_disabledboolfalsetrue | falseمحدودسازی MSS را کاملاً غیرفعال می‌کند، از جمله پیش‌فرض. با mss_fix و mss_fix_mode تعارض دارد.
mss_fix_modestring(encapsulation-aware)mtu | fixedنحوهٔ تفسیر mss_fix صریح: mtu سرآیندهای IP بیرونی و UDP/TCP را هم حساب می‌کند؛ fixed آن را اندازهٔ بستهٔ IPv4 درونی می‌داند. به mss_fix نیاز دارد.
fragmentuint3200 | >= 68بیشینهٔ اندازهٔ بستهٔ UDP برای قطعه‌بندی کانال دادهٔ خود OpenVPN. 0 آن را غیرفعال می‌کند؛ با ترابرد TCP مجاز نیست.
replay_windowuint3264<= 65536اندازهٔ پنجرهٔ بازپخش کانال دادهٔ UDP. TCP همیشه شناسه‌های بستهٔ پیاپی می‌خواهد.
replay_window_timebadoption.Duration15s<= 10m, whole secondsمدت پنجرهٔ بازپخش کانال دادهٔ UDP.
compressionstring(disabled)none | no | lz4 | lz4-v2 | stub | stub-v2 | disabled | offقاب‌بندی compress در OpenVPN. فشرده‌سازی می‌تواند محرمانگی را تضعیف کند؛ وقتی فقط سازگاری قاب‌بندی لازم است stub / stub-v2 را ترجیح دهید.
compression_lzostring(disabled)none | no | yes | adaptive | asym | disabled | offحالت comp-lzo در OpenVPN. فقط وقتی سرور لازم دارد فعال کنید.
allow_compressionstringnono | asym | yesسیاست در برابر فشرده‌سازی ارسالی سرور: no فقط قاب‌بندی stub را مجاز می‌کند؛ asym بسته‌های فشرده را می‌پذیرد ولی بسته‌های خروجی را هرگز فشرده نمی‌کند؛ yes نام مستعار قدیمی asym است.

منبع: option/openvpn.go:19-73 · ثابت‌شده در v1.14.2 (af6e64c)

گزینه‌های ارسالی و مسیریابی ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
route_no_pullboolfalsetrue | falseمسیرها، گزینه‌های DNS / DHCP، معیارهای مسیر، redirect-gateway، redirect-private، block-ipv6 و block-outside-dns ارسالی سرور را نادیده می‌گیرد. آدرس‌دهی، توپولوژی و MTU همچنان اعمال می‌شوند.
pull_filters[]OpenVPNPullFilterOptions[][{action, text}]فیلترهای ترتیبی برای گزینه‌های ارسالی؛ جدول pull_filters[] در پایین را ببینید.
routesbadoption.Listable[netip.Prefix][][<CIDR>]پیشوندهای اضافه‌ای که علاوه بر مسیرهای پذیرفته‌شده از سرور، در مسیریابی sing-box برای این نقطه‌انتهایی ترجیح داده می‌شوند. هیچ مسیر سیستم‌عاملی نصب نمی‌شود.
route_gateway*badoption.Addr(pushed gateway)<IPv4>دروازهٔ IPv4 برای مسیرهای گذرنده از نقطه‌انتهایی. برای سازگاری با OpenVPN حفظ شده است؛ ترجیح مسیر بر پایهٔ پیشوند است.
route_metricint0<int>معیار پیش‌فرض مسیر. برای سازگاری با OpenVPN حفظ شده است؛ هیچ مسیر سیستمی نصب نمی‌شود.
redirect_gatewayboolfalsetrue | falseدر مسیریابی sing-box این نقطه‌انتهایی را برای همهٔ مقصدهای IPv4 ترجیح می‌دهد. هیچ مسیر پیش‌فرض سیستم‌عامل نصب نمی‌شود.
redirect_gateway_flagsbadoption.Listable[string][]!ipv4 | def1 | ipv6 | local | autolocalپرچم‌های redirect-gateway در OpenVPN: !ipv4 ترجیح IPv4 را حذف می‌کند، def1 آن را با دو پیشوند /1 بیان می‌کند، ipv6 IPv6 را هم ترجیح می‌دهد. block-local پشتیبانی نمی‌شود؛ bypass-dhcp / bypass-dns کاربردی ندارند.
redirect_privateboolfalsetrue | falseredirect_gateway_flags را بدون افزودن ترجیح مسیر پیش‌فرض می‌پذیرد.
block_ipv6boolfalsetrue | falseترافیک IPv6 را به‌جای ارسال از VPN به‌صورت محلی رد می‌کند.

منبع: option/openvpn.go:19-73 · ثابت‌شده در v1.14.2 (af6e64c)

زمان‌سنج‌ها و مذاکرهٔ دوباره ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
ping_intervalbadoption.Duration(disabled)<duration>پس از این مدت بدون ارسال به سرور، یک ping کانال داده می‌فرستد. ping ارسالی سرور آن را بازنویسی می‌کند. باید ثانیهٔ کامل باشد.
ping_restartbadoption.Duration120s (UDP, pull)<duration>پس از این مدت بدون دریافت بسته دوباره وصل می‌شود. ping-restart ارسالی سرور آن را بازنویسی می‌کند؛ TCP پیش‌فرضی ندارد. باید ثانیهٔ کامل باشد.
ping_restart_disabledboolfalsetrue | falseمهلت اولیهٔ 120 ثانیه‌ای دریافت UDP و هر ping_restart محلی را غیرفعال می‌کند. با ping_restart تعارض دارد.
renegotiate_intervalbadoption.Duration1h<duration>فاصلهٔ مذاکرهٔ دوبارهٔ TLS.
renegotiate_disabledboolfalsetrue | falseمذاکرهٔ دوبارهٔ زمانی TLS را، از جمله فاصلهٔ پیش‌فرض، غیرفعال می‌کند. با renegotiate_interval تعارض دارد.
renegotiate_bytesuint640<bytes>پس از این تعداد بایت، کلیدهای کانال داده دوباره مذاکره می‌شوند. 0 از پیش‌فرض OpenVPN وابسته به رمز استفاده می‌کند.
renegotiate_packetsuint640<packets>پس از این تعداد بسته، کلیدهای کانال داده دوباره مذاکره می‌شوند. 0 از پیش‌فرض OpenVPN وابسته به رمز استفاده می‌کند.
tls_timeoutbadoption.Duration2s<duration>مهلت اولیهٔ ارسال دوبارهٔ بسته‌های کنترلی TLS.
handshake_windowbadoption.Duration1m<duration>بیشینهٔ زمان برای دست‌دهی اولیهٔ TLS و هر مذاکرهٔ دوباره.

منبع: option/openvpn.go:19-73 · ثابت‌شده در v1.14.2 (af6e64c)

pull_filters[] ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
actionstring(required)accept | ignore | rejectaccept گزینهٔ تطبیق‌یافته را اعمال می‌کند، ignore آن را دور می‌اندازد، reject اتصال را پایان می‌دهد.
textstring(required)<prefix>پیشوند حساس به بزرگی و کوچکی حروف برای کل گزینهٔ ارسالی. نخستین فیلتر منطبق اعمال می‌شود؛ گزینه‌های بدون تطبیق پذیرفته می‌شوند. "route " با مسیرهای IPv4 ارسالی تطبیق دارد اما با route-gateway نه.

منبع: option/openvpn.go:117-120 · ثابت‌شده در v1.14.2 (af6e64c)

tls ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
server_namestring(unset)<name>نام مورد انتظار گواهی سرور. اگر خالی باشد نام بررسی نمی‌شود؛ زنجیره یا اثرانگشت و کاربرد گواهی همچنان بررسی می‌شوند.
server_name_typestringnamesubject | name | name-prefixفیلد گواهی که با server_name تطبیق داده می‌شود: subject کامل، نام عمومی دقیق، یا پیشوند نام عمومی.
certificatebadoption.Listable[string](unset)<PEM>محتوای گواهی CA مورد اعتماد. یکی از certificate، certificate_path یا peer_fingerprint لازم است؛ با certificate_path تعارض دارد.
certificate_pathstring(unset)<path>مسیر گواهی CA مورد اعتماد. با certificate تعارض دارد.
client_certificatebadoption.Listable[string](unset)<PEM>محتوای گواهی کلاینت؛ همراه با کلید کلاینت تنظیم شود. با client_certificate_path تعارض دارد.
client_certificate_pathstring(unset)<path>مسیر گواهی کلاینت. با client_certificate تعارض دارد.
client_keybadoption.Listable[string](unset)<PEM>محتوای کلید خصوصی کلاینت. با client_key_path تعارض دارد.
client_key_pathstring(unset)<path>مسیر کلید خصوصی کلاینت. با client_key تعارض دارد.
peer_fingerprintbadoption.Listable[string][][<64 lowercase hex chars>]اثرانگشت‌های SHA-256 مجاز برای گواهی برگ سرور. با CA مورد اعتماد هر دو بررسی می‌شوند؛ بدون آن خود زنجیره بررسی نمی‌شود.
crl_pathstring(unset)<path>فهرست ابطال گواهی با قالب PEM یا DER برای رد گواهی‌های ابطال‌شدهٔ سرور.
remote_certificate_kubadoption.Listable[string][][<hex mask>]ماسک‌های کاربرد کلید لازم در قالب remote-cert-ku در OpenVPN؛ گواهی باید همهٔ بیت‌های دست‌کم یک ماسک را داشته باشد.
remote_certificate_ekustring(unset)<OID or name> | server | clientکاربرد گستردهٔ کلید لازم. جایگزین بررسی پیش‌فرض remote_certificate_tls می‌شود و با تنظیم صریح آن تعارض دارد.
remote_certificate_tlsstringserverserver | client | noneبررسی کاربرد گواهی سرور؛ none آن را غیرفعال می‌کند.
certificate_profilestringlegacyinsecure | legacy | preferred | suitebنمایهٔ قدرت گواهی: insecure زنجیره‌های MD5 / SHA-1 و کلیدهای کوچک را هم می‌پذیرد، legacy SHA-1 را می‌پذیرد اما MD5 را نه، preferred امضا و کلید قوی‌تر می‌خواهد، suiteb رمزهای TLS 1.2 را به‌طور پیش‌فرض روی Suite B می‌گذارد.
ns_certificate_typestring(disabled)server | clientبررسی منسوخ نوع گواهی Netscape. remote_certificate_tls را ترجیح دهید.
version_minstring1.21.0 | 1.1 | 1.2 | 1.3کمینهٔ نسخهٔ TLS.
version_maxstring(highest supported)1.0 | 1.1 | 1.2 | 1.3بیشینهٔ نسخهٔ TLS؛ نمی‌تواند کمتر از version_min باشد.
cipherstring(default suites)<OpenSSL names, colon-separated>مجموعه‌رمزهای TLS 1.2 و پیش از آن. بر مجموعه‌رمزهای TLS 1.3 اثری ندارد.
groupsstring(default groups)X25519 | SECP256R1 | SECP384R1 | SECP521R1گروه‌های تبادل کلید به ترتیب ترجیح، جداشده با دونقطه.
control_wrap*OpenVPNControlWrapOptions(disabled)OpenVPNControlWrapOptionsپوشش کانال کنترل (tls-auth / tls-crypt / tls-crypt-v2)؛ جدول بعدی را ببینید.

منبع: option/openvpn.go:122-143 · ثابت‌شده در v1.14.2 (af6e64c)

tls.control_wrap ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
typestring(required when set)tls_auth | tls_crypt | tls_crypt_v2نوع پوشش، متناظر با tls-auth، tls-crypt و tls-crypt-v2 در OpenVPN.
keybadoption.Listable[string](unset)<key content>محتوای کلید پوشش. با key_path تعارض دارد.
key_pathstring(unset)<path>مسیر کلید پوشش. با key تعارض دارد.
directionstring(bidirectional)server | clientجهت کلید tls_auth؛ فقط با type برابر tls_auth. اگر خالی باشد کلید در هر دو جهت به کار می‌رود.

منبع: option/openvpn.go:169-174 · ثابت‌شده در v1.14.2 (af6e64c)

نقطه‌انتهایی سرور (openvpn-server) ​

type: "openvpn-server" زیر endpoints[]، به‌علاوهٔ فیلدهای شنونده (listen، listen_port و udp_timeout برای نشست‌های UDP NAT).

نشست و آدرس‌دهی ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
modestringtlstls | static_keyحالت نشست. static_key فقط به یک همتا بدون TLS و محرمانگی پیشرو خدمت می‌دهد و tls، users، push و گزینه‌های مذاکرهٔ دوباره را نادیده می‌گیرد.
networkstringudpudp | tcpترابردی که این نقطه‌انتهایی ارائه می‌کند. هر نقطه‌انتهایی یک شبکه — برای ارائهٔ هر دو، دو نقطه‌انتهایی با زیرشبکه‌های address جداگانه پیکربندی کنید.
remotestring(unset)<address>آدرس ثابت همتا برای سرور static_key روی UDP، همراه با remote_port لازم است. سرورهای TCP همتا را از سوکت پذیرفته‌شده می‌گیرند.
remote_portuint16(unset)<port>پورت ثابت همتا برای سرور static_key روی UDP.
max_clientsint1024< 16777216بیشینهٔ نشست‌های TLS برقرار و در انتظار. حالت static_key فقط یک همتا دارد، پس در آن باید 0 یا 1 باشد.
addressbadoption.Listable[netip.Prefix](required)[<CIDR>]پیشوندهای سرور، حداکثر یک IPv4 و یک IPv6. آدرس پیشوند روی رابط سرور قرار می‌گیرد و پیشوند ماسک‌شده استخر آدرس و مسیر کلاینت‌ها می‌شود. در حالت static_key این‌ها پیشوندهای محلی تونل‌اند.
peer_address*badoption.Addr(unset)<IPv4>آدرس همتای IPv4 تونل. در حالت static_key با یک address از نوع IPv4 لازم است.
peer_address_ipv6*badoption.Addr(unset)<IPv6>آدرس همتای IPv6 تونل. در حالت static_key با یک address از نوع IPv6 لازم است.
topologystringsubnet (tls) / p2p (static_key)subnet | p2p | net30توپولوژی ارسالی به کلاینت‌ها.
duplicate_cnboolfalsetrue | falseاجازه به چند کلاینت فعال با نام عمومی گواهی یا نام کاربری یکسان. وقتی خاموش است، نشست تازه جایگزین قبلی می‌شود و آدرس آن را دوباره به کار می‌گیرد. فقط در حالت TLS.
users[]auth.User[][{username, password}]کاربران نام کاربری/گذرواژه. در صورت تنظیم، کلاینت‌ها علاوه بر سیاست گواهی باید این بررسی را هم بگذرانند. فقط در حالت TLS.

منبع: option/openvpn.go:75-110 · ثابت‌شده در v1.14.2 (af6e64c)

کلیدها و کانال داده ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
static_keybadoption.Listable[string](unset)<key content>محتوای کلید ایستای OpenVPN. در حالت static_key لازم است مگر اینکه static_key_path تنظیم شده باشد؛ با آن تعارض دارد.
static_key_pathstring(unset)<path>مسیر فایل کلید ایستای OpenVPN. با static_key تعارض دارد.
key_directionstring(bidirectional)server | clientجهت کلید ایستا، فقط در حالت static_key. طبق عرف سرور server و همتا client را به کار می‌برد.
tls*OpenVPNInboundTLSOptions(required in tls mode)OpenVPNInboundTLSOptionsپیکربندی TLS کانال کنترل؛ جدول tls سرور در پایین را ببینید.
cipherstringBF-CBC<cipher name>مجموعه‌رمز کانال داده فقط برای حالت static_key. BF-CBC پیش‌فرض قدیمی بالادست است؛ NONE هیچ محرمانگی‌ای ندارد.
data_ciphersbadoption.Listable[string]AES-256-GCM, AES-128-GCM, CHACHA20-POLY1305[<cipher name>]مجموعه‌رمزهای کانال داده که در مذاکره ارائه می‌شوند. فقط در حالت TLS. رمزهای قدیمی وجود دارند اما به‌طور پیش‌فرض فعال نیستند.
data_ciphers_fallbackstring(disabled)<cipher name>رمز برای کلاینت‌های قدیمی که نمی‌توانند مذاکره کنند (data-ciphers-fallback در OpenVPN). فقط در حالت TLS.
authstringSHA1<digest name>چکیدهٔ HMAC کانال داده، مطابق پیش‌فرض بالادست. فقط بر رمزهای غیر AEAD و tls_auth اثر دارد.
mss_fixuint32(OpenVPN default)<bytes>بیشینهٔ اندازهٔ بستهٔ کپسوله‌شده برای محدود کردن MSS در TCP؛ محاسبهٔ پیش‌فرض با MTU پیش‌فرض از 1492 استفاده می‌کند.
mss_fix_disabledboolfalsetrue | falseمحدودسازی MSS را، از جمله پیش‌فرض، غیرفعال می‌کند.
mss_fix_modestring(encapsulation-aware)mtu | fixedنحوهٔ تفسیر mss_fix صریح. به mss_fix نیاز دارد.
replay_windowuint3264<= 65536اندازهٔ پنجرهٔ بازپخش کانال دادهٔ UDP؛ شناسه‌های بستهٔ TCP همواره پیاپی می‌مانند.
replay_window_timebadoption.Duration15s<duration>مدت پنجرهٔ بازپخش UDP. باید ثانیهٔ کامل باشد.

منبع: option/openvpn.go:75-110 · ثابت‌شده در v1.14.2 (af6e64c)

ارسال و زمان‌سنج‌ها ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
push*OpenVPNPushOptions(unset)OpenVPNPushOptionsگزینه‌های ارسالی به کلاینت‌ها؛ جدول push در پایین را ببینید.
ping_intervalbadoption.Duration(disabled)<duration>سمت سرور: پس از این مدت بدون ارسال به یک کلاینت، ping می‌فرستد. برای کلاینت‌ها از push.ping_interval استفاده کنید. باید ثانیهٔ کامل باشد.
ping_restartbadoption.Duration(disabled)<duration>سمت سرور: پس از این مدت بدون دریافت از یک کلاینت، نشست آن را می‌بندد. آن را بلندتر از مهلت کلاینت نگه دارید. باید ثانیهٔ کامل باشد.
renegotiate_intervalbadoption.Duration1h<duration>فاصلهٔ مذاکرهٔ دوبارهٔ TLS. فقط در حالت TLS.
renegotiate_disabledboolfalsetrue | falseمذاکرهٔ دوبارهٔ زمانی TLS را، از جمله فاصلهٔ پیش‌فرض، غیرفعال می‌کند. فقط در حالت TLS.
renegotiate_bytesuint640<bytes>پس از این تعداد بایت، کلیدهای کانال داده دوباره مذاکره می‌شوند؛ 0 از پیش‌فرض وابسته به رمز استفاده می‌کند. فقط در حالت TLS.
renegotiate_packetsuint640<packets>پس از این تعداد بسته، کلیدهای کانال داده دوباره مذاکره می‌شوند؛ 0 از پیش‌فرض وابسته به رمز استفاده می‌کند. فقط در حالت TLS.
handshake_windowbadoption.Duration1m<duration>بیشینهٔ زمان برای دست‌دهی اولیهٔ TLS و هر مذاکرهٔ دوباره. فقط در حالت TLS.

منبع: option/openvpn.go:75-110 · ثابت‌شده در v1.14.2 (af6e64c)

tls ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
certificatebadoption.Listable[string](required)<PEM>محتوای گواهی سرور. certificate یا certificate_path لازم است؛ با هم تعارض دارند.
certificate_pathstring(required)<path>مسیر گواهی سرور. با certificate تعارض دارد.
keybadoption.Listable[string](required)<PEM>محتوای کلید خصوصی سرور. key یا key_path لازم است؛ با هم تعارض دارند.
key_pathstring(required)<path>مسیر کلید خصوصی سرور. با key تعارض دارد.
client_certificatebadoption.Listable[string](unset)<PEM>محتوای گواهی CA برای راستی‌آزمایی گواهی کلاینت‌ها. وقتی verify_client_certificate برابر require یا optional است، یکی از client_certificate، client_certificate_path یا peer_fingerprint لازم است.
client_certificate_pathstring(unset)<path>مسیر گواهی CA برای راستی‌آزمایی گواهی کلاینت‌ها. با client_certificate تعارض دارد.
verify_client_certificatestringrequirerequire | optional | noneسیاست گواهی کلاینت: optional در صورت ارائهٔ گواهی آن را بررسی می‌کند، none گواهی درخواست نمی‌کند. اگر users تنظیم شده باشد همچنان بررسی می‌شود.
client_namestring(unset)<name>نام مورد انتظار گواهی کلاینت. اگر خالی باشد بررسی نمی‌شود.
client_name_typestringnamesubject | name | name-prefixفیلد گواهی که با client_name تطبیق داده می‌شود.
peer_fingerprintbadoption.Listable[string][][<64 lowercase hex chars>]اثرانگشت‌های SHA-256 مجاز برای گواهی‌های برگ کلاینت؛ بدون CA کلاینت هم کار می‌کند.
crl_pathstring(unset)<path>فهرست ابطال گواهی برای رد گواهی‌های ابطال‌شدهٔ کلاینت.
remote_certificate_kubadoption.Listable[string][][<hex mask>]ماسک‌های کاربرد کلید لازم برای کلاینت در قالب remote-cert-ku در OpenVPN.
remote_certificate_ekustring(unset)<OID or name> | server | clientکاربرد گستردهٔ کلید لازم برای کلاینت. با remote_certificate_tls صریح تعارض دارد.
remote_certificate_tlsstringclientserver | client | noneبررسی کاربرد گواهی‌های کلاینت؛ none آن را غیرفعال می‌کند.
certificate_profilestringlegacyinsecure | legacy | preferred | suitebنمایهٔ قدرت گواهی، با همان معنای سمت کلاینت.
ns_certificate_typestring(disabled)server | clientبررسی منسوخ نوع گواهی Netscape.
version_minstring1.21.0 | 1.1 | 1.2 | 1.3کمینهٔ نسخهٔ TLS.
version_maxstring(highest supported)1.0 | 1.1 | 1.2 | 1.3بیشینهٔ نسخهٔ TLS.
cipherstring(default suites)<OpenSSL names, colon-separated>مجموعه‌رمزهای TLS 1.2 و پیش از آن. بر مجموعه‌رمزهای TLS 1.3 اثری ندارد.
groupsstring(default groups)X25519 | SECP256R1 | SECP384R1 | SECP521R1گروه‌های تبادل کلید به ترتیب ترجیح، جداشده با دونقطه.
control_wrap*OpenVPNInboundControlWrapOptions(disabled)OpenVPNInboundControlWrapOptionsپوشش کانال کنترل؛ جدول بعدی را ببینید.

منبع: option/openvpn.go:145-167 · ثابت‌شده در v1.14.2 (af6e64c)

tls.control_wrap ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
typestring(required)tls_auth | tls_crypt | tls_crypt_v2نوع پوشش. برای tls_crypt_v2 کلید همان کلید سرور است.
keybadoption.Listable[string](unset)<key content>محتوای کلید پوشش. key یا key_path لازم است؛ با هم تعارض دارند.
key_pathstring(unset)<path>مسیر کلید پوشش. با key تعارض دارد.
directionstring(bidirectional)server | clientجهت کلید tls_auth: server معادل key-direction 0 در OpenVPN و client معادل 1 است. اگر خالی باشد کلید در هر دو جهت به کار می‌رود.
force_cookieboolfalsetrue | falseفقط tls_crypt_v2: کلاینت‌های UDP باید از کوکی نشست بی‌حالت پشتیبانی کنند. وقتی خاموش است کلاینت‌های بدون پشتیبانی کوکی هم پذیرفته می‌شوند.

منبع: option/openvpn.go:176-182 · ثابت‌شده در v1.14.2 (af6e64c)

push ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
routesbadoption.Listable[netip.Prefix][][<CIDR>]مسیرهای ارسالی به کلاینت‌ها؛ IPv4 و IPv6 را می‌توان با هم آورد.
dnsbadoption.Listable[netip.Addr][][<IP>]سرورهای DNS که به‌صورت dhcp-option DNS / DNS6 قدیمی ارسال می‌شوند. گروه سرور جدید ارسالی در کلاینت‌های سازگار آن‌ها را بازنویسی می‌کند.
dns_servers[]OpenVPNPushDNSServerOptions[][{priority, addresses, resolve_domains, dnssec, transport, sni}]گروه‌های سرور DNS جدید. addresses آدرس IP یا IP:port ([IPv6]:port) می‌پذیرد؛ transport یکی از plain، dot یا doh؛ dnssec یکی از yes، optional یا no. کلاینت‌ها فقط گروه با کمترین عدد priority را به کار می‌برند.
search_domainsbadoption.Listable[string][][<domain>]دامنه‌های جست‌وجوی جدید برای ارسال.
dhcp_optionsbadoption.Listable[string][][<option>]مقادیر اضافی dhcp-option قدیمی، بدون پیشوند dhcp-option.
redirect_gatewayboolfalsetrue | falseارسال redirect-gateway تا کلاینت‌ها ترافیک خود را از VPN عبور دهند.
redirect_gateway_flagsbadoption.Listable[string]def1[<flag>]پرچم‌های redirect-gateway برای ارسال؛ فقط همراه با redirect_gateway.
block_outside_dnsboolfalsetrue | falseارسال block-outside-dns که DNS بیرون از VPN را در کلاینت‌های Windows مسدود می‌کند.
ping_intervalbadoption.Duration(disabled)<duration>فاصلهٔ ping در OpenVPN که به کلاینت‌ها ارسال می‌شود. باید ثانیهٔ کامل باشد.
ping_restartbadoption.Duration(disabled)<duration>مهلت ping-restart در OpenVPN که به کلاینت‌ها ارسال می‌شود. باید ثانیهٔ کامل باشد.

منبع: option/openvpn.go:184-195 · ثابت‌شده در v1.14.2 (af6e64c)

سرور DNS (openvpn) ​

type: "openvpn" زیر dns.servers[]:

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
endpointstring(required)<openvpn-client tag>tag نقطه‌انتهایی openvpn-client که حل‌کننده‌های ارسالی آن به کار می‌روند. پرس‌وجوها از همان نقطه‌انتهایی فرستاده می‌شوند.
accept_default_resolversboolfalsetrue | falseحل‌کننده‌های ارسالی را برای پرس‌وجوهایی هم به کار ببرد که با هیچ resolve-domains، DOMAIN-ROUTE یا پسوند دامنهٔ جست‌وجوی ارسالی تطبیق ندارند. وقتی خاموش است، این پرس‌وجوها NXDOMAIN می‌گیرند.
accept_search_domainboolfalsetrue | falseپرس‌وجوهای تک‌برچسبی (مانند intranet) را با هر دامنهٔ جست‌وجوی ارسالی دوباره امتحان کند تا یکی حل شود.

منبع: option/openvpn.go:206-210 · ثابت‌شده در v1.14.2 (af6e64c)

مثال‌ها ​

کلاینت با احراز هویت گواهی و tls-crypt که یک زیرشبکه را از تونل مسیریابی می‌کند و نام‌های داخلی سرور را با حل‌کننده‌های ارسالی حل می‌کند:

json
{
  "endpoints": [
    {
      "type": "openvpn-client",
      "tag": "ovpn-client",
      "server": "vpn.example.com",
      "server_port": 1194,
      "network": "udp",
      "tls": {
        "certificate_path": "/etc/openvpn/ca.crt",
        "client_certificate_path": "/etc/openvpn/client.crt",
        "client_key_path": "/etc/openvpn/client.key",
        "control_wrap": { "type": "tls_crypt", "key_path": "/etc/openvpn/tc.key" }
      }
    }
  ],
  "dns": {
    "servers": [
      { "type": "local", "tag": "local" },
      { "type": "openvpn", "tag": "ovpn-dns", "endpoint": "ovpn-client", "accept_default_resolvers": true }
    ],
    "rules": [
      { "preferred_by": "ovpn-dns", "action": "route", "server": "ovpn-dns" }
    ],
    "final": "local"
  },
  "route": {
    "rules": [
      { "ip_cidr": ["10.8.0.0/16"], "outbound": "ovpn-client" }
    ]
  }
}

سرور روی UDP 1194 که 10.8.0.0/24 را توزیع می‌کند و مسیر پیش‌فرض را ارسال می‌کند:

json
{
  "endpoints": [
    {
      "type": "openvpn-server",
      "tag": "ovpn-server",
      "listen": "::",
      "listen_port": 1194,
      "network": "udp",
      "address": ["10.8.0.1/24"],
      "tls": {
        "certificate_path": "/etc/openvpn/server.crt",
        "key_path": "/etc/openvpn/server.key",
        "client_certificate_path": "/etc/openvpn/ca.crt",
        "control_wrap": { "type": "tls_crypt", "key_path": "/etc/openvpn/tc.key" }
      },
      "push": {
        "redirect_gateway": true,
        "dns": ["1.1.1.1"]
      }
    }
  ]
}

نکات ​

  • نقطه‌انتهایی‌ها زیر endpoints[] قرار دارند و در قواعد مسیر، مانند خروجی‌ها، با tag انتخاب می‌شوند. هیچ‌کدام مسیر یا تنظیمات DNS سیستم‌عامل را نصب نمی‌کنند: routes، redirect_gateway و مسیرهای ارسالی فقط تعیین می‌کنند sing-box کدام مقصدها را ترجیحاً به نقطه‌انتهایی بفرستد.
  • فیلدهای شماره‌گیری کلاینت بر اتصال آن به سرور OpenVPN اعمال می‌شوند؛ این اتصال کنترلی هرگز از مسیرهای خود نقطه‌انتهایی پیروی نمی‌کند، پس پرچم‌های local / autolocal در redirect-gateway به استثنای مسیر نیازی ندارند.
  • حالت static_key فقط برای سازگاری با همتایانی است که ارتقا نمی‌یابند — کانال کنترل TLS و محرمانگی پیشرو ندارد. tls را ترجیح دهید.
  • احراز هویت تعاملی (چالش / پاسخ، auth_retry: "interact") از طریق کلاینت‌های گرافیکی sing-box یا Dashboard در بخش Tools › Endpoints انجام می‌شود.
  • گزینه‌های DNS ارسالی سرور هرگز در سیستم‌عامل نوشته نمی‌شوند. برای استفاده از آن‌ها سرور DNS از نوع openvpn را به کار ببرید: فقط گروه سرور ارسالی با کمترین عدد priority فعال است، اگر گروه جدیدی نباشد dhcp-option DNS قدیمی به کار می‌رود، و گروهی که DNSSEC را الزامی کند (dnssec yes) رد می‌شود چون این ترابرد DNSSEC را راستی‌آزمایی نمی‌کند.
  • مدت‌هایی مانند ping_interval، ping_restart و replay_window_time باید ثانیهٔ کامل باشند.

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

  • mihomo فقط کلاینت OpenVPN دارد: یک خروجی type: openvpn که کلیدهایش با دستورهای .ovpn متناظرند (ca / cert / key، tls-auth / tls-crypt، username / password و …). سرور OpenVPN ندارد. پیش‌فرض auth در mihomo برابر SHA256 است، در حالی که sing-box از SHA1 در OpenVPN بالادست پیروی می‌کند — هنگام ترکیب پیاده‌سازی‌ها auth را در هر دو سمت صریحاً تنظیم کنید. به OpenVPN — mihomo مراجعه کنید.
  • Xray-core از OpenVPN پشتیبانی نمی‌کند.

منبع: option/openvpn.go:10-210 · v1.14.2 (af6e64c)

Core Tutorial اثر Argsment