前言
目前来看,新装家庭宽带有IPv4公网地址的已经越来越少了,取而代之的是IPv6公网地址越来越多。不过由于IPv6地址的难以记忆且很多朋友家里缺乏IPv6公网地址和动态域名动态绑定的解决方案,导致IPv6公网地址"有也等于无"。且访问IPv6公网地址还有另一个潜在的要求,就是访问端必须也有IPv6地址,这个也难倒了很多朋友(手机通过3大运营商的蜂窝方式使用流量访问倒是都支持IPv6了,不过也并不是所有朋友都舍得用流量访问家里的应用,特别是大流量应用,比如看片之类)。所以在这种形式下,不管有没有IPv6公网地址(其实也适合有IPv4公网地址的情况),要想从外面访问自己家里的设备最方便的方式仍然是通过各种“内网穿透”技术来实现(运营商肯定是提供了IPv4地址的,只不过不是公网地址而已,以后可能加上IPv6公网地址,形成"私有IPv4"+"公网IPv6"的双栈结构)。
没有公网IPv4地址的内网穿透(之所以强调没有公网IPv4的内网穿透,是因为有公网IPv4的正常端口映射也可以说是一种内网穿透技术)必须依赖于有公网IPv4的中继服务器(相当于中介)以及各种黑科技的“打洞”技术。如果"打洞"能成功就可以直接通信,如果"打洞"不成功,就只能老老实实通过中继服务器中转流量。
中继服务器有2种获取方式:要么购买现成的,要么自建:购买现成的简单,一大堆收费的,我就不多说了。自建的话,就要从现在诸多虚拟组网技术中选一种方案了,我目前在使用的是tailscale,其他的我没用过,不作评价。
关于tailscale的部署方式可以在网上搜,有很多优秀的文章,我就不废话了,如果需要自己搭建tailscale的DERP服务器,可以参看我另一篇文章:debian系列 搭建tailscale DERP server(中继服务器)。
本文的重点不在使用哪种方案来实现虚拟组网,而在于如何在家庭数据中心的环境中使用虚拟组网(终于可以步入正题了,累死了)。
虚拟组网
虚拟组网技术是我的家庭数据中心解决方案中非常重要的底层技术之一。
从字面意思上讲,虚拟组网技术就是虚拟一个你自己的网络,所有在这个网络中的设备都可以自由通信。从具体技术实现的角度来讲,就是你的各个设备都添加一块虚拟网卡,每个虚拟网卡都有一个被分配的IP地址(或者v4和v6地址各一个),各个设备可以通过被分配的IP之间相互自由通信,不管这些设备在外网还是内网。
目前主流的虚拟组网技术是wireguard,不过自己搭建和配置wireguard是很繁琐的,并且需要一定的技术基础,还需要有公网IP的主机,所以对个人来说,最省事的方式还是选择基于wireguard技术的成熟方案,比如tailscale。
挑选具体虚拟组网方案的时候,一个重要的技术指标就是跨平台的支持能力,毕竟需要在设备上安装客户端,而设备的类型多种多样(win、linux、macos、ios、安卓设备),所以选择的虚拟组网方案也应该能支持这些常见的客户端类型。
另外,如果提供虚拟组网方案的是国外的产品,并且官方已经提供了server端的功能(意思就是只需要在官网注册一个账号,然后下载客户端就可以直接登录使用),则还需要考虑客户端和server端的可连接性,这个可以自己先尝试下,不排除有些登录的时候需要魔法进行辅助。
虚拟组网的实际应用
内网穿透
虚拟组网这种技术对于绝大多数人而言,只是家庭宽带没有公网IPv4地址而又需要访问家里设备时候的一种无奈之举,对于有公网IPv4地址的家庭宽带,大家可能更愿意使用动态域名+端口映射的方式进行访问。但是对于我而言,即时在我家宽带在有公网IP的情况下,不到万不得已,我也不愿意使用端口映射的:一来是因为我应用太多了,不可能挨个做映射;二来应用都是docker方式部署,只提供了http的访问方式,http明文在互联网上跑太危险;三来,直接通过公网IPv4端口映射发布应用,危险性实在太大了(IPv6地址好得多,毕竟地址多,还经常变,不怎么怕扫描,不过需要解决和动态域名的绑定以及访问端可能不支持IPv6的问题)。
虽然家庭宽带有公网IPv4地址的时候,通过反向代理加上动态域名,只需要做一次端口映射就可以发布所有应用(理论上也可以直接用于运维管理),但是基于安全考虑,我在WAF上把外网来的请求的敏感操作(例如wordpress的/wp-admin)进行了屏蔽,所以实际运维操作的时候,我在家时还是更喜欢直接用内网IP直接进行访问,而不在家时,就可以用虚拟组网分配的IP来访问(以前喜欢用openvpn,但是随着运营商对openvpn的负优化越来越过分,逼得只能换更安全的方式)。
所以理论上来说,不管家宽有没有公网IPv4和IPv6地址,虚拟组网都是最好的内网穿透的方式,当然有个前提:虚拟组网的软件有高效并且黑科技的“打洞”方式,在绝大多数情况下都可以让设备相互之间直接访问,而不是通过“中继”服务器来传数据。对于国内很多收费的内网穿透软件,需要你出高价购买“中继”服务器带宽来换取好的体验,这个就看大家能不能接受这个价格换来的便利性了。
作为"源站"
如果你有网站需要发布,最省钱的方式是用家里的设备(nas,电脑等)搭建好应用并作为源站,让国内CDN来访问(有备案域名),或者云主机作为反向代理来进行调用,这样可以不用购买高价性能昂贵的云主机以及数据库等,但是这种方式有个前提是家庭宽带有公网IP地址(单指国内CDN需要,如果是采用cloudflare不需要公网IP地址)。
如果家宽没有公网IP地址,那家里的设备还能作为源站吗?答案是可以,这就需要借助虚拟组网技术。
这种方式的前提是你首先要有一台云主机(这个不可能没有吧,域名要备案起码也要购买一台云主机吧,最便宜的就成,1个月10块左右),通过在云主机和家里设备上都部署虚拟组网软件的客户端,将云主机和家里设备的都加入虚拟组网之后,就可以在云主机上配置反向代理,通过虚拟组网分配的IP地址将上游服务器指向家里设备上部署的应用。如果觉得云主机的带宽不够,还可以通过CDN将源站指向云主机(云主机作为反向代理又指向家里设备,所以最终家里的设备上的应用成为了最终的源站)。
这种方式甚至能通过虚拟组网ip访问家里的数据库。。。但是基于互联网的延迟,这个体验是非常不好的,慎用,除非是某些访问数据库不频繁的应用。
安全的proxy
如果家里有一台设备能够使用魔法,这种往往只能够让家里的设备使用,如果不在家的时候就没法使用了。在没有使用虚拟组网之前,如果家庭宽带有公网IPv4地址,胆子够肥的还敢用端口映射拼一把,没有公网地址的就完全没辙了。而使用了虚拟组网之后,哪怕出门在外,只要能安装虚拟组网客户端的设备(笔记本,手机,pad)都可以直接通过虚拟组网的IP访问家里能使用魔法的设备。
另一种用法是对云主机而言,一旦云主机上也部署了虚拟组网的客户端,就能直接将代理通过虚拟组网IP指向家里能提供魔法的设备,也可以使用某些方式使用局部代理(参见文章:奇技淫巧系列 强大的局部代理工具:proxychains)。
使用smb访问家里nas的共享目录
以前用openvpn的一个原因,是因为想直接在win的系统上使用"//"的方式访问家里NAS的共享目录,现在虚拟组网方式也可以实现这个功能,这让我出门在外也能每天整理NAS上下载的电影(为什么要提win的系统?因为要用everything,现在我是在macbook上使用win的虚拟机,主要原因就是整理资源要依托于everything)。
跨设备文件传输
实现自己不同设备(手机、平板、电脑)之间无视位置和距离的无感高效跨设备文件传输(参见文章:奇技淫巧系列 跨设备文本和文件传输方案推荐
http)。
总结
最后,说白了,虚拟组网也只是一种技术,提供了这种功能,关键就看你怎么个用法了。