type
status
date
slug
summary
tags
category
icon
password
前言
一直想实现在学校或者在外面可以访问家里的各种设备,一般来说这种连接需要点对点(P2P)
想实现这种访问方式,除非有公网IP,IPv4不太可能,IPv6可以但是需要折腾一下
对于基于IPv6的P2P连接:
- 需要双方都具有公网IPv6地址
- 为了方便还需要一个域名对被连接设备做ddns绑定
公网v6地址好搞,家里光猫开启IPv6、路由器选择AP模式就好了,手机使用移动数据也会有IPv6地址
那么像FTP、SSH这种连接,部分远程连接软件的输入框不支持输入IPV6地址,即使支持也非常麻烦,IPv6地址太长,难记不说,部分地区的IPv6地址甚至是动态,隔一段时间就会换一个地址,这对于长期在外需要连接家里设备的我来说无疑是致命打击,因为我不知道它到底变成了哪个IP 🙂
对于这个动态IPv6的解决方法,最常用的就是DDNS
对于DDNS:
- 需要一个在主流域名服务商购买的域名
- 需要DDNS服务
域名需要付费,并且是一笔长期费用,但是不贵;DDNS服务有付费也有免费
DDNS的原理大概就是将你设备的公网v6绑定到域名上,类似IPv4的域名绑定,别人访问这个域名其实就是在访问你设备的公网v6地址,与IPv4的域名绑定不同的是,因为IPv6可能是动态的,DDNS会在设备的IPv6变动后,将旧的IPv6地址与域名解绑,再将新的IPv6地址绑定到新的域名上,整个过程是不需要干涉的,是无感的,甚至有的DDNS服务商还有邮件通知服务,什么时候地址变动了一目了然
还有一种方式是使用Zerotier,这似乎是一种基于隧道的连接方式,但是它需要一台公网服务器来做中转站,而且设备的传输速度取决于公网服务器的带宽,这无疑是又增加了成本……加上不是很了解,遂放弃
本来我已经打算IPv6+域名+DDNS了,因为我前两项已经有了
直到我被推荐了tailscale……
我搜索了一下tailscale
嗯~有点意思 🧐
tailscale也是类似于zerotier的连接方式,就是创建一个虚拟局域网,即 tailnet,然后通过安装在设备上的VPN虚拟网卡来连接到这个虚拟局域网,实现虚拟局域网内的设备之间互相通信
tailscale支持通过IPv6进行P2P通信,也可以不具备公网IP进行通信,这时是使用官方的公网服务器作为中转,传输速度会慢一点
这些功能似乎其他软件也能实现,让我眼前一亮的还是他的子网路由功能
部署Tailscale
下载链接
Linux安装也很简单,官网有一键安装脚本
安装完成后,启动tailscale
启动之后会弹出一个认证网址

进入网站完成注册,根据提示点击Connect


加入成功后,会自动跳转到Machines页面,这里会显示加入tailnet的设备和连接状况

一栏代表一个设备,信息依次为
Machine name
、 Addresses
、 Version
、 Last login
- Machine name:设备的虚拟主机名
- Addresses:设备在虚拟局域网中的IP地址
- Version:tailscale软件版本
- Last login:上次登录日期
连接
为了便于测试,我将电脑连上了我的手机热点,模拟电脑在外网访问的使用环境
设备网络概况:
- 电脑(laptop-il41cl7o)使用的网络是手机移动数据4G的WIFI热点,有IPv6
- 电视盒子(s905l3a)使用的是家里的宽带,未开启IPv6,所以无IPv6
- 另一台手机(galaxy-note10)使用移动数据4G网络,有IPv6
三台设备都开启了tailscale
Relay中继模式
电脑尝试Ping电视盒子的虚拟局域网IP

tailscale status
查看连接状态
因为s905l3a没有IPv6,所以目前与 s905l3a 的连接是
relay
到tailscale的“hkg”服务器进行中转,延迟会比较大如果没有延迟和传输速度的需求,不开启IPv6也能正常使用
Direct直连模式
尝试Ping我的另一台手机,即 galaxy-note10

查看连接状态

可以看到这次连接是
direct
,即直连,可以直接通过两台设备的公网v6地址进行通信但受限于电脑和手机都是移动网络4G的状态,所以延迟仍旧很高,换为有线连接后,处于一个城市内的设备连接延迟可以保持在30ms左右
MagicDNS
tailscale内置了自己的DNS服务,只要是加入了tailnet的设备,都可以通过
Machine name
进行访问,而不仅仅是内网IP,类似于手动修改host文件,达到主机名或者域名解析的效果此项功能不局限于有无IPv6,以及使用什么软件
比如:

还有:

Machine name
就是设备在tailnet中的主机名,而非设备本身的主机名或者计算机名Machine name
可以在🔗Web管理页面中修改优化
tailscale为了连接安全,对设备的授权会定期失效,默认是180天
为了保证能长期且便利地连接设备,可以在管理页面对需要“取消密钥过期”的设备选择
Disable key expiry

子网路由
通常来说,要想在外面通过tailscale访问家里的其他设备,需要为每个设备都安装tailscale,这样的访问效果显然是最好的
但是部分设备你不想它安装tailscale或者设备本身不能安装tailscale,例如打印机
🧐那么子网路由功能就很有用了
它可以指定一台在tailnet中的设备作为网关,添加该网关本身的真实局域网网段后,其他tailnet中的设备便可以通过该网关访问真实局域网中的所有设备
允许IP转发
<<< 在开启子网路由之前,需要在设备上允许IP转发 >>>

如果你的设备有
/etc/sysctl.d
这个目录,则在终端输入:如果没有这个目录,则在终端输入:
通告子网路由
例如
我的电视盒子(s905l3a)处于我家的局域网中,所在的网段是
192.168.31.0/24
那么我需要在s905l3a的终端中通告我要的子网路由
运行后,在web管理页面可以看到s905l3a有一个待批准的子网路由

点击右边三个点,选择Edit route setting,打开
192.168.31.0/24
网段的开关
如此一来,处于这个tailnet中的所有设备都可以访问我家里这个网段的设备了
例如
外网访问我家里的路由器

或者还可以添加上一级路由的网段,比如光猫出口的网段
192.168.1.0/24
通告子网路由,多个子网路由用逗号隔开
这条命令通告的是全部路由,而不是添加某一个子网,所以需要把之前通告过的子网也一并一起重新通告
启用

外网访问光猫后台

可谓是非常方便了
当然也有个缺点,就是像光猫、路由器这类没有加入tailnet的设备是没有办法主动去访问tailnet里的设备的
这个问题应该可以通过反向代理解决,不过真正实施起来会发现,太多的地址转换和端口转发了,多少都有点会影响传输性能和传输稳定性
最后
与IPv6+DDNS相比,tailscale节省了很多配置的时间,某些功能相比更加强大,例如子网路由
但是,IPv6+DDNS有个大优势,就是所有处于IPv6网络下的任何人都可以访问,而tailscale需要设备处于tailnet中,虽然安全性比较高,但是也只能自己用了,总不能叫别人也下个tailscale吧?
我也想IPv6+DDNS,只是配置实在是太繁琐了 😐
毕竟不是谁都喜欢花这么长时间配域名解析、域名证书,国内访问还要备案……
当然tailscale也有一定缺点,比如子网路由下的设备不能主动访问tailnet中的设备,可能可以,但我暂未尝试,端口转发应该是个办法,谁知道呢?🤔
- 作者:sleepfat
- 链接:https://blog.sleepfat.top/Tailscale%E6%90%AD%E5%BB%BA%E8%99%9A%E6%8B%9F%E5%B1%80%E5%9F%9F%E7%BD%91%E5%AE%9E%E7%8E%B0%E8%BF%9C%E7%A8%8B%E8%AE%BF%E9%97%AE
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。