之前给大家介绍过tailscale的基础用法,通过tailscale基础的虚拟组网功能,实现一个vpn网络。
组网成功后,每一个节点都可以分配到一个虚拟ip,通过虚拟ip就可以让网络中的设备实现点对点的互联,从而实现内网穿透。
但是tailscale能做到的远远不仅如此,它可以实现更加高级的功能,这些高级功能非常实用,对我来说不能没有的功能。
不看完亏死不负责,实现这些功能后你会感叹tailscale的强大。
哪些高级功能
今天要给大家介绍的第一个是route功能,在之前的视频中有提到,通过虚拟路由实现通过一个节点访问到节点所在局域网的所有内网设备。
第二个是通过openwrt实现局域网里所有的设备都可以访问到节点能够访问的虚拟设备,实现整个局域网访问虚拟网络,而不是让所有的设备都加入虚拟网络。
第三个是通过exit-node出口节点功能实现设备的异地出口访问,让设备可以通过指定节点作为出口进行上网,比如科学上网功能,实现全局的代理功能。
继续观看提示
1、因为具体的配置要根据你的网络情况来决定,我下面会给出案例配置命令,但是千万不要直接复制,因为复制了过去配置出来肯定是错误的,你的网络不可能跟我的一模一样。
开始讲之前我先跟大家解释一下为什么这个视频的主要内容是讲解,而不是演示。
大家只要明白了这其中的原理,就很容易实现了,具体的配置就是几条命令。
2、在继续观看该视频之前请先观看我之前的tailscale篇,能够基本的使用tailscale。
至于derp篇,绝大部分人并不需要自行搭建,如果你不知道是否需要搭建那你肯定不需要搭建。
而headscale是tailscale的开源版,同样不是必须的,用tailscale就足够了,需要的人自然知道自己需要。
3、所有作为出入口或者路由节点使用的设备都需要开启转发,如果你设置好了功能但是无法成功访问的话就在对应节点上打开他们
。
echo 'net.ipv4.ip_forward = 1' | tee /etc/sysctl.d/ipforwarding.conf
echo 'net.ipv6.conf.all.forwarding = 1' | tee -a /etc/sysctl.d/ipforwarding.conf
sysctl -p /etc/sysctl.d/ipforwarding.conf
现在我们去实现它们
1、路由功能
route
这是两个局域网,a,b
现在设备A1要想访问B1,第一个方法是让这两台设备都加入虚拟网络,这也是tailscale等组网工具的基本功能。
加入虚拟网络后,通过tailscale的后台可以看到两台设备都会获取到虚拟ip,这个ip是tailscale给分配的,这两台设备通过虚拟ip可以实现访问。
现在A1也要访问B2,我们怎么办呢,是不是可以再让设备B2也加入虚拟局域网,同样通过虚拟ip可以访问。
那设备更多呢,是不是每台都要加入虚拟网络,这样不仅麻烦,还要你管理每台设备的虚拟ip,非常不方便。
更好的方案是我们去B网络中找一台不关机的设备B3,让他加入虚拟局域网,然后让他声明advertise-route=192.168.2.0/24。
tailscale up --advertise-route=192.168.2.0/24 --accept-routes=true --accept-dns=false
# 后面两个参数另有他用
意思是我可以作为192.168.2.0段的路由,为访问本局域网的请求做数据转发。
去tailscale后台,对设备B3的声明做许可
现在,任何加入虚拟局域网的设备,只要开启use tailscale subnet,就可以直接访问到B2段中所有的设备,访问的ip就是他们的内网ip,192.168.2.x
在windows客户端上勾选subnets
这是如何实现的呢,一旦做完上面的操作,在所有加入虚拟网的设备都会获得一条route信息,让所有需要访问192.168.2.0的数据都通过设备B3来进行转发
这就实现了我们说的第一个虚拟路由功能。
2、局网穿透openwrt
我们实现了通过虚拟路由让所有的节点都可以通过内网ip访问到B网络的设备了
但是别忘了A网络里也有很多的设备,他们都想可以直接访问B网络的设备怎么办呢
我们也要一台台的把设备加到虚拟网络中么,太麻烦了啊
这时候就需要一台软路由了,让路由器A加入虚拟局域网,而且要accept-routes
tailscale up --accept-routes=true --accept-dns=false
# 后面你会看到,我们实际上也要执行下面的命令,让路由器A同时实现设备B3的功能
# 从而让路由器A即为网络b提供访问a网络的转发,又为网络a的设备提供到网络b的转发
# tailscale up --advertise-route=192.168.1.0/24 --accept-routes=true --accept-dns=false
这样,这台openwrt路由器就可以为通过这台路由上网的所有设备提供穿透服务了,这个路由器下面的所有设备都可以直接访问整个虚拟局域网里的资源了,现在的网络环境来说就是可以访问到b网络的所有设备。
如果你的主路由器不是openwrt怎么办,无法安装tailscale,也可以用旁路由,在主路由A上修改dhcp下发默认路由从192.168.1.1修改为192.168.1.2,这样a网络中所有设备自动获取ip的时候获取到的默认路由就是192.168.1.2,当然你可以通过设置静态地址,手动修改设备A1,A2的默认路由为192.168.1.2实现同样的功能。
这样就完成了
你可能已经想到了,如果b网络的b或者B3也是openwrt,情况会是怎么样的呢
此时,两边的路由器都加入了虚拟局域网并声明了作为本网段的虚拟路由存在,就实现了两个局域网的彻底打通,实现了一个相当于三层交换的功能。
# a的openwrt路由器上#
tailscale up --accept-routes=true --accept-dns=false --advertise-routes=192.168.1.0/24
# b的openwrt路由器上#
tailscale up --accept-routes=true --accept-dns=false --advertise-routes=192.168.2.0/24
这时候,两个网络中的所有设备都如同在同一个网络中一样,均可以通过内网ip进行访问。
3、实现切换流量出口exit-node
因为种种原因,大家可能希望自己的流量通过自己所在网络之外的其他网络中出入。
我们继续拓展上面的网络结构,现在我们还有一台设备x远在香港,我们希望我们的一台设备可以通过这台机器作为上网出口。
以上两个高级配置可以与此操作共存,不冲突。
首先,我们让a网络中的一台a1安装tailscale加入虚拟网络。
我们把香港的这台设备x加入节点,获取虚拟IP。
然后在x上声明advertise-exit-node,意思是它可以作为出口使用
tailscale up --advertise-exit-node
去tailscale的后台,许可这台设备作为exit节点,勾选exit node。
如果没有上面的操作,此处无法操作。
现在虚拟网络中的所有设备上就可以看到存在一个exit-node节点了,启用x设备的exit-node。
a设备上所有的流量都会从香港的机器进行出入,也就是说无论你访问任意的网络服务,流量都是从香港的这台x设备进行了中转。
只要你的网络够好,体验还是很ok的。
注意了!!!
1、所有的流量都会从这台exit-node设备出入,这意味着你会耗费大量的带宽和流量,要知道这些都是要花钱的。
2、请遵守当地的法律法规,别做违法乱纪的事情,否则后果自负。
3、作为开源版tailscale的headscale也一样可以实现这些功能route与exit-node,自建headscale并不能为你带来速度上的提升,更多的是面向企业用户,毕竟它没有节点数量限制。
操作不同的地方在于打开route与exit-node许可需要命令行操作
4、zerotier来说,功能1与2都是可以实现的,但是功能3虽然也可以实现,但是设置非常繁琐,不建议使用。
# -i后面的数字是通过命令查看到的具体节点的id号
headscale nodes list
# 输出
11 | OpenWrt | openwrt-pkxogrh2 | [C+q8S] | default | 10.1.0.2, fd7a:115c:a1e0::2 | false | 2022-11-07 01:53:12 | online | no
12 | lucid-cubes-6 | lucid-cubes-6-fodloxix | [8NBJW] | default | 10.1.0.4, fd7a:115c:a1e0::4 | false | 2022-11-07 01:52:50 | online | no
# 打开route,许可
headscale routes enable -i 11 -r "192.168.1.0/24"
# 打开exit-node,许可
headscale routes enable -i 12 -a
好了,以上,大家点个赞不过分吧。
下期再见!
2、局网穿透openwrt这段中,假设局域网A、B的网段都是192.168.1.0/24,完成所有配置后即路由A、B都设置了虚拟路由,设备A2(192.168.1.200)通过IP 192.168.1.100访问服务,此时访问的是设备A1(192.168.1.100)还是设备B1(192.168.1.100)?
不能用同一个子网名,会网络故障。
上述第二个功能,如按照上述设置的话,是无法实现的,即子网A是下的设备是不能正确访问子网B下的设备。
问题出在两个子网下的设备缺少路由,需要在各个子网下的设备上添加到对方子网的路由,这一点可以参见官方关于Site-to-site的说明。
官方文件还建议可以通过DHCP方式来自动下发这类的路由。
我说了,在主路由上配置的话,主路由上有到另一个子网的路由,而这个路由是所有内网设备的路由,所有的流量来到主路由自动路由了。