V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Yakir
V2EX  ›  程序员

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

  •  
  •   Yakir ·
    yakir3 · 2020-09-08 23:12:46 +08:00 · 2150 次点击
    这是一个创建于 1540 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    13 条回复    2020-09-10 00:00:07 +08:00
    jim9606
        1
    jim9606  
       2020-09-08 23:32:47 +08:00
    nginx 并不知道客户端用何种方式得到服务器的 IP 地址的,可以是 DNS 也可以是 DoH 。

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

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

    DNSPOD 有这个服务

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

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

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

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

    至于为什么会这么乱,以前 ISP 劫持浏览器打广告更猛 。
    wangyapu
        9
    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
        10
    wjhjd163  
       2020-09-09 17:45:49 +08:00 via Android
    @wangyapu URL 中的 Host 和 Header 里面的 Host 也不是一样的
    至于 HTTPS 还有个 SNI
    wangyapu
        11
    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
        12
    jim9606  
       2020-09-09 21:41:14 +08:00
    @wangyapu 因为对于这类 HTTP 客户端库,如果你直接用解析出来的 IP 构造 URL 传给这种库的话它就会在 Host 头和 SNI 扩展头里填 IP 而不是域名。所以才需要定制 SocketFactory 或者替换 Vertifier 。

    如果你是直接用 TLS Socket 或者 TCP Socket 并自己实现 HTTP 客户端逻辑,就可以根据上面的要求调整。
    wjhjd163
        13
    wjhjd163  
       2020-09-10 00:00:07 +08:00 via Android
    @wangyapu 这样确实没错
    如果你直接使用 socket 写一个 HTTP 可能会有更好的理解
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3442 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:10 · PVG 19:10 · LAX 03:10 · JFK 06:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.