Skip to content

OpenConnect — sing-box ​

sing-box یک نقطه‌انتهایی کلاینت OpenConnect (type: "openconnect") ارائه می‌کند. این نقطه‌انتهایی به سرورهای Cisco AnyConnect، Palo Alto GlobalProtect، Fortinet SSL VPN، F5 BIG-IP، Pulse Connect Secure و Juniper Network Connect وصل می‌شود و VPN را به‌صورت یک نقطه‌انتهایی قابل مسیریابی که TCP، UDP و ICMP را حمل می‌کند در اختیار می‌گذارد. یک سرور DNS همراه از نوع openconnect نام‌ها را از طریق تنظیمات DNS که سرور VPN می‌فرستد حل می‌کند.

نقطه‌انتهایی، فقط کلاینت

OpenConnect مانند WireGuard و Tailscale زیر آرایهٔ ریشهٔ endpoints[] قرار می‌گیرد و در قواعد مسیریابی با tag خود ارجاع داده می‌شود. فقط سمت کلاینت پیاده‌سازی شده است.

گزینه‌های نقطه‌انتهایی ​

type: "openconnect" زیر endpoints[]:

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
systemboolfalsetrue | falseاستفاده از یک رابط واقعی سیستم به‌جای پشتهٔ شبکهٔ داخلی sing-box. به دسترسی نیاز دارد و نباید با رابط موجودی تداخل کند.
namestring(auto)<interface name>نام رابط وقتی system فعال است. به‌طور پیش‌فرض نامی با پیشوند oc ساخته می‌شود.
udp_timeoutbadoption.Duration5m<duration>زمان انقضای نشست‌های UDP NAT.
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<count>بیشینهٔ تعداد نشست‌های UDP NAT؛ در رسیدن به سقف، کم‌استفاده‌ترین نشست اخیر بسته می‌شود. 0 یعنی 4096 در iOS و 4096 تا 16384 (بر اساس کل حافظه) در سایر پلتفرم‌ها.
serverstring(required)<hostname or https:// URL>URL از نوع HTTPS سرور VPN؛ اگر https:// نباشد افزوده می‌شود. اطلاعات کاربر، رشتهٔ پرس‌وجو و fragment پشتیبانی نمی‌شوند.
flavorstringanyconnectanyconnect | gp | fortinet | f5 | pulse | ncخانوادهٔ سرور: Cisco AnyConnect، Palo Alto GlobalProtect، Fortinet، F5 BIG-IP، Pulse Connect Secure، Juniper Network Connect.
usernamestring(unset)<string>فیلدهای نام کاربری منطبق در فرم احراز هویت را پر می‌کند.
passwordstring(unset)<string>فیلدهای گذرواژهٔ منطبق در فرم احراز هویت را پر می‌کند.
auth_groupstring(unset)<string>در صورت پشتیبانی نوع سرور، گزینهٔ گروه، realm، دامنه یا دروازهٔ منطبق را از پیش انتخاب می‌کند.
cookiestring(unset)<session cookie>نشست احراز هویت‌شدهٔ موجود که پیش از درخواست اعتبارنامه امتحان می‌شود. قالب آن به نوع سرور بستگی دارد (مثلاً webvpn برای AnyConnect، SVPNCOOKIE برای Fortinet، DSID برای Network Connect)؛ اگر سرور آن را رد کند، ورود عادی انجام می‌شود.
token*OpenConnectTokenOptions(unset)OpenConnectTokenOptionsتوکن نرم‌افزاری (TOTP، HOTP، RSA SecurID) یا توکن دسترسی OIDC برای پاسخ به فیلدهای توکن یا احراز هویت Bearer. پایین‌تر را ببینید.
reported_osstring(from platform)linux | linux-64 | win | mac-intel | android | apple-iosهویت سیستم‌عامل که به سرورهای AnyConnect، GlobalProtect و Pulse گزارش می‌شود. پیش‌فرض، پلتفرم در حال اجرا است.
user_agentstring(flavor-specific)<string>User-Agent گزارش‌شده به سرور. پیش‌فرض‌ها: عامل OpenConnect سازگار با AnyConnect (AnyConnect، Network Connect، Pulse، F5)، PAN GlobalProtect، Mozilla/5.0 SV1 (Fortinet).
versionstringv9.21<string>نسخهٔ کلاینت که جدا از user_agent گزارش می‌شود؛ فعلاً در احراز هویت XML در AnyConnect به کار می‌رود.
local_hostnamestring(system hostname)<string>نام میزبان گزارش‌شده به سرور؛ اگر نام میزبان سیستم در دسترس نباشد localhost.
mobile*OpenConnectMobileOptions(unset)OpenConnectMobileOptionsگزارش هویت کلاینت موبایل AnyConnect. اگر تنظیم شود، هر سه زیرفیلد الزامی‌اند. پایین‌تر را ببینید.
csd*OpenConnectCSDOptions(built-in){ wrapper_path }رسیدگی به CSD / host scan در AnyConnect. به‌طور پیش‌فرض داخلی است؛ wrapper_path به‌جای آن یک برنامهٔ پوشانندهٔ بیرونی اجرا می‌کند.
hip*OpenConnectHIPOptions(built-in){ wrapper_path }رسیدگی به گزارش HIP در GlobalProtect. به‌طور پیش‌فرض داخلی است؛ wrapper_path به‌جای آن یک برنامهٔ پوشانندهٔ بیرونی اجرا می‌کند.
tncc*OpenConnectTNCCOptions(built-in)OpenConnectTNCCOptionsرسیدگی به بررسی انطباق TNCC در Network Connect. پایین‌تر را ببینید.
fortinet_host_check*OpenConnectFortinetHostCheckOptions(disabled)OpenConnectFortinetHostCheckOptionsبازنویسی نتیجهٔ hostcheck در Fortinet؛ فقط وقتی hostcheck خالی نباشد فعال است. پایین‌تر را ببینید.
no_udpboolfalsetrue | falseغیرفعال کردن کانال دادهٔ DTLS / ESP و انتقال همهٔ ترافیک از کانال TLS.
dtls_local_portuint160<port>پورت UDP محلی برای کانال دادهٔ مستقیم DTLS / ESP؛ 0 یک پورت موقت انتخاب می‌کند.
compression_disabledboolfalsetrue | falseغیرفعال کردن مذاکرهٔ فشرده‌سازی AnyConnect. با compression_mode: all در تضاد است.
compression_modestringstatelessstateless | allحالت فشرده‌سازی AnyConnect: stateless فقط oc-lz4 / lzs را اعلام می‌کند؛ all برای CSTP، deflate حالت‌دار را هم پیشنهاد می‌دهد (DTLS بی‌حالت می‌ماند). فشرده‌سازی ممکن است اطلاعاتی از متن ساده درون تونل نشت دهد.
ipv6_disabledboolfalsetrue | falseپیکربندی تونل IPv6 درخواست یا استفاده نمی‌شود.
http_keepalive_disabledboolfalsetrue | falseغیرفعال کردن استفادهٔ مجدد از اتصال HTTP در درخواست‌های احراز هویت و پیکربندی.
xml_post_disabledboolfalsetrue | falseرد کردن احراز هویت XML POST در AnyConnect و آغاز با روند قدیمی GET.
external_auth_disabledboolfalsetrue | falseغیرفعال کردن احراز هویت با مرورگر بیرونی (SSO / SAML) برای AnyConnect، GlobalProtect و Fortinet؛ درخواست‌های احراز هویت بیرونی ناخواسته رد می‌شوند.
password_authentication_disabledboolfalsetrue | falseوقتی سرور فرمی غیر از موفقیت بازگرداند، احراز هویت AnyConnect را متوقف می‌کند (مانند --no-passwd در OpenConnect). روی دیگر انواع سرور یا cookie اثری ندارد.
tcp_keep_alive_enabledboolfalsetrue | falseفعال کردن TCP keep-alive روی اتصال‌های مستقیم به سرور VPN (مانند OpenConnect به‌طور پیش‌فرض خاموش). تنظیم tcp_keep_alive یا tcp_keep_alive_interval هم آن را فعال می‌کند.
pfsboolfalsetrue | falseبرای TLS 1.2 و پیش از آن، مجموعه‌رمزهای دارای محرمانگی پیشرو را الزامی می‌کند. به‌طور پیش‌فرض خاموش است تا با سرورهایی که به تبادل کلید RSA نیاز دارند سازگار باشد.
mtuuint320<576-65535>MTU ترجیحی تونل؛ MTU مذاکره‌شده به آن محدود می‌شود (0 = مذاکره‌شده). مقادیر غیرصفر کمتر از 576 به 576 تبدیل می‌شوند.
base_mtuuint321406<1280-65535>MTU مسیر که پس از کسر سربار بیرونی برای محاسبهٔ MTU تونل به کار می‌رود (AnyConnect، GlobalProtect، F5، Fortinet). مقادیر کمتر از 1280 به 1280 تبدیل می‌شوند.
dpd_intervalbadoption.Duration(server-provided)<duration>بازنویسی بازهٔ Dead Peer Detection. مقادیر مثبت کمتر از 2s به 2s تبدیل می‌شوند.
reconnect_timeoutbadoption.Duration300s<duration>بیشینهٔ مجموع زمان عقب‌نشینی در تلاش‌های ناموفق اتصال دوباره؛ نخستین تلاش بی‌درنگ انجام می‌شود.
trojan_intervalbadoption.Duration(server-provided)<duration>بازهٔ میان گزارش‌های HIP در GlobalProtect / بررسی‌های TNCC در Network Connect. اگر سرور مقداری نفرستد، GlobalProtect از 1h استفاده می‌کند.
queue_lengthuint3232<packets>طول صف بسته میان ترابرد VPN و رابط تونل. صف پر به‌جای اسقاط بسته‌ها، فشار معکوس اعمال می‌کند.
allow_insecure_cryptoboolfalsetrue | falseبرای سرورهای قدیمی، مجموعه‌رمزهای ضعیف TLS / DTLS و TLS 1.0 را مجاز می‌کند. راستی‌آزمایی گواهی را غیرفعال نمی‌کند.
tlsOpenConnectTLSOptions(system trust)OpenConnectTLSOptionsتنظیمات TLS مخصوص OpenConnect (نه بلوک TLS مشترک sing-box). پایین‌تر را ببینید.
form_entries[]OpenConnectFormEntryOptions[][OpenConnectFormEntryOptions]بازنویسی فیلدهای فرم احراز هویت. پایین‌تر را ببینید.

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

این نقطه‌انتهایی فیلدهای شماره‌گیری معمول (detour، bind_interface، tcp_keep_alive و …) را نیز در خود دارد؛ این فیلدها روی اتصال‌هایی که به سرور VPN برقرار می‌شوند اعمال می‌شوند. csd و hip هر کدام فقط یک فیلد wrapper_path می‌پذیرند.

token ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
modestring(required)totp | hotp | stoken | oidcنوع توکن: TOTP، HOTP، توکن نرم‌افزاری RSA SecurID (stoken) یا توکن دسترسی OIDC که به‌صورت احراز هویت HTTP Bearer فرستاده می‌شود.
secretstring(unset)<secret>راز توکن: برای TOTP / HOTP مقدار Base32، مقدار با پیشوند base32: یا یک URI از نوع otpauth://؛ برای stoken محتوای توکن CTF؛ برای oidc توکن دسترسی (فقط وقتی سرور احراز هویت Bearer بخواهد فرستاده می‌شود). یکی از secret / secret_path الزامی است.
secret_pathstring(unset)<file path>خواندن راز یا توکن دسترسی OIDC از یک فایل. با secret در تضاد است.
pinstring(unset)<PIN>PIN مربوط به RSA SecurID (stoken).
passwordstring(unset)<string>گذرواژه‌ای که توکن SecurID محافظت‌شده با گذرواژه را رمزگشایی می‌کند (stoken).
device_idstring(unset)<string>شناسهٔ دستگاه برای رمزگشایی توکن SecurID وابسته به دستگاه (stoken).
counteruint640<uint64>شمارندهٔ آغازین HOTP؛ مقدار 0 در صورت وجود، شمارندهٔ درون URI از نوع otpauth:// را به کار می‌برد.

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

tls ​

OpenConnect به‌جای گزینه‌های مشترک TLS بلوک TLS مخصوص خود را دارد — اینجا uTLS، REALITY یا ECH وجود ندارد.

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
insecureboolfalsetrue | falseرد کردن راستی‌آزمایی گواهی و نام میزبان سرور. به مهاجم فعال اجازهٔ جعل سرور را می‌دهد؛ certificate_authority یا peer_fingerprint را ترجیح دهید.
server_namestring(host from server)<hostname>SNI و نامی که برای راستی‌آزمایی گواهی به کار می‌رود.
peer_fingerprintbadoption.Listable[string](unset)<SHA-1 hex> | sha1:<hex> | sha256:<hex> | pin-sha256:<base64>اثرانگشت‌های مجاز گواهی سرور: هش SHA-1 بدون پیشوند گواهی (مانند --servercert در OpenConnect) یا هش‌های SPKI. پیشوندهای دست‌کم ۴ نویسه پذیرفته می‌شوند؛ تطبیق می‌تواند گواهیِ در غیر این صورت نامعتبر را مجاز کند.
system_trust_disabledboolfalsetrue | falseنادیده گرفتن مخزن CA سیستم؛ به‌جای آن با certificate_authority یا peer_fingerprint اعتماد برقرار کنید.
certificate_authoritybadoption.Listable[string](unset)<PEM>گواهی‌های CA مورد اعتماد اضافی (محتوای PEM) که به مخزن سیستم افزوده می‌شوند. با certificate_authority_path در تضاد است.
certificate_authority_pathstring(unset)<file path>گواهی‌های CA مورد اعتماد اضافی که از یک فایل PEM خوانده می‌شوند.
client_certificatebadoption.Listable[string](unset)<PEM>زنجیرهٔ گواهی کلاینت (محتوای PEM). گواهی و کلید باید با هم تنظیم شوند.
client_certificate_pathstring(unset)<file path>زنجیرهٔ گواهی کلاینت که از یک فایل PEM خوانده می‌شود.
client_keybadoption.Listable[string](unset)<PEM>کلید خصوصی کلاینت (محتوای PEM).
client_key_pathstring(unset)<file path>کلید خصوصی کلاینت که از یک فایل PEM خوانده می‌شود.
client_key_passwordstring(unset)<string>گذرواژهٔ کلید کلاینت رمزگذاری‌شده.
mca_certificatebadoption.Listable[string](unset)<PEM>زنجیرهٔ گواهی احراز هویت چندگواهی (MCA) در AnyConnect (محتوای PEM). گواهی و کلید باید با هم تنظیم شوند.
mca_certificate_pathstring(unset)<file path>زنجیرهٔ گواهی MCA که از یک فایل PEM خوانده می‌شود.
mca_keybadoption.Listable[string](unset)<PEM>کلید خصوصی MCA (محتوای PEM).
mca_key_pathstring(unset)<file path>کلید خصوصی MCA که از یک فایل PEM خوانده می‌شود.
mca_key_passwordstring(unset)<string>گذرواژهٔ کلید MCA رمزگذاری‌شده.

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

form_entries ​

مدخل‌ها بر اساس submission_key، یا بر اساس form_id به‌همراه name تطبیق داده می‌شوند؛ مدخل‌های منطبقِ بعدی برنده‌اند.

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
form_idstring(unset)<string>شناسهٔ فرم؛ وقتی submission_key خالی است همراه با name تطبیق داده می‌شود.
submission_keystring(unset)<string>کلید ارسال فیلد. یا این، یا هر دوی form_id و name الزامی است؛ مدخل‌های منطبقِ بعدی اولویت دارند.
namestring(unset)<string>نام فیلد که همراه با form_id تطبیق داده می‌شود.
valuestring(unset)<string>مقداری که خودکار پر می‌شود. با promote در تضاد است.
promoteboolfalsetrue | falseاین فیلد را به‌صورت تعاملی بپرسد به‌جای پر کردن خودکار. با value در تضاد است.

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

tncc ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
wrapper_pathstring(built-in)<file path>برنامهٔ پوشانندهٔ بیرونی TNCC. با همهٔ دیگر فیلدهای tncc در تضاد است.
device_idstring(unset)<string>شناسهٔ دستگاه که گردانندهٔ داخلی گزارش می‌کند.
user_agentstringNeoteris HC Http<string>User-Agent گردانندهٔ داخلی.
machine_identification_enabledboolfalsetrue | falseاجازه می‌دهد گردانندهٔ داخلی پلتفرم، نام میزبان و آدرس‌های MAC مشاهده‌شده را گزارش کند.
certificates[]OpenConnectTNCCCertificateOptions[][{ certificate | certificate_path }]گواهی‌های ماشین (محتوای PEM یا مسیر) برای پاسخ به درخواست‌های گواهی. به machine_identification_enabled نیاز دارد.

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

هر مدخل certificates[] یا certificate (محتوای PEM) را می‌پذیرد یا certificate_path را.

fortinet_host_check ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
hostcheckstring(unset)<status>,<os-version>رشتهٔ نتیجهٔ hostcheck، مثلاً 0100,10.0.19042 — چهار پرچم 0/1 به ترتیب برای دیوارهٔ آتش شخص ثالث، ضدویروس شخص ثالث، دیوارهٔ آتش FortiClient و ضدویروس FortiClient، سپس نسخهٔ سیستم‌عامل. مقدار خالی hostcheck را غیرفعال می‌کند.
check_virtual_desktopstring(empty)<MAC>|<MAC>…نتیجهٔ بررسی دسکتاپ مجازی، به‌طور مرسوم آدرس‌های MAC که با | به هم پیوسته‌اند. اگر تنظیم نشود، به‌صورت فیلد خالی فرستاده می‌شود.

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

mobile ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
platform_versionstring(required)<string>نسخهٔ سیستم‌عامل موبایل که به سرور AnyConnect گزارش می‌شود.
device_typestring(required)<string>مدل یا نوع دستگاه.
device_unique_idstring(required)<string>شناسهٔ دستگاه.

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

سرور DNS ​

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

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
endpointstring(required)<endpoint tag>tag نقطه‌انتهایی OpenConnect. پرس‌وجوها به حل‌کننده‌هایی می‌روند که سرور VPN فرستاده است: قواعد split-DNS از حل‌کنندهٔ اختصاصی خود، و پسوندهای split-DNS و دامنهٔ جست‌وجوی فرستاده‌شده از حل‌کننده‌های عمومی استفاده می‌کنند؛ پسوند مشخص‌تر اولویت دارد.
accept_default_resolversboolfalsetrue | falseپرس‌وجوهای منطبق‌نشده را هم با حل‌کننده‌های عمومی فرستاده‌شده پاسخ می‌دهد — فقط وقتی سرور همهٔ DNS را از تونل بخواهد یا هیچ قاعده یا پسوند split-DNS نفرستد. در غیر این صورت پرس‌وجوهای منطبق‌نشده NXDOMAIN می‌گیرند.
accept_search_domainboolfalsetrue | falseنام‌های تک‌برچسبی (مثلاً intranet) را با هر دامنهٔ جست‌وجوی فرستاده‌شده دوباره امتحان می‌کند تا یکی حل شود.

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

مثال‌ها ​

کلاینت حداقلی AnyConnect که یک بازهٔ خصوصی را از طریق VPN مسیریابی می‌کند:

json
{
  "endpoints": [
    {
      "type": "openconnect",
      "tag": "oc-client",
      "server": "vpn.example.com",
      "flavor": "anyconnect",
      "username": "alice",
      "password": "<password>"
    }
  ],
  "route": {
    "rules": [
      { "ip_cidr": ["10.0.0.0/8"], "outbound": "oc-client" }
    ]
  }
}

GlobalProtect با توکن TOTP که نام‌های split-DNS مربوط به VPN را از طریق حل‌کننده‌های فرستاده‌شده پاسخ می‌دهد:

json
{
  "dns": {
    "servers": [
      { "type": "local", "tag": "local" },
      { "type": "openconnect", "tag": "oc-dns", "endpoint": "gp-client" }
    ],
    "rules": [
      { "preferred_by": "oc-dns", "action": "route", "server": "oc-dns" }
    ],
    "final": "local"
  },
  "endpoints": [
    {
      "type": "openconnect",
      "tag": "gp-client",
      "server": "https://gp.example.com",
      "flavor": "gp",
      "username": "alice",
      "password": "<password>",
      "token": { "mode": "totp", "secret": "<base32 secret>" }
    }
  ]
}

نکات ​

  • این نوع فقط با برچسب ساخت with_openconnect کامپایل می‌شود و حالت پیش‌فرض فضای کاربر (system: false) افزون بر آن به with_gvisor نیاز دارد. بدون آن‌ها، نقطه‌انتهایی و سرور DNS هنگام راه‌اندازی با راهنمای ساخت مجدد خطا می‌دهند.
  • از فایل پیکربندی فقط ورود غیرتعاملی ممکن است: username / password، token، cookie و form_entries. SSO / SAML و هر درخواست دیگری که پیکربندی نتواند پاسخ دهد، از طریق کلاینت‌های گرافیکی sing-box یا Dashboard (Tools → Endpoints) تکمیل می‌شود.
  • تنظیمات DNS فرستاده‌شده هرگز در سیستم‌عامل نصب نمی‌شوند. برای استفاده از آن‌ها یک سرور DNS از نوع openconnect بیفزایید؛ با preferred_by مانند مثال بالا، فقط نام‌های خود VPN به آنجا فرستاده می‌شوند.
  • compression_mode: all فشرده‌سازی حالت‌دار را فعال می‌کند که خطرهای محرمانگی بیشتری دارد — فقط وقتی سرور آن را الزامی کند از آن استفاده کنید.
  • tls.insecure و allow_insecure_crypto مستقل از هم‌اند: اولی بررسی گواهی را رد می‌کند و دومی فقط رمزهای قدیمی و TLS 1.0 را دوباره فعال می‌کند.

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

  • mihomo کلاینت OpenConnect ندارد؛ نزدیک‌ترین خروجی شبیه VPN در آن OpenVPN — mihomo است.
  • Xray-core از OpenConnect پشتیبانی نمی‌کند.

منبع: option/openconnect.go:5-49 · v1.14.2 (af6e64c)

Core Tutorial اثر Argsment