引言:为什么"访问自己的 VPS"越来越贵
先别急着骂,这个问题确实越来越多人踩:
- IPv4 公网 IP 变贵:不少小厂 VPS 要么 $1–2/月单独收 IP 钱,要么直接不给公网 IPv4;
- 按流量计费:每次从家里
ssh、curl一下自己的 API、拉一次日志、传个备份,都是在烧出口流量; - 端口映射/公网开洞 = 攻击面扩大,还得配 fail2ban、安全组,心累;
- IPv6 普及了但"能用≠方便":家里/公司/手机网络 IPv6 互通不一定通,且 NAT64 配置千差万别。
核心思路:不依赖公网 IP,不开放任何入站端口——用 Tailscale(零配置 WireGuard 组网) 把"你的 VPS"和"你的笔记本/手机"塞进同一个虚拟局域网(tailnet)。之后:
| 场景 | 传统方式 | Tailscale 内网方式 |
|---|---|---|
ssh 登 VPS | 公网 IP + 22 端口开放 | ssh vps(100.x.y.z),0 端口 |
| 访问自托管面板 | 域名 + HTTPS + 反代 | http://vps:8080 走隧道,明文内网 OK |
| 传备份/大文件 | 走公网出口计费 | tailnet 内走 WireGuard,几乎 0 额外出口 |
| 手机访问家里服务 | 需要 DDNS/公网/蒲公英 | 直接 http://home:3000 |
实测:一台 1C1G 的 IPv6-only VPS(月租 ~$2),装完 Tailscale 后,从家里笔记本、手机、办公室 3 台设备访问 VPS 上的 Docker 面板 + SSH + 备份脚本,月出口流量从 ~8GB(公网访问 + API 轮询)降到 ~0.5GB(只有主动出站拉取更新等),省掉 IP 附加费 $2/月 + 流量费约 $0.5–1/月,月省 $2.5–3.5,且入站攻击面归零。
一、先搞清楚:你的 VPS 到底有什么网络能力
动手之前花 2 分钟确认,避免白折腾:
# 1. 有没有公网 IPv4?
ip -4 addr show | grep -v 127.0.0.1
curl -4 ifconfig.me && echo " 有 IPv4 出口" || echo " 无 IPv4"
# 2. 有没有 IPv6 出口?
ip -6 addr | grep -v fe80
curl -6 ifconfig.me && echo " 有 IPv6 出口" || echo " 无 IPv6 出口"
# 3. 能不能被 IPv6 直接访问(关键!)
# 在本地机器(有 IPv6 的)执行:
ping6 <vps的ipv6地址>
# 4. 系统内核 WireGuard 支持(Tailscale 底层依赖)
modprobe wireguard
dmesg | tail -3 # 无报错即 OK;老内核可编译模块
三种典型情况:
| 情况 | 建议 |
|---|---|
只有 IPv6,且本地可 ping6 通 | 最佳场景,本文主线 |
| 只有 IPv6,本地 ping 不通(CGNAT/运营商屏蔽) | 用 Tailscale 的 Derp 中继兜底(见第五节),体验略降 |
| 有 IPv4 + IPv6 | 双栈最稳,两边都能进 tailnet,按需用 |
安全前提:Tailscale 默认 不开放任何入站端口。即使 VPS 有 IPv6 公网,其他 IPv6 用户也无法从公网直接连到 tailnet 里的 100.x.y.z 地址——它只在"你授权的设备之间"可达。这是和传统端口转发/蒲公英的本质区别。
二、安装 Tailscale(2 分钟)
VPS 端(Linux,任意主流发行版)
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up --ssh --hostname=vps-main
# 浏览器扫码授权,看到 "Welcome to your new tailnet" 即成功
关键参数说明:
--ssh:让 VPS 通过 tailnet 提供 SSH 服务,不需要sshd监听公网 22,后续用tailscale ssh vps-main或ssh vps-main登录(详见第三节);--hostname:好记的节点名,方便其他设备直接ssh vps-main。
本地设备
- macOS/Windows:官网下载客户端,扫码;
- 手机(iOS/Android):App Store / Play 商店装 Tailscale 免费版;
- 其他 Linux:同 VPS 命令。
装完所有设备扫码进同一个 tailnet,验证:
tailscale ping vps-main # 在笔记本上
tailscale ip -4 vps-main # 拿到它的 100.x.y.z 内网地址
看到类似 100.88.12.45 的 CGNAT 地址即代表隧道通了。
三、三种"私网访问"姿势,按需选
姿势 1:SSH 走 tailnet(最常用)
# 方法 A:Tailscale 内置 SSH(无需 sshd 开端口)
tailscale ssh vps-main
# 方法 B:普通 ssh,解析内网地址
ssh user@100.88.12.45
配 ~/.ssh/config 一劳永逸:
Host vps
HostName 100.88.12.45
User root
IdentityFile ~/.ssh/id_ed25519
以后只要 ssh vps。
姿势 2:直接访问 HTTP 服务(面板/备份/API)
# 假设 VPS 上有 Docker 面板监听 8080,无需 nginx/公网域名
http://100.88.12.45:8080
安全提示:tailnet 内是明文内网环境,但 Tailscale 的整个流量仍走 WireGuard 加密隧道(AES-GCM),所以 http://100.x.y.z 在传输层依然是加密的,不必强制 HTTPS。
姿势 3:反向暴露到公网(可选,谨慎)
某些服务(如 webhook 回调、webhook 给 GitHub)必须公网可达,这时才用 Tailscale 的 Funnel 或传统反代:
# 仅对指定服务开启 Funnel(带 HTTPS + 自动证书)
sudo tailscale funnel 8080
# 域名形式(需绑定已验证域名)
sudo tailscale funnel --bg http://vps-main:8080
原则:默认不 Funnel。能走 tailnet 的走 tailnet,只有"外部系统必须主动连你"时才开 Funnel。
四、把"老服务"也塞进内网:双栈技巧
很多 VPS 服务(老 Docker 容器、本地数据库)只监听 127.0.0.1:3306 或 0.0.0.0:8080,不想改配置?两个办法:
办法 A:tailscale serve(官方方案,不改服务)
# 把本地 8080 挂到 tailnet 的 100.x.y.z:8443(自动 HTTPS)
sudo tailscale serve 8443 127.0.0.1:8080
# 指定自定义后端
sudo tailscale serve --bg https://127.0.0.1:8080
tailscale serve 会自动处理:
- WireGuard 隧道内的 TLS 终结(用 MagicDNS 自带证书);
- 后端是
127.0.0.1也没关系,因为流量是从 VPS 本机 loopback 进入的,不经过公网; - 一条命令撤销:
sudo tailscale serve --https=off。
办法 B:iptables/nftables 重定向(高级)
如果你坚持不装 tailscale serve,可以用 nftables 把到 100.88.12.45:8080 的包重定向到本地 127.0.0.1:8080:
table inet tailnet_redirect {
chain prerouting {
type nat prerouting;
ip daddr 100.88.12.45 tcp dport 8080 redirect to port 8080
}
}
实测
tailscale serve更省心,nftables 方案仅在"服务必须在 0.0.0.0 上监听、且想暴露 100.x.y.z 的固定端口"时用。
五、IPv6-only VPS 的"兜底":Derp 中继
理想情况:VPS 有 IPv6 出口,本地也有 IPv6 互通 → 走直连 WireGuard,延迟 ~20–40ms(同区)。
现实情况:家庭宽带的 IPv6 经常是 CGNAT(IPv6 也有 NAT 的厂商,如部分运营商),或者运营商屏蔽了 ICMPv6 ping,导致"有地址但 ping 不通"。
Tailscale 的 Derp 中继就是为此设计的:
# 查看当前走直连还是中继
tailscale status
# 输出里:vps-main 100.88.12.45 直连(direct)✅
# 或: vps-main 100.88.12.45 中继 via derp1(relay)⚠️
# 手动测试某 Derp 节点延迟
tailscale ping --derp derp-ams-1
经验值(实测):
| 模式 | 延迟 | 出口流量成本 |
|---|---|---|
| 直连(IPv6 互通) | 20–40ms | 0(tailnet 内免费) |
| 经 Derp 中继(欧洲→亚洲) | 80–150ms | 仍 0(走 Tailscale 基础设施,你不出账) |
| 经 Derp 中继(同区) | 30–60ms | 0 |
关键点:即使走 Derp 中继,你的 VPS 账单也不会多花 1 分钱——Derp 是 Tailscale 官方维护的免费中继,你只是"过路",流量从 VPS 进 → 加密 → 出到 Derp → 进你设备。VPS 的出口流量是 VPS→Derp(通常 VPS 有免费额度,超额才计费),比"公网 IP 被人随便 curl"安全且便宜。
六、成本控制清单:怎么把它当"省钱工具"用
Tailscale 免费版(2026 年现状):
- 100 台设备 / 3 人 免费;
- 无出口流量费(走 Tailscale 网络);
- 单节点 4 线程 WireGuard 够用。
省钱动作清单:
- 关掉 VPS 公网 IPv4 附加费:如果 VPS 商允许"只用 IPv6 + 不分配公网 IPv4",配置里去掉
public_ipv4=true,省 $1–2/月; iptables/nftables彻底封 22 端口公网入站(Tailscale 内网 SSH 替代后):sudo nft add rule inet filter input iif != lo tcp dport 22 drop- 备份走 tailnet:
restic/rsync从 VPS 推备份到家里 NAS(100.x.y.z),不烧公网出口; - Docker 拉镜像走 tailnet 内网 registry(如果你自建了):
registry.local:5000走 tailnet,省 CDN 回源费; - 监控走 tailnet:Prometheus/Alertmanager 拉指标走 100.x.y.z,不占公网带宽。
实测月度对比(1C1G IPv6-only VPS):
| 项目 | 改造前 | 改造后 | 月省 |
|---|---|---|---|
| 公网 IPv4 附加费 | $2.0 | $0 | $2.0 |
| 出口流量(公网访问 + API) | ~8GB → $0.4–0.8 | ~0.5GB → $0 | $0.4–0.8 |
| 22 端口被扫/爆破风险 | 高 | 0 | 定性 |
| 合计 | ~$2.4–2.8/月 | ~0 | $2.4–2.8/月 |
七、常见坑 & 排查
坑 1:tailscale status 显示所有节点都是 “relay”
→ 本机/VPS 有一边 IPv6 是 CGNAT。用 curl -6 ifconfig.me 确认出口。如果两边都是 CGNAT,只能走 Derp(延迟升 50–100ms,仍免费);至少一边能直连就 OK。
坑 2:tailscale serve 8443 127.0.0.1:8080 后本地能访问,远程设备不行
→ 检查 tailscale status 里该服务是否绑定到"该 VPS 的 100.x.y.z"。tailscale serve --https=off 重启一遍。
坑 3:手机 App 连不上 → 手机 App 和电脑必须在同一个 Tailscale 账号下。免费版个人账号跨设备 100 台上限,超过要升级或分账号。
坑 4:VPS 重启后 Tailscale 服务没起来
→ systemctl status tailscaled,通常 systemd 已 auto-enable;若没起来:sudo systemctl enable --now tailscaled。
坑 5:想用域名 + HTTPS 走 tailnet(给浏览器用)
→ tailscale serve 会自动在 svc-name.tailnet-xxx.ts.net 上发 TLS 证书(MagicDNS),浏览器直接开就行,不需要自己配 nginx + Let’s Encrypt。
结语
Tailscale 把"内网穿透"这件事从配置地狱(frp/蒲公英/向日葵/自建 WireGuard 服务器)变成了装个 App + 扫个码。
对 VPS 用户,它的真实价值不是"方便",而是省钱 + 安全:
- 省:不交公网 IPv4 附加费,出口流量趋近 0;
- 安:入站端口归零,爆破/扫描/误操作访问全挡在门外;
- 快:2 分钟部署,零配置文件。
一句话总结:IPv6 时代,别再为"怎么访问自己 VPS"花 1 分钱——装 Tailscale,扫码,ssh vps 走起。
附:完整最小部署脚本(VPS 端)
#!/usr/bin/env bash
# setup-tailscale-ipv6-vps.sh
# 用法:curl -fsSL https://example.com/setup.sh | bash
set -euo pipefail
if ! command -v tailscale &>/dev/null; then
curl -fsSL https://tailscale.com/install.sh | sh
fi
sudo tailscale up --ssh --hostname=vps-main
# 验证
sleep 3
tailscale status | head -5
echo "✅ Tailscale 已启动。在其他设备扫码后执行:tailscale ping vps-main"
本文基于 2026-11 实测:Tailscale v1.78+,Linux 内核 6.x,1C1G IPv6-only VPS(Vultr 东京节点,$2/月 档),家庭宽带(IPv6 CGNAT)。
