Tailscale我用来给家里的设备内网穿透用的,功能很强大。
传统的内网穿透比如说 frp 需要自己的 vps,且服务暴露在公网,速度取决于 vps 的带宽。
而 tailscale 类似于将设备组成局域网。
连接方式分 p2p 和中继,p2p 直连速度极快;中继速度取决于 tailscale 的服务器,速度较慢。
Tailscale 的 Acls 虽然一开始上手有点困难,但随之带来的安全性(Zero Trust Network)和较高的设置颗粒度。这是我选择 tailscale 的主要原因。
启动服务
curl -fsSL https://tailscale.com/install.sh | sh # 一键安装
sudo tailscale up # 简单启动
sudo tailscale up --ssh # 启动并开启SSH功能,允许别人通过Tailscale访问本机的SSH
ACLS
Tailscale 的 ACLs (Access Control Lists / 访问控制列表) 是其安全模型的核心,它遵循“零信任网络”原则。简单来说,默认情况下,网络内的任何设备都无法访问彼此。所有权限都必须在 ACL 策略中被明确授予。
虽然初看起来是纯文本配置,有些麻烦,但一旦掌握了 groups
(群组) 和 tags
(标签) 这两大“法宝”,管理起来会比任何图形化防火墙都更清晰、更强大。
- 群组 (Groups):用于将不同的用户(邮箱)归类。例如,可以创建一个
group:admins
(管理员组)和group:family
(家庭成员组)。这样,就可以为一整个群组授权,而无需为每个人单独写规则。 - 标签 (Tags):用于定义无人值守的设备或服务器,如 NAS、树莓派、云服务器等。使用标签可以让这些设备的身份独立于任何用户。即使您在手机上退出了登录,您的 NAS 依然可以通过
tag:nas
这个身份在线,提供服务。 - 别名 (Hosts):用于为IP、端口或设备定义一个易于理解的名称,让规则的可读性大大增强。
在 tailscale 后台启用 tags
- 登录后台:访问 Tailscale Admin Console。
- 找到设备:找到想作为服务器的设备。
- 禁用密钥过期:点击设备最右侧的三个点
...
,选择Disable key expiry...
。这是为了确保服务器的认证不会因为长时间不手动登录而失效。 - 应用标签:之后,就可以在 ACL 策略中定义这个 tag (例如
tag:server
),并在设备列表中为它打上这个标签。
Acls 模板
- 登录后台:访问 Tailscale Admin Console。
- 点击 access controls
{
// 定义标签所有者
"tagOwners": {
"tag:server-home": ["autogroup:admin"], // 家庭服务器的标签
"tag:device-main": ["autogroup:admin"], // 主要工作设备的标签
},
// 核心网络访问规则 (ACLs)
"acls": [
// 规则1: 允许主要设备访问家庭服务器的指定端口
{
"action": "accept",
"src": ["tag:device-main"],
"dst": ["tag:server-home:22, 80, 443, 445, 9999"], // SSH, Web, SMB等服务
},
// 规则2: 【出口节点规则】允许所有设备访问公共互联网
{
"action": "accept",
"src": ["autogroup:members"],
"dst": ["autogroup:internet:*"],
},
],
// Tailscale SSH 访问规则
"ssh": [
// 规则1: 授权主要设备可以SSH登录到家庭服务器
{
"action": "accept",
"src": ["tag:device-main"],
"dst": ["tag:server-home"],
"users": ["autogroup:nonroot", "root"], // 允许以普通用户和root身份登录
},
],
}
停止删除服务
tailscale down # 断开tailscale连接,服务依然在后台运行
tailscale logout # 退出登录,断开连接,设备在网络中移除
systemctl stop tailscaled
apt-get purge tailscale # 删除程序和配置文件
rm -rf /var/lib/tailscale # 删除数据目录
查看网络
tailscale status # 显示tailscale网络状态
tailscale ip -4 # 显示ipv4
tailscale ip -6 # 显示ipv6
tailscale ip ryzen # 显示特定设备的ip
tailscale ping armbian
tailscale ping 100.x.y.z
tailscale netcheck # 网络诊断,查看到各节点的延迟
tailscale nc ryzen 5522 # 查看机器的特定端口是否能连接,若报错则不能连接
SSH 登录
tailscale ssh root@armbian # 以root用户登录armbian机器的22端口
ssh -i /root/.ssh/id_rsa -p 5522 root@ryzen #当ssh端口不是22或使用私钥时使用
代理功能
代理机设置
首先需要在代理机上开启 ipv 4 转发和 ipv 6 转发:
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
tailscale up --advertise-exit-node # 在充当代理的机器上面运行,然后在后台批准
如果已经运行了 --ssh,指令就要修改如下:
tailscale up --advertise-exit-node --ssh
需代理机设置
tailscale up --exit-node=<出口设备的IP或名称> # 使用代理的机器上运行,开启代理
tailscale up --exit-node= # 关闭代理
代理功能个人尝试没成功,有兴趣的可以试试看。
使用的时候遇到一个问题,本机 dns 会覆盖 tailscale 的 dns,导致 ping 主机名或者 root@主机名 ssh 登录失败。
解决办法有两个,一个是修改本机 hosts 文件 /etc/hosts
,添加以下代码:
100.***.***.*** ubuntu ubuntu.tail123333.ts.net # 第一部分是tailscale的内网ip,第二部分是主机名,第三部分是主机名.tailnetname
Tailnetname 可以后台查看
另一个方法是手动配置 systemd-resolved 使用 Tailscale DNS,让系统将所有 .ts.net 结尾的域名查询都发送给 Tailscale 的 DNS 服务器 (100.100.100.100)
sudo systemd-resolve --set-dns=100.100.100.100 --interface=tailscale0 --set-domain=~ts.net
评论区(暂无评论)