用 Tailscale 把家里几台设备串成一张网
设备一多,记 IP 这件事就变得很蠢。换成 tailnet 之后,出门只需要记一个主机名。
家里现在常开的东西有点多:一台跑定时任务的小主机、一台插着显卡的机器、日常用的笔记本,还有一台没接屏幕的 headless 终端。以前的做法是给每台写死局域网 IP,路由器 DHCP 里做绑定,再在本机 ~/.ssh/config 里抄一份。直到某次改了 LAN 网段,四台设备里有三台连不上,我决定不再折腾这套手工活。
为什么不手写 WireGuard
WireGuard 本身没问题,麻烦在密钥分发和拓扑维护。每加一台设备,就得给已有的每一台更新 peer,公钥、AllowedIPs、Endpoint 三样东西来回倒腾;家里还是运营商 NAT 后面,没有固定公网地址,穿透失败时得自己搭中继。这些活干一次叫学习,干第三次就叫浪费时间。
Tailscale 本质还是 WireGuard,只是把控制面挪走了:密钥、ACL、设备清单交给协调服务,数据面尽量点对点,打不通才走中继。对几台设备的规模,这个取舍挺合适。
落地过程
安装和加入基本没有可写的部分:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up --ssh --accept-routes
sudo tailscale status
真正花时间的是两件事。一是 MagicDNS:加进来之后 ssh ubuntu@node-a 就能用,不用再管 IP 变没变,~/.ssh/config 里那一大段静态地址终于可以删了。二是 ACL,默认全互通虽然省事,但把一台只该被访问的机器也给了完整权限,心里不踏实,最后按标签拆了三组,只放行需要的端口。
还有个需求是让外面的笔记本能摸到家里局域网的设备,比如交换机管理页。这就要其中一台做子网路由:
sudo tailscale up --advertise-routes=192.168.31.0/24 --accept-routes
sudo sysctl -w net.ipv4.ip_forward=1
路由要在管理后台批准一次才会生效,这点容易忘,我第一次配完在外面连不上,回来才发现后台还挂着一条待审批。
踩过的两个坑
一是不知道自己在走中继。 有段时间 ssh 明显发黏,tailscale status 才发现两台在同一城域网里的机器也走了 DERP。看延迟最直接的办法:
tailscale ping node-a
# 关注输出里是 direct 还是 via DERP(...)
把其中一台的 UPnP 打开、确认 UDP 没被上游限速之后,延迟从几十毫秒掉回个位数。这类问题测速软件看不出来,只会告诉你「网速还行」。
二是 MTU。 走隧道之后有效载荷变小,大文件传输偶尔卡顿。临时把隧道接口 MTU 调到 1280 试了一轮,症状消失,就没再往下深究——家庭环境不必追求最优,够稳就行。
现在的状态
出门只带笔记本,ssh 后面跟主机名;家里设备换 IP 我也不需要知道。headless 那台连显示器都不用接,重装完跑一条命令就回到网里。
小结:这类工具的价值不在「能连上」,而在于把「记住拓扑」这件持续消耗注意力的事彻底删掉。