前言:为什么你需要“子网路由”?
如果你玩 HomeLab,肯定遇到过这种尴尬场景: 你人在外面,手机连着 Tailscale,可以轻松访问安装了 Tailscale 的 PVE 或电脑。但是,你突然需要访问家里的群晖 NAS、打印机、光猫后台,或者一个不支持安装 Tailscale 的智能家居网关。
难道要给家里几十个设备一个个装上 Tailscale 吗?(有的根本装不了)。
完全不需要。 你只需要利用 Tailscale 的 Subnet Router(子网路由) 功能。简单来说,就是把你的 PVE 当作一个“跳板”或“网关”。只要连上了 PVE,就等于连上了你家里的整个局域网。
这就叫:一人得道(PVE 装了),鸡犬升天(全家设备都能访问)。
下面是详细的三步操作指南。
第一步:开启 Linux 内核流量转发
默认情况下,Linux 出于安全考虑,是不帮忙转发数据的(它只处理发给它自己的包)。既然我们要把 PVE 当路由器用,就必须开启这个功能。
在 PVE 的 Shell(命令行)中执行以下命令(直接复制粘贴即可):
# 1. 开启 IPv4 和 IPv6 的转发功能,并写入配置文件实现永久生效
echo 'net.ipv4.ip_forward = 1' | tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | tee -a /etc/sysctl.d/99-tailscale.conf
# 以下命令lxc debian需要设置,意思:“虽然我要当路由器转发流量,但我也要听上级路由器的指挥,此外想要ipv6,路由器和lxc都需要使用SLAAC,01.21.2026
echo "net.ipv6.conf.eth0.accept_ra = 2" | tee -a /etc/sysctl.d/99-tailscale.conf
echo "net.ipv6.conf.all.accept_ra = 2" | tee -a /etc/sysctl.d/99-tailscale.conf
# 2. 让配置立即生效,无需重启
sysctl -p /etc/sysctl.d/99-tailscale.conf
原理: 这几行命令告诉 Linux 内核:“如果有数据包迷路了来问你,别把它丢掉,帮它转发到正确的地方去。”
第二步:广播你的内网网段
假设你家里的局域网 IP 段是 192.168.0.x(比如你的路由器是 192.168.0.1,PVE 是 192.168.0.15)。那么你的网段表示为 192.168.0.0/24。
我们需要告诉 Tailscale 官方服务器:“嘿,凡是找 192.168.0.x 的数据,都发给我这台 PVE,我来搞定。”
运行以下命令:
tailscale up --advertise-exit-node --accept-routes --advertise-routes=192.168.0.0/24
- 注意:如果你的内网是
192.168.1.x,请把命令里的0改成1。 --advertise-exit-node参数让 PVE 成为出口节点,其他设备可以通过它访问互联网。- 如果你只需要访问内网设备,不需要通过 PVE 上网,可以去掉
--advertise-exit-node参数,只使用:tailscale up --accept-routes --advertise-routes=192.168.0.0/24
- 如果你只需要访问内网设备,不需要通过 PVE 上网,可以去掉
- 运行后,如果系统没有报错,通常是静默成功的;有时会提示重新认证 URL,点进去登录一下即可。
第三步:在网页控制台“批准”路由(最关键!)
很多新手卡在这里:我在命令行明明敲了命令,为什么还是通不了? 因为出于安全机制,Tailscale 官方后台默认是不信任这种路由广播的,你必须手动去点一下“同意”。
- 打开 Tailscale 管理面板:https://login.tailscale.com/admin/machines
- 找到你的 pve 设备。
- 点击设备最右侧的 三个点图标 (…) -> 选择 Edit route settings。
- 你会看到
192.168.0.0/24出现在列表中,状态是灰色的。点击开关启用它。 - (可选)如果你使用了
--advertise-exit-node参数,你还会看到 “Use as exit node”(作为出口节点)选项,也需要启用它。如果不需要出口节点功能,可以跳过这一步。 - 保存(Save)。
关于出口节点的使用:
- 出口节点是可选功能,仅在你需要通过 PVE 访问互联网时才需要配置。
- 启用出口节点后,其他设备(如手机、电脑)想要使用 PVE 作为网络出口时,需要在各自设备的 Tailscale 客户端中手动选择这个出口节点。
- 以手机为例:打开 Tailscale App → 点击右上角的 三个点 → 选择 Use exit node → 选择你的 pve 设备。
- 这样,你的手机就可以通过 PVE 的网络访问互联网了(相当于人在外面,网络却是从家里出去的)。
🎉 见证奇迹的时刻
现在,让我们验证一下效果。
- 拿起你的手机。
- 关闭 WiFi,切换到 4G/5G 流量(模拟你在外面的环境)。
- 确保手机上的 Tailscale App 是 Connected(已连接) 状态。
- 打开手机浏览器,直接输入你家里的路由器 IP(例如
192.168.0.1)或者NAS IP。
结果: 你应该能丝般顺滑地打开路由器的登录界面,就像你此时此刻正坐在家里的沙发上一样。
💡 进阶小知识:为什么不需要设置静态路由?
懂网络的朋友可能会问:“不需要在我家主路由器上写静态路由,告诉它回程走 PVE 吗?”
答案是:不需要。
Tailscale 默认开启了 SNAT(源地址伪装)。 当手机访问 NAS 时,PVE 会把数据包的“发送者”伪装成 PVE 自己(192.168.0.15)。NAS 收到请求后,以为是 PVE 找它,就会直接把数据回传给 PVE,然后 PVE 再转回给手机。
这是一套开箱即用、对原有网络架构零侵入的完美方案。
Troubleshooting(常见问题):
如果你在配置时看到了关于 UDP GRO forwarding 的警告,别慌,那只是性能优化建议。你可以通过 ethtool 命令开启它来获得更快的传输速度,但这不影响基本功能的连通性。
cat <<EOF > /etc/systemd/system/tailscale-eth-fix.service
[Unit]
Description=Tailscale UDP Optimization
After=network.target
[Service]
Type=oneshot
# 尝试两种常见路径,前面加 - 表示如果找不到命令也不报错,继续下一行
ExecStart=-/usr/sbin/ethtool -K eth0 rx-udp-gro-forwarding on rx-gro-list off
ExecStart=-/sbin/ethtool -K eth0 rx-udp-gro-forwarding on rx-gro-list off
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl restart tailscale-eth-fix.service
systemctl status tailscale-eth-fix.service
希望这篇教程能帮你打通回家的“最后的一公里”!如果有问题,欢迎评论区交流。
Leave a comment