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.91k stars 1.37k forks source link

Support for using DNS over TCP to lookup hostname. #1215

Closed Zerorigin closed 2 months ago

Zerorigin commented 2 months ago

Description

有部分环境会劫持 53/udp 的解析请求到内网的递归或转发查询缓存服务器,而放行 53/tcp 查询 所以希望能在配置文件里给个选项来可选配置是否使用 53/tcp 查询

另外附一个测试公共 DNS 是否支持 53/tcp 的查询工具(全协议支持,方便后续使用) dnslookup 国内部分地区会掐部分公共 53/tcp 链接,因此我在想是否应该把两个 BackupDNS 列表也提取到配置文件里

我稍微看了下现有的代码: https://github.com/jeessy2/ddns-go/blob/ce755764e8064627d7e24a9365e86a685caa0ace/util/net_resolver.go 如果不涉及 UI 变动的话,我可以直接提交个 pr 添加这个 feat.

Problem

No response

Other Description

No response

Checklist

jeessy2 commented 2 months ago

只有本地DNS出错了才会使用BackupDNS.

可以指定DNS ./ddns-go -s install -dns 192.168.1.1

Zerorigin commented 2 months ago

只有本地DNS出错了才会使用BackupDNS.

可以指定DNS ./ddns-go -s install -dns 192.168.1.1

那就只加 53/tcp lookup hostname 就行?

jeessy2 commented 2 months ago

把192.168.1.1改成你认证可以的dns服务器,dns服务器需要开启53端口

Zerorigin commented 2 months ago

把192.168.1.1改成你认证可以的dns服务器,dns服务器需要开启53端口

不行,我这边的环境劫持了所有的 53/udp 查询到内网的转发查询缓存服务器 内网的 DNS 服务器和上游的通信走的全是非常规端口的加密协议(DoT/DoH/DoH3/DNSCrypt 这些)

jeessy2 commented 2 months ago

你都劫持了,那还有什么问题?

Zerorigin commented 2 months ago

你都劫持了,那还有什么问题?

只有网关的机器才能直通 53/udp 出去 内网的 DNS 服务器是带缓存的 只要乐观缓存没过期,就算实际 DNS 记录已变更(更新) ddns-go 查询的 hostname 对应的 IP 地址还会是旧的地址 这样会造成判断 DNS 记录出现出现延后现象

jeessy2 commented 2 months ago

用了ddns,你还开乐观缓存,乐观不起来。有些dns服务器可以设置的,这些你自己研究了

Zerorigin commented 2 months ago

用了ddns,你还开乐观缓存,乐观不起来。有些dns服务器可以设置的,这些你自己研究了

不是,我就加个配置文件的配置项,和命令行参数(不涉及任何 WebUI 的变动) 改动完后,我提交个 PR,你那边合并下即可

是不想增加复杂度么?如果是的,那这个 issue 也可以直接关了。 毕竟 DNS 记录判断造成的延后并不会导致更新不上,影响上并不会太大

jeessy2 commented 2 months ago

提交增加DNS支持DoT/DoH/DoH3? 我感觉没必要

Zerorigin commented 2 months ago

提交增加DNS支持DoT/DoH/DoH3? 我感觉没必要

指的是标题里提到的 DNS over TCP 这一个而已 上面提到的那些仅仅是说明下我这边的环境情况 DoT/DoH/DoH3 这些确实没必要

实在不行的话,我 fork 个分支,自用也行

jeessy2 commented 2 months ago

那你fork吧

jeessy2 commented 2 months ago

golang支持tcp的53端口,要改代码才行,感觉也没必要,udp不一样的?

Zerorigin commented 2 months ago

默认支持tcp的53端口,我这里没有,你可以试下

我这边在境外的机子测试了一下,国内外主流的公共 DNS 都是支持 53/tcp 的,这是一个用于 53/udp 回退的标准协议 但是国内部分地区会掐特定的 53/tcp 链接,我这边 alidns 和 114、Google Public DNS 的 53/tcp 都正常 但是腾讯的 DNSPod、Cisco OpenDNS、Cloudflare DNS、AdGuard DNS、Quad9 全被掐了

Zerorigin commented 2 months ago

golang支持tcp的53端口,要改代码才行,感觉也没必要,udp不一样的?

整个协议都是一样的,只不过走了 TCP 链接而已,所以才说只是很小的一部分变动而已

jeessy2 commented 2 months ago

也可以,参考dnslookup tcp://94.140.14.14 不加tcp://的默认就udp

Zerorigin commented 2 months ago

也可以,参考dnslookup tcp://94.140.14.14 不加tcp://的默认就udp

也行,这样就不需要增加配置文件的配置项了,命令行参数也不需要变动了 那就仅仅在内层的代码做些判断上的变动 如果可以的话,我就按参考 dnslookup 使用 tcp:// 和 udp:// 头来提交 PR

jeessy2 commented 2 months ago

可以

Zerorigin commented 2 months ago

只有本地DNS出错了才会使用BackupDNS.

可以指定DNS ./ddns-go -s install -dns 192.168.1.1

你可以先 review 下:https://github.com/jeessy2/ddns-go/pull/1217 使用 -dns 自定义 DNS 似乎仅仅是覆盖了 BackupDNS?这样好像还是在本地 DNS 出错了才会使用? 不过这样已经可以暂时通过防火墙拦截 ddns-go 对特定目标的 53/udp 的访问来使其回退到备选的自定义 DNS 了