Skip to content

OpenVPN — mihomo

mihomo 可以将 OpenVPN 服务器作为出站拨号,运行一个用户态客户端,建立一个 tun 风格的栈设备,并将匹配的流量经加密隧道路由。控制通道通过证书(ca / cert / key)、可选的 tls-crypt,以及/或 auth-user-pass 凭据进行认证;数据通道使用协商出的 cipher 加密。

出站

位于 proxies: 下、type: openvpn 的条目。内嵌 BasicOption(通用出站字段)。

字段类型默认值允许值描述
namestring(required)<string>唯一的代理名称。
serverstring(required)<host>OpenVPN 服务器主机/IP。
portint(required)<port>服务器端口。
protostringudpudp | tcpOpenVPN 隧道的传输层协议。
devstringtuntun虚拟设备类型(例如 `tun`)。
cipherstringAES-128-GCMAES-128-GCM | AES-192-GCM | AES-256-GCM | AES-128-CBC | AES-192-CBC | AES-256-CBC | CHACHA20-POLY1305`data-ciphers` 未设置时使用的数据通道加密套件。
data-ciphers[]string(unset)[<cipher>]供协商的数据通道加密套件列表(OpenVPN `--data-ciphers`)。协商结果取服务器推送条目中第一个同时出现在此列表里的加密套件;未设置时使用单一 `cipher` 值。
data-ciphers-fallbackstring(unset)<cipher>服务器不支持加密协商时使用的加密套件(OpenVPN `--data-ciphers-fallback`)。
authstringSHA256MD5 | SHA1 | SHA256 | SHA384 | SHA512控制通道的 HMAC 摘要算法,例如 `SHA256`。
comp-lzostring(unset)yes | no | adaptiveLZO 压缩设置。
castring(required)<inline PEM>CA 证书(内联 PEM 块)。
certstring(unset)<inline PEM>客户端证书(内联 PEM 块)。
keystring(unset)<inline PEM>客户端私钥(内联 PEM 块)。
tls-authstring(unset)<inline static key>内联的 `OpenVPN Static key V1` 块,为控制通道提供 tls-auth HMAC 保护。与 `tls-crypt`、`tls-crypt-v2` 互斥。
key-directionstring(bidirectional)0 | 1`tls-auth` 的密钥方向。`0` / `1` 选择方向密钥槽;未设置时两个方向使用同一把密钥。
tls-cryptstring(unset)<inline static key>用于控制通道加密/认证的 tls-crypt 静态密钥。
tls-crypt-v2string(unset)<inline PEM client key>内联 PEM 编码的 tls-crypt-v2 客户端密钥。与 `tls-auth`、`tls-crypt` 互斥。
usernamestring(unset)<string>auth-user-pass 用户名。
passwordstring(unset)<string>auth-user-pass 密码。
peer-infomap[string]string{}{<key>: <value>}附加的 peer-info 键值对(如 `IV_HWADDR`、`UV_*`),追加在密钥交换期间发送的内置 `IV_*` 条目之后。
pingint(unset)<seconds>保活 ping 间隔(秒)。
ping-restartint(unset)<seconds>在如此多秒数内未收到 ping 后重启隧道(秒)。
handshake-timeoutint0 (no limit)<seconds>OpenVPN 握手超过该秒数时中止隧道建立。0 表示禁用超时。
mtuint1500<integer>隧道 MTU。
udpboolfalsetrue | false允许 UDP 流量通过代理。
remote-dns-resolveboolfalsetrue | false使用隧道的 DNS 解析目标名称。
dns[]string[][<server>]用于隧道的 DNS 服务器。

源码: adapter/outbound/openvpn.go:42-72 · 锚定版本 v1.19.29 (e26714a)

示例

出站——证书认证:

yaml
proxies:
  - name: ovpn-cert
    type: openvpn
    server: vpn.example.com
    port: 1194
    proto: udp
    cipher: AES-256-GCM
    auth: SHA256
    ca: |
      -----BEGIN CERTIFICATE-----
      <ca-certificate>
      -----END CERTIFICATE-----
    cert: |
      -----BEGIN CERTIFICATE-----
      <client-certificate>
      -----END CERTIFICATE-----
    key: |
      -----BEGIN PRIVATE KEY-----
      <client-private-key>
      -----END PRIVATE KEY-----
    udp: true

出站——带保活的用户名/密码认证:

yaml
proxies:
  - name: ovpn-userpass
    type: openvpn
    server: vpn.example.com
    port: 1194
    proto: tcp
    ca: |
      -----BEGIN CERTIFICATE-----
      <ca-certificate>
      -----END CERTIFICATE-----
    username: <username>
    password: <password>
    ping: 10
    ping-restart: 60
    udp: true

说明

  • proto 选择链路传输:udp(默认)或 tcp
  • 数据通道加密的选择遵循 OpenVPN 2.5+ 语义:data-ciphers 是协商报价(以 IV_CIPHERS 发送),协商结果取服务器推送条目中第一个同时出现在该列表里的加密套件。data-ciphers-fallback 面向无法协商的服务器。data-ciphers 未设置时使用单一 cipher 值(默认 AES-128-GCM)。
  • ca 是必需的。cert + key 提供证书认证;username + password 提供 auth-user-pass 认证。当服务器同时要求两者时可以组合使用。所有密钥材料都以 内联 形式给出(YAML 块标量)—— 不会读取文件路径。
  • 三个控制通道包装器互斥:tls-auth(对控制通道做 HMAC 认证;可配合 key-direction: 0|1 使用方向密钥)、tls-crypt(用共享静态密钥加密并认证控制通道)与 tls-crypt-v2(按客户端包装的密钥,以内联 PEM 客户端密钥形式提供)。
  • peer-info 在客户端密钥交换期间发送的内置 IV_VER / IV_PROTO / IV_CIPHERS 条目之后追加自定义键值对(如 IV_HWADDRUV_*)。
  • handshake-timeout 限制隧道建立可花费的时长;0(默认)表示无限等待。
  • ping 按给定间隔发送保活;ping-restart 在如此多秒内未收到数据包后拆除隧道,以便重新建立。两者均以秒表示。
  • mtu 设置隧道 MTU,默认为 1500
  • remote-dns-resolve 使用 dns 中列出的服务器,将目标名称查找经隧道路由;除非 dns 非空,否则不生效。

跨内核说明

  • 在这三个内核中,OpenVPN 是 mihomo 特有的。Xray-core 与 sing-box 均未提供 OpenVPN 出站——若要用这些内核桥接 OpenVPN 端点,你需要运行一个独立的 OpenVPN 客户端,并将 socks/http 或 TUN 入站指向它。

源码: adapter/outbound/openvpn.go:42-72 · v1.19.29 (e26714a)

由 Argsment 出品的 Core Tutorial