U.S. flag

袁先生所属网站

Dot gov

所属网站使用 HIYUANSIR.COM
HIYUANSIR.COM 属于袁先生及其附属网站使用


HTTPS

HIYUANSIR.COM域名全面使用 HTTPS
小锁 ( ) 或 https:// 表示您已安全连接到袁先生的网站

Tailscale高级玩法:ACL控制
2024-01-04 0 评论 161 阅读 1 点赞

Tailscale高级玩法:ACL控制

袁先生
2024-01-04 / 0 评论 / 161 阅读 / 正在检测是否收录...
写在前面:

  Tailscale是一种软件定义网络(SDN)工具,它可以轻松地创建安全的虚拟专用网络(VPN),以安全地连接用户、服务和设备。它使用WireGuard®协议部署零配置、无麻烦的VPN,实现点对点网络连接,强制执行最小特权。Tailscale还提供了企业版,可以自动化用户入职、SSH会话记录和审计日志流。Tailscale还提供了免费的远程访问,可以从任何网络或物理位置访问。您可以在macOS、iOS、Windows、Linux和Android上安装Tailscale,只需一个命令或手动操作即可。但是网上关于Tailscale的高级玩法:ACL的教程可谓是大海捞针一样。经过我的一同摸索,终于研究明白Tailscale的ACL

   Tailscale的ACL(Access Control List) 提供了许多好处,使得用户能够更精确地控制网络访问权限,确保连接的安全性和合规性。以下是Tailscale ACL的主要优势总结:

  • 设备级别的控制: ACL允许用户以设备为单位设置访问规则,使其能够明确定义哪些设备可以与自己的设备通信,从而建立更为安全的网络连接。
  • 细粒度的网络控制: 用户可以指定允许或拒绝访问的设备,并甚至可以设置访问的具体端口,实现对网络连接的高度精细控制。
  • 简化配置: Tailscale设计了直观简单的ACL配置界面,使用户能够轻松定义规则,而无需深入了解复杂的网络设置,提高了配置的便捷性。
  • 全球范围的安全连接: ACL可以跨越地理边界,确保无论设备在全球的何处,都能够实现安全的网络连接,适用于全球化和分布式团队。
  • 动态更新: ACL规则是动态更新的,即时生效。这使得用户可以在需要时更改访问规则,而无需重新启动设备或服务,保证了灵活性和实时性。
  • 团队协作的支持: 在团队环境中,ACL可以用于限制某些设备的访问权限,确保敏感数据只能被授权的团队成员访问,有助于团队的安全协作。
  • 支持继承: ACL规则可以继承,使得在大规模网络中更容易管理设备的访问权限,提高了可维护性和扩展性。
默认 ACL 及参数说明

  当您首次创建 Tailscale 网络时,它会使用默认的“允许所有”访问策略进行初始化。这使得连接和使用 Tailscale 变得容易,并且不会限制网络中的任何流量。所有登录网络的设备都可以访问所有其他设备。这样不是不能用只是如果需要别人加入网络,那就会变得不安全!

  所以建议重新书写 ACL ,您的团队可以使用 Tailscale 访问远程设备。在这种情况下,所有用户都可以访问自己的远程设备,以及管理员所允许的设备,例如WEB的服务器。只有 Tailscale 管理员才能访问所有设备。管理员可以配置标记哪些设备。

默认的acl策略:

{
  "acls": [
    // 允许所有设备之间相互访问
    { "action": "accept", "src": ["*"], "dst": ["*:*"] },
  ],
}

  Tailscale 访问规则是“默认拒绝”,因此唯一参数的 actionaccept 允许否则会被拒绝的流量。 src 字段指定规则适用的源列表。列表中的每个元素可以是以下之一:

类型例子意义
任何*不限制来源
用户shreya@example.com使用该用户身份登录的所有设备
用户组group:example在该组内的所有用户
分配的IP100.101.102.103Tailscale给每台设备分配的IP。IPv6 地址必须遵循以下格式[1:2:3::4]:80。
子网 CIDR 范围192.168.1.0/24该子网内的所有IP
标签tag:example标记为该标签的所有设备
自动分组autogroup:member角色。默认为成员

  可选 srcPostures 字段可用于进一步将 src 设备限制为仅端口可以通信。 proto 字段是可选的,指定规则适用的协议。(如果未指定协议,则 ACL 规则适用于所有 TCP 和 UDP 流量。)字段 proto 只能包含在 Tailscale v1.18.2 或更高版本的 ACL 规则中。较旧的客户端将无法关闭,从而阻止带有协议的 ACL 规则的流量,除非另有允许。如果允许给定的 IP 对进行流量,则 ICMP 也将被允许。 proto 可以指定为 IANA IP 协议编号1-255(例如"16")或以下命名别名之一(例如" sctp "):

协议名称IANA 协议号
互联网组管理 (IGMP)igmp2
IPv4封装ipv4,ip-in-ip4
传输控制(TCP)tcp6
外部网关协议 (EGP)egp8
任何私人内部网关igp9
用户数据报 (UDP)udp17
通用路由封装 (GRE)gre47
封装安全有效负载 (ESP)esp50
身份验证标头 (AH)ah51
流控制传输协议 (SCTP)sctp132

  仅 TCP、UDP 和 SCTP 流量支持指定端口。对于所有其他协议,指定的端口需要是 *dst 字段指定规则应用的目标设备和端口的列表。列表中的每个元素的形式为 host:portshost 是以下之一:

类型例子意义
任何*不限制来源
用户shreya@example.com使用该用户身份登录的所有设备
用户组group:example在该组内的所有用户
分配的IP100.101.102.103Tailscale给每台设备分配的IP。IPv6 地址必须遵循以下格式[1:2:3::4]:80。
子网 CIDR 范围192.168.1.0/24该子网内的所有IP
标签tag:example标记为该标签的所有设备
自动分组autogroup:member角色。默认为成员
自有设备autogroup:self访问同一用户在 和 上经过身份验证的src设备dst。这不包括用户具有ACL 标记的设备。

ports 则是以下之一:

类型例子
任何*
单个22
多个80,443
范围1000-2000

ACL常用书写参数:

参数意义
groups用户组
hostsIP或者IP网段简写
tagOwners标签,用于标记设备
acls用于书写策略

下面的是一个标准的示例:

{
  {
    "groups": {
        "group:example": ["example@qq.com"],
    },
    "hosts": {
        "example_ip":  "218.198.100.238",
        "example_ip1": "218.198.100.0/24"
    },
    "tagOwners": {
        "tag:example": ["group:example"],
   },
    "acls": [
        {"action": "accept", "src": ["group:example"], "dst": ["*:80"]},
   ],
 }
演示 ACL 的作用:

  例如:现在你是某家公司的网络管理员,现在需要配置为管理员可以访问所有设备,所有用户都可以访问自己的设备,所有用户都可以访问WEB和OA服务器,开发人员都可以访的公司测试服务器。有三种方法可以实现。

方法一

  现假设管理员为用户组: group:admin 开发人员用户组 group:a 测试服务器集群标记: tag:server WEB服务器IP: 218.198.100.246 OA服务器为IP: 218.198.100.238

{
  {
    // 声明的账号静态组
    "groups": {
        // 管理员账号
        "group:admin": ["admin@qq.com","admin2@qq.com","admin3@qq.com"],
        // a组用户
        "group:a": ["a1@qq.com","b1@qq.com","c1@qq.com"],
    },
    // 声明的允许访问的IP
    "hosts": {
        "oa":  "218.198.100.238",
        "web": "218.198.100.246",
    },
    // 已声明的标签
    "tagOwners": {
        "tag:server": ["group:admin"],
   },
    // 策略
    "acls": [
        // 允许管理员访问所有设备
        {"action": "accept", "src": ["group:admin"], "dst": ["*:*"]},
        // 允许所有用户访问自己的所有设备
        {"action": "accept","src":  ["autogroup:member"],"dst": ["autogroup:self:*"]},
        // 允许所有用户访问OA服务器
        {"action": "accept", "src": ["autogroup:member"], "dst": ["oa:*"]},
        // 允许所有用户访问WEB服务器
        {"action": "accept", "src": ["autogroup:member"], "dst": ["web:*"]},
        // 允许开发人员访问测试服务器集群
        {"action": "accept", "src": ["group:a"], "dst": ["tag:server:*"]},
   ],
 }

  上述这种方法理论上没有任何问题但是经过实测 开发人员可以访问测试服务器集群,但是无法访问标签为测试服务器集群所声明的子网。所以还有第二种方法可以实现!

方法二

  现假设管理员为用户组: group:admin 开发人员用户组 group:a 测试服务器集群用户: group:b WEB服务器IP: 218.198.100.246 OA服务器为IP: 218.198.100.238

{
  {
    // 声明的账号静态组
    "groups": {
        // 管理员账号
        "group:admin": ["admin@qq.com","admin2@qq.com","admin3@qq.com"],
        // a组用户
        "group:a": ["a1@qq.com","b1@qq.com","c1@qq.com"],
      // b组用户
        "group:b": ["sr1@qq.com","sr2@qq.com","sr3@qq.com"],
    },
    // 声明的允许访问的IP
    "hosts": {
        "mc_ip":  "218.198.100.238",
        "web_ip": "218.198.100.246",
    },
    // 策略
    "acls": [
        // 允许管理员访问所有设备
        {"action": "accept", "src": ["group:admin"], "dst": ["*:*"]},
        // 允许所有用户访问自己的所有设备
        {"action": "accept","src":  ["autogroup:member"],"dst": ["autogroup:self:*"]},
        // 允许所有用户访问oa服务器
        {"action": "accept", "src": ["autogroup:member"], "dst": ["mc_ip:*"]},
        // 允许所有用户访问WEB服务器
        {"action": "accept", "src": ["autogroup:member"], "dst": ["web_ip:*"]},
        // 允许开发人员访问访问测试服务器
        {"action": "accept", "src": ["group:a"], "dst": ["group:b:*"]},
   ],
 }

  上述这种方法理论上没有任何问题但是经过实测 开发人员可以访问测试服务器集群,但是还是无法访问标签为测试服务器集群所声明的子网。所以还有第三种方法可以实现!

方法三

  现假设管理员为用户组: group:admin 开发人员用户组 group:a 测试服务器集群登陆任意账号,声明的子网为: 172.10.10.0/24175.0.0.0/24198.198.2.0/24 WEB服务器IP: 218.198.100.246 OA服务器为IP: 218.198.100.238

{
    // 声明的账号静态组
    "groups": {
        // 管理员账号
        "group:admin": ["admin@qq.com","admin2@qq.com","admin3@qq.com"],
        // a组用户
        "group:a": ["a1@qq.com","b1@qq.com","c1@qq.com"],
    },
    // 声明的允许访问的IP和网段
    "hosts": {
        "oa":  "218.198.100.238",
        "web": "218.198.100.246",
        "sns_1":  "172.10.10.0/24",
        "sns_2":  "175.0.0.0/24",
        "sns_3":  "198.198.2.0/24",
    },
    // 策略
    "acls": [
        // 允许管理员访问所有设备
        {"action": "accept", "src": ["group:admin"], "dst": ["*:*"]},
        // 允许所有用户访问自己的所有设备
        {"action": "accept","src":  ["autogroup:member"],"dst": ["autogroup:self:*"]},
        // 允许所有用户访问OA服务器
        {"action": "accept", "src": ["autogroup:member"], "dst": ["oa:*"]},
        // 允许所有用户访问WEB服务器
        {"action": "accept", "src": ["autogroup:member"], "dst": ["web:*"]},
        // 开发人员需要访问的测试服务器集群网段
        // 网段 172.10.10.0/24
        {"action": "accept", "src": ["group:a"], "dst": ["sns_1:*"]},
        // 网段 175.0.0.0/24
        {"action": "accept", "src": ["group:a"], "dst": ["sns_2:*"]},
        // 网段 198.198.2.0/24
        {"action": "accept", "src": ["group:a"], "dst": ["sns_3:*"]},
    ],
}

  上述这种方法理论上没有任何问题但是经过实测 开发人员可以访问测试服务器集群,也可以正常访问标签为测试服务器集群所声明的子网。这种方法虽然有点笨 但是实现的效果非常好。可以指定更加详细的ACL策略实现更多功能

  通过Tailscale ACL,用户可以在云原生、跨平台的网络环境中实现灵活、安全的访问控制,从而更好地保护其设备和数据。这使得Tailscale成为一个理想的解决方案,特别适用于需要在多设备之间建立安全连接的个人、企业和团队。通过这些优势,Tailscale 为用户提供了一种强大的工具,以确保其网络连接得到最佳的安全保障,并灵活适应各种使用场景和需求。

1

评论 (0)

取消