2020
03-01

基于CloudFlare API的纯Shell动态DNS(DDNS)脚本,CloudFlare API内网穿透DDNS脚本

基于CloudFlare API的纯Shell动态DNS(DDNS)脚本

家庭宽带的IP是不固定的,当出门在外,人不在家时,一旦IP变动,就给接入家中的设备(如监控)带来许多麻烦,于是我编写了一个能在Linux系统下运行,基于cloudflare API的动态DNS脚本,虽然国内已有花生壳之类的ddns服务,但是那些实在是太坑爹,比如只能使用它提供的二级域名,而该脚本能够配置顶级域名的动态DNS解析。

使用前提:局域网内有Linux主机(如openwrt路由设备)、有一个顶级域名、域名解析必须由CloudFlare托管。

CloudFlare API的纯Shell动态DNS(DDNS)使用方法

步骤一:到CloudFlare官网注册一个帐号,找到DNS选项,根据其要求,到你的域名注册商处将DNS服务器修改为CloudFlare提供的地址,修改完验证成功后就可以开始解析了。

步骤二:先添加一个二级域名解析,按照图示方法添加后点击Add Record保存

基于CloudFlare API的纯Shell动态DNS(DDNS)脚本

步骤三:获取三个Key值,其中APIKey和ZoneID可在官网登录后的Overview页面获得,而DNSID获取较为复杂,具体命令如下(需要安装curl):

curl -X GET "https://api.cloudflare.com/client/v4/zones/输入你的ZoneID/dns_records?type=A&name=刚才设置的记录值(比如xxx.yourdomain.com)" \
-H "X-Auth-Email:你注册时的邮箱" \
-H "X-Auth-Key:你的APIKEY" \
-H "Content-Type: application/json"

运行该命令后会输出结果,找到"id":"xxx"这个选项,其中的xxx即对应你的DNSID值

下方为shell脚本(需要设备安装curl),配置好后可利用crontab命令定时执行,(1-2分钟执行一次最佳)具体操作如下:

crontab -e
*/2 * * * * 脚本存放目录

cfddns.sh文件内容如下

#!/bin/sh
CF_API_KEY=输入你的APIKEY
CF_ZONE_ID=输入你的ZONEID
CF_DNS_ID=输入你的解析记录值对应的DNSID
EMAIL=输入你注册时的邮箱
ROUTER_NETWORK_DEVICE=你的设备拨号的网卡,openwrt一般是pppoe,可使用ifconfig命令查看
TEMP_FILE_PATH=/tmp/cloudflare-ddns/DNS_RECORD=填写用于ddns的DNS记录,要完整填写,比如:xxx.yourdomain.com
mkdir -p ${TEMP_FILE_PATH}curl -k -X GET "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records/${CF_DNS_ID}" \
-H "X-Auth-Email:${EMAIL}" \
-H "X-Auth-Key:${CF_API_KEY}" \
-H "Content-Type: application/json" |awk -F '"' '{print $18}'>${TEMP_FILE_PATH}/current_resolving.txt
ifconfig $ROUTER_NETWORK_DEVICE | awk -F'[ ]+|:' '/inet /{print $4}'>${TEMP_FILE_PATH}/current_ip.txt
if [ "$(cat ${TEMP_FILE_PATH}/current_ip.txt)" == "$(cat ${TEMP_FILE_PATH}/current_resolving.txt)" ]; 
then
exit 1
else
CURRENT_IP="$(cat ${TEMP_FILE_PATH}/current_ip.txt)"
curl -k -X PUT "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records/${CF_DNS_ID}" \
-H "X-Auth-Email:${EMAIL}" \
-H "X-Auth-Key:${CF_API_KEY}" \
-H "Content-Type: application/json" \
--data '{"type":"A","name":"'$DNS_RECORD'","content":"'$CURRENT_IP'","ttl":1,"proxied":false}'
fi

其他一下可以自定义域名内网穿透的方法如下:

frp内网穿透自定义域名80端口访问

目前来说,各大运营商都在减少对个人用户提供公网IP,这已经是一个趋势,估计在IPv6普及前不会有好转。虽然可以通过客服要回公网ip,但是难度太大了,就算能要到运营商也得恶心恶心你,所以目前外网访问家里路由器、NAS、智能家居等成了问题。

对于没有公网IP的解决办法也有很多:群晖的Anyconnect、花生壳、Ngrok、Frp等。从效果来看Frp效果最好

但是我们发现连接内网还是需要 输入 9080端口,而且域名是nginx上配置的三级域名,其实我们可以通过Nginx来反向代理一下,这样就可以自己的顶级域名,并通过80端口来访问了。

服务器安装 Nginx 的过程,请自行百度,假设你的服务器上已经安装好了Nginx

1、Nginx新建一个虚拟主机配置,或者直接改默认的主机配置也可以

在Nignx 的listen 后 增加 default_server 配置,用来监听默认情况下所有来自解析到该服务器的域名
然后在 server 段内增加 反向代理配置

listen 80 default_server;

#frp proxy
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:9080;
}

这样Nginx 将接管域名的绑定工作,监听到80端口的网站后,会将网站转发到 本机的frp 9080 端口

这时候,将 frp 的客户端配置文件改成如下:

[web]
type = http
local_ip = 127.0.0.1
local_port = 8080
custom_domains = xxx.com #此处填写你的顶级域名(该顶级域名解析到服务器的IP上)

然后启动客户端 ./frpc -c ./frpc.ini

这时候就可以通过 xxx.com 来访问你内网的网站了。

详细全文《frp内网穿透自定义域名80端口访问

官方QQ群号码:922069959

您可能感兴趣的文章

支付宝打赏支付宝打赏微信打赏微信打赏

本站》评论功能已永久关闭

官方QQ群号码:922069959
点击链接加入群聊【路由器交流】:
https://jq.qq.com/?_wv=1027&k=5AKdmZP
官方QQ群号码:922069959