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
 
 
启动之后会弹出一个认证网址
notion image
 
 
进入网站完成注册,根据提示点击Connect
notion image
 
notion image
 
 
加入成功后,会自动跳转到Machines页面,这里会显示加入tailnet的设备和连接状况
notion image
 
 
一栏代表一个设备,信息依次为 Machine nameAddressesVersionLast 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
notion image
 
 
tailscale status 查看连接状态
notion image
 
因为s905l3a没有IPv6,所以目前与 s905l3a 的连接是 relay 到tailscale的“hkg”服务器进行中转,延迟会比较大
 
如果没有延迟和传输速度的需求,不开启IPv6也能正常使用
 
 

Direct直连模式

 
尝试Ping我的另一台手机,即 galaxy-note10
notion image
 
查看连接状态
notion image
 
可以看到这次连接是 direct ,即直连,可以直接通过两台设备的公网v6地址进行通信
 
但受限于电脑和手机都是移动网络4G的状态,所以延迟仍旧很高,换为有线连接后,处于一个城市内的设备连接延迟可以保持在30ms左右
 
 

MagicDNS

 
tailscale内置了自己的DNS服务,只要是加入了tailnet的设备,都可以通过 Machine name 进行访问,而不仅仅是内网IP,类似于手动修改host文件,达到主机名或者域名解析的效果
 
此项功能不局限于有无IPv6,以及使用什么软件
 
比如:
notion image
 
还有:
notion image
 
Machine name 就是设备在tailnet中的主机名,而非设备本身的主机名或者计算机名
 
Machine name 可以在🔗Web管理页面中修改
 
 

优化

 
tailscale为了连接安全,对设备的授权会定期失效,默认是180天
 
为了保证能长期且便利地连接设备,可以在管理页面对需要“取消密钥过期”的设备选择 Disable key expiry
 
notion image
 
 
 

子网路由

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

允许IP转发

 
<<< 在开启子网路由之前,需要在设备上允许IP转发 >>>
 
 
notion image
 
 
如果你的设备有 /etc/sysctl.d 这个目录,则在终端输入:
 
如果没有这个目录,则在终端输入:
 
 
 

通告子网路由

 
例如
 
我的电视盒子(s905l3a)处于我家的局域网中,所在的网段是192.168.31.0/24
 
那么我需要在s905l3a的终端中通告我要的子网路由
 
运行后,在web管理页面可以看到s905l3a有一个待批准的子网路由
notion image
 
点击右边三个点,选择Edit route setting,打开192.168.31.0/24网段的开关
notion image
 
如此一来,处于这个tailnet中的所有设备都可以访问我家里这个网段的设备了
 
例如
 
外网访问我家里的路由器
notion image
 
 
或者还可以添加上一级路由的网段,比如光猫出口的网段192.168.1.0/24
 
通告子网路由,多个子网路由用逗号隔开
 
这条命令通告的是全部路由,而不是添加某一个子网,所以需要把之前通告过的子网也一并一起重新通告
 
 
启用
notion image
 
外网访问光猫后台
notion image
 
 
可谓是非常方便了
 
当然也有个缺点,就是像光猫、路由器这类没有加入tailnet的设备是没有办法主动去访问tailnet里的设备的
 
这个问题应该可以通过反向代理解决,不过真正实施起来会发现,太多的地址转换和端口转发了,多少都有点会影响传输性能和传输稳定性
 
 
 

最后

 
与IPv6+DDNS相比,tailscale节省了很多配置的时间,某些功能相比更加强大,例如子网路由
 
但是,IPv6+DDNS有个大优势,就是所有处于IPv6网络下的任何人都可以访问,而tailscale需要设备处于tailnet中,虽然安全性比较高,但是也只能自己用了,总不能叫别人也下个tailscale吧?
 
我也想IPv6+DDNS,只是配置实在是太繁琐了 😐
 
毕竟不是谁都喜欢花这么长时间配域名解析、域名证书,国内访问还要备案……
 
当然tailscale也有一定缺点,比如子网路由下的设备不能主动访问tailnet中的设备,可能可以,但我暂未尝试,端口转发应该是个办法,谁知道呢?🤔
 
 
 
 
【自制】迷你小风扇Rclone+Alist挂载网盘到本地
Loading...