Files
2026-07-23 13:17:58 +08:00

652 lines
17 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# OpenConnect 客户端
!!! question "自 sing-box 1.14.0 起"
==仅客户端==
## 结构
```json
{
"type": "openconnect",
"tag": "oc-client",
"system": false,
"name": "",
... // UDP NAT 字段
"server": "vpn.example.com",
"flavor": "anyconnect",
"username": "",
"password": "",
"auth_group": "",
"cookie": "",
"token": {
"mode": "",
"secret": "",
"secret_path": "",
"pin": "",
"password": "",
"device_id": "",
"counter": 0
},
"reported_os": "",
"user_agent": "",
"version": "",
"local_hostname": "",
"mobile": {
"platform_version": "",
"device_type": "",
"device_unique_id": ""
},
"csd": {
"wrapper_path": ""
},
"hip": {
"wrapper_path": ""
},
"tncc": {
"wrapper_path": "",
"device_id": "",
"user_agent": "",
"machine_identification_enabled": false,
"certificates": [
{
"certificate": [],
"certificate_path": ""
}
]
},
"fortinet_host_check": {
"hostcheck": "",
"check_virtual_desktop": ""
},
"no_udp": false,
"dtls_local_port": 0,
"compression_disabled": false,
"compression_mode": "",
"ipv6_disabled": false,
"http_keepalive_disabled": false,
"xml_post_disabled": false,
"external_auth_disabled": false,
"password_authentication_disabled": false,
"tcp_keep_alive_enabled": false,
"pfs": false,
"mtu": 0,
"base_mtu": 0,
"dpd_interval": "",
"reconnect_timeout": "",
"trojan_interval": "",
"queue_length": 0,
"allow_insecure_crypto": false,
"tls": {
"insecure": false,
"server_name": "",
"peer_fingerprint": [],
"system_trust_disabled": false,
"certificate_authority": [],
"certificate_authority_path": "",
"client_certificate": [],
"client_certificate_path": "",
"client_key": [],
"client_key_path": "",
"client_key_password": "",
"mca_certificate": [],
"mca_certificate_path": "",
"mca_key": [],
"mca_key_path": "",
"mca_key_password": ""
},
"form_entries": [
{
"form_id": "",
"submission_key": "",
"name": "",
"value": "",
"promote": false
}
],
... // 拨号字段
}
```
!!! note ""
当内容只有一项时,可以忽略 JSON 数组 [] 标签。
## 字段
### system
使用系统接口。
需要权限,且不能与现有系统接口冲突。
禁用时,sing-box 使用内部网络栈。
### name
系统接口的自定义接口名称。
默认使用自动生成的 `oc` 接口名称。
### server
==必填==
OpenConnect VPN 服务器 HTTPS URL。
省略协议时会添加 `https://`。不支持 URL 用户信息、查询和片段。
### flavor
OpenConnect 协议 flavor,可选值为 `anyconnect``gp``fortinet``f5``pulse``nc`
默认使用 `anyconnect`
### username
用于填充匹配认证表单字段的用户名。
### password
用于填充匹配认证表单字段的密码。
### auth_group
认证组,用于在所选 flavor 支持时预选匹配的组、realm、domain 或 gateway 选项。
### cookie
用于跳过凭据提示并直接连接的现有认证会话。
接受的格式取决于 `flavor`
- `anyconnect``webvpn` 值,或包含 `webvpn` 的分号分隔 cookie 列表。
- `gp`GlobalProtect 认证返回的完整 authenticated query string。
- `nc``DSID` 值,或包含 `DSID` 的分号分隔 cookie 列表。
- `pulse`:原始 Pulse 认证 cookie 值。
- `f5``MRHSession` 值,或包含 `MRHSession` 及可选 `F5_ST` 的分号分隔 cookie 列表。
- `fortinet``SVPNCOOKIE` 值,或包含 `SVPNCOOKIE` 的分号分隔 cookie 列表。
如果服务器拒绝提供的会话,将尝试正常认证。
### token
用于自动回答匹配 token 字段或进行 HTTP Bearer 认证的 token 配置。
必须设置 `token.secret``token.secret_path` 之一。
### token.mode
==必填==
Token 模式,可选值为:
- `totp`:基于时间的一次性密码。
- `hotp`:基于 HMAC 的一次性密码。
- `stoken`RSA SecurID 软件 token。
- `oidc`:用于 HTTP Bearer 认证的 OIDC access token。
### token.secret
软件 token 密钥。
对于 `totp``hotp`,可以是 Base32 密钥、带 `base32:` 前缀的密钥或类型匹配的 `otpauth://` URI。
对于 `stoken`,这是编码后的 RSA SecurID CTF token 内容。
对于 `oidc`,这是 access token 值。仅在 VPN 服务器请求 HTTP Bearer 认证后发送。
`token.secret_path` 冲突。
### token.secret_path
软件 token 密钥或 OIDC access token 的路径。
`token.secret` 冲突。
### token.pin
`stoken` 模式的 RSA SecurID PIN。
### token.password
`stoken` 模式下用于解密受密码保护的 RSA SecurID token 的密码。
### token.device_id
`stoken` 模式下用于解密设备绑定 RSA SecurID token 的设备 ID。
### token.counter
`hotp` 模式的初始计数器。
为零时,如果 `otpauth://` URI 中存在计数器,则使用该计数器;否则从零开始。
### reported_os
所选 flavor 支持时向 VPN 服务器报告的操作系统标识。
对于 `anyconnect``gp``pulse`,支持的值为 `linux``linux-64``win``mac-intel``android``apple-ios`
默认值根据系统平台选择:Windows 使用 `win`macOS 使用 `mac-intel`Android 使用 `android`iOS 使用 `apple-ios`,其他 64 位或 32 位系统使用 `linux-64``linux`
### user_agent
所选 flavor 支持时向 VPN 服务器报告的 User-Agent。
默认值由 flavor 决定。AnyConnect、Network Connect、Pulse 和 F5 使用 `AnyConnect-compatible OpenConnect VPN Agent v9.21`GlobalProtect 使用 `PAN GlobalProtect`Fortinet 使用 `Mozilla/5.0 SV1`
### version
所选 flavor 支持时,与 `user_agent` 分开报告的客户端版本。
默认使用 `v9.21`。当前用于 AnyConnect XML 认证。
### local_hostname
所选 flavor 支持时向 VPN 服务器报告的本地主机名。
默认使用系统主机名;无法获取时使用 `localhost`
### mobile
AnyConnect 移动客户端身份。配置时三个字段均为必填,并会在 XML 认证和隧道建立阶段报告。
### mobile.platform_version
向 AnyConnect 服务器报告的移动操作系统版本。
### mobile.device_type
向 AnyConnect 服务器报告的移动设备型号或类型。
### mobile.device_unique_id
向 AnyConnect 服务器报告的移动设备标识符。
### csd
AnyConnect CSD/host scan 合规性选项。
服务器请求 CSD 时,默认使用内置 CSD 处理。
### csd.wrapper_path
外部 AnyConnect CSD wrapper 可执行文件的路径。
为空时使用内置 CSD 处理。
### hip
GlobalProtect HIP 检查和报告选项。
服务器请求 HIP 时,默认使用内置 HIP 报告。
### hip.wrapper_path
外部 GlobalProtect HIP report wrapper 可执行文件的路径。
为空时使用内置 HIP 报告。
### tncc
Network Connect TNCC 合规性选项。
服务器请求 TNCC 时,默认使用内置 TNCC 处理。
### tncc.wrapper_path
外部 Network Connect TNCC wrapper 可执行文件的路径。
为空时使用内置 TNCC 处理。
`tncc.device_id``tncc.user_agent``tncc.machine_identification_enabled``tncc.certificates` 冲突。
### tncc.device_id
内置 TNCC 处理程序报告的设备 ID。
`tncc.wrapper_path` 冲突。
### tncc.user_agent
内置 TNCC 处理程序使用的 User-Agent。
默认使用 `Neoteris HC Http`
`tncc.wrapper_path` 冲突。
### tncc.machine_identification_enabled
启用内置 TNCC 机器标识,包括平台、主机名和观测到的 MAC 地址。
`tncc.wrapper_path` 冲突。
### tncc.certificates
内置 TNCC 处理程序用于回答证书请求的机器证书。
需要启用 `tncc.machine_identification_enabled`
`tncc.wrapper_path` 冲突。
### tncc.certificates.certificate
PEM 格式的 TNCC 机器证书内容。
`tncc.certificates.certificate_path` 冲突。
### tncc.certificates.certificate_path
PEM 格式的 TNCC 机器证书路径。
`tncc.certificates.certificate` 冲突。
### fortinet_host_check
Fortinet hostcheck 结果覆盖选项。
默认禁用 hostcheck。仅当 `fortinet_host_check.hostcheck` 非空时启用。不会自动收集操作系统、安全产品或网络接口信息。
启用后,如果成功的 Fortinet 登录响应要求 hostcheck,将在使用 VPN 会话前向服务器提交两个配置值。这些值不经修改,作为 `application/x-www-form-urlencoded` 字段发送。
部分 Fortinet 服务器只会要求可识别的 FortiClient User-Agent 执行 hostcheck。服务器策略有要求时请配置 `user_agent`
### fortinet_host_check.hostcheck
Fortinet hostcheck 结果字符串。
通常格式为 `<security-status>,<os-version>`,例如 `0100,10.0.19042``security-status` 包含四个 `0``1` 字符,依次表示第三方防火墙、第三方杀毒软件、FortiClient 防火墙和 FortiClient 杀毒软件。
空值会禁用 Fortinet hostcheck,即使配置了 `fortinet_host_check.check_virtual_desktop`
### fortinet_host_check.check_virtual_desktop
Fortinet virtual desktop 检查结果字符串。
FortiClient 通常发送以冒号分隔的 MAC 地址,多个地址使用 `|` 连接,例如 `74:78:27:4d:81:93|84:1b:77:3a:95:84`。启用 hostcheck 时,空值会作为空字段提交。
### no_udp
禁用 DTLS 或 ESP 辅助数据通道,仅使用 TLS 数据通道。
### dtls_local_port
直连 DTLS 或 ESP 辅助数据通道使用的本地 UDP 端口。
默认自动选择临时端口。
### compression_disabled
禁用 AnyConnect 压缩协商。
默认情况下,当服务器支持时,CSTP 和 DTLS 会协商无状态 `oc-lz4``lzs` 压缩。
当攻击者能够影响通过 VPN 隧道发送的明文时,压缩可能削弱流量机密性。
与设置为 `all``compression_mode` 冲突。
### compression_mode
AnyConnect 压缩模式,可选值为:
- `stateless`:声明支持无状态 `oc-lz4``lzs` 压缩。
- `all`:额外声明支持 CSTP 有状态 `deflate` 压缩。
默认使用 `stateless`。即使选择 `all`DTLS 也始终使用无状态压缩。
有状态压缩存在额外的流量机密性风险,仅应在 VPN 服务器需要时启用。
### ipv6_disabled
禁用请求和使用 IPv6 隧道配置。
### http_keepalive_disabled
在认证和配置请求中禁用 HTTP 连接复用。
### xml_post_disabled
禁用 AnyConnect XML POST 认证,并直接使用旧版 GET 流程开始认证。
### external_auth_disabled
禁用 AnyConnect、GlobalProtect 和 Fortinet 的 SSO、SAML 等外部浏览器认证。
启用时不会为 AnyConnect 或 GlobalProtect 向服务器声明外部认证支持,并会拒绝任何意外收到的外部认证请求,包括 Fortinet SAML。
### password_authentication_disabled
如果服务器返回非成功的认证表单,则中止 AnyConnect 认证,与 OpenConnect `--no-passwd` 行为一致。
此选项不影响其他 flavor,也不影响由 `cookie` 提供的会话。
### tcp_keep_alive_enabled
为直接 VPN 服务器连接启用 TCP keep alive。
默认禁用以匹配 OpenConnect。设置 `tcp_keep_alive``tcp_keep_alive_interval` 也会启用,无需同时设置此字段。启用但未设置这两个时间值时,保留操作系统的 TCP keep alive 时间设置。
`disable_tcp_keep_alive` 冲突。
### pfs
要求 TLS 1.2 及更早版本使用具有前向保密性的 TLS 密码套件。
默认禁用,以兼容需要 RSA 密钥交换的 VPN 服务器。此选项不会启用已弃用的密码套件;旧版加密支持参阅 `allow_insecure_crypto`
### mtu
首选隧道 MTU。
所有 flavor 协商的 MTU 都不会超过此值。对于 AnyConnect,此值还会发送给服务器。GlobalProtect、F5 和 Fortinet 会先扣除各自的协议开销,再将结果作为隧道 MTU。
非零值小于 `576` 时按 `576` 处理。最大值为 `65535`
### base_mtu
扣除外层 IP、传输和协议开销后,用于计算 AnyConnect、GlobalProtect、F5 和 Fortinet 隧道 MTU 的基础路径 MTU。
默认使用 `1406`
这些 flavor 会将小于 `1280` 的值按 `1280` 处理。最大值为 `65535`
### dpd_interval
覆盖 Dead Peer Detection 间隔。
默认使用服务器提供或 flavor 特定的间隔。
大于零且小于 `2s` 的值按 `2s` 处理。值不得为负数。
### reconnect_timeout
重连尝试失败后允许累计使用的最大退避时间。断线后的第一次重连会立即开始,且此超时不会取消已经进行中的尝试。
默认使用 `300s`
值不得为负数。
### trojan_interval
覆盖 GlobalProtect HIP report 或 Network Connect TNCC check 的执行间隔。
默认使用服务器提供的间隔。服务器未提供时,GlobalProtect 使用 `1h`
值不得为负数。
### queue_length
VPN transport 与隧道接口之间的入站和出站数据包队列长度。
默认使用 `32`。队列已满时会施加反压并等待消费者腾出空间,不会丢弃已排队的数据包。
### allow_insecure_crypto
启用旧版 VPN 服务器所需的弱 TLS 和 DTLS 密码套件及 TLS 1.0 兼容性。
默认禁用;未启用时会拒绝低于 TLS 1.2 的版本。此选项不会禁用服务器证书验证。
### tls
OpenConnect TLS 配置。
### tls.insecure
禁用 VPN 服务器证书和主机名验证。
默认禁用。启用后,主动攻击者可以冒充 VPN 服务器。应尽可能使用 `tls.certificate_authority``tls.peer_fingerprint`
### tls.server_name
用于 TLS SNI 和证书主机名验证的服务器名称。
默认使用 `server` 中的主机名。
### tls.peer_fingerprint
允许的服务器证书指纹。可以指定单个字符串或列表。
支持的格式:
- 与 OpenConnect `--servercert` 兼容的无前缀 SHA-1 证书指纹。
- `sha1:<hex>`SHA-1 SPKI 指纹。
- `sha256:<hex>`SHA-256 SPKI 指纹。
- `pin-sha256:<base64>`Base64 编码的 SHA-256 SPKI pin。
每种格式的编码指纹均可缩写为至少四个字符的前缀。配置后,对端证书必须匹配其中一个指纹;匹配的指纹可以授权未通过其他方式信任的证书。
### tls.system_trust_disabled
禁用系统 CA 证书池。
启用时,使用 `tls.certificate_authority``tls.peer_fingerprint` 建立信任。
### tls.certificate_authority
PEM 格式的附加受信任 CA 证书内容。
这些证书会添加到系统证书池。
`tls.certificate_authority_path` 冲突。
### tls.certificate_authority_path
PEM 格式的附加受信任 CA 证书路径。
这些证书会添加到系统证书池。
`tls.certificate_authority` 冲突。
### tls.client_certificate
PEM 格式的客户端证书链内容。
`tls.client_certificate_path` 冲突。
### tls.client_certificate_path
PEM 格式的客户端证书链路径。
`tls.client_certificate` 冲突。
### tls.client_key
PEM 格式的客户端私钥内容。
`tls.client_key_path` 冲突。
### tls.client_key_path
PEM 格式的客户端私钥路径。
`tls.client_key` 冲突。
客户端证书和私钥必须同时设置或同时为空。
### tls.client_key_password
加密客户端私钥的密码。
### tls.mca_certificate
PEM 格式的 AnyConnect 多证书认证(MCA)证书链内容。
`tls.mca_certificate_path` 冲突。
### tls.mca_certificate_path
PEM 格式的 AnyConnect 多证书认证(MCA)证书链路径。
`tls.mca_certificate` 冲突。
### tls.mca_key
PEM 格式的 AnyConnect 多证书认证(MCA)私钥内容。
`tls.mca_key_path` 冲突。
### tls.mca_key_path
PEM 格式的 AnyConnect 多证书认证(MCA)私钥路径。
`tls.mca_key` 冲突。
MCA 证书和私钥必须同时设置或同时为空。
### tls.mca_key_password
加密 MCA 私钥的密码。
### form_entries
认证表单字段覆盖。
设置 `submission_key` 时按该字段匹配,否则按 `form_id``name` 的组合匹配。后面的匹配项优先。
### form_entries.form_id
`form_entries.submission_key` 为空时,与 `form_entries.name` 一起使用的认证表单标识符。
### form_entries.submission_key
认证字段提交键。
`form_entries.submission_key``form_entries.form_id``form_entries.name` 的组合之一必填。
### form_entries.name
`form_entries.submission_key` 为空时,与 `form_entries.form_id` 一起使用的认证字段名称。
### form_entries.value
自动提供给匹配认证字段的值。
`form_entries.promote` 冲突。
### form_entries.promote
交互询问匹配的认证字段,而不是自动提供值。
`form_entries.value` 冲突。
## UDP NAT 字段
参阅 [UDP NAT 字段](/zh/configuration/shared/udp-nat/)。
## 拨号字段
参阅[拨号字段](/zh/configuration/shared/dial/)了解详情。
## 交互式认证
在 sing-box dashboard 或任意 sing-box 图形客户端的 `工具` > `端点` 中认证和管理 endpoint。
## DNS
推送的 DNS 设置不会安装到操作系统中。配置 [OpenConnect DNS 服务器](/zh/configuration/dns/server/openconnect/) 以通过 sing-box 使用这些设置。