跳转至

OpenVPN 服务器

自 sing-box 1.14.0 起

构建标签

OpenVPN 端点需要 with_openvpn 构建标签。

禁用 system 时,内部网络栈还需要 with_gvisor 构建标签。

结构

{
  "type": "openvpn-server",
  "tag": "ovpn-server",

  ... // 监听字段

  "system": false,
  "name": "",
  "mtu": 1500,
  "network": "udp",
  "max_clients": 1024,
  "address": [],
  "topology": "subnet",
  "users": [
    {
      "username": "",
      "password": ""
    }
  ],
  "tls": {
    "certificate": [],
    "certificate_path": "",
    "key": [],
    "key_path": "",
    "client_certificate": [],
    "client_certificate_path": "",
    "verify_client_certificate": "require",
    "control_wrap": {
      "type": "tls_crypt",
      "key": [],
      "key_path": "",
      "direction": ""
    }
  },
  "data_ciphers": [],
  "data_ciphers_fallback": "",
  "auth": "",
  "push": {
    "routes": [],
    "dns": [],
    "redirect_gateway": false,
    "redirect_gateway_flags": [],
    "block_outside_dns": false
  },
  "keepalive_interval": "",
  "keepalive_timeout": "",
  "renegotiate_interval": "",
  "udp_timeout": ""
}

当内容只有一项时,可以忽略 JSON 数组 [] 标签

监听字段

参阅 监听字段

字段

system

使用系统接口。

需要特权且不能与已有系统接口冲突。

如果禁用,sing-box 将使用内部网络栈。

禁用时需要 with_gvisor 构建标签。

name

系统接口的自定义接口名称。

默认使用自动生成的 ovpn 接口名称。

mtu

OpenVPN 接口 MTU。

默认使用 1500

network

OpenVPN 传输网络,udptcp 之一。

默认使用 udp

每个端点仅服务一种传输网络;如需同时服务 TCP 与 UDP, 需要配置两个端点并使用互不重叠的 address 子网, 与上游 OpenVPN 需要两个服务进程一致。

max_clients

已建立与握手中的 TLS 客户端会话的最大数量。

默认使用 1024。该值必须小于 OpenVPN peer-id 空间的大小 16777216

address

必填

OpenVPN 服务器地址前缀列表。

最多支持一个 IPv4 前缀和一个 IPv6 前缀。

前缀地址被分配给服务器接口。掩码后的前缀用作客户端地址池和路由。

第一个 IPv4 和 IPv6 前缀地址用作端点的本地地址。

topology

推送给客户端的 OpenVPN topology,subnetp2pnet30 之一。

默认使用 subnet

users

OpenVPN 用户名/密码用户列表。

如果设置,客户端除了通过 tls.verify_client_certificate 配置的证书策略外,还必须通过用户名/密码认证。

users.username

用户名。

users.password

密码。

tls

必填

OpenVPN 控制信道 TLS 配置。

tls.certificate

TLS 服务器证书内容。

tls.certificatetls.certificate_path 必填其一。

tls.certificate_path 冲突。

tls.certificate_path

TLS 服务器证书路径。

tls.certificatetls.certificate_path 必填其一。

tls.certificate 冲突。

tls.key

TLS 服务器私钥内容。

tls.keytls.key_path 必填其一。

tls.key_path 冲突。

tls.key_path

TLS 服务器私钥路径。

tls.keytls.key_path 必填其一。

tls.key 冲突。

tls.client_certificate

TLS CA 证书内容,用于验证客户端证书。

tls.client_certificatetls.client_certificate_path 必填其一。

tls.client_certificate_path 冲突。

tls.client_certificate_path

TLS CA 证书路径,用于验证客户端证书。

tls.client_certificatetls.client_certificate_path 必填其一。

tls.client_certificate 冲突。

tls.verify_client_certificate

OpenVPN 客户端证书策略,requireoptionalnone 之一。

默认使用 require

设为 optional 时,客户端提供证书则验证,不提供证书的客户端也被允许。

设为 none 时,不请求客户端证书。

该字段不替代 users;设置 users 后仍然要求用户名/密码认证。

tls.control_wrap

OpenVPN 控制信道包装。

等价于 OpenVPN tls-authtls-crypttls-crypt-v2

默认禁用。

tls.control_wrap.type

必填

控制信道包装类型,tls_authtls_crypttls_crypt_v2 之一。

对于 tls_crypt_v2,密钥为服务器密钥。

tls.control_wrap.key

控制信道包装密钥内容。

tls.control_wrap.keytls.control_wrap.key_path 必填其一。

tls.control_wrap.key_path 冲突。

tls.control_wrap.key_path

控制信道包装密钥路径。

tls.control_wrap.keytls.control_wrap.key_path 必填其一。

tls.control_wrap.key 冲突。

tls.control_wrap.direction

OpenVPN tls-auth 密钥方向,serverclient 之一。

仅当 tls.control_wrap.typetls_auth 时可用。

server 对应 OpenVPN 密钥方向 0client 对应 1;按照惯例服务器使用 0,客户端使用 1

如果为空,密钥被双向使用,与两端均省略 key-direction 的行为一致。

data_ciphers

允许的 OpenVPN 数据信道加密方式。

默认使用 AES-256-GCMAES-128-GCMCHACHA20-POLY1305

data_ciphers_fallback

用于不支持加密方式协商的遗留客户端的 OpenVPN 数据信道加密方式。

等价于 OpenVPN data-ciphers-fallback

默认禁用。

auth

OpenVPN 数据信道认证摘要。

默认使用 SHA1,与上游默认值一致;仅对非 AEAD 数据信道加密方式和 tls_auth 生效。

push

推送给客户端的选项。

push.routes

推送给客户端的路由。

IPv4 和 IPv6 前缀可以混用。

push.dns

推送给客户端的 DNS 服务器地址。

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 查询。

keepalive_interval

推送给客户端的 OpenVPN keepalive ping 间隔。

默认禁用。

keepalive_timeout

推送给客户端的 OpenVPN keepalive ping 超时。

默认禁用。

renegotiate_interval

OpenVPN TLS 重协商间隔。

如果为空或设为 0s,使用 OpenVPN 默认值 1h

udp_timeout

通过 OpenVPN 接口的流量的 UDP NAT 过期时间。

默认使用 5m