Skip to content

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):一个逻辑上的身份标签。节点(服务器、电脑等)可以声明自己属于一个或多个组(如 admindatabase)。
  • 组声明(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 功能!如有任何问题,欢迎在社区讨论。🎉