OpenVPN — mihomo
mihomo 可以将 OpenVPN 服务器作为出站拨号,运行一个用户态客户端,建立一个 tun 风格的栈设备,并将匹配的流量经加密隧道路由。控制通道通过证书(ca / cert / key)、可选的 tls-crypt,以及/或 auth-user-pass 凭据进行认证;数据通道使用协商出的 cipher 加密。
出站
位于 proxies: 下、type: openvpn 的条目。内嵌 BasicOption(通用出站字段)。
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
name | string | (required) | <string> | 唯一的代理名称。 |
server | string | (required) | <host> | OpenVPN 服务器主机/IP。 |
port | int | (required) | <port> | 服务器端口。 |
proto | string | udp | udp | tcp | OpenVPN 隧道的传输层协议。 |
dev | string | tun | tun | 虚拟设备类型(例如 `tun`)。 |
cipher | string | AES-128-GCM | AES-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-fallback | string | (unset) | <cipher> | 服务器不支持加密协商时使用的加密套件(OpenVPN `--data-ciphers-fallback`)。 |
auth | string | SHA256 | MD5 | SHA1 | SHA256 | SHA384 | SHA512 | 控制通道的 HMAC 摘要算法,例如 `SHA256`。 |
comp-lzo | string | (unset) | yes | no | adaptive | LZO 压缩设置。 |
ca | string | (required) | <inline PEM> | CA 证书(内联 PEM 块)。 |
cert | string | (unset) | <inline PEM> | 客户端证书(内联 PEM 块)。 |
key | string | (unset) | <inline PEM> | 客户端私钥(内联 PEM 块)。 |
tls-auth | string | (unset) | <inline static key> | 内联的 `OpenVPN Static key V1` 块,为控制通道提供 tls-auth HMAC 保护。与 `tls-crypt`、`tls-crypt-v2` 互斥。 |
key-direction | string | (bidirectional) | 0 | 1 | `tls-auth` 的密钥方向。`0` / `1` 选择方向密钥槽;未设置时两个方向使用同一把密钥。 |
tls-crypt | string | (unset) | <inline static key> | 用于控制通道加密/认证的 tls-crypt 静态密钥。 |
tls-crypt-v2 | string | (unset) | <inline PEM client key> | 内联 PEM 编码的 tls-crypt-v2 客户端密钥。与 `tls-auth`、`tls-crypt` 互斥。 |
username | string | (unset) | <string> | auth-user-pass 用户名。 |
password | string | (unset) | <string> | auth-user-pass 密码。 |
peer-info | map[string]string | {} | {<key>: <value>} | 附加的 peer-info 键值对(如 `IV_HWADDR`、`UV_*`),追加在密钥交换期间发送的内置 `IV_*` 条目之后。 |
ping | int | (unset) | <seconds> | 保活 ping 间隔(秒)。 |
ping-restart | int | (unset) | <seconds> | 在如此多秒数内未收到 ping 后重启隧道(秒)。 |
handshake-timeout | int | 0 (no limit) | <seconds> | OpenVPN 握手超过该秒数时中止隧道建立。0 表示禁用超时。 |
mtu | int | 1500 | <integer> | 隧道 MTU。 |
udp | bool | false | true | false | 允许 UDP 流量通过代理。 |
remote-dns-resolve | bool | false | true | 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_HWADDR、UV_*)。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)
