V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
guanyin9cn
V2EX  ›  程序员

宽带公网 IP,有没有开源的类似 ddns 实现脚本,自动获取 ip,并把 ip 写入到 cloudflare 的 dns 记录里

  •  
  •   guanyin9cn · 2021-08-31 20:59:54 +08:00 · 3993 次点击
    这是一个创建于 1172 天前的主题,其中的信息可能已经有所发展或是发生改变。
    RT,
    有 公网 ip,但 ip 是变化的,有没有 脚本 获取 本机 ppp+ 上的 ip 地址,通过 cloudflare api 修改 dns 记录
    第 1 条附言  ·  2021-09-01 00:27:12 +08:00
    感谢大佬们,已经写好了脚本
    gist.github.com/0neday/04141ba4d3ac3ccf77a5b5837b104762
    第 2 条附言  ·  2021-09-01 11:19:03 +08:00

    再次感谢各位,学到了不少东西,尤其是对 sed regex pattern 处理 json 有了新的理解。以前写 grok 语法接触到一点 regex pattern, 但理解不够深入。比如要获取 json 的 某个 key 对应的 vlaue。

    echo $update_v4 | sed -E "s/.+\"success\":[ ]*([a-z]+).+/\1/g"
    
    37 条回复    2022-12-09 10:58:00 +08:00
    wangbenjun5
        1
    wangbenjun5  
       2021-08-31 21:15:57 +08:00
    自己写个很简单啊,你在服务器上面写个 web 服务,获取请求者的 ip,记录下来,如果变了就请求 api 修改 dns 记录不就行了。

    然后自己路由器(智能路由)用 crontab 整个定时访问这个服务。。。

    完美解决!
    guanyin9cn
        2
    guanyin9cn  
    OP
       2021-08-31 21:25:57 +08:00
    @wangbenjun5 谢谢,你说的略显麻烦,我刚自行搜了下,找到了方法,发在了宽带区

    v2ex.com/t/799135
    wangbenjun5
        3
    wangbenjun5  
       2021-08-31 21:36:02 +08:00
    @guanyin9cn 只要能获取 ip,都好办,自己服务器写个 web 服务,用 go 或者 php 也就几行代码,胜在稳定可控。至于光猫或者路由器上面直接命令获取,必须得改路由器上面拨号,有点麻烦。
    f165af34d4830eeb
        4
    f165af34d4830eeb  
       2021-08-31 21:42:04 +08:00
    openwrt 的 ddns 插件符合你的要求,而且支持多家 dns 服务商。
    jakehu
        5
    jakehu  
       2021-08-31 21:55:24 +08:00
    boris93
        6
    boris93  
       2021-08-31 21:58:01 +08:00 via iPhone
    正好我自己写的一个小玩意完美符合需求
    https://github.com/boris1993/dnsupdater
    代码可能有点丑,但确实能用
    FrankAdler
        7
    FrankAdler  
       2021-08-31 23:26:42 +08:00
    https://gist.github.com/fengqi/0d5979c1a15c678db2c260970f98183b 我正在用的脚本,跑在 openwrt 上,jq 命令自己想办法装上或者替换成 awk
    Tink
        8
    Tink  
       2021-08-31 23:33:25 +08:00
    这个随便一搜一大堆。。。
    flynaj
        9
    flynaj  
       2021-08-31 23:49:13 +08:00
    ddns 是路由器的基本功能。openwrt 直接支持。
    Tumblr
        10
    Tumblr  
       2021-08-31 23:59:44 +08:00   ❤️ 2
    大佬们的好厉害啊,一个小功能也可以写成鸿篇巨制,我只有几行:
    #!/bin/sh
    myip=`curl 'https://api.ipify.org'` > /dev/null 2>&1
    curl -X PUT https://api.cloudflare.com/client/v4/zones/<zone_id>/dns_records/<record_id> \
    -H "X-Auth-Email: <[email protected]>" \
    -H "X-Auth-Key: <auth_token>" \
    -H "Content-Type: application/json" \
    --data "{\"type\":\"A\",\"name\":\"<DNS_record>\",\"content\":\"$myip\",\"ttl\":120,\"proxied\":false}" \
    > /dev/null 2>&1
    guanyin9cn
        11
    guanyin9cn  
    OP
       2021-09-01 00:10:21 +08:00
    @FrankAdler #7 用 sed 正则表达式匹配,代替 jq 处理 json
    获取
    zone_id=echo $zone_response | sed -E "s/.+\"result\":\[\{\"id\":\"([a-f0-9]+)\".+/\1/g"
    record_id=echo $record_response | sed -E "s/.+\"result\":\[\{\"id\":\"([a-f0-9]+)\".+/\1/g"
    实测可用
    hasdream
        12
    hasdream  
       2021-09-01 08:36:59 +08:00
    老毛子( PADAVAN ) 路由器固件支持这个功能 (愉快使用 2 年多了)
    iphoneXr
        13
    iphoneXr  
       2021-09-01 09:13:32 +08:00
    @Tumblr 我的第一反应也是找到 cloudflare 的 api 接口 直接 curl 一下
    感谢实现了
    guanyin9cn
        14
    guanyin9cn  
    OP
       2021-09-01 09:48:04 +08:00
    @Tumblr #10 zone_id 一般不会变,除非删除了域名。record_id 会随着删除 A 记录而发生变化。写的简单,维护起来麻烦。
    guanyin9cn
        15
    guanyin9cn  
    OP
       2021-09-01 09:50:17 +08:00
    @boris93 go 语言实现,json 解析起来会比较方便。
    black938
        16
    black938  
       2021-09-01 10:37:14 +08:00
    https://github.com/jeessy2/ddns-go
    go 语言实现 打包个二进制扔路由器跑都行
    Loku
        17
    Loku  
       2021-09-01 10:39:38 +08:00
    @Tumblr 我也是这样写的
    superszy
        18
    superszy  
       2021-09-01 10:41:19 +08:00
    现成的啊,openwrt 的 ddns 也有 cf,编译时候选上就行了。

    如果想自己 docker 部署的话也很多,比如这个 https://github.com/wddwycc/cf_ddns
    Tumblr
        19
    Tumblr  
       2021-09-01 11:06:32 +08:00
    @guanyin9cn #14 为什么要删除 A 记录呢? 😅 直接 modify 就好了。
    如果有多个域名,其它的 cname 到一个固定的 A 就可以了。
    sam014
        20
    sam014  
       2021-09-01 11:19:25 +08:00
    ddns-go
    boris93
        21
    boris93  
       2021-09-01 12:17:11 +08:00 via iPhone
    @guanyin9cn #15 更主要的原因是性能要求低。最早我是让它跑在路由器上的,Java 和 python 不可能,c 我不会,最后选择 go
    notgoda
        22
    notgoda  
       2021-12-12 15:27:35 +08:00 via iPhone
    @Tumblr 大佬,你这个 ddns 脚本建议多久跑一次?放在国内家家里光猫后面。
    notgoda
        23
    notgoda  
       2021-12-12 18:09:27 +08:00 via iPhone
    @boris93
    @FrankAdler
    @guanyin9cn 各位 V 友,https://api.cloudflare.com / cf 这个 api 在国内会不会被干扰? 官网在有些地区已经打不开了。
    Tumblr
        24
    Tumblr  
       2021-12-12 19:28:02 +08:00
    @notgoda #22 在梅林固件中,路由器每次获取 IP 之后会触发这个,不需要设定周期。
    boris93
        25
    boris93  
       2021-12-12 20:19:00 +08:00 via iPhone
    @notgoda #23 目前我用着没问题
    notgoda
        26
    notgoda  
       2021-12-12 22:16:45 +08:00 via iPhone
    @Tumblr 我不是路由器。。我就是用树莓派跑 你这个脚本。 大佬建议隔多久间隔 crontab?
    Tumblr
        27
    Tumblr  
       2021-12-12 23:04:07 +08:00
    @notgoda #26 这个很难给建议,举个例子,比如我这边公网 IP 的租期是 3 天,但是我每天都要用,所以我会倾向于每天早上跑一次。

    如果你对于公网 IP 的需求不是太强烈,当然可以按你的公网租期来跑,但是如果需要强烈,建议 hourly 检测公网 IP (比如 IP 存入文件,每次比对完之后覆盖),发现变化了就更新,否则就不执行操作。
    当然,这种频繁检测的还要留意获取公网 IP 的 API 是否有限制。
    notgoda
        28
    notgoda  
       2021-12-12 23:23:38 +08:00 via iPhone
    @Tumblr 我看了一下你用的那个 api 对次数没有任何限制的。那为什么要 ip 写入文件比对呢?直接每分钟执行一下这个脚本不是更好吗?
    Tumblr
        29
    Tumblr  
       2021-12-12 23:33:06 +08:00
    @notgoda #28 这个是我个人习惯,不做无谓地更新,既然 IP 地址没变,就不用对 DNS 的 ISP 发出请求。
    当然,如果每次都请求更新 DNS 记录,肯定也是没有问题的。
    notgoda
        30
    notgoda  
       2021-12-12 23:34:06 +08:00 via iPhone
    @boris93 谢谢大佬回复。请问 cf ddns cron job 支持的间隔最低可以设置为多少?
    notgoda
        31
    notgoda  
       2021-12-12 23:35:17 +08:00 via iPhone
    @Tumblr 谢谢大佬,请问你这个脚本该怎么改才能同时支持 v4 和 v6 公网地址 dns 更新?
    notgoda
        32
    notgoda  
       2021-12-12 23:39:42 +08:00 via iPhone
    @guanyin9cn
    @iphoneXr
    @black938
    @Loku
    @sam014
    @boris93 各位大佬们, 对于同时有公网 IPv4 和 V6, 有没有办法一起检查更新 dns 呢? ddns go 好像只能二选一。🙏🙏
    boris93
        33
    boris93  
       2021-12-13 03:01:04 +08:00 via iPhone
    @notgoda #32 我那个玩意可以
    notgoda
        34
    notgoda  
       2021-12-13 11:07:16 +08:00 via iPhone
    @boris93 谢谢,请问你 cf 能支持一下 API Tokens 吗?更安全。
    boris93
        35
    boris93  
       2021-12-13 21:45:48 +08:00 via iPhone
    @notgoda #34 抽空我看看吧……
    notgoda
        36
    notgoda  
       2022-12-09 02:04:49 +08:00 via iPhone
    @Tumblr 大佬你好,请问梅林固件中,如何让路由器每次获取 IP 之后触发你这个脚本?谢谢🙏
    Tumblr
        37
    Tumblr  
       2022-12-09 10:58:00 +08:00
    @notgoda #36 把脚本放在 /jffs/scripts/ 里,我用的这个固件在每次更新 IP 之后都会主动调用。
    我用的是这个固件: http://xvtx.ru/xwrt/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2644 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:50 · PVG 09:50 · LAX 17:50 · JFK 20:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.