家庭宽带的IP是不固定的,当出门在外,人不在家时,一旦IP变动,就给接入家中的设备(如监控)带来许多麻烦,于是我编写了一个能在Linux系统下运行,基于cloudflare API的动态DNS脚本,虽然国内已有花生壳之类的ddns服务,但是那些实在是太坑爹,比如只能使用它提供的二级域名,而该脚本能够配置顶级域名的动态DNS解析。
使用前提:局域网内有Linux主机(如openwrt路由设备)、有一个顶级域名、域名解析必须由CloudFlare托管。
CloudFlare API的纯Shell动态DNS(DDNS)使用方法
步骤一:到CloudFlare官网注册一个帐号,找到DNS选项,根据其要求,到你的域名注册商处将DNS服务器修改为CloudFlare提供的地址,修改完验证成功后就可以开始解析了。
步骤二:先添加一个二级域名解析,按照图示方法添加后点击Add Record保存
步骤三:获取三个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(空)、1093596563(空)
4 thoughts on “基于CloudFlare API的纯Shell动态DNS(DDNS)脚本,CloudFlare API内网穿透DDNS脚本”
Pingback: Python编写CloudFlare API动态cloudflare_ddns客户端,CloudFlare API内网穿透cloudflare_ddns Python脚本 – 月下博客 Pingback: CloudFlare API实现自动 DDNS 功能支持IPv4与IPv6,CloudFlare API内网IPv6穿透DDNS – 月下博客 Pingback: login to server failed: authorization timeout错误怎么办?frpc启动失败, 注意检查端口是否有冲突 – 月下博客 Pingback: 抛弃3322 DDNS使用更好的changeip免费DDNS内网穿透 – 月下博客
留言评论