家里的树莓派5上运行了一台iStoreOS旁路由,并且已经安装了Tailscale。
在外面通过Tailscale访问iStoreOS本身一直没有问题,但是只能访问它的Tailscale IP,无法继续访问家里的主路由和其他局域网设备。
我的网络环境是:
|
1 2 3 4 5 |
家庭局域网:192.168.110.0/24 主路由:192.168.110.1 iStoreOS旁路由:192.168.110.54 iStoreOS Tailscale IP:100.x.x.x |
最开始的访问方式只能是:
|
1 2 3 4 5 6 7 |
外部设备 │ │ Tailscale ▼ iStoreOS 100.x.x.x |
最终想实现的是:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
外部设备 │ │ Tailscale ▼ iStoreOS旁路由 192.168.110.54 │ │ 家庭局域网 ├── 主路由:192.168.110.1 ├── NAS ├── Home Assistant └── 其他局域网设备 |
这个功能在Tailscale中叫作:
|
1 2 3 |
Subnet Router 子网路由器 |
简单来说,就是让iStoreOS告诉其他Tailscale设备:
访问192.168.110.0/24网段的流量,都可以交给我转发。
下面记录一下完整配置过程。
1. 检查IPv4转发
首先通过SSH登录iStoreOS:
|
1 2 |
ssh root@192.168.110.54 |
检查内核是否已经开启IPv4转发:
|
1 2 |
sysctl net.ipv4.ip_forward |
我这里返回:
|
1 2 |
net.ipv4.ip_forward = 1 |
说明已经开启,不需要继续修改。
如果返回的是:
|
1 2 |
net.ipv4.ip_forward = 0 |
可以临时开启:
|
1 2 |
sysctl -w net.ipv4.ip_forward=1 |
然后创建持久配置:
|
1 2 3 4 |
cat >/etc/sysctl.d/99-tailscale.conf <<'EOF' net.ipv4.ip_forward = 1 EOF |
应用配置:
|
1 2 |
sysctl -p /etc/sysctl.d/99-tailscale.conf |
Linux设备作为Tailscale子网路由器时,需要开启IP forwarding。(Tailscale)
2. 广播家庭局域网路由
我的家庭局域网是:
|
1 2 |
192.168.110.0/24 |
因此在iStoreOS中执行:
|
1 2 |
tailscale set --advertise-routes=192.168.110.0/24 |
命令没有任何输出,也没有报错。
这里不要只广播主路由的单个地址:
|
1 2 |
192.168.110.1/32 |
直接广播整个:
|
1 2 |
192.168.110.0/24 |
以后除了主路由,还可以访问NAS、打印机、Home Assistant以及其他局域网设备。
3. 在Tailscale后台批准子网路由
只在iStoreOS中执行--advertise-routes还不够,还需要登录Tailscale管理后台批准这条路由。
进入:
|
1 2 3 4 5 6 |
Tailscale管理后台 → Machines → 找到iStoreOS → 右侧三个点 → Edit route settings |
勾选:
|
1 2 |
192.168.110.0/24 |
然后保存。
如果使用了自动批准策略,这一步可能已经自动完成;普通配置下,需要管理员在Machines页面手动批准。(Tailscale)
4. 检查子网路由状态
可以用JSON状态进行检查:
|
1 2 |
tailscale status --json | grep -A5 -B5 '192.168.110' |
我这里看到:
|
1 2 3 4 5 6 7 8 9 |
"AllowedIPs": [ "100.x.x.x/32", "fd7a:115c:a1e0::xxxx:xxxx/128", "192.168.110.0/24" ], "PrimaryRoutes": [ "192.168.110.0/24" ] |
关键是:
|
1 2 3 4 |
"AllowedIPs": [ "192.168.110.0/24" ] |
以及:
|
1 2 3 4 |
"PrimaryRoutes": [ "192.168.110.0/24" ] |
说明192.168.110.0/24已经出现在当前节点的允许路由中,并且已经被选为生效的主要子网路由。
也可以执行:
|
1 2 |
tailscale debug prefs |
查找:
|
1 2 |
AdvertiseRoutes |
或者直接过滤:
|
1 2 |
tailscale debug prefs | grep -E 'AdvertiseRoutes|NoSNAT|RouteAll' |
正常应该能看到正在广播的:
|
1 2 |
192.168.110.0/24 |
5. 从外部网络测试
测试时不要连接家里的Wi-Fi。
最好让手机关闭Wi-Fi,直接使用移动数据;电脑则可以连接手机热点。
首先确认能够访问iStoreOS的Tailscale IP:
|
1 2 |
tailscale ping 100.x.x.x |
然后测试主路由:
|
1 2 |
ping 192.168.110.1 |
浏览器打开:
|
1 2 |
http://192.168.110.1 |
如果主路由使用HTTPS:
|
1 2 |
https://192.168.110.1 |
也可以使用curl测试:
|
1 2 |
curl -v --connect-timeout 5 http://192.168.110.1 |
或者:
|
1 2 |
curl -vk --connect-timeout 5 https://192.168.110.1 |
配置完成后,我已经可以通过外部网络直接打开:
|
1 2 |
192.168.110.1 |
也就是家里的主路由管理页面。
之后访问其他局域网设备,同样直接使用它们原来的局域网地址即可。
6. Linux客户端需要接受子网路由
macOS、Windows、iOS和Android通常会自动使用已经批准的Tailscale子网路由。
如果正在使用的客户端是Linux,默认可能不会接受其他节点广播的子网路由,需要执行:
|
1 2 |
sudo tailscale set --accept-routes=true |
检查设置:
|
1 2 |
tailscale debug prefs | grep RouteAll |
在官方文档中,Android、iOS、macOS和Windows默认接受子网路由,而Linux通常需要手动启用--accept-routes。(Tailscale)
7. 检查iStoreOS本地访问
如果配置后还是不能访问主路由,先确认iStoreOS自己能不能访问,在iStoreOS上运行:
|
1 2 |
ip route get 192.168.110.1 |
正常应该类似:
|
1 2 |
192.168.110.1 dev br-lan src 192.168.110.54 |
测试连通性:
|
1 2 |
ping -c 4 192.168.110.1 |
测试管理页面:
|
1 2 |
curl -v --connect-timeout 5 http://192.168.110.1 |
如果iStoreOS自己都无法访问192.168.110.1,问题就不是Tailscale,而是本地接口、路由或者主路由管理页面的访问限制。
8. 检查iStoreOS防火墙
如果iStoreOS自己能访问主路由,但是远程设备不能访问,需要检查tailscale0到LAN的转发。
先查看现有配置:
|
1 2 |
ip -br addr show tailscale0 |
|
1 2 |
uci show network | grep -i tailscale |
|
1 2 |
uci show firewall | grep -i -E 'tailscale|ts_' |
|
1 2 |
nft list ruleset | grep -i -C3 tailscale |
如果系统中没有对应的网络接口和防火墙区域,可以先备份配置:
|
1 2 3 4 5 6 |
cp /etc/config/network \ "/etc/config/network.bak.$(date +%Y%m%d-%H%M%S)" cp /etc/config/firewall \ "/etc/config/firewall.bak.$(date +%Y%m%d-%H%M%S)" |
创建tailscale0逻辑接口:
|
1 2 3 4 5 |
uci set network.tailscale='interface' uci set network.tailscale.proto='none' uci set network.tailscale.device='tailscale0' uci commit network |
创建防火墙区域:
|
1 2 3 4 5 6 7 |
uci set firewall.tailscale='zone' uci set firewall.tailscale.name='tailscale' uci add_list firewall.tailscale.network='tailscale' uci set firewall.tailscale.input='ACCEPT' uci set firewall.tailscale.output='ACCEPT' uci set firewall.tailscale.forward='ACCEPT' |
允许转发到LAN:
|
1 2 3 4 |
uci set firewall.tailscale_to_lan='forwarding' uci set firewall.tailscale_to_lan.src='tailscale' uci set firewall.tailscale_to_lan.dest='lan' |
保存并重启:
|
1 2 3 4 |
uci commit firewall /etc/init.d/network reload /etc/init.d/firewall restart |
检查防火墙配置:
|
1 2 |
fw4 check |
|
1 2 3 4 |
uci show network.tailscale uci show firewall.tailscale uci show firewall.tailscale_to_lan |
正常应该包含:
|
1 2 3 4 5 |
network.tailscale.device='tailscale0' firewall.tailscale.name='tailscale' firewall.tailscale_to_lan.src='tailscale' firewall.tailscale_to_lan.dest='lan' |
如果系统安装Tailscale时已经自动创建了相关规则,就不要重复添加,只需要确认现有规则允许tailscale0 → lan转发。
9. 使用tcpdump抓包排查
如果看配置仍然无法确定问题,可以直接抓包。
在iStoreOS中执行:
|
1 2 3 |
tcpdump -ni tailscale0 \ 'host 192.168.110.1 and (icmp or tcp port 80 or tcp port 443)' |
保持运行,然后从外部设备访问:
|
1 2 |
http://192.168.110.1 |
如果tailscale0能看到请求,再打开另一个SSH窗口:
|
1 2 3 |
tcpdump -ni br-lan \ 'host 192.168.110.1 and (icmp or tcp port 80 or tcp port 443)' |
可以根据抓包结果判断:
9.1 tailscale0完全没有流量
可能原因:
- 子网路由没有在后台批准;
- 客户端没有接受子网路由;
Tailscale ACL不允许访问该网段;- 外部网络和家庭网络使用了相同网段。
9.2 tailscale0有流量,br-lan没有流量
说明请求已经到达iStoreOS,但是没有转发到家庭局域网。
重点检查:
|
1 2 3 4 |
IPv4 forwarding iStoreOS防火墙 tailscale0到lan的转发规则 |
9.3 br-lan有请求,但是没有响应
说明请求已经发送给主路由,但是主路由没有返回。
可能是:
- 主路由管理页面端口不是
80或443; - 主路由禁用了
Ping; - 主路由限制了管理页面来源;
- 主路由自身防火墙阻止了访问。
9.4 请求和响应都有,但客户端打不开
继续检查:
- 客户端路由;
Tailscale ACL;- 外部网络与家庭网段冲突;
MTU问题;- 浏览器是否自动跳转到了其他域名或端口。
10. 注意外部网络的网段冲突
我的家庭网络是:
|
1 2 |
192.168.110.0/24 |
假如外面的酒店、公司或者其他Wi-Fi也使用:
|
1 2 |
192.168.110.0/24 |
客户端可能会认为192.168.110.1就在当前本地网络中,而不会把流量交给Tailscale。
所以排障时最好先使用手机移动数据测试。
如果手机流量可以访问,某个Wi-Fi下不能访问,通常就是路由优先级或者网段重叠问题。Tailscale官方也将重叠子网和本地网络路由选择列为局域网访问失败的常见排查方向。(Tailscale)
11. 主路由不需要添加静态路由
默认情况下,Tailscale会对经过子网路由器的流量执行SNAT。
因此主路由看到的请求来源通常不是远程设备的100.x.x.x地址,而是:
|
1 2 |
192.168.110.54 |
也就是iStoreOS自己的局域网地址。
返回流量会直接发送给iStoreOS,然后再由Tailscale返回远程设备,所以主路由一般不需要添加静态路由。Tailscale默认会对经过子网路由器的流量执行源地址转换,这样可以简化返回路由配置。(Tailscale)
不要随便执行:
|
1 2 |
tailscale set --snat-subnet-routes=false |
关闭SNAT后,局域网设备可以看到远程客户端的真实来源地址,但是主路由和其他设备必须知道如何把100.64.0.0/10的返回流量发送给iStoreOS。
对于普通家庭远程访问场景,保持默认设置最简单。
12. 最终配置
我的最终网络结构是:
|
1 2 3 4 5 6 7 |
主路由:192.168.110.1 iStoreOS:192.168.110.54 家庭网段:192.168.110.0/24 IPv4转发:开启 Tailscale子网路由:192.168.110.0/24 子网SNAT:保持默认开启 |
核心命令其实只有:
|
1 2 |
sysctl net.ipv4.ip_forward |
确认返回:
|
1 2 |
net.ipv4.ip_forward = 1 |
然后广播家庭网段:
|
1 2 |
tailscale set --advertise-routes=192.168.110.0/24 |
进入Tailscale管理后台批准:
|
1 2 |
192.168.110.0/24 |
最后检查:
|
1 2 |
tailscale status --json | grep -A5 -B5 '192.168.110' |
看到:
|
1 2 3 4 5 6 7 |
"AllowedIPs": [ "192.168.110.0/24" ], "PrimaryRoutes": [ "192.168.110.0/24" ] |
配置完成后,通过Tailscale连接家里的iStoreOS,就可以继续访问:
|
1 2 3 4 |
主路由:192.168.110.1 iStoreOS:192.168.110.54 其他家庭局域网设备:192.168.110.x |
13. 总结
之前只安装Tailscale时,每台安装了客户端的设备只能通过各自的100.x.x.x地址互相访问。
主路由、NAS和其他没有安装Tailscale的设备,仍然无法直接访问。
把iStoreOS配置成子网路由器之后,它相当于在Tailscale网络和家庭局域网之间搭了一座桥:
|
1 2 3 4 5 6 7 8 |
Tailscale远程设备 │ ▼ iStoreOS子网路由器 │ ▼ 192.168.110.0/24家庭局域网 |
整个过程不需要在主路由上安装Tailscale,也不需要修改主路由默认网关。
只需要:
|
1 2 3 4 5 |
开启IPv4转发 广播家庭局域网 在后台批准子网路由 确认防火墙允许转发 |
就可以在外面直接使用原来的局域网IP访问家中设备了。
对于已经长期运行的iStoreOS旁路由来说,让它顺便承担Tailscale Subnet Router还是非常方便的,记录一下,给遇到同样问题的朋友做个参考~

![[mcj]Ubuntu16.04安装NVIDIA驱动+CUDA10.1+cudnn7.5.0附详细步骤-马春杰杰](https://ypyssl.machunjie.com/machunjie/20210408222433.png_machunjie.png)



最新评论
牛牛牛
同样
站长您好,亚马逊云咨询推广资源,望建立联系,可邮件,谢谢。
换友情链接吗?
看你的站做的挺不错的
恭喜!!太强了,硕博连读啊
雁过留毛,人过留名。
看不懂但大受震撼