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

iOS APP 发网络请求时,如何指定域名强制解析某 IP,不使用域名服务器的 IP

  •  
  •   q409195961 · 2017-07-06 10:57:42 +08:00 · 3714 次点击
    这是一个创建于 2696 天前的主题,其中的信息可能已经有所发展或是发生改变。

    由于 DNS 污染,某环境下,xxx.com 的域名被解析成 123.0.0.1

    如何在发请求时,把 xxx.com 的域名强制解析 IP 成 127.0.0.1 去请求数据

    在 PC 下,可以通过修改 /etc/hosts 实现

    127.0.0.1 xxx.com
    

    请问在移动端的 APP 该如何处理??

    网络请求框架:AFNetworking

    19 条回复    2017-07-06 16:23:39 +08:00
    CDuXZMAPgHp1q9ew
        1
    CDuXZMAPgHp1q9ew  
       2017-07-06 11:23:35 +08:00
    urlprotocol
    liuminghao233
        2
    liuminghao233  
       2017-07-06 11:29:52 +08:00 via iPhone
    做这事情没啥意义啊

    dns 请求也是发 udp 包给服务器,然后你解 reply 包,把 ip 地址拿出来。

    你都知道 ip 了还解析个啥,有点莫名其妙的感觉。
    honeycomb
        3
    honeycomb  
       2017-07-06 11:32:52 +08:00 via Android
    使用各大厂商提供的 HTTP dns 接口。
    当然也可以自己做,但可能没意义。
    q409195961
        4
    q409195961  
    OP
       2017-07-06 11:42:13 +08:00
    @liuminghao233 我不是想拿到 ip 地址。我是想在发请求 xxx.com 的接口时,域名指向的 ip 地址是 127.0.0.1,而不是 DNS 服务器给的 123.0.0.1。(不可以直接通过 IP 地址请求接口)
    xxx.com 域名原本是指向 127.0.0.1 的服务器,但 DNS 服务器污染后变成指向 123.0.0.1 了
    paradoxs
        5
    paradoxs  
       2017-07-06 11:42:51 +08:00
    让后台做转发啊, 这个部分访问你们后台提供的地址就行了.
    icodesign
        6
    icodesign  
       2017-07-06 11:45:49 +08:00
    是真 `127.0.0.1` 吗.....

    > 不可以直接通过 IP 地址请求接口
    还有这种?最终都是 tcp 连接过去,说到底不还是 IP
    wizardoz
        7
    wizardoz  
       2017-07-06 11:55:55 +08:00
    那为啥不直接填 IP
    wizardoz
        8
    wizardoz  
       2017-07-06 11:57:52 +08:00
    域名的唯一意义就是得到 IP,说不可以通过 IP 地址请求表示不能理解。
    如果是 HTTP 接口的话,在请求 Header 里面设置域名就可以了。
    flyingghost
        9
    flyingghost  
       2017-07-06 12:05:15 +08:00   ❤️ 2
    “不可以直接通过 IP 地址请求接口”
    说明你并没有理解 HTTP。
    建立连接填 IP,header 头填 host 字段,抓包确认看看。
    noli
        10
    noli  
       2017-07-06 12:50:14 +08:00 via iPhone
    如果已知 ip 并且 ip 在 app 生命周期里不会变,那为啥不用 ip 直连?

    如果觉得 ip 可能会变,使用了域名,又担心 dns 污染,那你要解决的问题就是防止 dns 污染而不是直接指定一个 ip。
    q409195961
        11
    q409195961  
    OP
       2017-07-06 12:53:52 +08:00
    @icodesign @wizardoz @flyingghost 感谢回答!

    比如访问 V2,DNS 服务器会返回 101.226.196.39 这个 IP,来访问网站

    ![image]( https://ooo.0o0.ooo/2017/07/06/595dc0b59b571.png)

    但 V2 也有其他节点,比如我想强制让他用另一个 IP ( 61.49.62.98 )来请求。

    在 PC 中,我只需修改 hosts 即可

    ```
    61.49.62.98 www.v2ex.com
    ```

    但我想在 APP 中实现,且不修改系统的 hosts。
    sampeng
        12
    sampeng  
       2017-07-06 12:54:12 +08:00   ❤️ 1
    楼上这么多人心都操碎了。。。我猜楼主想表达的是,真实 ip 我有办法弄到,并且我有办法知道 dns 返回 ip 不对,但我怎么直接指定 ip,但是不用换域名呢。
    答案 9 楼已说,自行 google
    sampeng
        13
    sampeng  
       2017-07-06 12:54:38 +08:00
    @q409195961 配 header 头解决问题
    blank_dlh
        14
    blank_dlh  
       2017-07-06 13:00:07 +08:00   ❤️ 1
    @q409195961 请求的时候,URL 里面用 IP,header 中加上 Host: 域名。这是常规的 HTTPDNS 的做法。
    liuminghao233
        15
    liuminghao233  
       2017-07-06 13:18:06 +08:00 via iPhone
    自己发包选择 dns
    自己解析 reply

    不过按照楼主的逻辑
    自己选择 dns 服务器也不能用 ip 只能用域名
    如果这个域名又被污染 那岂不是无解的?
    a554340466
        16
    a554340466  
       2017-07-06 13:23:47 +08:00 via iPhone
    九楼的方案就是啊
    sobigfish
        17
    sobigfish  
       2017-07-06 13:26:49 +08:00   ❤️ 1
    https://github.com/mattt/NSEtcHosts
    lz 是想在 app 把特定的域名解析到特定的 IP 吧
    sfz97308
        18
    sfz97308  
       2017-07-06 16:20:28 +08:00   ❤️ 1
    @sobigfish 提供的应该是 lz 想要的

    楼上好多人说直接通过 IP 访问,理论上可以,但在 iOS 9 之后,App Transport Security 是禁止直接通过 IP 地址访问的,必须通过域名,除非强制设置 NSAllowsArbitraryLoads
    skylancer
        19
    skylancer  
       2017-07-06 16:23:39 +08:00
    喂喂.. 你们在喷卤煮不熟悉 HTTP 前,先看清人家说的是 iOS App,,,
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   926 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:12 · PVG 05:12 · LAX 13:12 · JFK 16:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.