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 ,其他自定义即可。

参考: Using configd — OPNsense documentation

更正时间

有时安装系统后,系统默认使用 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
posted @ 2022-08-31 13:43  Yogile  阅读(3099)  评论(0编辑  收藏  举报