接上一期,我们已经在m401a中安装好了armbian,老E实际已经部署了Pandora(一个无障碍访问ChatGPT服务的开源应用),但如何实现Anywhere呢?
有人说内网穿透?如果考虑安全防护,不暴露私有主机,可以理解。但是,毕竟是s905l3a的m401a盒子,况且2023年了,还在“内网穿透”,还在NAT over NAT?运营商表示很不爽!我们优选简单实现。
纵观国内几大运营商提供的光宽带网络服务,公网IPv4不说,IPv6是早就开始推广应用了,近两年新装的宽带,附送的光猫无一例外都自带路由且支持DHCPv6,而且,要知道家庭宽带分配到的IP(v4 or v6)都是最干净的地址。查看盒子接口信息,移动的应该都是“2409”开头的,这个“2409”开头的IPv6地址就是公网地址,是可以在外网访问(暴露在公网)的。
已知3大运营商IPv6地址前缀:
中国移动:2409:8000::/20
中国电信:240e::/20
中国联通:2408:8000::/20
所以,家宽的IPv6支持不成为应用障碍的前提下,域名绑定、DDNS的简单实现是最优方案。
1.域名绑定和记录添加
我们找一个已注册的域名,最好是泊靠在Cloudflare,这样不用再做迁移。登录Cloudflare,选择我们打算绑定的域名,老E随便选了个刚注册的一个.eu.org域名。
进入该域的dns设置后,我们增加一条A或者AAAA记录。老E添加了一条IPv6记录,二级域名ai.xxxx.eu.org,指向IP地址只要合法就行,不用纠结。添加后保存。
记得关闭小黄云(不开启代理),TTL可以设为自动,确定后保存该记录。这样,ai.xxxxx.eu.org就是指向armbian m401a盒子的主机名,域名绑定完成。
说明:多数名称服务提供机构都有DNS API支持,国内腾讯、阿里也有,Cloudflare自然也不例外,不过,从去年开始Cloudflare对于.tk ,.ga,.gq等freenom注册的免费域名不再提供api支持。
2.获取Token
要通过使用API使用服务,一般都需要获取Token或Key,Cloudflare不仅是DNS记录更新,包括证书申请、workers代理计算等都需要/可以使用API。
打开xxxxx.eu.org域的管理面板,右侧就是区域ID、令牌的标识,复制Zone/区域 ID。账户ID在本例中不需要。这里,点选“获取您的API令牌”,来到令牌创建页面。
老E的配置页面显示的是针对另一个区域(为了区分,称之为yyyy.eu.org)创建好的令牌,已创建的令牌可以点选最右侧的"..."查看摘要信息。这里点选创建令牌即可。
之后的API令牌模板选择第1项,使用“编辑区域DNS”模板。一般常用的就是该类令牌和“编辑Cloudflare Workers”以及“Wordpress”令牌。点击"使用模板"。
区域资源点开"Select..."选择我们增加了AAAA记录的域xxxx.eu.org。其他选项正常情况下保持默认即可,如果和上图不一致的地方就需要修改成和上面一样的。选择“继续以显示摘要”,在摘要页点选“创建令牌”即可。
说明:望文生义,令牌用于访问我们的某个域,而且仅限该域,不仅要查询DNS记录,还要更新,所以权限是“编辑”--读和写。
把创建的Token拷贝下来,和ZoneID等一起保存好。给出的测试命令也可以一并拷贝下来保存。
至此,针对ddns配置任务目标,我们在cloudflare后台需要进行的操作全部完成。后期,如果要验证记录更新的话,也不必登录后台,没有套CDN的情况下,ping ai.xxxx.eu.org即可。
Token != Key
重点来了,Cloudflare API已经演进到4.0版本,之前有通过key的验证、使用方式,我们既然获取了Token即令牌,就不可能还用Key的验证方式。参考官方文档,我们可以了解详细API关键字和使用方法。务必注意,Token不是Key,很多教程把Token写在Key的地方,或者header定义是X-Auth-Key,后面填写的却是Token,完全不清楚是怎么跑通的或者说有没有真正测试过。
shell输入以下命令即可查询到刚才设定的AAAA记录ID。需要替换(包括花括弧)给定的内容包括:ZoneID、Email(Cloudflare账户邮箱)、Token。
不出意外的话,Result中的第一条就是RecordID,记录下来,在写入、更新其IPv6地址的时候,需要指定。如果--header指定了X-Auth-Key,而你却填写了Token,一定返回error。
首先,确认一下需要记下保存的4项信息:ZoneID、Token、Mail/Account、RecordID。
DDNS实现的核心就两点:
1.监测(被动)或检测(主动)IPv6地址的变化
2.基于变化进行DNS记录的更新
被动监测,是需要基于系统network管理进程,利用hooks机制,仅当接口分配到的IPv6地址发生变化时触发记录更新;主动检测,就是按一定时间周期(cron,如120s)进行轮询,一旦检测到接口的IPv6地址发生变化则进行记录更新。
1.DNS记录更新脚本(IPv6)
无论主动检测或者被动监测,都需要在分配的IPv6地址发生变化时,通过Cloudflare API更新DNS记录,运行以下代码可以自动创建/bin/cf-ddns.sh脚本。
可通过执行以下命令下载脚本并执行,会自动生成/bin/cf-ddns6.sh,务必在替换{interface}、{ZoneID}、{RecordID}、{Email}、{Token}、{Domainname}并保存后执行。
{interface}: 替换为监测的网络接口,例如 eth0。
{ZoneID}: 替换为 Cloudflare 域名所在的区域 ID。
{RecordID}: 替换为要更新的 DNS 记录的 ID。
{Email}: 替换为你的 Cloudflare 帐户的注册电子邮件地址。
{Token}: 替换为你获取的 Cloudflare API Token。
{Fullname}: 替换为要更新的完整主机域名,如ai.xxxx.eu.org。
验证部署一下,先后台或者命令行查阅当前ai.xxxx.eu.org的IPv6地址。
运行/bin/cf-ddns.sh,除了最后的“成功”或“失败”返回码,静默运行不会有任何过程输出。
我们在控制台看到记录更新成功,回到Cloudflare DNS设置后台进行验证。
2.被动监测
对于使用 NetworkManager 的 Debian Bullseye,通过 NetworkManager 的 dispatcher.d 功能来监测到 IP 地址变化。这是一种类似于 dhcpcd以及dhclient 客户端 hooks 的机制,可以在 IP 地址变化时执行/bin/cf-ddns6.sh。
创建一个脚本文件,用于处理 IPv6 地址变化的操作。
基本文件内容如下:
赋权、属组、属主设为root。大功告成。
说明:可实现被动监测条件取决于网络管理服务,NetworkManager、dhcpcd、dhclient均可。netplan应该也可以,但个人非常不喜欢。
3.主动检测
受限于系统网络管理守护进程,如果被动监测无法实现,我们可以将/bin/cf-ddns6.sh作为定时任务,使用crontab -e编辑cron表,在其中增加如下一行内容,每2分钟执行一次。
最后,需要提示一下:运营商一定会屏蔽80、443端口,需要重新编辑下相应的service文件(如有),譬如我就将ChatGPT pandora本地服务的监听端口改成了8091,如此,公网访问需要加端口号,我的就是ai.xxxx.eu.org:8091。
至此我们就通过IPv6配置完成了基于Cloudflare API的DDNS,抓紧试试吧。通过DDNS的搭建与实现,我们不仅可以通过公网访问m401a服务器上的Pandora服务,还可以在m401a上部署Jellyfin server、HA等若干应用服务,从目前我的m401a运行情况来看,两个字:够用。
当然,这种方式实际是将服务器(m401a)暴露在公网,任何人只要知道域名的都可以访问,有一定的安全隐患。但是,相比其他实现而言,这是最简单的、门槛最低的。老E建议能简单不复杂。
下期,将分享有关Pandora等ChatGPT服务的本地部署,结合DDNS,就可以实现Anywhere,而且没有容器依赖。对于普通用户而言,replit、railway、vercel等容器平台还有有一定技术门槛的,老E最不擅长的就是账号管理,在一堆平台开通了一堆账号,实在头疼。相比很多非理工的人,也一样会有此顾虑。