访问策略

策略决定谁能访问谁的哪些端口。未配置策略时,网内设备互通;一旦写入放行规则,未被规则覆盖的流量就会被拒绝。

策略写在哪里#

协调服务器上,用 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",不写表示不限。

几个必须知道的语义#

  1. 空策略不限制网内流量。 {"acls":[]} 与没有策略文件一样,允许网内互通。

如果已经写了规则,但当前没有设备匹配,流量会被拒绝。

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

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

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

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

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

标签#

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

审计#

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