分享

使用tailscale打通两个Lan之间互访(VPN)

背景

一直有使用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的大小之内。

我在测试部署中没有配置这项,目前使用暂没影响。

参考资料

發佈留言