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

问个面试用的题目,你如何获取一个域名的所有 ip

  •  
  •   firefox12 · 2016-11-24 16:41:06 +08:00 · 8984 次点击
    这是一个创建于 2922 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问个面试用的题目,你如何获取一个域名的所有 ip ?

    结果需要可实践,可以做出来。 比如 www.sina.com weibo.com www.qq.com

    如何尽可能多的获取它们对应的 ip ? 给你 1 个小时,可以使用网络,自己编码,或者??

    如果使用工具,工具必须别人也可以无障碍的访问到!

    36 条回复    2016-11-25 16:48:32 +08:00
    cevincheung
        1
    cevincheung  
       2016-11-24 16:54:38 +08:00
    难道不是 dig?
    zixianlei
        2
    zixianlei  
       2016-11-24 16:59:51 +08:00
    Andrewliu
        3
    Andrewliu  
       2016-11-24 17:01:42 +08:00
    我记得 c lib 中 gethostbyname 会返回一个数据结构, 其实包含一个可遍历数组, 可以来遍历所有 ip (逃
    Technetiumer
        4
    Technetiumer  
       2016-11-24 17:09:19 +08:00
    用各地的公共 DNS 都解析一遍

    智能解析是根据递归 DNS (公共 DNS )服务器的 IP 来分配节点的,而不是用户 IP 。
    firefox12
        5
    firefox12  
    OP
       2016-11-24 17:09:43 +08:00
    @zixianlei 如果都是中国主机,还能想到更精确的办法吗?
    firefox12
        6
    firefox12  
    OP
       2016-11-24 17:10:51 +08:00
    @Technetiumer 如何获取各地公共 dns , 如何确保 你获取了足够的 dns 。
    enenaaa
        7
    enenaaa  
       2016-11-24 17:12:57 +08:00
    @Andrewliu gethostbyname()只返回某个 dns 里配置的 ip ,或者只返回其中一个。 而且域名也可能配置多个 dns
    waytoexplorer
        8
    waytoexplorer  
       2016-11-24 17:16:46 +08:00 via iPhone
    遍历一遍 ip 最精确了,感觉能在几个小时内完成遍历
    EricInBj
        9
    EricInBj  
       2016-11-24 17:19:23 +08:00
    dig +subnet
    这样?
    Technetiumer
        10
    Technetiumer  
       2016-11-24 17:19:51 +08:00
    无法确保获取了足够的 DNS

    你要不要试试

    http://www.ipip.net/dns.php

    无法确保无障碍的访问到
    waruqi
        11
    waruqi  
       2016-11-24 17:26:01 +08:00 via iPhone
    getaddrinfo gethostbyname 或者自己写 dns 解析
    cmxz
        12
    cmxz  
       2016-11-24 17:26:02 +08:00 via Android
    多个 ip 的情景有 3 种
    1.域名配置时一个域名可解析出来多个 ip ,这是为了 ip 后的服务不可用后客户端切换到后续的 ip
    2.为了提高用户访问速度,使用各种方式使得用户可以就近访问
    3.运营商进行的 DNS 劫持
    如果不考虑 3 ,那么通过各种方式(各种全国 ping 网站,网上已有的数据)收集全国各省市电信运营商的 DNS 服务器 ip ,在他们没有限制只对指定段 ip 的查询进行响应的情况下进行 dig 就好了
    如果考虑 3 ,那还要把解析到的 ip 进行判断是否为该公司的服务器,判断方法有从 response header 看差异、把 http host 字段为其他公司域名的请求打到该 ip 上等等
    Technetiumer
        13
    Technetiumer  
       2016-11-24 17:28:40 +08:00
    @cmxz 楼主已经回复了,无法确保获取了足够的 DNS
    firefox12
        14
    firefox12  
    OP
       2016-11-24 17:38:06 +08:00
    @Technetiumer 开放题,其实大多数的 ping 网站的 dns 应该足够。 但是有办法拿到一份权威的 中国国内的 dns 列表吗?
    这样可以防止 ping 网站有遗漏!
    xiaoz
        15
    xiaoz  
       2016-11-24 17:41:11 +08:00
    难道不是超级 ping : http://ping.chinaz.com/
    mhycy
        16
    mhycy  
       2016-11-24 17:42:33 +08:00
    1 、遍历国内 IP 地址段,得出所有有响应的 DNS 服务器地址。
    (这里有几个坑)
    ( 1 、一般而言移动的 DNS 不会响应电信过来的请求)
    imlonghao673
        17
    imlonghao673  
       2016-11-24 17:43:32 +08:00 via Android
    假定他有域传送漏洞,嗯,然后应该全了
    laoyuan
        18
    laoyuan  
       2016-11-24 17:45:12 +08:00
    只有我想到黑进去瞧瞧么。。
    imlonghao673
        19
    imlonghao673  
       2016-11-24 17:45:27 +08:00 via Android
    暴力方法,扫描全球 IP80 端口,然后加 Host 跑
    当然会有些反代的。
    xfspace
        20
    xfspace  
       2016-11-24 17:46:18 +08:00 via Android
    难道不是打个电话给公司,问他拿个 IP 段?
    mhycy
        21
    mhycy  
       2016-11-24 17:48:46 +08:00
    1 、遍历国内 IP 地址段,得出所有有响应的 DNS 服务器地址。
    (这里有几个坑)
    ( 1 、一般而言移动的 DNS 不会响应电信过来的请求)
    ( 2 、电信的 DNS 无法获得目标服务器的移动 IP )
    ( 3 、部分运营商 DNS 不会跨地域响应)
    (综上你需要三网 IP )

    2 、在此基础上,遍历各个 DNS 获得 IP 地址
    (三网接入策略路由就放在路由器吧, Ubnt EdgeRouter X 就够了)

    3 、验证 DNS 结果
    (发起请求到各个 IP 地址,并对比获得的响应信息)
    (这又有几个坑)
    ( 1 、 CDN 地址可能不应答跨省数据)
    ( 2 、部分新闻类站点存在不同 CDN 信息不同的可能性)


    综上:
    1 、没法保证获得完整的 IP 地址列表
    2 、没法保证验证 DNS 过程中请求靠谱(运营商劫持那是常有的事)

    结论:
    此题无解
    sampeng
        22
    sampeng  
       2016-11-24 17:52:36 +08:00
    我觉得。。是不是大家想多了= =!
    1 个小时能编码出来的,也就只是做一个 dns 解析器了。。
    jarlyyn
        23
    jarlyyn  
       2016-11-24 17:53:52 +08:00
    我公司内网的指向 ip ,也能拿到么?
    gamexg
        24
    gamexg  
       2016-11-24 17:54:49 +08:00
    只能尽量的过去,像上面讲的尽可能的多的 dns 解析。
    之前计划做过一个类似的东西,当时计划的策略是:
    目前有几家 dns 提供了 http dns 接口,这个允许指定客户 ip 。可以遍历客户网段来获得足够的 ip 。
    cst4you
        25
    cst4you  
       2016-11-24 19:08:07 +08:00
    如果这是个 anycast 的 IP, 你的老板会不会认为你在忽悠他?
    jasontse
        26
    jasontse  
       2016-11-24 19:21:24 +08:00 via iPad
    这玩意需要的不是时间,是资源。服务器都有 BCP38 保护,各省各运营商都要有资源。
    Felldeadbird
        27
    Felldeadbird  
       2016-11-24 23:28:29 +08:00 via iPhone
    用 ping 工具,或者写个代理的脚本去 ping 。
    firefox12
        28
    firefox12  
    OP
       2016-11-25 09:44:39 +08:00 via iPhone
    @mhycy
    真实要做肯定需要很多资源

    这是一个开放题 本来就没固定答案。
    如果只想获得中国区的 IP 可以怎么做?
    mhycy
        29
    mhycy  
       2016-11-25 10:56:29 +08:00
    @firefox12

    无论中国区还是全球区域,做法都一样,毕竟互联网本身就没有国界。
    并不存在说抓取某个国家 /地区会更为简单。步骤还是那些,目标范围大小的区别。
    即便是抓取本地能应答的全部 IP ,也会因为各种接入点的不同而有所区别。
    (例如长城宽带的 CDN 地址在别的网络不太可能抓到)

    于是,为了能给出更好的答案该反问一个问题:能投入多少资源去做这个事?
    firefox12
        30
    firefox12  
    OP
       2016-11-25 11:10:34 +08:00
    @mhycy 面试题 1 个小时 你可以做多少? 单机 单 ip 中国区

    Apnic 拿到最新的 ip 分布, python 获取 cn 区 ip 列表, golang 编写最简单的 http client. 将 ip 端做为输入, 简单分析 repsonse code 和结果。判断是否是需要的结果。完整实现这个过程 30 分钟内可以完成编码。

    单机修改内核配置,优化网络 开启快速回收端口,让它可以单次刷 6.3 万个主机。剩下半个小时差不多可以刷 1.1 亿个 ip 。当然这很理想化。

    如果你有更多资金, 使用 api 在阿里云上,各个节点快速创建主机。 将各个 ip 端 分隔,让不同节点的主机 分别跑这个程序。可以把时间收缩得更小。考虑到阿里云节点数有限,所以资金可控。

    总之这个是开放题。
    firefox12
        31
    firefox12  
    OP
       2016-11-25 11:42:23 +08:00
    把 http 改成 dns request 也很可以,向所有 ip 的 53 端口 发请求,后端解析结果。向所有的 ip 去重 合并。

    最后验证一下就可以。
    mhycy
        32
    mhycy  
       2016-11-25 12:00:16 +08:00
    @firefox12
    程序开发是做工程,看需求并结合现实的限制给出解决方案解决问题
    每秒 6.3W 主机的遍历速度,在不考虑内核消耗的前提下先计算下握手包的带宽消耗。
    一般的商用宽带(非对称)没法承受这个并发量带来的带宽消耗

    于是,能好好的给下限制条件么?
    firefox12
        33
    firefox12  
    OP
       2016-11-25 12:37:39 +08:00
    @mhycy 如果是 1000M 带宽, 所有的 dns request 会小于 100. 而大部分的回应数据应该是 icmp ,少部分为 udp 所以回应 也应该在 100 左右。 1000M 带宽 64 字节的应该是 1.4Mpps, 所以应该满足要求,工程上可以达到。 如果是 100M 带宽, 0.14Mpps 也应该可以满足。先发 udp dns ,扫描全中国 ip , 获得的 ip 。 这段时间写个 http 的验证客户端,应该足够。

    很久不算了,凭印象做的可能算错了。而且还有阿里云方案可以水平扩展。
    sampeng
        34
    sampeng  
       2016-11-25 15:54:11 +08:00
    @firefox12 我觉得。。只要能在半小时做一个简单的 dns 解析器,然后找到各个省的 dns 中心 ip 。无非每个大运营商一个也就几百个 dns 中心打一遍 dns 请求。分分钟就出结果。

    既然是开放问题,也不能把问题复杂化。核心结果是尽可能多的得到域名对应的 ip 。 dns 是做这件事最合适的。只用跑 ip 段?可以当然可以,但我觉得是不是跑题了,如果是一个项目中的解决方案,估计会被打死的。但去尽可能多的访问 dns 中心就不一样了。 dns 协议本身就要允许循环查询。原则上只要 dns 覆盖的足够多。就能够得到足够多解析的 ip 。
    firefox12
        35
    firefox12  
    OP
       2016-11-25 16:40:43 +08:00
    @sampeng 在一个小时实现一个能用的 dns 解析协议,我觉得会比较难,应该选已有的轮子比较现实。
    sampeng
        36
    sampeng  
       2016-11-25 16:48:32 +08:00
    @firefox12 用 dig ,然后 shell 做个脚本。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2734 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:23 · PVG 19:23 · LAX 03:23 · JFK 06:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.