jeessy2 / ddns-go

Simple and easy to use DDNS. Support Aliyun, Tencent Cloud, Dnspod, Cloudflare, Callback, Huawei Cloud, Baidu Cloud, Porkbun, GoDaddy, Namecheap, NameSilo...
MIT License
11.22k stars 1.28k forks source link

主路由ip变更后反复在新ip和旧ip之间获取 #1107

Closed ATFieldBeast closed 1 month ago

ATFieldBeast commented 4 months ago

问题描述

我的主路由ip是#531这里说所用dig获取的 dig +short aaaa *******.asuscomm.com 发现在主路由ip发生变更后会在两小时内反复的获取到新ip和旧ip,交替解析到dnspod

Snipaste_2024-05-10_08-39-48 Snipaste_2024-05-10_08-41-24

是不是ip变化后dig会有两条记录呢(当时在睡觉没有马上手动dig一下),但是为什么顺序一直在规律变化

另外有没有什么办法能在虚拟机的docker中直接获得主路由的ipv6呢,用ip neigh只有ipv4的网关地址和内网ipv6地址(而且主路由自己得到的ipv6前缀和分配下去的前缀并不一样

DNS服务商

DnsPod

是否已搜索同类问题

已搜索,但未能解决

操作系统

Linux

架构

x86_64

版本

v6.5.0

安装方式

Docker

额外信息

No response

jeessy2 commented 4 months ago

交替变化说明dig获取的IPv6也交替变化了,需要你自己验证。

如果要获取其它设备的IPv6:

ATFieldBeast commented 4 months ago

交替变化说明dig获取的IPv6也交替变化了,需要你自己验证。

如果要获取其它设备的IPv6:

这些方法好像都从局域网内拿不到主路由的wan口ip的, 我下午试了下把主路由的ssh开了,从容器里ssh进主路由,然后再ip addr那些是可以得到了, 但是在容器里执行有结果,在gui的脚本里放ssh -p xxx xxxx@ip xxx什么的会返回ssh:not found……;把命令写进sh脚本里再在gui的脚本里写/opt/xxxx.sh会返回xxxx.sh not found ……现在就不知道这最后一步在gui里怎么从ssh获得ip了

jeessy2 commented 4 months ago

docker中不能使用ssh,没那个ssh包 可以尝试直接安装ddns-go到路由器

ATFieldBeast commented 4 months ago

docker中不能使用ssh,没那个ssh包 可以尝试直接安装ddns-go到路由器

啊?我用命令行登陆,进到容器里面都跑通了啊,有ssh来着,就是gui执行不了

jeessy2 commented 4 months ago

好像是安全机制,不能用脚本执行ssh。换个支持的?

ATFieldBeast commented 4 months ago

好像是安全机制,不能用脚本执行ssh。换个支持的?

我是傻逼,我这个虚拟机的docker里装了ddnsgo和npm两个容器,结果下午一直在npm里面操作的,我也不知道为什么居然一直没发现,刚才吃了饭一看怎么好像不太对,真的是,怪不得gui里一直没用

我还说你怎么说镜像里没ssh呢,原来是npm那边有ssh

现在在ddnsgo里自己装了ssh之后一切正常了,gui也能正确获得主路由的wan口ip了

Snipaste_2024-05-10_20-16-24

首先要生成秘钥和主路由免密登录

gui里用的命令是 ssh -T -p XXX YYY@ZZZ < ~/sshgetip/getip.sh XXX是ssh端口,YYY是主路由登录名,ZZZ是路由器ip

getip.sh是容器里的脚本,随便放哪,里面是ssh到路由器后执行的命令,如下

#!/bin/bash
ip -6 addr show ppp0 | grep 'inet6 240[a-f:A-F 0-9]*/64' | grep -v 'deprecated' | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}' | tail -1

用的就是之前大家总结的正常在本机查找的命令,ppp0要换成你的获取ipv6的网口

(终于把dig要用到华硕的服务这个故障点干掉了,能ssh到主路由的都能这样干了

xfl12345 commented 3 months ago

好像是安全机制,不能用脚本执行ssh。换个支持的?

我是傻逼,我这个虚拟机的docker里装了ddnsgo和npm两个容器,结果下午一直在npm里面操作的,我也不知道为什么居然一直没发现,刚才吃了饭一看怎么好像不太对,真的是,怪不得gui里一直没用

我还说你怎么说镜像里没ssh呢,原来是npm那边有ssh

现在在ddnsgo里自己装了ssh之后一切正常了,gui也能正确获得主路由的wan口ip了

Snipaste_2024-05-10_20-16-24

首先要生成秘钥和主路由免密登录

gui里用的命令是 ssh -T -p XXX YYY@ZZZ < ~/sshgetip/getip.sh XXX是ssh端口,YYY是主路由登录名,ZZZ是路由器ip

getip.sh是容器里的脚本,随便放哪,里面是ssh到路由器后执行的命令,如下

#!/bin/bash
ip -6 addr show ppp0 | grep 'inet6 240[a-f:A-F 0-9]*/64' | grep -v 'deprecated' | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}' | tail -1

用的就是之前大家总结的正常在本机查找的命令,ppp0要换成你的获取ipv6的网口

(终于把dig要用到华硕的服务这个故障点干掉了,能ssh到主路由的都能这样干了

简化版:

echo $(ssh root@192.168.1.1 'ip -6 route get 240c::6666') | grep -oE 'src.*$' | awk {'print $2'}
ATFieldBeast commented 3 months ago

好像是安全机制,不能用脚本执行ssh。换个支持的?

我是傻逼,我这个虚拟机的docker里装了ddnsgo和npm两个容器,结果下午一直在npm里面操作的,我也不知道为什么居然一直没发现,刚才吃了饭一看怎么好像不太对,真的是,怪不得gui里一直没用 我还说你怎么说镜像里没ssh呢,原来是npm那边有ssh 现在在ddnsgo里自己装了ssh之后一切正常了,gui也能正确获得主路由的wan口ip了 Snipaste_2024-05-10_20-16-24 首先要生成秘钥和主路由免密登录 gui里用的命令是 ssh -T -p XXX YYY@ZZZ < ~/sshgetip/getip.sh XXX是ssh端口,YYY是主路由登录名,ZZZ是路由器ip getip.sh是容器里的脚本,随便放哪,里面是ssh到路由器后执行的命令,如下

#!/bin/bash
ip -6 addr show ppp0 | grep 'inet6 240[a-f:A-F 0-9]*/64' | grep -v 'deprecated' | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}' | tail -1

用的就是之前大家总结的正常在本机查找的命令,ppp0要换成你的获取ipv6的网口 (终于把dig要用到华硕的服务这个故障点干掉了,能ssh到主路由的都能这样干了

简化版:

echo $(ssh root@192.168.1.1 'ip -6 route get 240c::6666') | grep -oE 'src.*$' | awk {'print $2'}

我就是没整清楚ssh执行命令的时候“”里面还有“”怎么写,转义什么的试了还是报错,才把获取ipv6的命令放脚本里了的,没转过弯可以先不grep,得到完整的返回结果,再在本地grep这样也行(不过放脚本里在gui里看着也挺整洁就是

yuanwenliang commented 2 months ago

我目前的情况与你一样,也是华硕路由器,想在群晖NAS上 Docker 中跑 ddns-go,我准备用你之前 dig 方案,但是镜像中没有 dig 命令,所以想问一下您是改了 Dockerfile 重新构建了镜像不,可以分享一下 Dockerfile 不,我有 Mac 电脑,可能还涉及到交叉编译,如果不在 Mac 上编译镜像也还可以选择在NAS上编译,但是NAS还没装 make 命令,所以想问一下您的方案

ATFieldBeast commented 2 months ago

我目前的情况与你一样,也是华硕路由器,想在群晖NAS上 Docker 中跑 ddns-go,我准备用你之前 dig 方案,但是镜像中没有 dig 命令,所以想问一下您是改了 Dockerfile 重新构建了镜像不,可以分享一下 Dockerfile 不,我有 Mac 电脑,可能还涉及到交叉编译,如果不在 Mac 上编译镜像也还可以选择在NAS上编译,但是NAS还没装 make 命令,所以想问一下您的方案

啊,我是用的docker compose,pull镜像的时候就会自动调用dockerfile来build(不过dockerfile不是用的docker build命令么,也没用make啊) docker-compose.yml:

# version: '3.9'
services:
  ddnsGo:
    image: ddns-go:mod
    build:
      context: ../dockerfile
      dockerfile: ddnsGoMod
    container_name: ddnsGo
    restart: always
    network_mode: host
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./ddnsGo:/root

对应调用的dockerfile:

FROM jeessy/ddns-go:latest
RUN apk update && \
    apk add --no-cache openssh

我这里是装了后面改进的ssh,要用dig换成dig就是

yuanwenliang commented 2 months ago

我用你这个 Dockerfile 在NAS上构建了一个镜像,已经可以用了,我选择的是你之前 dig 方案,多谢~