访问策略
策略决定谁能访问谁的哪些端口。默认拒绝:没有写明放行的流量不放行。加入这张网本身不等于可以访问所有机器。
策略写在哪里#
协调服务器上,用 JSON 描述,通过管理 API 提交:
bash
curl -sX PUT https://vpn.example.com/admin/api/acl \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H 'Content-Type: application/json' \
-d @policy.json也可以直接在管理后台 /admin 的"访问策略"里编辑。提交时会先编译:写错的策略会被拒绝并说明原因,不会下发出去。
一份完整的策略#
json
{
"groups": {
"group:dev": ["alice@example.com", "bob@example.com"],
"group:oncall": ["carol@example.com"]
},
"hosts": {
"db": "100.64.0.5",
"lan": "192.168.0.0/16"
},
"tagOwners": {
"tag:server": ["alice@example.com"]
},
"acls": [
{ "action": "accept", "src": ["group:dev"], "dst": ["tag:server:22,443"] },
{ "action": "accept", "src": ["group:dev"], "dst": ["db:5432"] },
{ "action": "accept", "src": ["group:oncall"], "dst": ["tag:server:*"] },
{ "action": "accept", "src": ["tag:server"], "dst": ["tag:server:*"] }
]
}字段#
| 字段 | 说明 |
|---|---|
groups | 把人分组,规则里写组名 |
hosts | 给地址或网段起名字,规则里可以直接用 |
tagOwners | 谁有权给机器打某个标签 |
acls | 规则列表,按顺序匹配,第一条匹配的规则生效 |
规则里的写法#
来源(src)可以是:
| 写法 | 含义 |
|---|---|
* | 网内所有机器 |
group:dev | 某个组的所有成员 |
tag:server | 带这个标签的所有机器 |
alice@example.com | 某个用户名下的全部机器 |
100.64.0.5 或 100.64.0.0/24 | 地址或网段 |
db(hosts 里定义的名字) | 对应地址 |
目标(dst)必须写成 目标:端口:
| 写法 | 含义 |
|---|---|
db:5432 | 某个主机的某个端口 |
db:80,443 | 多个端口 |
lan:8000-9000 | 端口区间 |
tag:server:* | 某个标签的全部端口 |
*:* | 任何目标任何端口(慎用) |
协议可用 proto 字段限定:"proto": "tcp"、"udp"、"icmp",不写表示不限。
几个必须知道的语义#
- 默认拒绝。 空的策略文件意味着"没有任何规则",也就是谁都不能访问谁。
这与"没有策略文件"是两回事——后者表示不限制(适合刚建好的实验环境)。
- 规则是单向的。
alice → db:5432放行的是这一个方向;应答流量会被同一条规则覆盖,
但反向新建连接不受它保护。需要双向就写两条。
- 策略在两端各自执行。 每台机器都按同一份规则检查经过自己的流量,所以一端放行不等于
另一端也放行——两端都必须有规则覆盖。
- 改完即时生效。 不需要重启任何服务。
标签#
标签适合描述角色而不是人:tag:server、tag:ci、tag:db。给机器打标签后:
- 规则可以按角色写,新机器加入时自动套用;
- 机器不再属于某个人的"个人设备",而属于这个角色——这正是"服务器不该因为某个人的账号被停用
而掉线"所需要的语义。
在管理后台的机器列表里给节点打标签,或者通过 API:
bash
curl -sX POST https://vpn.example.com/admin/api/nodes/12/tags \
-H "Authorization: Bearer $ADMIN_TOKEN" -d '{"tags":["tag:server"]}'子网路由与出口节点#
| 概念 | 含义 |
|---|---|
| 子网路由 | 某台机器把它所在的局域网(例如 192.168.1.0/24)提供给全网,其他机器可以直接访问那些地址,不需要在每台上装客户端 |
| 出口节点 | 某台机器承接全部出网流量(0.0.0.0/0),常用于公共 Wi-Fi 下加密全部流量 |
两者都需要在节点上声明(--advertise-routes / --advertise-exit-node),并在服务器上被批准(管理员在后台确认,或用 autoApprovers 自动批准),然后其他机器用 --accept-routes / --exit-node 使用。
审计#
管理后台可以看到每台机器、每个标签、每条规则的当前状态。策略变更会被记录在服务器的日志里。