613 lines
15 KiB
Markdown
613 lines
15 KiB
Markdown
# OpenVPN 服务器
|
||
|
||
!!! question "自 sing-box 1.14.0 起"
|
||
|
||
## 结构
|
||
|
||
```json
|
||
{
|
||
"type": "openvpn-server",
|
||
"tag": "ovpn-server",
|
||
|
||
... // 监听字段
|
||
|
||
"system": false,
|
||
"name": "",
|
||
"mtu": 1500,
|
||
"mode": "tls",
|
||
"network": "udp",
|
||
"remote": "",
|
||
"remote_port": 0,
|
||
"max_clients": 1024,
|
||
"address": [],
|
||
"peer_address": "",
|
||
"peer_address_ipv6": "",
|
||
"topology": "subnet",
|
||
"duplicate_cn": false,
|
||
"users": [
|
||
{
|
||
"username": "",
|
||
"password": ""
|
||
}
|
||
],
|
||
"static_key": [],
|
||
"static_key_path": "",
|
||
"key_direction": "",
|
||
"tls": {
|
||
"certificate": [],
|
||
"certificate_path": "",
|
||
"key": [],
|
||
"key_path": "",
|
||
"client_certificate": [],
|
||
"client_certificate_path": "",
|
||
"verify_client_certificate": "require",
|
||
"client_name": "",
|
||
"client_name_type": "name",
|
||
"peer_fingerprint": [],
|
||
"crl_path": "",
|
||
"remote_certificate_ku": [],
|
||
"remote_certificate_eku": "",
|
||
"remote_certificate_tls": "",
|
||
"certificate_profile": "",
|
||
"ns_certificate_type": "",
|
||
"version_min": "1.2",
|
||
"version_max": "",
|
||
"cipher": "",
|
||
"groups": "",
|
||
"control_wrap": {
|
||
"type": "tls_crypt",
|
||
"key": [],
|
||
"key_path": "",
|
||
"direction": "",
|
||
"force_cookie": false
|
||
}
|
||
},
|
||
"cipher": "",
|
||
"data_ciphers": [],
|
||
"data_ciphers_fallback": "",
|
||
"auth": "",
|
||
"mss_fix": 0,
|
||
"mss_fix_disabled": false,
|
||
"mss_fix_mode": "",
|
||
"replay_window": 0,
|
||
"replay_window_time": "",
|
||
"push": {
|
||
"routes": [],
|
||
"dns": [],
|
||
"dns_servers": [],
|
||
"search_domains": [],
|
||
"dhcp_options": [],
|
||
"redirect_gateway": false,
|
||
"redirect_gateway_flags": [],
|
||
"block_outside_dns": false,
|
||
"ping_interval": "",
|
||
"ping_restart": ""
|
||
},
|
||
"ping_interval": "",
|
||
"ping_restart": "",
|
||
"renegotiate_interval": "",
|
||
"renegotiate_disabled": false,
|
||
"renegotiate_bytes": 0,
|
||
"renegotiate_packets": 0,
|
||
"handshake_window": "1m",
|
||
|
||
... // UDP NAT 字段
|
||
}
|
||
```
|
||
|
||
!!! note ""
|
||
|
||
当内容只有一项时,可以忽略 JSON 数组 [] 标签
|
||
|
||
## 监听字段
|
||
|
||
参阅 [监听字段](/zh/configuration/shared/listen/)。`udp_timeout` 属于下方的 [UDP NAT 字段](#udp-nat-字段)。
|
||
|
||
## 字段
|
||
|
||
### system
|
||
|
||
使用系统接口。
|
||
|
||
需要特权且不能与已有系统接口冲突。
|
||
|
||
endpoint 会配置接口地址和 MTU,但不会安装操作系统路由或 DNS 设置。
|
||
|
||
如果禁用,sing-box 将使用内部网络栈。
|
||
|
||
### name
|
||
|
||
系统接口的自定义接口名称。
|
||
|
||
默认使用自动生成的 `ovpn` 接口名称。
|
||
|
||
### mtu
|
||
|
||
OpenVPN 接口 MTU。
|
||
|
||
默认使用 `1500`。
|
||
|
||
### mode
|
||
|
||
OpenVPN 会话模式,`tls` 或 `static_key` 之一。
|
||
|
||
默认使用 `tls`。
|
||
|
||
`static_key` 在没有 TLS 控制信道和前向保密的情况下服务一个对端,仅作为不可变部署的显式兼容选项保留。该模式不使用 `tls`、`users`、推送选项或 TLS 重协商选项。
|
||
|
||
### network
|
||
|
||
OpenVPN 传输网络,`udp` 或 `tcp` 之一。
|
||
|
||
默认使用 `udp`。
|
||
|
||
每个端点仅服务一种传输网络;如需同时服务 TCP 与 UDP,
|
||
需要配置两个端点并使用互不重叠的 `address` 子网,
|
||
与上游 OpenVPN 需要两个服务进程一致。
|
||
|
||
### remote
|
||
|
||
UDP `static_key` 服务器的固定远端地址。
|
||
|
||
在 UDP `static_key` 模式下与 `remote_port` 一起必填。TCP 服务器从监听套接字接受单个对端,不使用此字段。
|
||
|
||
### remote_port
|
||
|
||
UDP `static_key` 服务器的固定远端端口。
|
||
|
||
在 UDP `static_key` 模式下与 `remote` 一起必填。
|
||
|
||
### max_clients
|
||
|
||
已建立与握手中的 TLS 客户端会话的最大数量。
|
||
|
||
默认使用 `1024`。该值必须小于 OpenVPN peer-id 空间的大小 `16777216`。
|
||
|
||
`static_key` 模式仅支持一个对端,因此此值必须为 `0` 或 `1`。
|
||
|
||
### address
|
||
|
||
==必填==
|
||
|
||
OpenVPN 服务器地址前缀列表。
|
||
|
||
最多支持一个 IPv4 前缀和一个 IPv6 前缀。
|
||
|
||
前缀地址被分配给服务器接口。掩码后的前缀用作客户端地址池和路由。
|
||
|
||
第一个 IPv4 和 IPv6 前缀地址用作端点的本地地址。
|
||
|
||
在 `static_key` 模式下,这些地址是本地隧道前缀,而不是地址池。
|
||
|
||
### peer_address
|
||
|
||
IPv4 隧道对端地址。
|
||
|
||
在 `static_key` 模式下配置 IPv4 `address` 时必填。
|
||
|
||
### peer_address_ipv6
|
||
|
||
IPv6 隧道对端地址。
|
||
|
||
在 `static_key` 模式下配置 IPv6 `address` 时必填。
|
||
|
||
### topology
|
||
|
||
推送给客户端的 OpenVPN topology,`subnet`、`p2p` 或 `net30` 之一。
|
||
|
||
TLS 模式默认使用 `subnet`,`static_key` 模式默认使用 `p2p`。
|
||
|
||
### duplicate_cn
|
||
|
||
允许具有相同认证证书 common name 或用户名的多个客户端同时在线。
|
||
|
||
禁用时,新认证的会话会替换具有相同身份的现有会话,并在可用时复用其 tunnel 地址。
|
||
|
||
默认禁用。
|
||
|
||
仅在 TLS 模式下可用。
|
||
|
||
### users
|
||
|
||
OpenVPN 用户名/密码用户列表。
|
||
|
||
如果设置,客户端除了通过 `tls.verify_client_certificate` 配置的证书策略外,还必须通过用户名/密码认证。
|
||
|
||
仅在 TLS 模式下可用。
|
||
|
||
### users.username
|
||
|
||
用户名。
|
||
|
||
### users.password
|
||
|
||
密码。
|
||
|
||
### static_key
|
||
|
||
OpenVPN 静态密钥内容。
|
||
|
||
在 `static_key` 模式下必填。
|
||
|
||
与 `static_key_path` 冲突。
|
||
|
||
### static_key_path
|
||
|
||
OpenVPN 静态密钥路径。
|
||
|
||
在 `static_key` 模式下未设置 `static_key` 时必填。
|
||
|
||
与 `static_key` 冲突。
|
||
|
||
### key_direction
|
||
|
||
静态密钥方向,`server` 或 `client` 之一。
|
||
|
||
为空时双向使用密钥。按照惯例,服务器使用 `server`,对端使用 `client`。
|
||
|
||
仅在 `static_key` 模式下可用。
|
||
|
||
### tls
|
||
|
||
在 TLS 模式下必填。
|
||
|
||
OpenVPN 控制信道 TLS 配置。
|
||
|
||
### tls.certificate
|
||
|
||
TLS 服务器证书内容。
|
||
|
||
`tls.certificate` 或 `tls.certificate_path` 必填其一。
|
||
|
||
与 `tls.certificate_path` 冲突。
|
||
|
||
### tls.certificate_path
|
||
|
||
TLS 服务器证书路径。
|
||
|
||
`tls.certificate` 或 `tls.certificate_path` 必填其一。
|
||
|
||
与 `tls.certificate` 冲突。
|
||
|
||
### tls.key
|
||
|
||
TLS 服务器私钥内容。
|
||
|
||
`tls.key` 或 `tls.key_path` 必填其一。
|
||
|
||
与 `tls.key_path` 冲突。
|
||
|
||
### tls.key_path
|
||
|
||
TLS 服务器私钥路径。
|
||
|
||
`tls.key` 或 `tls.key_path` 必填其一。
|
||
|
||
与 `tls.key` 冲突。
|
||
|
||
### tls.client_certificate
|
||
|
||
TLS CA 证书内容,用于验证客户端证书。
|
||
|
||
当 `tls.verify_client_certificate` 为 `require` 或 `optional` 时,`tls.client_certificate`、`tls.client_certificate_path` 或 `tls.peer_fingerprint` 必填其一。
|
||
|
||
与 `tls.client_certificate_path` 冲突。
|
||
|
||
### tls.client_certificate_path
|
||
|
||
TLS CA 证书路径,用于验证客户端证书。
|
||
|
||
当 `tls.verify_client_certificate` 为 `require` 或 `optional` 时,`tls.client_certificate`、`tls.client_certificate_path` 或 `tls.peer_fingerprint` 必填其一。
|
||
|
||
与 `tls.client_certificate` 冲突。
|
||
|
||
### tls.verify_client_certificate
|
||
|
||
OpenVPN 客户端证书策略,`require`、`optional` 或 `none` 之一。
|
||
|
||
默认使用 `require`。
|
||
|
||
设为 `optional` 时,客户端提供证书则验证,不提供证书的客户端也被允许。
|
||
|
||
设为 `none` 时,不请求客户端证书。
|
||
|
||
该字段不替代 `users`;设置 `users` 后仍然要求用户名/密码认证。
|
||
|
||
### tls.client_name
|
||
|
||
期望的客户端证书名称。为空时禁用。
|
||
|
||
### tls.client_name_type
|
||
|
||
`tls.client_name` 匹配的证书字段,`subject`、`name` 或 `name-prefix` 之一。
|
||
|
||
配置 `tls.client_name` 时默认使用 `name`。
|
||
|
||
### tls.peer_fingerprint
|
||
|
||
允许的客户端叶证书 SHA-256 指纹。可以在没有客户端 CA 时仅使用指纹验证。
|
||
|
||
### tls.crl_path
|
||
|
||
用于拒绝已吊销客户端证书的证书吊销列表路径。
|
||
|
||
### tls.remote_certificate_ku
|
||
|
||
OpenVPN `remote-cert-ku` 格式的客户端证书 Key Usage mask。
|
||
|
||
### tls.remote_certificate_eku
|
||
|
||
客户端证书所需的 Extended Key Usage。与显式配置的 `tls.remote_certificate_tls` 冲突。
|
||
|
||
### tls.remote_certificate_tls
|
||
|
||
客户端证书用途检查,`server`、`client` 或 `none` 之一。默认使用 `client`。
|
||
|
||
### tls.certificate_profile
|
||
|
||
证书 profile,可选值为 `insecure`、`legacy`、`preferred` 或 `suiteb`。
|
||
|
||
默认使用 `legacy`。
|
||
|
||
`insecure` 为兼容不可变对端而接受使用 MD5 或 SHA-1 签名的证书链和较小的旧密钥,仅应在对端无法升级时使用。`legacy` 接受 SHA-1 但拒绝 MD5 签名;`preferred` 要求更强的签名和密钥。
|
||
|
||
选择 `suiteb` 且 `tls.cipher` 为空时,TLS 1.2 cipher 列表默认使用 Suite B ECDHE-ECDSA AES-GCM 套件。该 profile 不限制显式配置的 `tls.cipher` 和 `tls.groups`。
|
||
|
||
### tls.ns_certificate_type
|
||
|
||
已弃用的 Netscape 证书类型检查,`server` 或 `client` 之一。
|
||
|
||
### tls.version_min
|
||
|
||
最低 TLS 版本。默认使用 `1.2`。
|
||
|
||
### tls.version_max
|
||
|
||
最高 TLS 版本。默认使用支持的最高版本。
|
||
|
||
### tls.cipher
|
||
|
||
TLS 1.2 及更低版本允许的 OpenSSL cipher suite 名称,以冒号分隔。
|
||
|
||
为空时使用默认 TLS cipher suite。该字段不控制 TLS 1.3 cipher suite。
|
||
|
||
### tls.groups
|
||
|
||
按偏好顺序排列的 TLS key exchange group,以冒号分隔。
|
||
|
||
### tls.control_wrap
|
||
|
||
OpenVPN 控制信道包装。
|
||
|
||
等价于 OpenVPN `tls-auth`、`tls-crypt` 和 `tls-crypt-v2`。
|
||
|
||
默认禁用。
|
||
|
||
### tls.control_wrap.type
|
||
|
||
==必填==
|
||
|
||
控制信道包装类型,`tls_auth`、`tls_crypt` 或 `tls_crypt_v2` 之一。
|
||
|
||
对于 `tls_crypt_v2`,密钥为服务器密钥。
|
||
|
||
### tls.control_wrap.key
|
||
|
||
控制信道包装密钥内容。
|
||
|
||
`tls.control_wrap.key` 或 `tls.control_wrap.key_path` 必填其一。
|
||
|
||
与 `tls.control_wrap.key_path` 冲突。
|
||
|
||
### tls.control_wrap.key_path
|
||
|
||
控制信道包装密钥路径。
|
||
|
||
`tls.control_wrap.key` 或 `tls.control_wrap.key_path` 必填其一。
|
||
|
||
与 `tls.control_wrap.key` 冲突。
|
||
|
||
### tls.control_wrap.direction
|
||
|
||
OpenVPN `tls-auth` 密钥方向,`server` 或 `client` 之一。
|
||
|
||
仅当 `tls.control_wrap.type` 为 `tls_auth` 时可用。
|
||
|
||
`server` 对应 OpenVPN 密钥方向 `0`,`client` 对应 `1`;按照惯例服务器使用 `0`,客户端使用 `1`。
|
||
|
||
如果为空,密钥被双向使用,与两端均省略 `key-direction` 的行为一致。
|
||
|
||
### tls.control_wrap.force_cookie
|
||
|
||
要求 UDP 上的 `tls-crypt-v2` 客户端支持无状态 session cookie。
|
||
|
||
仅当 `tls.control_wrap.type` 为 `tls_crypt_v2` 时可用。禁用时,不支持 cookie 的客户端会按照上游 `allow-noncookie` 行为被接受。
|
||
|
||
默认禁用。
|
||
|
||
### cipher
|
||
|
||
`static_key` 模式使用的数据信道加密方式。
|
||
|
||
为空时使用上游静态密钥模式的默认值 `BF-CBC`。支持 AES-CBC、ARIA-CBC、Camellia-CBC、DES-CBC、Blowfish-CBC、CAST5-CBC 系列,以及 `SEED-CBC`、`SM4-CBC` 和 `NONE`。
|
||
|
||
仅在 `static_key` 模式下可用。`NONE` 不提供机密性。
|
||
|
||
### data_ciphers
|
||
|
||
允许的 OpenVPN 数据信道加密方式。
|
||
|
||
默认使用 `AES-256-GCM`、`AES-128-GCM` 和 `CHACHA20-POLY1305`。
|
||
|
||
AES-GCM 系列还包括 `AES-192-GCM`。保留的 cipher 包括 AES、ARIA、Camellia、DES、Blowfish、CAST5、SEED 和 SM4 的 CBC、CFB、OFB 形式,以及 `NONE`。CFB 和 OFB 仅可用于 TLS 模式。旧 cipher 只能提供较弱的机密性或完全不加密,因此默认不启用。
|
||
|
||
仅在 TLS 模式下可用。
|
||
|
||
### data_ciphers_fallback
|
||
|
||
用于不支持加密方式协商的遗留客户端的 OpenVPN 数据信道加密方式。
|
||
|
||
等价于 OpenVPN `data-ciphers-fallback`。
|
||
|
||
默认禁用。
|
||
|
||
仅在 TLS 模式下可用。
|
||
|
||
### auth
|
||
|
||
OpenVPN 数据信道认证摘要。
|
||
|
||
默认使用 `SHA1`,与上游默认值一致;仅对非 AEAD 数据信道加密方式和 `tls_auth` 生效。
|
||
|
||
为兼容既有客户端,显式配置时仍可使用 `MD5` 和 `RIPEMD160` 等旧摘要。
|
||
|
||
### mss_fix
|
||
|
||
用于限制 TCP MSS 的最大封装数据包大小。默认 MTU 下使用上游默认值 `1492` 计算。
|
||
|
||
### mss_fix_disabled
|
||
|
||
禁用 MSS 限制,包括默认限制。
|
||
|
||
### mss_fix_mode
|
||
|
||
显式 `mss_fix` 的计算模式,`mtu` 或 `fixed` 之一。需要 `mss_fix`。
|
||
|
||
### replay_window
|
||
|
||
UDP 数据通道重放窗口大小。默认使用 `64`;TCP 数据包 ID 始终严格连续。
|
||
|
||
### replay_window_time
|
||
|
||
UDP 重放窗口时长。默认使用 `15s`。该值必须使用整秒。
|
||
|
||
### push
|
||
|
||
推送给客户端的选项。
|
||
|
||
### push.routes
|
||
|
||
推送给客户端的路由。
|
||
|
||
IPv4 和 IPv6 前缀可以混用。
|
||
|
||
### push.dns
|
||
|
||
推送给客户端的 DNS 服务器地址。
|
||
|
||
使用传统的 `dhcp-option DNS`/`DNS6`。兼容客户端收到现代 DNS 服务器组时会覆盖这些地址。
|
||
|
||
### push.dns_servers
|
||
|
||
推送的现代 OpenVPN DNS 服务器组。每项包含 `priority`、`addresses`,以及可选的 `resolve_domains`、`dnssec`、`transport` 和 `sni`。
|
||
|
||
地址接受 IP 或 `IP:port`(带端口的 IPv6 使用 `[IPv6]:port`)。`transport` 为 `plain`、`dot` 或 `doh` 之一;`dnssec` 为 `yes`、`optional` 或 `no` 之一。OpenVPN 客户端仅应用优先级数字最低的服务器组。
|
||
|
||
### push.search_domains
|
||
|
||
推送的现代 OpenVPN 搜索域。
|
||
|
||
### push.dhcp_options
|
||
|
||
推送的额外传统 `dhcp-option` 值,不包含 `dhcp-option` 前缀。
|
||
|
||
### push.redirect_gateway
|
||
|
||
向客户端推送 `redirect-gateway`,根据 `push.redirect_gateway_flags` 通过 VPN 路由客户端流量。
|
||
|
||
当 `push.redirect_gateway_flags` 为空时,默认使用 `def1`。
|
||
|
||
### push.redirect_gateway_flags
|
||
|
||
向客户端推送的 OpenVPN `redirect-gateway` flag。
|
||
|
||
仅当启用 `push.redirect_gateway` 时可用。
|
||
|
||
默认使用 `def1`。
|
||
|
||
### push.block_outside_dns
|
||
|
||
向客户端推送 `block-outside-dns`,在 Windows 客户端上阻止 VPN 之外的 DNS 查询。
|
||
|
||
### push.ping_interval
|
||
|
||
推送给客户端的 OpenVPN `ping` 间隔。
|
||
|
||
在该间隔内未发送任何 packet 后,客户端会向服务器发送一个 data channel ping。
|
||
|
||
该值必须使用整秒。
|
||
|
||
默认禁用。
|
||
|
||
### push.ping_restart
|
||
|
||
推送给客户端的 OpenVPN `ping-restart` 超时。
|
||
|
||
在该超时时间内未收到任何 packet 后,客户端会重新连接服务器。
|
||
|
||
该值必须使用整秒。
|
||
|
||
默认禁用。
|
||
|
||
### ping_interval
|
||
|
||
服务器未向客户端发送任何 packet 时,发送 data channel ping 的间隔。
|
||
|
||
该值应用于服务器。使用 `push.ping_interval` 配置客户端。
|
||
|
||
该值必须使用整秒。
|
||
|
||
默认禁用。
|
||
|
||
### ping_restart
|
||
|
||
服务器未收到任何 packet 后关闭客户端会话的时间。
|
||
|
||
该值应用于服务器。使用 `push.ping_restart` 配置客户端。
|
||
|
||
服务器超时应长于客户端超时,以便客户端在服务器丢弃其会话前重新连接。
|
||
|
||
该值必须使用整秒。
|
||
|
||
默认禁用。
|
||
|
||
### renegotiate_interval
|
||
|
||
OpenVPN TLS 重协商间隔。
|
||
|
||
为空时使用 OpenVPN 默认值 `1h`。
|
||
|
||
仅在 TLS 模式下可用。
|
||
|
||
### renegotiate_disabled
|
||
|
||
禁用基于时间的 TLS 重协商,包括默认间隔。
|
||
|
||
仅在 TLS 模式下可用。
|
||
|
||
### renegotiate_bytes
|
||
|
||
传输指定字节数后重新协商数据通道密钥。`0` 使用与密码算法相关的 OpenVPN 默认值。
|
||
|
||
仅在 TLS 模式下可用。
|
||
|
||
### renegotiate_packets
|
||
|
||
传输指定数据包数后重新协商数据通道密钥。`0` 使用与密码算法相关的 OpenVPN 默认值。
|
||
|
||
仅在 TLS 模式下可用。
|
||
|
||
### handshake_window
|
||
|
||
初始 TLS 握手和每次 TLS 重协商允许使用的最长时间。
|
||
|
||
默认使用 `1m`。
|
||
|
||
仅在 TLS 模式下可用。
|
||
|
||
## UDP NAT 字段
|
||
|
||
这些字段配置通过 OpenVPN 接口的流量的 UDP 会话。
|
||
|
||
参阅 [UDP NAT 字段](/zh/configuration/shared/udp-nat/)。
|