在 Headscale 中配置访问权限

2024-09-29#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 的配置文件中,首先在 groupstagOwners 分别配置组和标签所有者,然后在 acls 中设置规则。在配置访问目的地(dst)时,需要指定端口号,或者以 * 允许所有端口。在网络上的一些文章中提到可使用 autogroup (比如 autogroup:selfautogroup:members 等),但是经过测试,在当前的 v0.23.0 还不支持 autogroup。在 Github 上有一个关于 autogroup 的议题《No support for "autogroup:" in ACL rules》,目前还在 Open 状态。

部署 🔗

在控制服务器更新了 config.yaml 和 ACL 配置文件后,重新启动 headscale 服务即可生效。如果 ACL 配置有错误,那么重启后就会无法运行。


加载中...