mirror of
https://github.com/EasyTier/easytier.github.io.git
synced 2026-10-20 00:17:33 +00:00
220 lines
7.9 KiB
Markdown
220 lines
7.9 KiB
Markdown
# 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 功能!如有任何问题,欢迎在社区讨论。🎉 |