# VPN 与 Tailscale

## `[l3vpns]`

定义第三层 VPN 接口，每条记录的键是自定义接口名称。

### 通用字段

| 键 | 类型 | 说明 | 必填 |
|---|---|---|---|
| `type` | 字符串 | 已实现 `wireguard`、`amneziawg` 与实验性 `tailscale`。schema 接受 `openvpn`，但不代表已实现 OpenVPN 客户端。 | 是 |
| `nickname` | 字符串 | 易读的显示名称。 | 否 |
| `enabled` | 布尔值 | 是否启用，默认 `true`。 | 否 |

### WireGuard 字段（`type=wireguard`）

| 键 | 类型 | 说明 | 必填 |
|---|---|---|---|
| `private-key` | 字符串 | 接口私钥。 | 是 |
| `address` | CIDR | 接口内部 IP 地址与子网。 | 是 |

### Tailscale 字段（`type:tailscale`，实验性，Pro）

| 键 | 说明 |
|---|---|
| `login-server` | HTTPS 控制服务器 URL，通常为 `https://controlplane.tailscale.com`；不能包含内嵌凭据、查询或片段。 |
| `auth-key` | 可选的初始登录密钥。优先使用浏览器登录或一次性提交认证KEY，避免在配置中保存秘密。 |
| `exit-node-ip` | 可选的首选出口节点 IPv4 地址，不含 CIDR 或端口。重启 VPN 或主动登录时应用。节点必须可用并提供出口功能，否则请检查 Tailscale 状态；省略时使用设备已保存的偏好。 |
| `drive-dns` | 默认 `false`。通过 MintFlow DNS 派生对等节点 IPv4 记录；不启用 Tailscale 操作系统级 MagicDNS 解析器。需要 Pro 和 MintFlow DNS 路径。 |
| `enabled` | 默认 `true`。每份配置只允许一个活跃 Tailscale 接口。 |

```ini
[l3vpns]
tailnet=type:tailscale,login-server:https://controlplane.tailscale.com,enabled:true

[routing]
CIDR,100.64.0.0/10,L3VPN,tailnet
DEFAULT,DIRECT
DNS-FALLBACK,DIRECT
```

配合 `[dns]` 中的 `app-routing-enabled=true` 与合适的 `direct-dns` 上游使用。参阅[完整登录与路由指南](../howtos/tailscale.md)。设备身份与接受路由仍保存在设备本地。可选的 `exit-node-ip` 将首选出口节点保存在配置中，并随配置同步；实时覆盖不会修改配置。省略此字段时，各设备使用自己的出口偏好。失去 Pro 权限时，编译会排除该接口，并将指向它的路由改为 REJECT。

### AmneziaWG 字段（`type=amneziawg`）

从 1.9.0 起支持 AmneziaWG 1.5 和 2.0 参数。对等节点另在 `[amneziawg-peers]` 设置。

| 键 | 类型 | 说明 | 必填 |
|---|---|---|---|
| `private-key` | 字符串 | 接口私钥。 | 是 |
| `address` | CIDR | 接口内部 IP 地址与子网。 | 是 |
| `jc` | 整数 | 垃圾数据包数量参数。 | 否 |
| `jmin` | 整数 | 垃圾数据包最小大小。 | 否 |
| `jmax` | 整数 | 垃圾数据包最大大小。 | 否 |
| `s1` | 整数 | AmneziaWG S1 参数。 | 否 |
| `s2` | 整数 | AmneziaWG S2 参数。 | 否 |
| `s3` | 整数 | AmneziaWG S3 参数。 | 否 |
| `s4` | 整数 | AmneziaWG S4 参数。 | 否 |
| `h1` | 整数或范围 | H1 数据包标头值，如 `1` 或 `843739526-1233562642`。 | 否 |
| `h2` | 整数或范围 | H2 数据包标头值，如 `2` 或 `1383464517-1389039856`。 | 否 |
| `h3` | 整数或范围 | H3 数据包标头值，如 `3` 或 `1558777559-1611162592`。 | 否 |
| `h4` | 整数或范围 | H4 数据包标头值，如 `4` 或 `1797613837-1977519157`。 | 否 |
| `i1` ... `i5` | 字符串 | AmneziaWG 2.0 CPS 指令字符串，每字段最多 255 UTF-8 字节；支持 `<b>`、`<r>`、`<rd>`、`<rc>`、`<t>` 标签。 | 否 |

```ini
[l3vpns]
my-wireguard=type:wireguard,nickname:My WG,private-key:...,address:10.0.0.1/32
my-awg=type:amneziawg,nickname:My AWG,private-key:...,address:10.8.9.2/32,jc:4,jmin:40,jmax:70,s1:0,s2:0,s3:0,s4:0,h1:1,h2:2,h3:3,h4:4,i1:<r 33>
```

## `[wireguard-peers]`

定义 WireGuard 对等节点，每条记录的键为自定义节点名。

| 键 | 类型 | 说明 | 必填 |
|---|---|---|---|
| `interface` | 字符串 | 所属 `l3vpns` 接口名称。 | 是 |
| `public-key` | 字符串 | 对等节点公钥。 | 是 |
| `preshared-key` | 字符串 | 可选预共享密钥。 | 否 |
| `endpoint` | 字符串 | 对等节点公网端点，如 `1.2.3.4:51820`。 | 是 |
| `allowed-ips` | CIDR 列表 | 经由该节点的 IP 地址/范围。 | 是 |

```ini
[wireguard-peers]
my-peer=interface:my-wireguard,public-key:...,endpoint:1.2.3.4:51820,allowed-ips:0.0.0.0/0
```

## `[amneziawg-peers]`

定义 AmneziaWG 对等节点，每条记录的键为自定义节点名。字段与 WireGuard 相同，但 `interface` 必须引用 `[l3vpns]` 中 `type` 为 `amneziawg` 的接口。

| 键 | 类型 | 说明 | 必填 |
|---|---|---|---|
| `interface` | 字符串 | 所属 `amneziawg` 接口名称。 | 是 |
| `public-key` | 字符串 | 对等节点公钥。 | 是 |
| `preshared-key` | 字符串 | 可选预共享密钥。 | 否 |
| `endpoint` | 字符串 | 对等节点公网端点，如 `1.2.3.4:51820`。 | 是 |
| `allowed-ips` | CIDR 列表 | 经由该节点的 IP 地址/范围。 | 是 |

```ini
[amneziawg-peers]
my-awg-peer=interface:my-awg,public-key:...,endpoint:1.2.3.4:51820,allowed-ips:0.0.0.0/0,::/0
```
