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 模板

{
    // 定义标签所有者
    "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

后台三个点设置,勾选use as exit node,保存

后台三个点设置,勾选use as exit node,保存

需代理机设置

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