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

2017-04-26 15:30:09 +08:00
 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 了。
4494 次点击
所在节点    Python
16 条回复
yexiaoxing
2017-04-26 15:34:38 +08:00
request 的时候直接用 IP 替代 dns.google.com ,然后加上一个 HOST: dns.google.com 的 header ?
denghongcai
2017-04-26 15:35:57 +08:00
先用 dnspython 去查 ip ,然后给 urllib 设置 Host 头,用 IP 去请求就好了
qinc
2017-04-26 15:44:16 +08:00
dnspod 家的 httpdns 貌似可以解决
leavic
2017-04-26 17:00:09 +08:00
@denghongcai urllib 对付 http 请求这样搞是可以,不过用 aiohttp 请求 https://dns.google.com 的时候就会爆 ssl 错误,还要看看。
denghongcai
2017-04-26 17:59:01 +08:00
ssl 握手包里有域名,这样确实不行

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

不过正确的实现像五楼说的那样。
TJT
2017-04-27 00:18:54 +08:00
不过正确的实现*应该*像五楼说的那样。
leavic
2017-04-27 10:12:48 +08:00
@TJT 我希望的就是这个东西能够完全独立于其他的服务,只依赖基本的网络连接。
andrewhxism
2017-04-27 10:16:39 +08:00
@leavic 不可能的,基本网络连接也需要初始 DNS 的
leavic
2017-04-27 10:39:44 +08:00
@andrewhxism 别扯,我已经搞定了。
leavic
2017-04-27 10:47:48 +08:00
@andrewhxism 好吧,我错了,好像还是有问题。
leavic
2017-04-27 11:00:54 +08:00
@andrewhxism 哈哈哈,是我代码写错了,还是可以的。
TJT
2017-04-27 13:22:31 +08:00
@leavic 基本的网络连接怎么定义???
candane
2017-04-27 13:50:43 +08:00
楼主搞定了没有??
leavic
2017-04-27 14:45:18 +08:00
@TJT 有 TCP 和 UDP 连接就行啊
leavic
2017-04-27 14:45:54 +08:00
@candane append 的部分就是可用的代码啊

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

https://www.v2ex.com/t/357479

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

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

© 2021 V2EX