boxmoe_header_banner_img

希望是美好的,也许是人间至善,而美好的事物永不消逝

文章导读

Headscale通过ACL设置内网用户隔离


avatar
hydrangea 26 8 月, 2026 19

4. 通过ACL设置虚拟局域网中不同用户设备互相隔离

由于各种原因,虚拟局域网的某些设备有被攻击风险,不能让它与安全的设备互访,所以需要通过ACL隔离这些设备。

首先,在headscale上新建一个用户:

docker exec -it headscale headscale users create fragile_dev

docker exec -it headscale headscale preauthkeys create --user <fragile_dev的用户ID> --reusable -e 3600d

同样记下headscale给出的AuthKey,等会儿用最上面的命令加入这个局域网。

最重要的一步:在Headscale ACL添加访问控制。

4.1 编写ACL hujson文件

在我的配置中,编辑vim /etc/derp/headscale/acl.hujson

{
  // 1. 定义组(Headscale 用户名末尾必须带 @)
  "groups": {
    "group:vnet": ["fragile_dev@"]
  },

  // 2. 访问控制列表
  "acls": [
    // 规则 1:只允许 vnet 组(即 fragile_dev 用户下的服务器)互相通信
    {
      "action": "accept",
      "src": ["group:vnet"],
      "dst": ["group:vnet:*"]
    },

    // 规则 2:允许其它所有普通用户的设备在“同用户内部”互访,阻断跨用户访问
    {
      "action": "accept",
      "src": ["autogroup:member"],
      "dst": ["autogroup:self:*"]
    }
  ]
}

然后:wq保存。

4.2 配置ACL文件路径

server_url: https://<SERVER_URL>
listen_addr: 0.0.0.0:8080
metrics_listen_addr: 0.0.0.0:9090
grpc_listen_addr: 0.0.0.0:50443
grpc_allow_insecure: true

# 【加在这里】配置 ACL 文件路径(顶层参数,无缩进)
#  注意这里要写容器内部对应的acl.hujson路径
acl_policy_path: /etc/headscale/acl.hujson

private_key_path: /var/lib/headscale/private.key
noise:
  private_key_path: /var/lib/headscale/noise_private.key
...

4.3 检查

由于现在有在运行中的局域网,所以需要测试配置文件无误后再应用。保存以上文件之后,输入命令测试headscale配置YAML文件:
docker exec -it headscale headscale configtest

输入命令测试ACL访问控制文件:

docker exec -it headscale headscale policy check --file /etc/headscale/acl.hujson

确认输出 Policy is valid. 后,运行 docker restart headscale



评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字
插入代码