在 Headscale 中配置访问权限
在前文《使用 Headscale 和 Tailscale 搭建虚拟私有网络》中,搭建了最简单的网格网络,网络中的各个节点可以互联互通了。但是,在真实场景下,就算是在VPN内部,出于安全考虑,还应该加入访问控制或者防火墙控制。比如可以对不同环境的主机进行网络隔离,或者减少暴露到VPN中的端口。
Headscale 中的访问控制 🔗
Nebula 使用防火墙规则管理节点之间的网络访问。每个节点在自己的配置文件中,配置入站(inboud)和出站(outbound)规则。而 Headscale 采用的是中心化的“访问控制列表”(Access Control List,ACL),在服务器配置访问控制规则后,会自动地下发到各个节点。
ACL 的配置 🔗
Headscale 访问控制列表的具体说明可见 《ACLs》 文档。其理念见 Tailscale 的文档 Manage permissions using ACLs。
首先在 Headscale 配置文件(config.yaml
)的 policy.mode
之下设定配置访问控制的模式。可通过文件(file
)或者数据库(database
)配置。如果使用文件来配置,那么必须使用 JSON 或者HuJSON 的格式进行配置。在网络上的一些文章中提到可使用 YAML 格式配置 ACL,但至少当前的 v0.23.0
并不支持。
在 ACL 的配置文件中,首先在 groups
、tagOwners
分别配置组和标签所有者,然后在 acls
中设置规则。在配置访问目的地(dst
)时,需要指定端口号,或者以 *
允许所有端口。在网络上的一些文章中提到可使用 autogroup
(比如 autogroup:self
、autogroup:members
等),但是经过测试,在当前的 v0.23.0
还不支持 autogroup
。在 Github 上有一个关于 autogroup
的议题《No support for "autogroup:" in ACL rules》,目前还在 Open 状态。
部署 🔗
在控制服务器更新了 config.yaml
和 ACL 配置文件后,重新启动 headscale 服务即可生效。如果 ACL 配置有错误,那么重启后就会无法运行。