背景
一直有使用tailscale,在外访问家里的nas都很方便。后来在看资料时,发现可以用tailscale打通两个lan之间的site to site互访,lan内的non-tailscale设备(没安装tailscale)也可以直接访问另一个lan内的non-tailscale设备。
简单来说,其实就是在每个lan中找一台设备安装tailscale,用来承载vpn(跨lan)流量,其它non-tailscale设备就是通过它来访问另一个lan的设备。
刚才好手头上也有环境,决定测试部署一下。
测试环境
- LAN1, 192.168.100.0/24, tailscale设备:ubuntu(虚拟机), IP:192.168.100.201
- LAN2, 192.168.101.0/24, tailscale设备:Netgear WNDR4300,刷openwrt 22.03.5, IP:192.168.101.201
部署tailscale
LAN1:ubuntu安装tailscale
linux安装很简单,就一行命令,更详细的可以看官方资料:https://tailscale.com/download/linux
curl -fsSL https://tailscale.com/install.sh | sh
LAN1:配置并运行
启用ip forward功能
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
启动tailscale
tailscale up --advertise-routes=192.168.100.0/24 --accept-routes --snat-subnet-routes=false
- –advertise-routes=192.168.100.0/24, 公告本节点代理的路由网段(网段信息以实际为准)。
- –accept-routes, 接受其它节点公告的路由信息
- –snat-subnet-routes=false, 通过本节点访问局域网设备时,不做源地址转换,默认为true
如果是首次运行,会提示先验证登录;需要在浏览器中打开指定URL。

LAN1:Approvers路由信息
在启动时公告了路由信息后,还需要在machines page中确认启用,console的machines page

节点公告了代理路由网段,但没在console启用,subnets旁边会有叹号

点击节点最后的三个点点“…”,选择“Edit route settings…”,启用公告的网段

启用后subnets旁边的叹号就会消失
LAN2:openwrt安装tailscale
openwrt可以通过opkg安装,如果是22.03及之后的版本,还需要安装iptables-nft,否则会运行失败
opkg update
opkg install tailscale
opkg install iptables-nft
LAN2:配置并运行
启动方式与ubuntu的类似,只是openwrt 22.03及之后的版本,要增加–netfilter-mode=off参数
tailscale up --advertise-routes=192.168.101.0/24 --accept-routes --snat-subnet-routes=false --netfilter-mode=off
还需要在luci添加接口和防火墙规则
添加接口:Network → Interfaces → Add new interface
- Name: tailscale
- Protocol: Unmanaged
- Device: tailscale0
添加防火墙规则:Network → Firewall → Zones → Add
- Name: tailscale
- Input: ACCEPT (default)
- Output: ACCEPT (default)
- Forward: ACCEPT
- Masquerading: on
- MSS Clamping: on
- Covered networks: tailscale
- Allow forward to destination zones: Select your LAN
- Allow forward from source zones: Select your LAN
LAN2:Approvers路由信息
与LAN1一样,参考:LAN1:Approvers路由信息
non-tailscale设备配置
在non-tailscale设备,只需要添加对应的静态路由就可以
LAN1 non-tailscale设备配置
#linux
ip route add 100.64.0.0/10 via 192.168.100.201 #此为tailscale vpn的网段
ip route add 192.168.101.0/24 via 192.168.100.201 #此为LAN2的网段
#windows
route add 100.64.0.0 mask 255.192.0.0 192.168.100.201 #此为tailscale vpn的网段
route add 192.168.101.0 mask 255.255.255.0 192.168.100.201 #此为LAN2的网段
LAN2 non-tailscale设备配置
#linux
ip route add 100.64.0.0/10 via 192.168.100.201 #此为tailscale vpn的网段
ip route add 192.168.100.0/24 via 192.168.100.201 #此为LAN1的网段
#windows
route add 100.64.0.0 mask 255.192.0.0 192.168.100.201 #此为tailscale vpn的网段
route add 192.168.100.0 mask 255.255.255.0 192.168.100.201 #此为LAN1的网段
连通测试
直接从LAN1的non-tailscale设备ping去LAN2的non-tailscale设备

可以ping通,测试成功。
其它问题
通过dhcp为客户端下发静态路由
所有要跨lan访问的non-tailscale设备,都要添加对应的静态路由,如果逐一在各客户端上操作会十分麻烦,这个可以通过dhcp解决。
dhcp中的option 121,可以为dhcp客户端添加静态路由。格式:121,目标网络/掩码,网关
以下是我在openwrt的配置,供参考:

openwrt下为tailscale配置接口后,ip消失
在openwrt安装并启动tailscale后,还要添加对应的接口,协议为“Unmanaged”。添加这个接口后,有可能会出现系统内tailscale的ip消失的情况,但实际上,从admin console查看,这个设备还是在tailscale的网络中的。
如果出现这种情况,可以把tailscale接口的协议改为静态,手动把tailscale的ip配上(可以在console上确认ip),掩码需要写为10位。
我自己在测试过程中,也出现过很多次这种情况。后来不知怎样,终于在配置接口协议为“Unmanaged”,ip也没有消失。
这个问题解决方法暂时未明确。
iptables配置
在官方的配置指引文档中,还需要配置iptables,配置命令如下:
iptables -t mangle -A FORWARD -i tailscale0 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
根据指引说明,就是把最大分段大小限制在mtu的大小之内。
我在测试部署中没有配置这项,目前使用暂没影响。
發佈留言