Files
2026-02-06 09:31:08 +08:00

220 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Easytier ACL 功能指南 🛡️
## 📖 目录
1. [核心概念](#-核心概念)
2. [工作原理](#-工作原理)
3. [配置详解](#-配置详解)
4. [常用场景示例](#-常用场景示例)
5. [最佳实践与注意事项](#-最佳实践与注意事项)
---
## 🧠 核心概念
理解以下几个关键概念是配置 ACL 的基础:
- **ACL(访问控制列表)**:一组规则的集合,用于允许或拒绝网络流量。Easytier 自 2.4.0 版本起支持基于 IP 的 ACL,2.4.3 版本新增基于身份组(Group)的零信任 ACL 机制,策略配置更加灵活。
- **链(Chain)**:规则的集合。链有不同的类型,例如 `chain_type = 1` 表示入站链,用于处理发送到本机的流量。
- **规则(Rule)**:定义流量匹配条件(如协议、端口、源/目标组)及匹配后的执行动作(允许或拒绝)。
- **组(Group)**:一个逻辑上的身份标签。节点(服务器、电脑等)可以声明自己属于一个或多个组(如 `admin`、`database`)。
- **组声明(Group Declaration)**:节点需预先知道所有可能通信的组名及其对应的共享密钥,密钥用于验证其他节点声明的组成员身份是否有效。
- **优先级(Priority)**:规则按优先级数值从高到低匹配。一旦流量匹配某条规则,将执行其动作并停止后续匹配。
---
## 🔧 配置详解
ACL 配置需添加到 Easytier 的配置文件 `config.yaml` 中。
### 1. 定义组与密钥
这是最关键的一步。每个节点需在配置中声明其所属的组,并配置所有相关组的共享密钥。
```yaml
# 本节定义本节点要加入的组(用于生成身份证明)
[acl.acl_v1.group]
members = ["admin", "web-server"] # 本节点身份:既是管理员,也是Web服务器
# 本节定义本节点“已知”的所有组及其密钥(用于验证对方身份)
[[acl.acl_v1.group.declares]]
group_name = "admin"
group_secret = "super-secret-admin-key" # 请使用更复杂的密钥!
[[acl.acl_v1.group.declares]]
group_name = "web-server"
group_secret = "web-server-secret-key"
[[acl.acl_v1.group.declares]]
group_name = "database"
group_secret = "database-secret-key"
[[acl.acl_v1.group.declares]]
group_name = "guest"
group_secret = "guest-secret-key"
```
> **⚠️ 重要提示**:
> - `members`:定义本节点的身份。
> - `declares`:相当于节点的“通讯录”,必须包含网络中所有可能通信的组的定义。所有节点的 `declares` 必须完全一致。
> - `group_secret`:是安全的核心,必须使用高强度、独一无二的密钥,且所有节点共享相同的密钥定义。
---
### 2. 配置规则链 (Chain)
规则链决定了如何处理流量。
```yaml
# 定义一个入站链
[[acl.acl_v1.chains]]
name = "my_acl_policy" # 链名称
chain_type = 1 # 0:未指定,1:入站链(处理发给本机的流量),2:出站(处理本机发出的流量),3:转发(子网代理)
description = "我的安全策略"
enabled = true # 启用此链
default_action = 2 # 默认动作:1(允许) 2(拒绝)
```
---
### 3. 配置规则 (Rules)
规则是策略的核心,定义在链内部。
```yaml
# 上面定义的链中的规则列表
[[acl.acl_v1.chains.rules]]
name = "allow_admin_rdp"
description = "允许管理员通过RDP连接本机"
priority = 1000 # 优先级,数字越大优先级越高(0-65535)
action = 1 # 动作:0(无操作) 1(允许) 2(拒绝)
source_groups = ["admin"] # 规则匹配:源设备必须属于 admin 组
protocol = 1 # 协议:0(未指定) 1(TCP) 2(UDP) 3(ICMP) 4(ICMPv6) 5(任何)
ports = ["3389"] # 本机允许端口:3389(RDP)
enabled = true # 启用此规则
[[acl.acl_v1.chains.rules]]
name = "deny_guest_to_db"
description = "拒绝访客访问数据库"
priority = 900 # 优先级较低
action = 2 # 动作:0(无操作) 1(允许) 2(拒绝)
source_groups = ["guest"] # 规则匹配:源设备必须属于 guest 组
destination_groups = ["database"] # 目标设备属于 database 组时匹配
enabled = true # 启用规则
protocol = 1 # TCP协议
ports = [] # 留空,则匹配所有端口
source_ips = [] # 留空,则匹配所有源IP范围;格式 `10.144.144.2/32`
destination_ips = [] # 留空,则匹配所有目标IP范围
source_ports = [] # 留空,则匹配所有源端口
rate_limit = 0 # 速率限制(bps),0 = 无限制
burst_limit = 0 # 突发的最高带宽(bps)
stateful = true # 启用连接跟踪
```
---
## 🧪 常用场景示例
### 场景 1:极简安全组 - “密钥相同即放行”
**目标**:实现一个私有网络,只要设备拥有相同的密钥,就能互通;没有密钥的设备无法接入。
**配置**:
```yaml
[acl.acl_v1.group]
members = ["my-net"] # 所有设备都加入同一个组
[[acl.acl_v1.group.declares]]
group_name = "my-net"
group_secret = "my-net-secret-key" # 所有设备使用相同密钥
[[acl.acl_v1.chains]]
name = "default_inbound"
chain_type = 1
enabled = true
default_action = 2 # 默认拒绝
# 核心规则:允许组内所有通信
[[acl.acl_v1.chains.rules]]
name = "allow_whole_group"
description = "允许组内所有流量"
priority = 1000
action = 1
source_groups = ["my-net"] # 源是组内成员
destination_groups = ["my-net"] # 目标是组内成员
protocol = 1
enabled = true
```
---
### 场景 2:三层网络架构
**目标**:模拟经典 Web-DB 架构,只允许 Web 服务器访问数据库的特定端口。
**节点配置**:
- Web 服务器:`members = ["web"]`
- 数据库服务器:`members = ["db"]`
- 管理员机器:`members = ["admin"]`
**数据库服务器上的 ACL 规则**:
```yaml
[[acl.acl_v1.chains]]
name = "db_server_policy"
chain_type = 1
enabled = true
default_action = 2 # 默认拒绝所有连接
# 规则 1: 允许Web服务器访问数据库端口
[[acl.acl_v1.chains.rules]]
name = "allow_web_to_mysql"
description = "允许Web组访问MySQL"
priority = 100
action = 1
source_groups = ["web"]
destination_groups = ["db"] # 目标是本机(db组)
protocol = 1
ports = ["3306"] # 只开放MySQL端口
enabled = true
# 规则 2: 允许管理员访问所有端口(例如用于管理)
[[acl.acl_v1.chains.rules]]
name = "allow_admin_to_all"
description = "允许管理员访问所有服务"
priority = 110 # 优先级比上一条更高
action = 1
source_groups = ["admin"]
destination_groups = ["db"] # 目标是本机(db组)
protocol = 1
enabled = true
```
---
## ✅ 最佳实践与注意事项
1. **密钥管理**:
- **重要性**:`group_secret` 是安全的基石,一旦泄露,攻击者可随意加入您的网络。
- **建议**:使用密码生成器创建长且复杂的密钥,并定期更换。
- **安全存储**:不要将配置文件提交到公共代码仓库。
2. **配置一致性**:
- 确保网络中所有节点的 `[[acl.acl_v1.group.declares]]` 部分完全一致(相同的组名和密钥),否则会导致组验证失败,网络不通。
3. **调试技巧**:
- 从宽松策略(`default_action = 1`)开始,搭配日志确认网络连通性。
- 逐步添加拒绝规则(`action = 2`)来限制访问。
- 最后,改为 `default_action = 2` ,形成“白名单”模式。
- 充分利用 `description` 字段,为每个规则添加清晰注释,便于后期维护。
- `easytier-cli acl stats` 命令可查看 ACL 统计信息。
4. **操作顺序**:
- 修改 ACL 配置后,通常需要重启 Easytier 进程才能生效。
- 使用 `easytier-core -d --tcp-whitelist 端口号` 等命令可以自动生成简单的端口白名单规则,可作为学习起点。
---
希望这份文档能帮助您更好地理解和使用 Easytier 的 ACL 功能!如有任何问题,欢迎在社区讨论。🎉