写在前面:
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 访问规则是“默认拒绝”,因此唯一参数的 action
是 accept
允许否则会被拒绝的流量。 src
字段指定规则适用的源列表。列表中的每个元素可以是以下之一:
类型 | 例子 | 意义 |
任何 | * | 不限制来源 |
用户 | shreya@example.com | 使用该用户身份登录的所有设备 |
用户组 | group:example | 在该组内的所有用户 |
分配的IP | 100.101.102.103 | Tailscale给每台设备分配的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) | igmp | 2 |
IPv4封装 | ipv4,ip-in-ip | 4 |
传输控制(TCP) | tcp | 6 |
外部网关协议 (EGP) | egp | 8 |
任何私人内部网关 | igp | 9 |
用户数据报 (UDP) | udp | 17 |
通用路由封装 (GRE) | gre | 47 |
封装安全有效负载 (ESP) | esp | 50 |
身份验证标头 (AH) | ah | 51 |
流控制传输协议 (SCTP) | sctp | 132 |
仅 TCP、UDP 和 SCTP 流量支持指定端口。对于所有其他协议,指定的端口需要是 *
。 dst
字段指定规则应用的目标设备和端口的列表。列表中的每个元素的形式为 host:ports
。 host
是以下之一:
类型 | 例子 | 意义 |
任何 | * | 不限制来源 |
用户 | shreya@example.com | 使用该用户身份登录的所有设备 |
用户组 | group:example | 在该组内的所有用户 |
分配的IP | 100.101.102.103 | Tailscale给每台设备分配的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 | 用户组 |
hosts | IP或者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/24
、 175.0.0.0/24
、 198.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 为用户提供了一种强大的工具,以确保其网络连接得到最佳的安全保障,并灵活适应各种使用场景和需求。
评论 (0)