问个面试用的题目,你如何获取一个域名的所有 ip ?
结果需要可实践,可以做出来。 比如 www.sina.com weibo.com www.qq.com
如何尽可能多的获取它们对应的 ip ? 给你 1 个小时,可以使用网络,自己编码,或者??
如果使用工具,工具必须别人也可以无障碍的访问到!
1
cevincheung 2016-11-24 16:54:38 +08:00
难道不是 dig?
|
2
zixianlei 2016-11-24 16:59:51 +08:00
|
3
Andrewliu 2016-11-24 17:01:42 +08:00
我记得 c lib 中 gethostbyname 会返回一个数据结构, 其实包含一个可遍历数组, 可以来遍历所有 ip (逃
|
4
Technetiumer 2016-11-24 17:09:19 +08:00
用各地的公共 DNS 都解析一遍
智能解析是根据递归 DNS (公共 DNS )服务器的 IP 来分配节点的,而不是用户 IP 。 |
6
firefox12 OP @Technetiumer 如何获取各地公共 dns , 如何确保 你获取了足够的 dns 。
|
7
enenaaa 2016-11-24 17:12:57 +08:00
@Andrewliu gethostbyname()只返回某个 dns 里配置的 ip ,或者只返回其中一个。 而且域名也可能配置多个 dns
|
8
waytoexplorer 2016-11-24 17:16:46 +08:00 via iPhone
遍历一遍 ip 最精确了,感觉能在几个小时内完成遍历
|
9
EricInBj 2016-11-24 17:19:23 +08:00
dig +subnet
这样? |
10
Technetiumer 2016-11-24 17:19:51 +08:00
|
11
waruqi 2016-11-24 17:26:01 +08:00 via iPhone
getaddrinfo gethostbyname 或者自己写 dns 解析
|
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 上等等 |
13
Technetiumer 2016-11-24 17:28:40 +08:00
@cmxz 楼主已经回复了,无法确保获取了足够的 DNS
|
14
firefox12 OP @Technetiumer 开放题,其实大多数的 ping 网站的 dns 应该足够。 但是有办法拿到一份权威的 中国国内的 dns 列表吗?
这样可以防止 ping 网站有遗漏! |
15
xiaoz 2016-11-24 17:41:11 +08:00
难道不是超级 ping : http://ping.chinaz.com/ ?
|
16
mhycy 2016-11-24 17:42:33 +08:00
1 、遍历国内 IP 地址段,得出所有有响应的 DNS 服务器地址。
(这里有几个坑) ( 1 、一般而言移动的 DNS 不会响应电信过来的请求) |
17
imlonghao673 2016-11-24 17:43:32 +08:00 via Android
假定他有域传送漏洞,嗯,然后应该全了
|
18
laoyuan 2016-11-24 17:45:12 +08:00
只有我想到黑进去瞧瞧么。。
|
19
imlonghao673 2016-11-24 17:45:27 +08:00 via Android
暴力方法,扫描全球 IP80 端口,然后加 Host 跑
当然会有些反代的。 |
20
xfspace 2016-11-24 17:46:18 +08:00 via Android
难道不是打个电话给公司,问他拿个 IP 段?
|
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 过程中请求靠谱(运营商劫持那是常有的事) 结论: 此题无解 |
22
sampeng 2016-11-24 17:52:36 +08:00
我觉得。。是不是大家想多了= =!
1 个小时能编码出来的,也就只是做一个 dns 解析器了。。 |
23
jarlyyn 2016-11-24 17:53:52 +08:00
我公司内网的指向 ip ,也能拿到么?
|
24
gamexg 2016-11-24 17:54:49 +08:00
只能尽量的过去,像上面讲的尽可能的多的 dns 解析。
之前计划做过一个类似的东西,当时计划的策略是: 目前有几家 dns 提供了 http dns 接口,这个允许指定客户 ip 。可以遍历客户网段来获得足够的 ip 。 |
25
cst4you 2016-11-24 19:08:07 +08:00
如果这是个 anycast 的 IP, 你的老板会不会认为你在忽悠他?
|
26
jasontse 2016-11-24 19:21:24 +08:00 via iPad
这玩意需要的不是时间,是资源。服务器都有 BCP38 保护,各省各运营商都要有资源。
|
27
Felldeadbird 2016-11-24 23:28:29 +08:00 via iPhone
用 ping 工具,或者写个代理的脚本去 ping 。
|
28
firefox12 OP |
29
mhycy 2016-11-25 10:56:29 +08:00
@firefox12
无论中国区还是全球区域,做法都一样,毕竟互联网本身就没有国界。 并不存在说抓取某个国家 /地区会更为简单。步骤还是那些,目标范围大小的区别。 即便是抓取本地能应答的全部 IP ,也会因为各种接入点的不同而有所区别。 (例如长城宽带的 CDN 地址在别的网络不太可能抓到) 于是,为了能给出更好的答案该反问一个问题:能投入多少资源去做这个事? |
30
firefox12 OP @mhycy 面试题 1 个小时 你可以做多少? 单机 单 ip 中国区
Apnic 拿到最新的 ip 分布, python 获取 cn 区 ip 列表, golang 编写最简单的 http client. 将 ip 端做为输入, 简单分析 repsonse code 和结果。判断是否是需要的结果。完整实现这个过程 30 分钟内可以完成编码。 单机修改内核配置,优化网络 开启快速回收端口,让它可以单次刷 6.3 万个主机。剩下半个小时差不多可以刷 1.1 亿个 ip 。当然这很理想化。 如果你有更多资金, 使用 api 在阿里云上,各个节点快速创建主机。 将各个 ip 端 分隔,让不同节点的主机 分别跑这个程序。可以把时间收缩得更小。考虑到阿里云节点数有限,所以资金可控。 总之这个是开放题。 |
31
firefox12 OP 把 http 改成 dns request 也很可以,向所有 ip 的 53 端口 发请求,后端解析结果。向所有的 ip 去重 合并。
最后验证一下就可以。 |
32
mhycy 2016-11-25 12:00:16 +08:00
@firefox12
程序开发是做工程,看需求并结合现实的限制给出解决方案解决问题 每秒 6.3W 主机的遍历速度,在不考虑内核消耗的前提下先计算下握手包的带宽消耗。 一般的商用宽带(非对称)没法承受这个并发量带来的带宽消耗 于是,能好好的给下限制条件么? |
33
firefox12 OP @mhycy 如果是 1000M 带宽, 所有的 dns request 会小于 100. 而大部分的回应数据应该是 icmp ,少部分为 udp 所以回应 也应该在 100 左右。 1000M 带宽 64 字节的应该是 1.4Mpps, 所以应该满足要求,工程上可以达到。 如果是 100M 带宽, 0.14Mpps 也应该可以满足。先发 udp dns ,扫描全中国 ip , 获得的 ip 。 这段时间写个 http 的验证客户端,应该足够。
很久不算了,凭印象做的可能算错了。而且还有阿里云方案可以水平扩展。 |
34
sampeng 2016-11-25 15:54:11 +08:00
@firefox12 我觉得。。只要能在半小时做一个简单的 dns 解析器,然后找到各个省的 dns 中心 ip 。无非每个大运营商一个也就几百个 dns 中心打一遍 dns 请求。分分钟就出结果。
既然是开放问题,也不能把问题复杂化。核心结果是尽可能多的得到域名对应的 ip 。 dns 是做这件事最合适的。只用跑 ip 段?可以当然可以,但我觉得是不是跑题了,如果是一个项目中的解决方案,估计会被打死的。但去尽可能多的访问 dns 中心就不一样了。 dns 协议本身就要允许循环查询。原则上只要 dns 覆盖的足够多。就能够得到足够多解析的 ip 。 |