Easytier ACL 功能指南 🛡️
📖 目录
🧠 核心概念
理解以下几个关键概念是配置 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
✅ 最佳实践与注意事项
密钥管理:
- 重要性:
group_secret
是安全的基石,一旦泄露,攻击者可随意加入您的网络。 - 建议:使用密码生成器创建长且复杂的密钥,并定期更换。
- 安全存储:不要将配置文件提交到公共代码仓库。
- 重要性:
配置一致性:
- 确保网络中所有节点的
[[acl.acl_v1.group.declares]]
部分完全一致(相同的组名和密钥),否则会导致组验证失败,网络不通。
- 确保网络中所有节点的
调试技巧:
- 从宽松策略(
default_action = 1
)开始,搭配日志确认网络连通性。 - 逐步添加拒绝规则(
action = 2
)来限制访问。 - 最后,改为
default_action = 2
,形成“白名单”模式。 - 充分利用
description
字段,为每个规则添加清晰注释,便于后期维护。 easytier-cli acl stats
命令可查看 ACL 统计信息。
- 从宽松策略(
操作顺序:
- 修改 ACL 配置后,通常需要重启 Easytier 进程才能生效。
- 使用
easytier-core -d --tcp-whitelist 端口号
等命令可以自动生成简单的端口白名单规则,可作为学习起点。
希望这份文档能帮助您更好地理解和使用 Easytier 的 ACL 功能!如有任何问题,欢迎在社区讨论。🎉