当系统 DNS 不可用的时候,如何给 Python 程序指定 DNS 服务器,或者有没有类似 Hosts 的实现方法?

2017 年 4 月 26 日
 leavic
简单点说,我想用 Google 的 DNS Over Https 。

但这里有一个问题,如果我只是作为一个候选的 DNS 服务来启动是没问题的,但如果要作为本机唯一的 DNS 服务器,这就有个鸡生蛋蛋生鸡的问题了:

我需要访问 dns.google.com 才能解析数据,可是我不知道 dns.google.com 的 IP 地址,于是我向自己查询,然后死循环。

所以,有没有什么办法可以给 python 程序指定一个 DNS 解析器用于一些必要的基本解析呢,例如用 114DNS 先完成必要的域名解析。

或者有没有类似写 Hosts 的方法,直接告诉 python 这些域名的地址,具体的来说,是告诉 urllib 和 aiohttp 域名的 A 地址,这样就不需要额外的 DNS 来解析 dns.google.com 了。
5162 次点击
所在节点    Python
16 条回复
yexiaoxing
2017 年 4 月 26 日
request 的时候直接用 IP 替代 dns.google.com ,然后加上一个 HOST: dns.google.com 的 header ?
denghongcai
2017 年 4 月 26 日
先用 dnspython 去查 ip ,然后给 urllib 设置 Host 头,用 IP 去请求就好了
qinc
2017 年 4 月 26 日
dnspod 家的 httpdns 貌似可以解决
leavic
2017 年 4 月 26 日
@denghongcai urllib 对付 http 请求这样搞是可以,不过用 aiohttp 请求 https://dns.google.com 的时候就会爆 ssl 错误,还要看看。
denghongcai
2017 年 4 月 26 日
ssl 握手包里有域名,这样确实不行

自定义一个 connector 应该可以 http://aiohttp.readthedocs.io/en/stable/_modules/aiohttp/connector.html
TJT
2017 年 4 月 27 日
简单粗暴的方法,起个 dnsmasq 中转 DNS 查询,然后 Python 用 dnspython 去查 IP ,查到就更新到 dnsmasq 里面,再去请求就好了。

不过正确的实现像五楼说的那样。
TJT
2017 年 4 月 27 日
不过正确的实现*应该*像五楼说的那样。
leavic
2017 年 4 月 27 日
@TJT 我希望的就是这个东西能够完全独立于其他的服务,只依赖基本的网络连接。
andrewhxism
2017 年 4 月 27 日
@leavic 不可能的,基本网络连接也需要初始 DNS 的
leavic
2017 年 4 月 27 日
@andrewhxism 别扯,我已经搞定了。
leavic
2017 年 4 月 27 日
@andrewhxism 好吧,我错了,好像还是有问题。
leavic
2017 年 4 月 27 日
@andrewhxism 哈哈哈,是我代码写错了,还是可以的。
TJT
2017 年 4 月 27 日
@leavic 基本的网络连接怎么定义???
candane
2017 年 4 月 27 日
楼主搞定了没有??
leavic
2017 年 4 月 27 日
@TJT 有 TCP 和 UDP 连接就行啊
leavic
2017 年 4 月 27 日
@candane append 的部分就是可用的代码啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/357479

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX