全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 784|回复: 7

能根据ping值自动切换dns记录的工具

[复制链接]
发表于 2023-2-26 12:40:54 | 显示全部楼层 |阅读模式
有没有一个docker镜像或者python脚本,能ping测试ip延迟,如果ping值大于300ms,就修改相应的DNS的A记录



我的使用场景是又个香港服务器,有时如果被打ip就绕路到美国地址了,相应的ping值就高了,那我就要切换dns的A记录,把域名解析到新加坡服务器上,有以上的解决方案吗?
发表于 2023-2-26 14:49:28 | 显示全部楼层
本帖最后由 咯拉无米 于 2023-2-26 14:54 编辑

我以前做过类似的,这个东西太简单,用python有点大材小用,用shell就完成了,
我用的是dns.he.net的Dynamic DNS Record功能,
先要在dns.he.net新建一个a记录,开启Enable entry for dynamic 功能
然后点击新建的a记录(下面的dyn.example.com)后的ddns选项图标生成dynamic  key(下面的的passwd用于认证)


然后新建一个定时任务shell
cd /root
vi  ddns.sh
加入以下代码自己定义代码

  1. #!/bin/bash
  2. #定义大于该值时,dns更新
  3. i=300
  4. while true; do
  5. #定义取ping某个ip的平均值,c后是ping次数,理论上数值越大越准确,默认是3。
  6. a=`ping   -c 3 -i 0.2 -W 3  8.8.8.8|grep avg|awk '{print $4}'|awk -F '/' '{ print $3 }'|awk '{print int($0)}'`
  7. echo $i
  8. echo $a
  9. date
  10. if [ $a -gt $i ]
  11. then
  12.     #延迟大于设定值i时将dyn.example.com的a记录改为192.168.0.1
  13.     curl -s "https://dyn.dns.he.net/nic/update?hostname=dyn.example.com&password=password&myip=192.168.0.1"
  14.     echo "a > i, DNS uplpad"
  15. else
  16.    #延迟小于设定值i时将dyn.example.com的a记录改为192.168.0.2
  17.     curl -s  "https://dyn.dns.he.net/nic/update?hostname=dyn.example.com&password=password&myip=192.168.0.2"
  18.     echo "a <= i,DNS uplpad"
  19. fi
  20. #定义间隔时间,默认30秒
  21. sleep 30
  22. done

复制代码


给权限
  1. chmod  +x  /root/ddns.sh
复制代码

后台运行
  1. nohup ./ddns.sh&
复制代码

查看日志
tail -f nohup.out
发表于 2023-2-26 12:43:58 | 显示全部楼层
阿里云全局解析
 楼主| 发表于 2023-2-26 12:49:58 | 显示全部楼层
本帖最后由 Right 于 2023-2-26 12:52 编辑
Hude 发表于 2023-2-26 12:43
阿里云全局解析


我看收费的,太贵了
发表于 2023-2-26 13:08:03 | 显示全部楼层
要接入dns 提供商的api,很繁琐的工作
自用针对特定的一两个dns提供商写一个不难
发表于 2023-2-26 13:09:13 | 显示全部楼层
可以自己写个bash脚本,用cf的API自动修改DNS记录
发表于 2023-2-26 13:12:19 来自手机 | 显示全部楼层
Azure 的 Traffic Manager 根据延时返回结果好像可以,其他的应该也支持
 楼主| 发表于 2023-2-26 20:26:40 | 显示全部楼层
本帖最后由 Right 于 2023-2-26 20:28 编辑

感谢大佬@咯拉无米 的思路,我使用的是dnspod,稍为修改了一下支持在我的云服务器上运行

部分代码我加了#,以支持crontab定时运行,每小时运行一次


  1. #!/bin/bash
  2. #定义大于该值时,dns更新
  3. i=100
  4. #while true; do
  5. #定义取ping某个ip的平均值,c后是ping次数,理论上数值越大越准确,默认是3。
  6. a=`ping   -c 3 -i 0.2 -W 3  192.168.2.1|grep avg|awk '{print $4}'|awk -F '/' '{ print $3 }'|awk '{print int($0)}'`
  7. echo $i
  8. echo $a
  9. date
  10. if [ $a -gt $i ]
  11. then
  12.     #延迟大于设定值i时将dyn.example.com的a记录改为192.168.2.1
  13.     #修改login_token值,domain值,record_id值,sub_domain值,value值,下同
  14.     curl -X POST https://dnsapi.cn/Record.Modify -d 'login_token=XXX,XXX&format=json&domain=example.com&record_id=13511117&sub_domain=dyn&value=192.168.2.1&record_type=A&record_line=%E9%BB%98%E8%AE%A4'
  15.     echo "a > i, DNS uplpad"
  16. else
  17.    #延迟小于设定值i时将dyn.example.com的a记录改为192.168.2.2
  18.     curl -X POST https://dnsapi.cn/Record.Modify -d 'login_token=XXX,XXX&format=json&domain=example.com&record_id=13511117&sub_domain=dyn&value=192.168.2.2&record_type=A&record_line=%E9%BB%98%E8%AE%A4'
  19.     echo "a <= i,DNS uplpad"
  20. fi
  21. #定义间隔时间,默认30秒
  22. #sleep 3600
  23. #done
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2025-10-9 16:09 , Processed in 0.157649 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表