访问策略
策略决定谁能访问谁的哪些端口。未配置策略时,网内设备互通;一旦写入放行规则,未被规则覆盖的流量就会被拒绝。
策略写在哪里#
协调服务器上,用 JSON 描述,通过管理 API 提交:
bash
curl -sX PUT https://login.celium.cn/admin/api/acl \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H 'Content-Type: application/json' \
-d @policy.json也可以直接在管理后台 /admin 的"访问策略"里编辑。提交时会先编译:写错的策略会被拒绝并说明原因,不会下发出去。
一份完整的策略#
json
{
"groups": {
"group:dev": ["alice1", "bob001"],
"group:oncall": ["carol01"]
},
"hosts": {
"db": "10.239.0.5",
"lan": "192.168.0.0/16"
},
"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 | 给地址或网段起名字,规则里可以直接用 |
acls | 放行规则列表;多条规则的放行范围取并集 |
规则里的写法#
来源(src)可以是:
| 写法 | 含义 |
|---|---|
* | 网内所有机器 |
group:dev | 某个组的所有成员 |
tag:server | 带这个标签的所有机器 |
alice1 | 某个登录用户名下的全部机器 |
10.239.0.5 或 10.239.0.0/24 | 地址或网段 |
db(hosts 里定义的名字) | 对应地址 |
目标(dst)必须写成 目标:端口:
| 写法 | 含义 |
|---|---|
db:5432 | 某个主机的某个端口 |
db:80,443 | 多个端口 |
lan:8000-9000 | 端口区间 |
tag:server:* | 某个标签的全部端口 |
*:* | 任何目标任何端口(慎用) |
协议可用 proto 字段限定:"proto": "tcp"、"udp"、"icmp",不写表示不限。
几个必须知道的语义#
- 空策略不限制网内流量。
{"acls":[]}与没有策略文件一样,允许网内互通。
如果已经写了规则,但当前没有设备匹配,流量会被拒绝。
- 规则是单向的。
alice → db:5432放行的是这一个方向;应答流量会被同一条规则覆盖,
但反向新建连接不受它保护。需要双向就写两条。
- 策略在两端各自执行。 每台机器都按同一份规则检查经过自己的流量,所以一端放行不等于
另一端也放行——两端都必须有规则覆盖。
- 改完即时生效。 不需要重启任何服务。
标签#
标签适合描述角色而不是人:tag:server、tag:ci、tag:db。给机器打标签后:
- 规则可以按角色写,新机器加入时自动套用;
- 机器不再属于某个人的"个人设备",而属于这个角色——这正是"服务器不该因为某个人的账号被停用
而掉线"所需要的语义。
目前只能由管理员通过 API 给节点打标签;tagOwners 字段尚未实现授权判断,请勿依赖它限制标签分配:
bash
curl -sX POST https://login.celium.cn/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),并在服务器上被批准(管理员通过 API 确认;autoApprovers 尚未实现),然后其他机器用 --accept-routes / --exit-node 使用。
审计#
管理后台可以看到每台机器、每个标签、每条规则的当前状态。策略变更会被记录在服务器的日志里。