请教一下 HttpDns 的问题,想了解下工作方式跟具体的实现场景。

2020-09-08 23:12:46 +08:00
 Yakir

HttpDns 替代普通 dns 解析 IP 的方式。 看到 aliyun 的 HttpDns Api 是通过调用固定 ip 返回 domain 的 json 数据(数据返回 api 中 domain 参数的解析地址),通过 http 协议,因此绕过本地运营商,防止劫持。

但是看到网上文章说的是:移动端是获取到该 ip 之后,在原有 URL 基础上,将域名替代为 ip,然后用新的 URL 发起请求。

想请教下,这样是否有个问题:假如我的 web 服务器上 nginx 配置的是 server_name 模式,移动端使用 IP/URL 这样的方式不是会 404 吗,请问有大佬使用这个 API 吗,具体实现方式是咋样的呢?

2152 次点击
所在节点    程序员
13 条回复
jim9606
2020-09-08 23:32:47 +08:00
nginx 并不知道客户端用何种方式得到服务器的 IP 地址的,可以是 DNS 也可以是 DoH 。

HTTP 请求的 Host 头会包含域名,HTTPS 会包含 SNI 扩展指定域名,nginx 是认这个的。
xmumiffy
2020-09-09 01:39:22 +08:00
一般是在 DNS 解析层做的,不会去改 URL
wjhjd163
2020-09-09 01:50:48 +08:00
类似于
你请求 HTTP 时候请求了 IP
但 Header 里面手动写入了 Host: xxxx

到了 WEB 服务器手里面还是一样处理
ochatokori
2020-09-09 02:15:18 +08:00
server_name 匹配的是 host,你客户端设置 host 就好了
当然了,只有 web 客户端就不行了
wangritian
2020-09-09 09:24:16 +08:00
url 里面的域名要替换成 httpdns 的结果 ip,然后手动设置 Host 为域名
http 层并没有目标 ip 地址,ip 是封装在 tcp 包里的,所有的代理软件都是查看 http header 的 Host 识别用户访问域名
594duck
2020-09-09 09:50:39 +08:00
HTTP DNS 简单讲可以认为是类似像 HOSTS 一样的东西

DNSPOD 有这个服务

应用场景是因为国内 DNS 劫持太猛了,特别是像广东地区,重庆地区,东北地区,那叫一个乱。所以只有用这个办法解决被 DNS 劫持的恶果。

普通 浏览器还不支持,一般是在移动端打个 SDK 包。
Yakir
2020-09-09 10:36:46 +08:00
@594duck
请问像这种运营商级别的劫持,除了这种通过不走 UDP 协议的方式还有其他解决方法吗?

移动端打包 SDK 的话就是用 IP 替换域名的方式请求服务器吗?

顺便问下,为啥这几个地区劫持会这么乱呢,难道不会被查水表吗?
594duck
2020-09-09 11:02:08 +08:00
@Yakir 是 SDK 在第一次请求的时候通过私有方法先到一台网关上获得你的 IP 和 HOSTS 对应表,之后的请求就直接查这个表,这样你永远不会被污染

至于为什么会这么乱,以前 ISP 劫持浏览器打广告更猛 。
wangyapu
2020-09-09 16:26:22 +08:00
@jim9606
@wjhjd163
看到阿里云的文档里是这么说的:
「当客户端使用 HTTPDNS 解析域名时,请求 URL 中的 host 会被替换成 HTTPDNS 解析出来的 IP,所以在证书验证的第 2 步,会出现 domain 不匹配的情况,导致 SSL/TLS 握手不成功。」
https://help.aliyun.com/document_detail/30143.html?spm=5176.doc30140.6.562.9duHZH

我的理解是,HTTP 请求报文中只有一个地方来指定服务地址:Host 字段。既然换成 IP 了,怎么还能保留原本的域名呢?
wjhjd163
2020-09-09 17:45:49 +08:00
@wangyapu URL 中的 Host 和 Header 里面的 Host 也不是一样的
至于 HTTPS 还有个 SNI
wangyapu
2020-09-09 20:37:02 +08:00
@wjhjd163
感谢回复!
但是根据我查阅的资料,HTTP 的报文,首行的 URL 不是只包含 path 吗,host 被放在了 host 字段,比如:

http://www.ituring.com.cn/figures/2013/HTTP_The%20Definitive%20Guide/07.d03z.05.png


资料来源:《 HTTP 权威指南》 https://www.ituring.com.cn/book/miniarticle/44596
jim9606
2020-09-09 21:41:14 +08:00
@wangyapu 因为对于这类 HTTP 客户端库,如果你直接用解析出来的 IP 构造 URL 传给这种库的话它就会在 Host 头和 SNI 扩展头里填 IP 而不是域名。所以才需要定制 SocketFactory 或者替换 Vertifier 。

如果你是直接用 TLS Socket 或者 TCP Socket 并自己实现 HTTP 客户端逻辑,就可以根据上面的要求调整。
wjhjd163
2020-09-10 00:00:07 +08:00
@wangyapu 这样确实没错
如果你直接使用 socket 写一个 HTTP 可能会有更好的理解

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

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

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

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

© 2021 V2EX