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

2016-11-24 16:41:06 +08:00
 firefox12

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

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

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

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

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

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

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

于是,为了能给出更好的答案该反问一个问题:能投入多少资源去做这个事?
firefox12
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
2016-11-25 11:42:23 +08:00
把 http 改成 dns request 也很可以,向所有 ip 的 53 端口 发请求,后端解析结果。向所有的 ip 去重 合并。

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

于是,能好好的给下限制条件么?
firefox12
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
2016-11-25 15:54:11 +08:00
@firefox12 我觉得。。只要能在半小时做一个简单的 dns 解析器,然后找到各个省的 dns 中心 ip 。无非每个大运营商一个也就几百个 dns 中心打一遍 dns 请求。分分钟就出结果。

既然是开放问题,也不能把问题复杂化。核心结果是尽可能多的得到域名对应的 ip 。 dns 是做这件事最合适的。只用跑 ip 段?可以当然可以,但我觉得是不是跑题了,如果是一个项目中的解决方案,估计会被打死的。但去尽可能多的访问 dns 中心就不一样了。 dns 协议本身就要允许循环查询。原则上只要 dns 覆盖的足够多。就能够得到足够多解析的 ip 。
firefox12
2016-11-25 16:40:43 +08:00
@sampeng 在一个小时实现一个能用的 dns 解析协议,我觉得会比较难,应该选已有的轮子比较现实。
sampeng
2016-11-25 16:48:32 +08:00
@firefox12 用 dig ,然后 shell 做个脚本。

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

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

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

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

© 2021 V2EX