Skip to content

OpenVPN — sing-box ​

sing-box 通过两个端点原生支持 OpenVPN —— 位于 endpoints[] 下的 openvpn-client 与 openvpn-server —— 另有一个 openvpn DNS 服务器,通过服务端推送给客户端的解析器进行解析。两个端点都能与标准 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_dependentUDP NAT 映射行为:同一源地址与端口对所有目标复用同一映射(默认),或按目标地址 / 地址加端口分别建立映射。
udp_filteringUDPNATBehaviorendpoint_independentendpoint_independent | address_dependent | address_and_port_dependentUDP NAT 过滤行为:接受任意远端的数据包(默认),或仅接受已发送过数据包的远端地址 / 地址加端口。
udp_nat_maxuint320 (auto)<uint32>UDP NAT 会话上限;达到上限时关闭最久未使用的会话。为 0 时:iOS 上为 4096,其他平台按总内存在 4096–16384 之间选取。

源码: option/openvpn.go:10-17 · 锚定版本 v1.14.2 (af6e64c)

客户端端点(openvpn-client) ​

位于 endpoints[] 下的 type: "openvpn-client"。除下列字段外,还接受 server / server_port(与 servers 冲突)以及拨号字段,拨号字段作用于到 OpenVPN 服务端的连接。

连接与地址 ​

字段类型默认值允许值描述
modestringtlstls | static_key会话模式。static_key 是已弃用的兼容模式,没有 TLS 控制通道与前向保密;它会忽略 tls、用户名 / 密码、拉取的选项与重协商。
networkstringudpudp | tcp | udp4 | udp6 | tcp4 | tcp6连接服务端的默认传输。适用于 server 以及未单独指定 network 的 servers 条目。
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 模式下配置了 IPv4 address 时必填。
peer_address_ipv6*badoption.Addr(unset)<IPv6>IPv6 隧道对端与 VPN 网关。static_key 模式下配置了 IPv6 address 时必填。
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>用于钳制隧道内 TCP 连接 MSS 的 OpenVPN 最大包长。为空时使用上游默认值:设置了 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 | >= 68OpenVPN 自身数据通道分片使用的最大 UDP 包长。0 表示禁用;不能与 TCP 传输同用。
replay_windowuint3264<= 65536UDP 数据通道的重放窗口大小。TCP 始终要求包 ID 严格连续。
replay_window_timebadoption.Duration15s<= 10m, whole secondsUDP 数据通道重放窗口时长。
compressionstring(disabled)none | no | lz4 | lz4-v2 | stub | stub-v2 | disabled | offOpenVPN compress 帧格式。压缩可能削弱机密性;仅需帧格式兼容时优先使用 stub / stub-v2。
compression_lzostring(disabled)none | no | yes | adaptive | asym | disabled | offOpenVPN comp-lzo 模式。仅在服务端要求时启用。
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 | autolocalOpenVPN redirect-gateway 标志:!ipv4 取消 IPv4 偏好,def1 以两个 /1 前缀表达,ipv6 同时偏好 IPv6。不支持 block-local;bypass-dhcp / bypass-dns 不适用。
redirect_privateboolfalsetrue | false接受 redirect_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禁用初始的 120s 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-prefixserver_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 时二者都会检查;没有 CA 时不验证证书链本身。
crl_pathstring(unset)<path>PEM 或 DER 格式的证书吊销列表,用于拒绝已吊销的服务端证书。
remote_certificate_kubadoption.Listable[string][][<hex mask>]OpenVPN remote-cert-ku 格式的必需密钥用法掩码;证书必须包含至少一个掩码的全部位。
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封装类型,对应 OpenVPN 的 tls-auth、tls-crypt 与 tls-crypt-v2。
keybadoption.Listable[string](unset)<key content>封装密钥内容。与 key_path 冲突。
key_pathstring(unset)<path>封装密钥路径。与 key 冲突。
directionstring(bidirectional)server | clienttls_auth 密钥方向;仅 type 为 tls_auth 时可用。为空时双向使用该密钥。

源码: option/openvpn.go:169-174 · 锚定版本 v1.14.2 (af6e64c)

服务端端点(openvpn-server) ​

位于 endpoints[] 下的 type: "openvpn-server",外加监听字段(listen、listen_port,以及用于 UDP NAT 会话的 udp_timeout)。

会话与地址 ​

字段类型默认值允许值描述
modestringtlstls | static_key会话模式。static_key 只服务单个对端,没有 TLS 与前向保密,并忽略 tls、users、push 与重协商选项。
networkstringudpudp | tcp该端点服务的传输。每个端点只服务一种网络 —— 要同时服务两种,请配置两个端点并使用不同的 address 子网。
remotestring(unset)<address>UDP static_key 服务端的固定对端地址,须与 remote_port 一同设置。TCP 服务端从接受的套接字获取对端。
remote_portuint16(unset)<port>UDP static_key 服务端的固定对端端口。
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 模式下配置了 IPv4 address 时必填。
peer_address_ipv6*badoption.Addr(unset)<IPv6>IPv6 隧道对端地址。static_key 模式下配置了 IPv6 address 时必填。
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>供无法协商加密套件的旧客户端使用(OpenVPN data-ciphers-fallback)。仅 TLS 模式。
authstringSHA1<digest name>数据通道 HMAC 摘要,与上游默认一致。只作用于非 AEAD 加密套件与 tls_auth。
mss_fixuint32(OpenVPN default)<bytes>用于钳制 TCP MSS 的最大封装包长;默认计算在默认 MTU 下使用 1492。
mss_fix_disabledboolfalsetrue | false禁用 MSS 钳制,包括默认钳制。
mss_fix_modestring(encapsulation-aware)mtu | fixed显式 mss_fix 的计算方式。要求设置 mss_fix。
replay_windowuint3264<= 65536UDP 数据通道重放窗口大小;TCP 的包 ID 始终严格连续。
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-prefixclient_name 匹配的证书字段。
peer_fingerprintbadoption.Listable[string][][<64 lowercase hex chars>]允许的客户端叶证书 SHA-256 指纹;无需客户端 CA 即可使用。
crl_pathstring(unset)<path>用于拒绝已吊销客户端证书的证书吊销列表。
remote_certificate_kubadoption.Listable[string][][<hex mask>]OpenVPN remote-cert-ku 格式的客户端必需密钥用法掩码。
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 | clienttls_auth 密钥方向:server 对应 OpenVPN key-direction 0,client 对应 1。为空时双向使用该密钥。
force_cookieboolfalsetrue | false仅 tls_crypt_v2:要求 UDP 客户端支持无状态会话 cookie。关闭时仍接受不支持 cookie 的客户端。

源码: option/openvpn.go:176-182 · 锚定版本 v1.14.2 (af6e64c)

push ​

字段类型默认值允许值描述
routesbadoption.Listable[netip.Prefix][][<CIDR>]推送给客户端的路由;可混用 IPv4 与 IPv6。
dnsbadoption.Listable[netip.Addr][][<IP>]以旧式 dhcp-option DNS / DNS6 推送的 DNS 服务器。在兼容的客户端上,推送的新式服务器组会覆盖它们。
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,在 Windows 客户端上拦截 VPN 之外的 DNS。
ping_intervalbadoption.Duration(disabled)<duration>推送给客户端的 OpenVPN ping 间隔。须为整秒。
ping_restartbadoption.Duration(disabled)<duration>推送给客户端的 OpenVPN ping-restart 超时。须为整秒。

源码: option/openvpn.go:184-195 · 锚定版本 v1.14.2 (af6e64c)

DNS 服务器(openvpn) ​

位于 dns.servers[] 下的 type: "openvpn":

字段类型默认值允许值描述
endpointstring(required)<openvpn-client tag>openvpn-client 端点的 tag,使用其收到的推送解析器。查询经该端点发送。
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 服务端的连接;该控制连接从不走端点自身的路由,因此 redirect-gateway 的 local / autolocal 标志无需路由例外。
  • static_key 模式仅用于兼容无法升级的对端 —— 它没有 TLS 控制通道,也没有前向保密。优先使用 tls。
  • 交互式鉴权(挑战 / 应答、auth_retry: "interact")通过 sing-box 图形客户端或 Dashboard 的「Tools › Endpoints」完成。
  • 服务端推送的 DNS 选项从不写入操作系统。请用 openvpn DNS 服务器来使用它们:只有 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 服务端。mihomo 的 auth 默认为 SHA256,而 sing-box 沿用上游 OpenVPN 的 SHA1 —— 混用实现时请在两端显式设置 auth。参见 OpenVPN — mihomo。
  • Xray-core 不支持 OpenVPN。

源码: option/openvpn.go:10-210 · v1.14.2 (af6e64c)

由 Argsment 出品的 Core Tutorial