易雾君
Published on 2024-12-01 / 55 Visits
0
0

NAS党福音:近乎零成本优雅地实现家庭网络异地组网(二)

第一篇快速将近期写的一个项目跑了起来,没怎么描述过多的细节,本篇做下补充。近期写的这个项目基于开源方案做了些许自动化处置,实现了无公网IPv4场景的大内网异地组网和发布家庭网的站点服务。标题中的零成本解释下,本方案涉及到域名可能会花点钱,有些免费域名也可以接入Cloudflare,其实完全可以做到不花钱的。

先梳理下当下的痛点及基础环境。组网方面,家庭为重庆移动宽带,有公网IPv6,无公网IPv4,曾经向运营商索要无果,针对IPv4场景,如公司的访客网仅支持ipv4,一度使用手头上的一台广州VPS中转,供手机在IPv4网络环境接入,国内的云服务器普遍管子特小,影响体验。而IPv6场景,则通过手机流量直连回家,稍微做下ddns,使用体验还能在接受方位内,虚拟隧道选的是wireguard。总体看下来,ipv4和ipv6回家链路不统一,不够优雅。然而,现在唯一的VPS不打算续期后,IPv4回家链路就没有了,急需解决办法,好在一直在关注p2p组网,正好有了此系列的折腾。

其次,家庭站点发布方面,之前采用 cloudflare zero atrust tunnel 发布站点,由于众所周知的跨境原因,网络经常不稳定,于是采用了Cloudflare反代模式,IPv6可以直接配置代理模式,而IPv4则通过打洞形式接入,回源重写端口达到优雅地免端口访问站点,顺便告诉大家一个消息,重庆移动的家宽443端口其实没有被封禁,不知道你们的家宽有没被封禁呢。这里顺便友情提示下,对公网暴露服务具有较大安全风险,如有需求,建议套一层雷池的WAF社区版,降低被攻破的概率。

我的家庭宽带是通过PVE下的OpenWRT进行直接拨号的,光猫改的桥接模式,曾经有段时间,我的IPv6经常不稳定,找了很久的原因,后来将网络模式由linux bridge改为openvswitch bridge 模式后基本稳定下来。担心哪天它又开始作妖,所以项目实现需要自动回退到IPv4模式,组网和发布站点都要能自动回退,也就是,即使我的网络环境没有ipv6公网IP,也能顺利异地组网和发布服务。

由于牵涉到大内网打洞,我们还希望简化网络结构,最好将打洞操作和组网服务捆绑在一块,出口网关作最小的操作,比如有些硬路由不支持软件扩展,但设置DMZ基础功能是具备的,避免让这些傻瓜路由来完成打洞操作,最终实现一键式编排。打洞能否成功,主要看你的真实网络类型,相关检测方法已在第一篇做了介绍,可跳转查看。

headscale_meshTunnel.drawio.png

反代服务(headscale-traefik),用于反向代理多个web服务,有效减少打洞数量,每开放一个web服务就打一个洞极其不现实,同时接管tls证书自动签发,配合cloudflare和letencrypt。

服务端(headscale-server),开源的tailscale服务端版本,又叫协调服务器,负责wireguard节点的密钥交换、访问控制等。

服务端控制后台(headscale-ui),headscale的图形化控制,降低管理复杂度。

中继节点(headscale-derp),端到端打洞保底方案,且其本身就在境内,即使无法完成俩设备直连,回退到了中继方案,也能有很低的延迟。中继节点可同时开启DERP和STUN服务。

客户端(headscale-client),这个tailscale客户端主要充当两个角色,一个为接入家庭网的核心入口节点,一个为防止derp被白嫖的作用。

核心维护容器(headscale-worker),负责一些关键配置的初始化,tls证书同步,ipv4场景打洞并维持稳定,如存在ipv6,优先通过ipv6暴露web服务和stun服务,如ipv6地址掉了,能自动监测回退只ipv4环境,确保顺利组网且暴露服务功能正常。当打洞端口发生变化,ipv6地址发生变化,都会自动更新derp节点信息,确保headscale服务端能提供最新有效的中继信息。

项目实现上主要分两大板块,一是打洞,二是实时监测本地网络地址的变化,三是同步traefik的tls证书给derp。整体工作流如下,当检测到本地支持ipv6,优先通过ipv6暴露服务,ipv4方面本方案则采用的开源natter进行打洞,打洞的稳定性经一段时间测试还算比较稳定,对外仅需打洞暴露两个端口,一个traefik服务端口和stun服务端口,traefik后需接入cloudflare反代,从而实现面向公网暴露。

接下来看看我的项目实现。近期我对项目已做了一版更新,相对更加友好和人性化。赶快尝试体验吧!项目地址:https://github.com/evling2020/hsmaker

git clone https://github.com/evling2020/hsmaker.git
# 替换.env里相应的变量,替换获取到的cloudflare token到文件secrets/cf_api_token里边
chmod 0600 certs/acme.json 
docker compose up -d

Comment