OPNsense 防火墙系列三:阿里云 aliddns + 计划任务
说明
本系列前文中,我记录了 WAN IPv6 的获取和 HTTPS 监听端口模式的更改,为了给后文——在 IPv6 防火墙的保护下——进行端口转发做铺垫,本文记录如何实现 OPNsense 下的阿里云 DDNS 。
目前,网络上流行的、支持阿里云 IPv6 DDNS 解析的成品工具,绝大部分都是 基于 Docker 平台的容器。而基于 FreeBSD 的 OPNsense 在 Docker 的支持上天生残疾,所以建议通过 脚本+计划
的方式实现 IPv6 的 aliddns 。
下载 aliddns 程序
经过在 Gitee 和 Github 上寻找测试,最终选择支持全平台的 GitHub - honwen/aliyun-ddns-cli ,可以便捷识别 WAN 口的 IPv6 地址。
其他要不然就是只支持 IPv4 ,要不就是支持了 IPv6 但无法动态解析。
下载对应 OPNsense x86 平台的 freebsd-amd64
版本压缩包,解压 .tar.gz
得到可执行程序 aliddns
。
chmod +x ./aliddns
赋予执行权限。
编写脚本
编写脚本 aliddns_run.sh
,通过绝对路径执行 aliddns :
#!/bin/sh
/home/ddns/freebsd-amd64/aliddns --id "<阿里云AccessKeyID>" --secret "<阿里云AccessKeySecret>" --ipv6 auto-update --domain <证书域名>
echo -e `date` "\taliddns\t" `ifconfig pppoe0 | grep 'inet6 2409' | grep "<后64位固定后缀>" | awk '{print $2}' | head -1` >> /home/ddns/freebsd-amd64/aliddns.log
执行完成后,在 /home/ddns/freebsd-amd64/aliddns.log
文件中可以看到:
Thu Sep 1 00:10:18 HKT 2022 aliddns 2409:xxxx:xxxx:xxxx:<后64位固定后缀>
注意:
-
--ipv6
要放在auto-update
之前,否则报错。无--ipv6
,则默认解析 IPv4 地址。 -
建议由服务器主机自行通报 IP 地址。在路由或 DHCP 中固定 IP-MAC 配对时,一定要注意主机名是否为主机自身设定的名字。若不相同,则报错。
例如:Unraid 服务器主机在网络中共享的主机名为
UNRAID
,但设置固定 IP-MAC 时,设置为Unraid
。这时执行脚本显示:...... domain[xxx.xxxxx.xxx] reslove empty, PLZ check network 或者 IP is empty, PLZ check network ......
若直接指定 IPv6 地址,则显示:
...... AddDomainRecord error, Aliyun API Error: RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Status Code: 400 Code: SubDomainInvalid.Value Message: The DNS record is invalid or in the wrong format. ......
计划任务
因为阿里云域名解析的 TTL 为 10 分钟,则可以设定动态解析检查时间为 15 分钟。
活动命令有效期为 OPNsense 重启之前;常态命令有效期为系统更新之前(与重启无关);固定命令有效期为系统架构大幅更新之前(日常和安全更新无影响)。
活动命令
通过在 root 权限下 crontab -l
可以查看 root 权限执行的计划。
通过在 root 权限下 crontab -e
可以打开 vi 配置计划任务:
root@route:~ # crontab -u root -e
# or /usr/local/etc/cron.d and follow the same format as
# /etc/crontab, see the crontab(5) manual page.
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
REQUESTS_CA_BUNDLE=/etc/ssl/cert.pem
#minute hour mday month wday command
1 * * * * (/usr/local/sbin/configctl -d syslog archive) > /dev/null
......
*/15 * * * * (/bin/sh /home/ddns/freebsd-amd64/aliddns_run.sh) >> /home/ddns/freebsd-amd64/aliddns.log
按照 vi 的逻辑添加即可, :wq
保存。
常态命令
修改文件,在 OPNsense 的 /etc/crontab
文件末尾添加:
#minute hour mday month wday who command
# aliddns
*/15 * * * * root /bin/sh /home/ddns/freebsd-amd64/aliddns_run.sh
/etc/rc.d/cron restart
,重启计划任务执行。
注意,在系统更新后,计划任务列表可能会重置,需要重新写入更改。
固定命令
在 /usr/local/opnsense/service/conf/actions.d
中,创建 actions_aliddns.conf
:
[<动作action>]
command:<命令>
parameters:<参数>
type:script
description:<描述>
message:<消息>
示例:
[run]
command:/bin/sh /home/ddns/freebsd-amd64/aliddns_run.sh >> /home/ddns/freebsd-amd64/aliddns.log
parameters:
type:script
description:aliyun ddns of xxx.xxxxx.xxx
message:aliddns run
[wake]
command:/usr/local/bin/wol -i
parameters: %s %s
type:script
description:Wake-On-LAN for host with broadcast IP and MAC
message:Waking up host %s %s
在 大厅 -> 服务
中,重启 configd
服务。
在 系统 -> 设置 -> 调度任务
中,点击 +
添加,选择 命令
为 actions_aliddns.conf
中的 description
,其他自定义即可。
更正时间
有时安装系统后,系统默认使用 UTC
格式,时间快正常北京时间 8 小时,导致报错:
2022/09/01 05:02:41 DescribeDomains error, Aliyun API Error: RequestId: xxxxxxxx Status Code: 400 Code: InvalidTimeStamp.Expired Message: Specified time stamp or date value is expired.
首先,查看时间是否正常:
# date
Wed Aug 31 22:05:43 HKT 2022
虽然可能标记 HKT
等正常,但实际时间确实是 +8 小时。
最简单的解决办法是直接设置,重启后不会回复:
# date 202208311405