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

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

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

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

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

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

    完美解决!
    guanyin9cn
        2
    guanyin9cn   54 天前
    @wangbenjun5 谢谢,你说的略显麻烦,我刚自行搜了下,找到了方法,发在了宽带区

    v2ex.com/t/799135
    wangbenjun5
        3
    wangbenjun5   54 天前
    @guanyin9cn 只要能获取 ip,都好办,自己服务器写个 web 服务,用 go 或者 php 也就几行代码,胜在稳定可控。至于光猫或者路由器上面直接命令获取,必须得改路由器上面拨号,有点麻烦。
    f165af34d4830eeb
        4
    f165af34d4830eeb   54 天前
    openwrt 的 ddns 插件符合你的要求,而且支持多家 dns 服务商。
    boris93
        6
    boris93   54 天前 via iPhone
    正好我自己写的一个小玩意完美符合需求
    https://github.com/boris1993/dnsupdater
    代码可能有点丑,但确实能用
    FrankAdler
        7
    FrankAdler   54 天前
    我正在用的脚本,跑在 openwrt 上,jq 命令自己想办法装上或者替换成 awk
    Tink
        8
    Tink   54 天前
    这个随便一搜一大堆。。。
    flynaj
        9
    flynaj   54 天前
    ddns 是路由器的基本功能。openwrt 直接支持。
    Tumblr
        10
    Tumblr   54 天前   ❤️ 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   54 天前
    @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   53 天前
    老毛子( PADAVAN ) 路由器固件支持这个功能 (愉快使用 2 年多了)
    iphoneXr
        13
    iphoneXr   53 天前
    @Tumblr 我的第一反应也是找到 cloudflare 的 api 接口 直接 curl 一下
    感谢实现了
    guanyin9cn
        14
    guanyin9cn   53 天前
    @Tumblr #10 zone_id 一般不会变,除非删除了域名。record_id 会随着删除 A 记录而发生变化。写的简单,维护起来麻烦。
    guanyin9cn
        15
    guanyin9cn   53 天前
    @boris93 go 语言实现,json 解析起来会比较方便。
    black938
        16
    black938   53 天前
    https://github.com/jeessy2/ddns-go
    go 语言实现 打包个二进制扔路由器跑都行
    Loku
        17
    Loku   53 天前
    @Tumblr 我也是这样写的
    superszy
        18
    superszy   53 天前
    现成的啊,openwrt 的 ddns 也有 cf,编译时候选上就行了。

    如果想自己 docker 部署的话也很多,比如这个 https://github.com/wddwycc/cf_ddns
    Tumblr
        19
    Tumblr   53 天前
    @guanyin9cn #14 为什么要删除 A 记录呢? 😅 直接 modify 就好了。
    如果有多个域名,其它的 cname 到一个固定的 A 就可以了。
    sam014
        20
    sam014   53 天前
    ddns-go
    boris93
        21
    boris93   53 天前 via iPhone
    @guanyin9cn #15 更主要的原因是性能要求低。最早我是让它跑在路由器上的,Java 和 python 不可能,c 我不会,最后选择 go
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   988 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 19:14 · PVG 03:14 · LAX 12:14 · JFK 15:14
    ♥ Do have faith in what you're doing.