上一篇是关于Windows下的DDNS一键部署,本文在简单介绍Linux下DHCP客户端的基础上,借助其hook/dispatch机制,同样避免看似鲁棒、实则毫无意义的定时检测与扫描。与Windows事件驱动不同的是,不同的DHCP客户端对IPv6及IPv4动态地址分配相关的“Reason”或“Action”有非常明确的定义乃至细分,可以进行更为精准的hook触发,最大程度地降低开销,让你的系统更“聪明”。
1.测试环境与部署
Linux分支太多,即便同样硬件规格的arm盒子,主板方案和系统也可能天差地别,所以先说明LaoE自用的设备:S905 M401A机顶盒、armbian kernel 6.1.30,无内核参数修改。同时,脚本在Ubuntu 22.04、Debian 11(均为虚拟机)中运行、触发正常。
消费终端的Linux下,DHCP客户端主要是NetworkManager(netplan基于NM)和dhcpcd,以及新系统中已被弃用很少的DHClient。无论哪个客户端,都有相应的hook/dispatch机制,客户端系统会在发生相关事件时调用hook脚本(入口处调用、出口处调用,enter或exit),也允许用户自定义hook脚本,这就为最小开销的DDNS提供了基础。官方明确的DHCP客户端包括树莓派下的dhcpcd、Armbian下的NM、Debian下的DHClient、Android(原生)下的dhcpcd等等。当然,不排除不同OS小版本会有差异,掌握基本原理,都可以自由发挥。
这里仅仅就不同发行版对DHCP客户端hook列举一二,更多信息可以自行搜索。
- https://manpages.ubuntu.com/manpages/trusty/man8/dhcpcd-run-hooks.8.html
- https://man.archlinux.org/man/dhcpcd-run-hooks.8
- https://manpages.debian.org/buster/isc-dhcp-client/dhclient-script.8.en.html
- https://networkmanager.dev/docs/api/latest/NetworkManager-dispatcher.html
可以通过【工具下载】栏目搜索下载安装脚本,再通过SFTP上传至设备,也可以在终端shell下直接运行如下指令(curl一般都是默认安装好):
curl -o intstall-cf-ddns6.sh -sSL https://appscross.com/as-tools/pub%20Tools/DDNS6/install-cf-ddns.sh && chmod +x intstall-cf-ddns6.sh ./intstall-cf-ddns6.sh
安装脚本运行后,和Windows下的脚本相同,仅需获取Cloudflare API Key。依次输入账号邮箱、API key、根/主域名、主机名(域名前缀),脚本将自动检测、创建记录及完成其他工作。
2.Android和OpenWRT
Andoid理论上是可以适配的,但不建议优化适配。首先,Android明确只支持SLAAC,国内的机顶盒固件都阉割掉了服务框架(GMS等),同时进行了大量的自定义,但保留并启用了dhcpcd作为DHCP Server(Android分为Client和Server)的就可以较为简单地进行适配。ATV系统默认curl、busybox会自带,jq等可以通过curl下载或在其他系统上自行下载后,通过adb push到盒子中,可以参考本文将Android盒子一键部署上DDNS6,应做如下基本检查:
- 原生ATV固件
- 系统使用并加载了dhcpcd作为服务
- /system/etc或/vendor/etc下存在完整的dhcpcd目录(/etc是指向/system/etc的链接)
- 已root
- adb正常工作
现实是:国内TVBox除了阉割之外,网络服务方面“异彩纷呈”,同一厂家、同一SoC规格在Android系统层面也可能有很大差异,更不用说各种改版的固件了,除了几个预装apk、桌面和 root,作者自己也不会知道网络服务用的是什么。启用了dhcpcd的ATV系统,默认会在初始化阶段加载如下的原生服务,同时,配置文件为/system/etc/dhcpcd/dhcpcd.conf。
service dhcpcd_wlan0 /system/bin/dhcpcd -ABKLG class late_start disabled oneshot service dhcpcd_p2p /system/bin/dhcpcd -ABKLG class late_start disabled oneshot service iprenew_p2p /system/bin/dhcpcd -n class late_start disabled oneshot
检查项中如果系统未启用dhcpcd作为服务端,建议不要继续,因为花费的时间和精力远超刷写Armbian/OpenWRT或者ELEC。至于Android下的应用服务端,至少Plex、Emby和Jellyfin都提供了Server的apk包,其他类别的应用服务多数也是可以找到对应apk包的。需要强调的是,符合条件的Android盒子的DDNS6安装、部署没问题,理论上触发机制工作、更新脚本执行也不会有问题,但需要留意、必要时自己动手排障。
外贸盒子、OpenWRT可以自由编译定制,了解Hook机制的基本原理,愿意折腾的自行折腾吧。各类软路由也都有第三方的DDNS工具,基本都是采用了定时检测方式,不要用定时检测工具和Hook脚本作比较。自行折腾需要注意IPv6的DHCPv6或SLAAC配置模式的区别。
3.最后
从Windows到Linux,其实关键字无非就是事件驱动、hook,用最简单、开销最低的方式实现单一的部署目标,老E也从不否定任何优秀的工具,但上网应该是一件简单的事。就愿意三五分钟定时检测那就检吧,别有蹭推销或者欠教养的多余置评,那就该回炉好好学学语文、让家长教教怎么说话。
需要适配其他DNS解析服务(DNSpod、阿里、火山等)的,短期内要自己修改脚本,相比CF而言,DNSPod、阿里以及火山TrafficDNS的Request构造更为简单,但验证、授权方面可能不太友好。
文章评论