基于nodejs的DNS查询工具

  开始这个实例之前,我们简单谈一下Node.js吧,Node.js是一个由JavaScript书写而成的强大Web开发框架,它让开发强壮的、伸缩性良好的服务器端Web应用变得更加简单、容易。这种技术诞生于09年末,在一个JavaScript大会上宣布,当时这项在服务器端运行JavaScript技术让所有参会者惊奇,当时这位提出者给出了一个“hello world”的程序。

1 var http = require(‘http‘);
2 var server = http.createServer(function(req,res){
3     res.writeHead(200);
4     res.end(‘Hello World‘);
5 });
6 server.listen(3000,‘127.0.0.1‘);
7 console.log("please run at 127.0.0.1:3000");

  于是在地址栏输入127.0.0.1:3000后就出现了我们非常熟悉的“Hello World”

  

  好,简单介绍下Node.js,接下来就开始我们的正题,简单搭建一个DNS查询工具

  准备前期:确保已经安装Node.js,网络上面有很多安装教程,在这里就不详细多说了

(1)需要加载的Node.js原生模块

  1. Node.js的HTTP模块,用于创建Web的HTTP服务器
  2. Node.js的dns模块,用于DNS域名解析
  3. Node.js的fileSystem模块,用于读取HTML页面
  4. Node.js的querystring模块,处理请求参数
1 var http = require(‘http‘),
2     dns = require(‘dns‘),
3     fs = require(‘fs‘);
4     url = require(‘url‘);//处理文件url路径
5     querystring = require(‘querystring‘);//处理前端传回的字符串解析

(2)添加HTTP服务器代码,返回显示index.html(PS:如果是返回html数据,则Content-Type类型值为text/html)

1 http.createServer(function(req,res){
2     var pathname = url.parse(req.url).pathname;
3     req.setEncoding("utf8");
4     res.writeHead(200,{‘Content-Type‘:‘text/html‘});
5     router(res,req,pathname);
6 }).listen(3000,‘127.0.0.1‘);  //监听地址为127.0.0.1:3000
7 console.log("You can try it at 127.0.0.1:3000");

解析出请求中的地址后,用一个路由处理器判断区分用户是要显示index.html主页,还是要进行/parse解析操作,这里的路由控制器就是router方法
(3)处理url路由

1 function router(res,req,pathname){
2     switch(pathname){
3         case "/parse":parseDns(res,req);break;    //解析url地址
4         default:goIndex(res,req);                 //显示index主页
5     }
6 }    
  • goIndex(res,req)函数,主要用于显示一个index.html页面,参数:res  为响应客户端请求对象;req  为客户端请求对象
1 function goIndex(res,req){
2     var readPath = __dirname + ‘/‘ + url.parse(‘index.html‘).pathname;
3     var indexPage = fs.readFileSync(readPath);//读取html数据,存放在indexpage变量之中
4     res.end(indexPage);                //响应html数据到客户端
5 }
  • parseDns(res,req)函数,主要用于解析客户端传递来的域名,并且返回该域名对应的IP地址
 1  1 function parseDns(res,req){
 2  2     var postData = "";
 3  3     req.addListener("data",function(postDataChunk){
 4  4         postData += postDataChunk;
 5  5     });
 6  6     req.addListener("end",function(){
 7  7         var resData = getDns(postData,function(domain,addresses){
 8  8             res.writeHead(200,{‘Content-Type‘:‘text/html‘});
 9  9             res.end("</html><head><meta http-equiv=‘content-type‘ content=‘text/html;charset=utf-8‘></head><body><div style=‘text-align:center‘>Domain:<span style=‘color:red‘>" + domain + "</span><br/>IP:<span style=‘color:red‘>" + addresses.join(‘,‘) + "</span></div></body></html>");
10 10             return;
11 11         })
12 12     })
13 13 }
14 14
15 15 function getDns(postData,callback){
16 16     var domain = querystring.parse(postData).search_dns;
17 17     console.log(postData);                     //search_dns=www.qq.com
18 18     console.log(querystring.parse(postData));//{ search_dns: ‘www.qq.com‘ }
19 19     console.log(domain);                     //www.qq.com/
20 20     dns.resolve(domain,function(err,addresses){  //返回的addresses是一个数组
21 21         if(!addresses){
22 22             addresses=[‘不存在域名‘];
23 23         }
24 24         callback(domain,addresses);
25 25     })
26 26 }

注意:由于dns.resolve()方法是一个异步执行函数,如果想使用它执行的结果,需要有一个回调函数,并把结果作为参数传入回调函数,才可以传递到函数外面!

(4)主页index.html代码

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title>DNS查询</title>
 5     <meta http-equiv="content-type" content="text/html;charset=utf-8">
 6 </head>
 7 <body>
 8     <h1 style=‘text-align:center‘>DNS查询工具</h1>
 9     <div style=‘text-align:center‘>
10         <form action="/parse" method="post">
11             查询DNS:<input type=‘text‘ name=‘search_dns‘/>
12             <input type=‘submit‘ value=‘查询‘/>
13         </form>
14     </div>
15 </body>

  到了这里,已经实现了DNS查询功能了,我把(1)(2)(3)(4)步的代码都放在一个叫parse_dns.js的文件夹里面,在同一根目录文件下存放(5)步的index.html,然后再命令行窗口下找到当前目录(一开始我是用很笨的方法用cd命令找到文件根目录,后来发现sublimeText的Side Bar插件可以直接在所选文件夹右键点击“Open/Run”,直接打开一个叫Window PowerShell的蓝色窗口,功能和cmd窗口一样,在那里已经帮你自动找好文件路径,非常方便),然后直接输入node parse_dns.js,即可显示"You can try it at 127.0.0.1:3000"

在浏览器地址栏输入“127.0.0.1:3000”,就有下图界面

输入“www.baidu.com”进行查询,页面就跳到了“127.0.0.1:3000/parse”

  进行到这一步已经是基本完成了,但是笔者并没有将这个系统进行模块化,比如分成服务器创建模块、路由处理模块、逻辑控制模块、错误处理模块等,要想让程序更加健壮并且项目可维护性高,这个是必不可少的,由于是刚学node不久,日后必定写上更好的版本。

思考:

(1)这个小工具还存在一些小问题,就是如果我输入类似“https://www.baidu.com/”这样子的格式,程序会解析不成功,而返回“域名不存在”,所以日后我需要引入Node.js的原生模块url,用于url的分解

(2)笔者输入“www.qq.com”解析出来的IP,放在浏览器地址栏里打开但并不是腾讯的主页,然而输入“www.baidu.com”解析出来的IP却可以呈现度娘的搜索首页,笔者的室友说是因为有多个服务器解析出来的多个IP,所以这个IP可能不是我正在看到的腾讯主页,还有一个解释是因为端口问题,百度搜索首页是默认80端口,而腾讯首页不是,所以要知道端口号并加到IP后面才可以访问,问题还没搞清楚,所以笔者还会继续研究~

时间: 2024-08-26 23:54:46

基于nodejs的DNS查询工具的相关文章

DNS查询工具:host、nslookup、dig

作者:zhanhailiang 日期:2014-11-01 1. host host提供域名到IP地址的双向解析: host默认通过/etc/resolv.conf读取Name Server来解析,除非提供可选參数server. -a參数相当于进行ANY查询. [root@~]# host pic1.vip.com pic1.vip.com is an alias for pic1.vip.com.wscdns.com. pic1.vip.com.wscdns.com is an alias f

nodejs的数据库查询工具-sqlpad

学习关注nodejs有一段时间了,最近在学习nodejs相关的应用.工作中经常会查询数据库,进行数据的验证,涉及到sqlserver,mysql等,虽然都有客户端工具,但总感觉不太方便,偶尔接触了sqlpad,感觉是一个不错的利器,能支持多种数据库,把常用查询保存下来,极大提升工作效率.在内部系统部署一个,方便团队共同使用. sqlpad目前只具备查询功能,能将结果导出csv文件,同时还提供了一个数据图形化功能,提供了常用的三种图(柱状图,气泡图,折线图),简单快速的数据可视化效果. 简单的界面

foy: 轻量级的基于 nodejs 的通用 build 工具

npm 的 scripts 下写的命令太多就很容易很乱,各种第三方轮子都只能解决一部分问题,总感觉不是很好用,想找个类似 make 的工具只能找到 jake, 可是 jake 的 API 太老,居然很多都不支持 promise, 代码也不多,就干脆自己造轮子了, 感觉效果还行. 特点: 基于 promise 的任务和内置工具函数(fs/shell), 无缝支持 async/await 类似于 shelljs 的跨平台 shell dsl, 人人都会写 shell 易学易用,无需为写仅仅几个 bu

DNS查询相关

本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/45 一种简单的设计方式是在因特网上使用一个DNS服务器,该服务器包含所有的映射.在这种集中式设计中,客户端将所有的查询发往同一台的DNS服务器.但是,这种设计方式的问题如下: 单点故障 通信容量:必须处理所有查询 远距离的集中式数据库:如果将单台DNS服务器放在纽约,那么在澳大利亚的的查询必须传播到地球的另一端,中间也许还要经过拥塞的链路. 维护 基于以上几点,

DNS测试工具

一.dig命令 dig - 用于测试dns系统, 因此, 不会查询hosts文件进行解析. # 用法: dig [@dns_server] [-t rr_type] name [query option] 正向解析测试: # 用法: dig -t A FQDN [@dns_server] # 示例: [[email protected] named]# dig -t A www.leistudy.com @192.168.123.100 ; <<>> DiG 9.9.4-RedHa

基于nodeJs express 框架的图片上传和编辑(引用美图编辑工具)上传小示例

唉,由于近期工作中对于新知识的运用相对较少,也导致小码哥少有更新鄙人心得的机会.还望路过的基友们不要抱怨,勿喷,,,,, 本篇文章,是基于NodeJs Express框架完成的一个用于项目中图片上传和编辑上传的小示例,当然,由于项目工期不禁,都是在非工作时间慢慢完成的,导致至今该图片上传功能也未能插入项目中真正的验证最终效果.不过就小码哥感觉,基本思路及基本功能算是完成了. 下面便由小码哥来给基友们稍微讲解改功能的实现过程及其中用到的一些技术等等. 首先,说说NodeJs Express框架的搭

DNS(二)Linux下正反向解析配置和客户端查询工具

一.服务安装: 1.bind简介: Bind:Berkeley Internet Name Domain www.isc.org 软件包: bind:bind应用程序包: bind-utils:客户端工具包: 服务程序名:named 2.程序安装: # yum install bind    :安装bind: # rpm –ql bind | less    :查看bind安装生成文件: # /etc/rc.d/init.d/named    :服务启动脚本: # /etc/named.conf

基于阿里云 DNS API 实现的 DDNS 工具

0.简要介绍 0.1 思路说明 AliDDNSNet 是基于 .NET Core 开发的动态 DNS 解析工具,借助于阿里云的 DNS API 来实现域名与动态 IP 的绑定功能.工具核心就是调用了阿里云 DNS 的两个 API ,一个 API 获取指定域名的所有解析记录,然后通过比对与当前公网 IP 是否一致,一致则不进行更改,不一致则通过另外一个修改 API 来修改指定子域名的修改记录. 0.2 使用说明 使用时请更改同目录下的 settings.json.example 为 setting

被动信息收集1——DNS基础 + DNS解析工具 NSLOOKUP使用

被动信息收集 特点: 基于公开渠道 与目标不直接接触 避免留下一切痕迹 标准参考--OSINT: 美国军方 北大西洋公约组织 名词解释 DNS--Domain Name System 域名系统 因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析).DNS协议运行在UDP协议之上,使用端口号53.在RFC文档中RFC 2181对DNS有规范说明,RF