宽带公网 IP,有没有开源的类似 ddns 实现脚本,自动获取 ip,并把 ip 写入到 cloudflare 的 dns 记录里 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
guanyin9cn
V2EX    程序员

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

  •  
  •   guanyin9cn 2021-08-31 20:59:54 +08:00 4596 次点击
    这是一个创建于 1501 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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  
    PRO
       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 我那个玩意可以
        34
    notgoda  
       2021-12-13 11:07:16 +08:00 via iPhone
    @boris93 谢谢,请问你 cf 能支持一下 API Tokens 吗?更安全。
    notgoda
    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     Solana     1049 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 18:24 PVG 02:24 LAX 11:24 JFK 14:24
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86