访问策略

策略决定谁能访问谁的哪些端口。默认拒绝:没有写明放行的流量不放行。加入这张网本身不等于可以访问所有机器。

策略写在哪里#

协调服务器上,用 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.5100.64.0.0/24地址或网段
dbhosts 里定义的名字)对应地址

目标(dst必须写成 目标:端口

写法含义
db:5432某个主机的某个端口
db:80,443多个端口
lan:8000-9000端口区间
tag:server:*某个标签的全部端口
*:*任何目标任何端口(慎用)

协议可用 proto 字段限定:"proto": "tcp""udp""icmp",不写表示不限。

几个必须知道的语义#

  1. 默认拒绝。 空的策略文件意味着"没有任何规则",也就是谁都不能访问谁。

这与"没有策略文件"是两回事——后者表示不限制(适合刚建好的实验环境)。

  1. 规则是单向的。 alice → db:5432 放行的是这一个方向;应答流量会被同一条规则覆盖,

反向新建连接不受它保护。需要双向就写两条。

  1. 策略在两端各自执行。 每台机器都按同一份规则检查经过自己的流量,所以一端放行不等于

另一端也放行——两端都必须有规则覆盖。

  1. 改完即时生效。 不需要重启任何服务。

标签#

标签适合描述角色而不是人:tag:servertag:citag: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 使用。

审计#

管理后台可以看到每台机器、每个标签、每条规则的当前状态。策略变更会被记录在服务器的日志里。