这篇文章原本是写给我的朋友的,但仔细想了想也许公开发出来会更好一些。
如果你在向你的好友安利 Tailscale 时懒得介绍 Tailscale 的各个功能,也欢迎向 Ta 分享这篇文章,带 Ta 快速入门。
什么是 Tailscale
Tailscale 是一个端到端加密的虚拟专用网络(VPN)组网工具,但它的主要功能不是更改出口 IP 地址,而是为了更加方便的将你的一个或多个设备连接到同一个虚拟网络中。这样,你无需将它们暴露在危险的公网中,就能够轻松、安全的访问这些设备和其上运行的服务。
设备一旦成功连接到 Tailscale 网络,就会得到一个虚拟 IPV4 和 一个虚拟 IPV6 地址。同一 Tailscale 网络内的设备都可以通过这个地址访问到此设备。
Tailscale 个人用户使用完全免费,几乎没有什么功能限制,并支持最大 100 台设备。
随着网络威胁越来越严重,监管越来越严格。将你的服务端口暴露在公网上,不管是从安全角度还是合规角度来说都有巨大风险。通过 Tailscale,无需暴露端口,即可无缝访问这些服务。如同在同一个局域网中一样。
Tailscale 能做什么
- 互联你的设备和网络,在任意安装了 Tailscale 的机器上访问其它也安装了 Tailscale 的设备的任意服务
如果你配置了 Tailscale subnet,则还可以分享设备所连接的整个局域网(LAN)
你甚至可以将 Tailscale 运行为一个 socks5 服务端,这样就可以分享给 Docker 容器使用 - 优化访问路由,寻找最优路径,降低延迟,提高速度
- 通过 MagicDNS,为每个设备配置一个好记的名字,免去输入难记的数字 IP 的麻烦
- 设置网络出口,通过特定设备访问互联网,不再需要线下跑腿
- ACL 和日志审计,控制每台设备的访问权限和访问范围
- 代替 SSH 的密码登录,通过网页 OAuth 授权,免密码连接服务器 SSH
- 使用 Taildrop 在不同设备之间点对点发送文件
- ……以及更多!
在现实中的作用
- 无需向公网暴露端口,访问家里 NAS 的网页控制面板,连接 SMB,FTP 和 RDP 远程桌面;把重要和危险的服务留在 NAT 之内,并通过 Tailscale 连接(如 MySQL、Redis、MongoDB 等)
- 将远在中国另一端的电脑上插着的打印机通过 Samba 共享或者 IP 方式来添加到你的电脑上,并远程打印文件
- 架设游戏服务器,输入 Tailscale 的虚拟 IP 地址,和好友一起联机打游戏
- 分享自己的一个特定设备给其他 Tailscale 账号访问,并随时回收权限
- 点对点文件直传,安全又快速,不受大小限制
- 出门在外,通过 Tailscale Subnets 暴露子网,访问家里路由器、HomeLab 的网页控制台
- 更改出口节点到宿舍,临时出门在外也能使用校园网资源
我需要有公网 IP 地址吗,需要架设服务端吗,有带宽要求吗?
公网 IP 最好有,但如果没有也没有关系。
Tailscale 基于 WireGuard 技术,所有传输都是点对点的,您无需架设任何服务端。没有服务端自然也就不需要考虑带宽瓶颈的问题。大多数情况下,建立直接连接后,通常能够跑满您的网络带宽。
Tailscale 自带一套非常成熟的 NAT 打洞机制。你能想到的问题,Tailscale 都帮你解决了。在大部分场景下都能够打通端到端直连通道。如果失败了也不要紧,Tailscale 官方提供了一组服务器帮你兜底转发流量,当然你也可以自己架设中继服务器(除非你是超级重度用户,否则官方给的就够用了)。
最后,为了提高打洞的成功率,尽可能地开启 UPNP/NAP-PMP 服务,并放行 41641 和 3478 的 UDP 流量,有助于改善连接性。
Tailscale 能在哪些平台上使用
Tailscale 覆盖了几乎所有常见平台,包括但不限于这些平台。点击链接可以跳转到下载页面或安装配置指南。
以及更多!你几乎不用担心平台兼容性问题,是个土豆都有办法跑起来。就算设备不支持,通过 Subnets 等技术,将同一网络内的不支持/未安装客户端设备共享到你的 Tailscale 网络中。
获取一个 Tailscale 账号
Tailscale 账号是您的 Tailscale 之旅的开始。
前往 Tailscale 官网,打开登录页,并选择一个方式登录,登录时就会自动完成注册。
既不能更改为其它登录方式,也不能解绑,也无法添加更多登录方式。
考虑到你需要在其它设备上通过相同方式登录鉴权,最好选一个没有访问困难的登录方式。
添加你的第一台设备到 Tailscale 网络
在机器上安装 Tailscale 客户端后,即可连接到 Tailscale 网络。本文使用 Windows 版本的客户端作为示例。
在安装好 Tailscale 并启动后,你会收到一个通知提醒,要求你登录 Tailscale 账号。

在点击并在弹出的网页中完成登录后,会弹出这样一个提示,警告我们虽然设备已经登陆了,但还没有连接到网络,必须管理员来手动批准一下。

点击 "Open in admin console" 打开控制台,找到需要批准的设备,点击菜单中的批准即可连接。
如果这是你的长期使用的设备,还可以选择 “Disable key expiry” 来禁用密钥过期,这样就会保持连接和登录,否则在一段时间后,设备会自动断开连接,并需要重新批准。

批准后,系统弹出通知,此时你的 Tailscale 就成功连接到你的网络中了。你也能够访问其它同 Tailscale 网络中的设备了。在其它设备上如法炮制,即可添加和连接更多设备。

如果你将 Tailscale 安装在 Windows 上,且希望作为服务器使用,请启用 Preferences 中的 Run unattended 选项,以服务形式运行。否则重启后需要登录到桌面 Tailscale 才会起效,如果你恰好除了 TS 外其他方式都连不上这台机器,那么恭喜你这台机器就会失联了。

控制台界面简介
本文章主要介绍两个最重要的控制台,其它的在后面的教程介绍到时会顺带提到。
Machine - 设备
设备控制台是 Tailscale 最重要的界面,你的所有设备都会显示在这里。
下面是一张图,简单介绍了这个界面中的各个字段分别是什么意思。

Service - 服务
服务控制台显示了你的 Tailscale 网络中所有的设备上可通过 Tailscale 连接到的服务。
下面是一张图,简单介绍了这个界面中的各个字段分别是什么意思。

和其它人分享你的 Tailscale 节点
如果你不希望在别人设备上登录你的 Tailscale 账号,但又希望别人能够访问你的设备(例如游戏联机,远程协作等),则可以单独分享您的特定设备。
点击 Share…… 选项打开分享控制面板。

点击 Generate & copy invite link 就可以生成并复制分享链接了。将其发给其他人,Ta 就可以将这个设备添加到 Ta 自己的 Tailscale 账号中并访问它。
如果要撤销权限,也是在此面板的下面来撤销。

功能介绍
Tailscale 有大量超级好用的功能,本文只介绍几个用的较多的功能。
MagicDNS
MagicDNS 通过修改系统的 hosts 文件来添加自定义 DNS 解析。其好处是不用再背复杂的 IP 地址,而只需要记住名字就可以了。
转到 DNS 控制面板,并向下拉网页。

点击蓝色的 “Enable MagicDNS” 按钮,启用 MagicDNS。如果已经是灰色的 “Disable MagicDNS……”,再次点击就会禁用。

配置完成后,此功能即刻生效。
现在我们有一台设备名为 “barbatos”,虚拟 IP 地址为 100.125.104.20。

您会发现,现在使用 "barbatos" 和 "100.125.104.20" 都能够访问到这台设备。显然,前者比后者更好记,并且名称可以自行更改。

MagicDNS 支持绝大多数应用程序和系统服务,TCP/UDP 协议均可:
RDP | Samba(SMB) | XShell (SSH) |
![]() | ![]() | ![]() |
Tailscale Subnets - 共享局域网的其它设备
Tailscale Subnets 能够让指定客户端分享它所连接的局域网(LAN)的其它设备。这样就算其它设备没有/无法安装 Tailscale,您也可以访问它们。
barbatos 设备连接到了一个局域网(LAN),路由器设置其所在网络 CIDR 表示为 192.168.0.0/24,对应也就是 192.168.0.0 - 192.168.0.255 这一段,我可以通过 192.168.0.1 访问到路由器后台。CIDR 可使用 CIDR 计算器算出。
通常家用路由器的 CIDR 都是 192.168.x.0/24。例如设备 IP 是 192.168.1.3,那么通常填写 192.168.1.0/24 即可。
跟随官方教程,在 barbatos 设备上运行命令:
tailscale up --advertise-routes=192.168.0.0/24
成功后,打开 Machines 控制台,找到 barbatos 设备菜单的 “Edit route settings……” 选项,可以看到我们刚刚声明的网段出现在了这里:


打勾选中保存即可访问对应网段的资源了。如果仍然无法访问,则需要在客户端的 Preferences 中打开 “Use Tailscale subnets” 选项。

Taildrop - 点对点文件传送
在需要发送的文件上右键,选择 “Send with Tailscale……”

弹出 Send with Tailscale 窗口,在右边点击选择发送到的设备。

文件会立刻开始发送,并显示文件发送进度。

发送成功后,文件会保存在目标机器的 “下载” 文件夹中。

Tailscale SSH - 无密码登录 SSH
前往 Access controls,在右侧面板中找到 “Enable Tailscale SSH” 并启用。
在需要使用 Tailscale SSH 的服务器上,运行下面的命令,启用 Tailscale SSH 功能:
tailscale up --ssh
启用后 Tailscale 将接管来自 Tailscale 网络发起的对 22 端口的连接请求(不影响公网 22)。

启用后回到 Machine 界面,支持 Tailscale SSH 的机器会有绿色的 SSH 标签显示。
通过 Web 网页中继连接 SSH
点击 SSH 或者 SSH Machine…… 即可连接到此机器的 SSH(通过中继,会比较卡)。

您还可以在连接前选择和输入您想要以哪个用户的身份进行连接。

即可连接到此设备。

不过由于这种方式是拜托 Tailscale 的中继服务器连接,所以会非常卡,只适合临时使用。通常推荐使用自己的 SSH 客户端连接。
SSH 客户端直接连接
这种方式无需经过中继服务器,且效果和网页的相同。
在 SSH 客户端中填写 Tailscale 的虚拟 IP / MagicDNS 主机名,以及想要连接到的用户名,并和正常方式一样连接(无需输入密码)。
对于常规用户:连接免密码建立
对于高危系统账户(root):弹出浏览器要求再次授权登录以确认。验证通过后,就会自动连接到 SSH 啦。认证完毕后的一段时间内,无需重复验证。

Tailscale Funnel - CloudFlare Tunnel 的替代品
Tailscale Funnel 是 CloudFlare Tunnel 的一个替代品,可以通过 Tailscale 的 Funnel 中继服务器,将本地的服务经过 Funnel 中继对外提供服务。所有流量都通过 Funnel 中继转发,不会暴露自己设备的 IP 地址。支持任意 TCP 类型的应用,或者 Web 站点。
此功能的主要问题是 Funnel 中继服务器的带宽受限,且对于国内访问非常不友好。
参见官方文档进行配置。
Tailscale DNS - 配置设备的 DNS 到你自己的 DNS 服务器 (Adguard/Pi-hole)
想想看,你有一个 DNS 服务器负责进行广告过滤(如 Adguard Home 或者 Pi-hole),但根据我国相关法律法规,个人不能架设对外的 DNS 服务器。因此你不能将 DNS 端口暴露到公网。
有了 Tailscale,你就可以通过 Tailscale 网络访问你的 Adguard Home 和 Pi-hole。再通过 Tailscale DNS 统一管理各个客户端的 DNS 配置。这样不管你在哪里,都能用上家里的 DNS 服务器了。
在你的 DNS 服务器上安装 Tailscale,并关闭它的 Tailscale DNS 功能(因为这就是你的 DNS 服务器,你不能设置是自己的 DNS 上游)。
tailscale up --accept-dns=false
转到 DNS 控制界面,找到 Nameservers 设置,选择 Add nameserver,并在弹出的对话框中,输入你的 DNS 服务器的虚拟 IPV4/IPV6 地址(不支持主机名)。


最后打开 Override local DNS,以允许 Tailscale 覆盖客户端的本地 DNS 设置,设置就完成了

Tailscale Proxy - 将 Tailscale 客户端变成一个 Socks5 和 HTTP 代理服务器 以及接入 Docker 网络
Tailscale 除了可以通过 TUN 转发流量以外,还可以开启一个 Socks5 代理服务器。这样你就可以将 Wordpress 以及容器内的程序等,设置它们走 Tailscale 的 Socks5 代理服务器,通过这个 Socks5 代理服务器访问你的 Tailscale 网络。极大的增强了灵活性和扩展能力。如果 Tailscale 运行在 Docker 容器这种没有 TUN 创建的环境里,也可以使用这种方法 workdaround 一下。
参见官方文档进行设置 Docker,以及这篇官方文档设置 Socks5/HTTP/HTTPS 代理服务器。
Exit Node - 传统 VPN 的替代
如果你用过学校给你的锐捷 SSLVPN 之类的东西来访问学校图书馆资源的话,你应该很熟悉这个。当你连接后,你的出口 IP 就变成了学校信息中心的机房的某台服务器的 IP 地址,此时你就可以访问学校图书馆资源了。
Tailscale Exit Node 也是相同的功能,可以让你选择 Tailscale 网络里的某一台设备作为出口节点,你的所有流量都通过这台设备路由,你的 IP 也会变成那台服务器的 IP。其他人看起来就好像你在用那台设备在上网一样。
对于 Windows 客户端来说,选择 Exit node -> Run exit node... 即可。

如果是 Linux 服务器,则需要根据官方文档,设置内核 IP 转发和防火墙。
客户端侧启动 Exit node 后,在管理员控制面板处就会出现批准选择框,勾选批准后,这台设备就成为一个 Exit node 了。

在需要用到 Exit node 时,只需要在客户端的 Exit node 中选择你配置好的节点,即可切换。

ACL - 访问控制
ACL 访问控制功能能够设置网络中的设备访问权限。例如 A 设备可以访问 B 设备,但不能访问 C 设备。
我个人未使用过 ACL 功能,胡乱描述此功能反而会误导其他人,因此你需要自行查看官方文档。
值得一提的是,如果你在自行部署 DERP 服务器,你也需要用到 ACL 来设置让客户端走你自己的 DERP 服务器。
进阶-自建 DERP 服务器
我们在前面提到,Tailscale 有时会使用中继服务器路由流量(如 NAT 打洞失败,或者连接建立初期)。官方提供的中继服务器用来辅助打洞还行,但如果运行延迟敏感的应用程序,那最好自己部署一个 DERP 服务器。
DERP 服务器负责这些事情:
- 协调客户端之间通信,帮助进行 NAT 打洞
- 中继流量
需要特别注意的是,DERP 服务器运行在 443 端口上 HTTPS 协议,且需要 HTTPS 证书。如果你的服务器在国内,需要进行 ICP 备案。当然,也少不了购置一个域名并为域名实名认证。
目前网上已经有许多优秀的教程教你如何自行部署 DERP 服务器,你可以查看一下这些文章:
如果你懒得自建,也有现成的服务可以购买即用,但大多价格比较美丽,适合重度使用的朋友:
- vx.link(注册需要邀请码)
- 万能的淘宝
- 也比较万能的闲鱼
- 还有你的好群友
进阶-调试 Tailscale 网络
如何知道我的连接是如何被 Tailscale 路由的?我是连接到了 DERP 中继服务器,还是 Tailscale 帮我打好了洞进行点对点直连?
这篇教程帮助你检查你的 Tailscale 网络状态。
测试到另一台设备的连接
使用 tailscale ping 设备
能够测试设备连通性。
如图所示,我与 barbatos 和 buer 设备都是通过公网 IPv4 直接连接,与 hutao 通过公网 IPv6 直接连接,而与 smartptr 则直接使用了内网 IPv4 直接连接(在同一个路由器下)。

检查网络
Tailscale 提供了一个 tailscale netcheck
命令,允许用户检查自己设备上的 Tailscale 客户端的工作状态。
如图所示,Tailscale 检测到了我的正确的外网 IPV4/IPV6 地址,且状态都是可通信。
网关处于 192.168.2.1 上,支持 UPNP,NAT-PMP 以及 PCP,并成功进行了 UPNP 端口映射,设备是 iKuaiOS。
UDP 可用,距离我最近的 DERP 是日本(94ms),因此 Tailscale 选择 tok 的 DERP 服务器用作回落。

总结
Tailscale 极大的便利了开发者或者好朋友访问分散在不同网络和地理位置下的设备,并在提供便利的同时,保证了设备和服务的安全性。基本功能上手简单,高级功能配置性强,不管是打游戏的还是开发者,都能以各种方式满足需求。
借助于 Tailscale 提供的虚拟组网功能搭建虚拟局域网,以及其端到端加密能力,能够轻松访问那些无法暴露在公网(或者有极大安全风险)的服务和设备,并保证访问始终可控。如果氪金购买了高级版本,更是能看到通过 Tailscale 网络的每一个网络连接访问的审计日志。
Tailscale 优秀的 NAT 打洞和穿透能力能够最大可能地提升连接到 P2P,免去了昂贵的购买中继服务器的费用。在使用官方提供的 DERP 服务器的前提下,几乎没有任何成本和开销,也能用的非常舒心。
如果你的用量超过的免费额度(不会吧?100台真的能用完?),还可以看看社区的 Headscale 开源项目。