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[]:
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
system | bool | false | true | false | استفاده از یک رابط واقعی سیستم بهجای پشتهٔ شبکهٔ داخلی sing-box. به دسترسی نیاز دارد و نباید با رابط موجودی تداخل کند. |
name | string | (auto) | <interface name> | نام رابط وقتی system فعال است. بهطور پیشفرض نامی با پیشوند oc ساخته میشود. |
udp_timeout | badoption.Duration | 5m | <duration> | زمان انقضای نشستهای UDP NAT. |
udp_mapping | UDPNATBehavior | endpoint_independent | endpoint_independent | address_dependent | address_and_port_dependent | نگاشت UDP NAT: استفادهٔ مجدد از یک نگاشت برای هر مبدأ و همهٔ مقصدها، یا جداسازی آن بر اساس آدرس مقصد / آدرس و پورت. |
udp_filtering | UDPNATBehavior | endpoint_independent | endpoint_independent | address_dependent | address_and_port_dependent | پالایش UDP NAT: پذیرفتن پاسخ از هر طرف دور، یا فقط از آدرسها / جفتهای آدرس و پورتی که قبلاً به آنها بسته فرستاده شده است. |
udp_nat_max | uint32 | 0 | <count> | بیشینهٔ تعداد نشستهای UDP NAT؛ در رسیدن به سقف، کماستفادهترین نشست اخیر بسته میشود. 0 یعنی 4096 در iOS و 4096 تا 16384 (بر اساس کل حافظه) در سایر پلتفرمها. |
server | string | (required) | <hostname or https:// URL> | URL از نوع HTTPS سرور VPN؛ اگر https:// نباشد افزوده میشود. اطلاعات کاربر، رشتهٔ پرسوجو و fragment پشتیبانی نمیشوند. |
flavor | string | anyconnect | anyconnect | gp | fortinet | f5 | pulse | nc | خانوادهٔ سرور: Cisco AnyConnect، Palo Alto GlobalProtect، Fortinet، F5 BIG-IP، Pulse Connect Secure، Juniper Network Connect. |
username | string | (unset) | <string> | فیلدهای نام کاربری منطبق در فرم احراز هویت را پر میکند. |
password | string | (unset) | <string> | فیلدهای گذرواژهٔ منطبق در فرم احراز هویت را پر میکند. |
auth_group | string | (unset) | <string> | در صورت پشتیبانی نوع سرور، گزینهٔ گروه، realm، دامنه یا دروازهٔ منطبق را از پیش انتخاب میکند. |
cookie | string | (unset) | <session cookie> | نشست احراز هویتشدهٔ موجود که پیش از درخواست اعتبارنامه امتحان میشود. قالب آن به نوع سرور بستگی دارد (مثلاً webvpn برای AnyConnect، SVPNCOOKIE برای Fortinet، DSID برای Network Connect)؛ اگر سرور آن را رد کند، ورود عادی انجام میشود. |
token | *OpenConnectTokenOptions | (unset) | OpenConnectTokenOptions | توکن نرمافزاری (TOTP، HOTP، RSA SecurID) یا توکن دسترسی OIDC برای پاسخ به فیلدهای توکن یا احراز هویت Bearer. پایینتر را ببینید. |
reported_os | string | (from platform) | linux | linux-64 | win | mac-intel | android | apple-ios | هویت سیستمعامل که به سرورهای AnyConnect، GlobalProtect و Pulse گزارش میشود. پیشفرض، پلتفرم در حال اجرا است. |
user_agent | string | (flavor-specific) | <string> | User-Agent گزارششده به سرور. پیشفرضها: عامل OpenConnect سازگار با AnyConnect (AnyConnect، Network Connect، Pulse، F5)، PAN GlobalProtect، Mozilla/5.0 SV1 (Fortinet). |
version | string | v9.21 | <string> | نسخهٔ کلاینت که جدا از user_agent گزارش میشود؛ فعلاً در احراز هویت XML در AnyConnect به کار میرود. |
local_hostname | string | (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_udp | bool | false | true | false | غیرفعال کردن کانال دادهٔ DTLS / ESP و انتقال همهٔ ترافیک از کانال TLS. |
dtls_local_port | uint16 | 0 | <port> | پورت UDP محلی برای کانال دادهٔ مستقیم DTLS / ESP؛ 0 یک پورت موقت انتخاب میکند. |
compression_disabled | bool | false | true | false | غیرفعال کردن مذاکرهٔ فشردهسازی AnyConnect. با compression_mode: all در تضاد است. |
compression_mode | string | stateless | stateless | all | حالت فشردهسازی AnyConnect: stateless فقط oc-lz4 / lzs را اعلام میکند؛ all برای CSTP، deflate حالتدار را هم پیشنهاد میدهد (DTLS بیحالت میماند). فشردهسازی ممکن است اطلاعاتی از متن ساده درون تونل نشت دهد. |
ipv6_disabled | bool | false | true | false | پیکربندی تونل IPv6 درخواست یا استفاده نمیشود. |
http_keepalive_disabled | bool | false | true | false | غیرفعال کردن استفادهٔ مجدد از اتصال HTTP در درخواستهای احراز هویت و پیکربندی. |
xml_post_disabled | bool | false | true | false | رد کردن احراز هویت XML POST در AnyConnect و آغاز با روند قدیمی GET. |
external_auth_disabled | bool | false | true | false | غیرفعال کردن احراز هویت با مرورگر بیرونی (SSO / SAML) برای AnyConnect، GlobalProtect و Fortinet؛ درخواستهای احراز هویت بیرونی ناخواسته رد میشوند. |
password_authentication_disabled | bool | false | true | false | وقتی سرور فرمی غیر از موفقیت بازگرداند، احراز هویت AnyConnect را متوقف میکند (مانند --no-passwd در OpenConnect). روی دیگر انواع سرور یا cookie اثری ندارد. |
tcp_keep_alive_enabled | bool | false | true | false | فعال کردن TCP keep-alive روی اتصالهای مستقیم به سرور VPN (مانند OpenConnect بهطور پیشفرض خاموش). تنظیم tcp_keep_alive یا tcp_keep_alive_interval هم آن را فعال میکند. |
pfs | bool | false | true | false | برای TLS 1.2 و پیش از آن، مجموعهرمزهای دارای محرمانگی پیشرو را الزامی میکند. بهطور پیشفرض خاموش است تا با سرورهایی که به تبادل کلید RSA نیاز دارند سازگار باشد. |
mtu | uint32 | 0 | <576-65535> | MTU ترجیحی تونل؛ MTU مذاکرهشده به آن محدود میشود (0 = مذاکرهشده). مقادیر غیرصفر کمتر از 576 به 576 تبدیل میشوند. |
base_mtu | uint32 | 1406 | <1280-65535> | MTU مسیر که پس از کسر سربار بیرونی برای محاسبهٔ MTU تونل به کار میرود (AnyConnect، GlobalProtect، F5، Fortinet). مقادیر کمتر از 1280 به 1280 تبدیل میشوند. |
dpd_interval | badoption.Duration | (server-provided) | <duration> | بازنویسی بازهٔ Dead Peer Detection. مقادیر مثبت کمتر از 2s به 2s تبدیل میشوند. |
reconnect_timeout | badoption.Duration | 300s | <duration> | بیشینهٔ مجموع زمان عقبنشینی در تلاشهای ناموفق اتصال دوباره؛ نخستین تلاش بیدرنگ انجام میشود. |
trojan_interval | badoption.Duration | (server-provided) | <duration> | بازهٔ میان گزارشهای HIP در GlobalProtect / بررسیهای TNCC در Network Connect. اگر سرور مقداری نفرستد، GlobalProtect از 1h استفاده میکند. |
queue_length | uint32 | 32 | <packets> | طول صف بسته میان ترابرد VPN و رابط تونل. صف پر بهجای اسقاط بستهها، فشار معکوس اعمال میکند. |
allow_insecure_crypto | bool | false | true | false | برای سرورهای قدیمی، مجموعهرمزهای ضعیف TLS / DTLS و TLS 1.0 را مجاز میکند. راستیآزمایی گواهی را غیرفعال نمیکند. |
tls | OpenConnectTLSOptions | (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
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
mode | string | (required) | totp | hotp | stoken | oidc | نوع توکن: TOTP، HOTP، توکن نرمافزاری RSA SecurID (stoken) یا توکن دسترسی OIDC که بهصورت احراز هویت HTTP Bearer فرستاده میشود. |
secret | string | (unset) | <secret> | راز توکن: برای TOTP / HOTP مقدار Base32، مقدار با پیشوند base32: یا یک URI از نوع otpauth://؛ برای stoken محتوای توکن CTF؛ برای oidc توکن دسترسی (فقط وقتی سرور احراز هویت Bearer بخواهد فرستاده میشود). یکی از secret / secret_path الزامی است. |
secret_path | string | (unset) | <file path> | خواندن راز یا توکن دسترسی OIDC از یک فایل. با secret در تضاد است. |
pin | string | (unset) | <PIN> | PIN مربوط به RSA SecurID (stoken). |
password | string | (unset) | <string> | گذرواژهای که توکن SecurID محافظتشده با گذرواژه را رمزگشایی میکند (stoken). |
device_id | string | (unset) | <string> | شناسهٔ دستگاه برای رمزگشایی توکن SecurID وابسته به دستگاه (stoken). |
counter | uint64 | 0 | <uint64> | شمارندهٔ آغازین HOTP؛ مقدار 0 در صورت وجود، شمارندهٔ درون URI از نوع otpauth:// را به کار میبرد. |
منبع: option/openconnect.go:51-59 · ثابتشده در v1.14.2 (af6e64c)
tls
OpenConnect بهجای گزینههای مشترک TLS بلوک TLS مخصوص خود را دارد — اینجا uTLS، REALITY یا ECH وجود ندارد.
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
insecure | bool | false | true | false | رد کردن راستیآزمایی گواهی و نام میزبان سرور. به مهاجم فعال اجازهٔ جعل سرور را میدهد؛ certificate_authority یا peer_fingerprint را ترجیح دهید. |
server_name | string | (host from server) | <hostname> | SNI و نامی که برای راستیآزمایی گواهی به کار میرود. |
peer_fingerprint | badoption.Listable[string] | (unset) | <SHA-1 hex> | sha1:<hex> | sha256:<hex> | pin-sha256:<base64> | اثرانگشتهای مجاز گواهی سرور: هش SHA-1 بدون پیشوند گواهی (مانند --servercert در OpenConnect) یا هشهای SPKI. پیشوندهای دستکم ۴ نویسه پذیرفته میشوند؛ تطبیق میتواند گواهیِ در غیر این صورت نامعتبر را مجاز کند. |
system_trust_disabled | bool | false | true | false | نادیده گرفتن مخزن CA سیستم؛ بهجای آن با certificate_authority یا peer_fingerprint اعتماد برقرار کنید. |
certificate_authority | badoption.Listable[string] | (unset) | <PEM> | گواهیهای CA مورد اعتماد اضافی (محتوای PEM) که به مخزن سیستم افزوده میشوند. با certificate_authority_path در تضاد است. |
certificate_authority_path | string | (unset) | <file path> | گواهیهای CA مورد اعتماد اضافی که از یک فایل PEM خوانده میشوند. |
client_certificate | badoption.Listable[string] | (unset) | <PEM> | زنجیرهٔ گواهی کلاینت (محتوای PEM). گواهی و کلید باید با هم تنظیم شوند. |
client_certificate_path | string | (unset) | <file path> | زنجیرهٔ گواهی کلاینت که از یک فایل PEM خوانده میشود. |
client_key | badoption.Listable[string] | (unset) | <PEM> | کلید خصوصی کلاینت (محتوای PEM). |
client_key_path | string | (unset) | <file path> | کلید خصوصی کلاینت که از یک فایل PEM خوانده میشود. |
client_key_password | string | (unset) | <string> | گذرواژهٔ کلید کلاینت رمزگذاریشده. |
mca_certificate | badoption.Listable[string] | (unset) | <PEM> | زنجیرهٔ گواهی احراز هویت چندگواهی (MCA) در AnyConnect (محتوای PEM). گواهی و کلید باید با هم تنظیم شوند. |
mca_certificate_path | string | (unset) | <file path> | زنجیرهٔ گواهی MCA که از یک فایل PEM خوانده میشود. |
mca_key | badoption.Listable[string] | (unset) | <PEM> | کلید خصوصی MCA (محتوای PEM). |
mca_key_path | string | (unset) | <file path> | کلید خصوصی MCA که از یک فایل PEM خوانده میشود. |
mca_key_password | string | (unset) | <string> | گذرواژهٔ کلید MCA رمزگذاریشده. |
منبع: option/openconnect.go:93-110 · ثابتشده در v1.14.2 (af6e64c)
form_entries
مدخلها بر اساس submission_key، یا بر اساس form_id بههمراه name تطبیق داده میشوند؛ مدخلهای منطبقِ بعدی برندهاند.
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
form_id | string | (unset) | <string> | شناسهٔ فرم؛ وقتی submission_key خالی است همراه با name تطبیق داده میشود. |
submission_key | string | (unset) | <string> | کلید ارسال فیلد. یا این، یا هر دوی form_id و name الزامی است؛ مدخلهای منطبقِ بعدی اولویت دارند. |
name | string | (unset) | <string> | نام فیلد که همراه با form_id تطبیق داده میشود. |
value | string | (unset) | <string> | مقداری که خودکار پر میشود. با promote در تضاد است. |
promote | bool | false | true | false | این فیلد را بهصورت تعاملی بپرسد بهجای پر کردن خودکار. با value در تضاد است. |
منبع: option/openconnect.go:112-118 · ثابتشده در v1.14.2 (af6e64c)
tncc
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
wrapper_path | string | (built-in) | <file path> | برنامهٔ پوشانندهٔ بیرونی TNCC. با همهٔ دیگر فیلدهای tncc در تضاد است. |
device_id | string | (unset) | <string> | شناسهٔ دستگاه که گردانندهٔ داخلی گزارش میکند. |
user_agent | string | Neoteris HC Http | <string> | User-Agent گردانندهٔ داخلی. |
machine_identification_enabled | bool | false | true | 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
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
hostcheck | string | (unset) | <status>,<os-version> | رشتهٔ نتیجهٔ hostcheck، مثلاً 0100,10.0.19042 — چهار پرچم 0/1 به ترتیب برای دیوارهٔ آتش شخص ثالث، ضدویروس شخص ثالث، دیوارهٔ آتش FortiClient و ضدویروس FortiClient، سپس نسخهٔ سیستمعامل. مقدار خالی hostcheck را غیرفعال میکند. |
check_virtual_desktop | string | (empty) | <MAC>|<MAC>… | نتیجهٔ بررسی دسکتاپ مجازی، بهطور مرسوم آدرسهای MAC که با | به هم پیوستهاند. اگر تنظیم نشود، بهصورت فیلد خالی فرستاده میشود. |
منبع: option/openconnect.go:83-86 · ثابتشده در v1.14.2 (af6e64c)
mobile
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
platform_version | string | (required) | <string> | نسخهٔ سیستمعامل موبایل که به سرور AnyConnect گزارش میشود. |
device_type | string | (required) | <string> | مدل یا نوع دستگاه. |
device_unique_id | string | (required) | <string> | شناسهٔ دستگاه. |
منبع: option/openconnect.go:61-65 · ثابتشده در v1.14.2 (af6e64c)
سرور DNS
type: "openconnect" زیر dns.servers[]:
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
endpoint | string | (required) | <endpoint tag> | tag نقطهانتهایی OpenConnect. پرسوجوها به حلکنندههایی میروند که سرور VPN فرستاده است: قواعد split-DNS از حلکنندهٔ اختصاصی خود، و پسوندهای split-DNS و دامنهٔ جستوجوی فرستادهشده از حلکنندههای عمومی استفاده میکنند؛ پسوند مشخصتر اولویت دارد. |
accept_default_resolvers | bool | false | true | false | پرسوجوهای منطبقنشده را هم با حلکنندههای عمومی فرستادهشده پاسخ میدهد — فقط وقتی سرور همهٔ DNS را از تونل بخواهد یا هیچ قاعده یا پسوند split-DNS نفرستد. در غیر این صورت پرسوجوهای منطبقنشده NXDOMAIN میگیرند. |
accept_search_domain | bool | false | true | false | نامهای تکبرچسبی (مثلاً intranet) را با هر دامنهٔ جستوجوی فرستادهشده دوباره امتحان میکند تا یکی حل شود. |
منبع: option/openconnect.go:120-124 · ثابتشده در v1.14.2 (af6e64c)
مثالها
کلاینت حداقلی AnyConnect که یک بازهٔ خصوصی را از طریق VPN مسیریابی میکند:
{
"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 را از طریق حلکنندههای فرستادهشده پاسخ میدهد:
{
"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)
