首页 > 编程语言 >Node.JS编写的DNS分发器

Node.JS编写的DNS分发器

时间:2022-12-04 20:45:15浏览次数:40  
标签:Node const DNS err JS conf getDateStr return com

Node.JS编写的DNS分发器

 

const dgram = require('dgram');
//获取本地时间字符串
function getDateStr() {
    return (new Date()).toLocaleString();
}
function checkDomainOne(sReq, sDomain) {
    const aReq = sReq.split('.');
    const aDomain = sDomain.split('.');
    const iLen = aDomain.length;
    for (var i = 0; i < iLen; i++) {
        const sReq = aReq.pop();
        if (sReq === undefined) {
            return false;
        }
        const sDom = aDomain.pop();
        if (sDom !== sReq) {
            return false;
        }
    }
    return true;
}
function checkDomainByList(sReq, sList) {
    const aList = sList.split(',');
    for (var i = 0; i < aList.length; i++) {
        const sDomain = aList[i];
        if (checkDomainOne(sReq, sDomain)) {
            return true;
        }
    }
    return false;
}
function getDnsAddrByHost(conf, sReqHost) {
    if (checkDomainByList(sReqHost, conf.domain_gfw)) {
        return '192.168.30.1';
    }
    return '192.168.5.1';
}
function parseHost(_msg) {
    const sMsg = _msg.subarray(12);
    const aHost = [];
    var num = sMsg.readUInt8(0);
    var offset = 1;
    while (num !== 0) {
        aHost.push(sMsg.subarray(offset, offset + num).toString());
        offset += num;
        num = sMsg.readUInt8(offset);
        offset += 1;
    }
    return aHost.join('.');
}
// 创建DNS代理
function proxyDNS(conf) {
    const serverUDP = dgram.createSocket('udp4');
    serverUDP.on('error', (err) => {
        console.error(`[${getDateStr()}] [ERROR] - ${err}`);
    });
    serverUDP.on('message', (msg, rinfo) => {
        const sReqHost = parseHost(msg);
        const dnsAddr = getDnsAddrByHost(conf, sReqHost);
        console.info(`[${getDateStr()}] ${rinfo.address} ${sReqHost} => ${dnsAddr}`);
        const client = dgram.createSocket('udp4');
        client.on('error', (err) => {
            console.error(`[${getDateStr()}] [ERROR] - ${err}`);
            client.close();
        });
        client.on('message', (fbMsg, fbRinfo) => {
            serverUDP.send(fbMsg, rinfo.port, rinfo.address, (err) => {
                if (err) console.error(`[${getDateStr()}] [ERROR] - ${err}`);
            });
            client.close();
        });
        client.send(msg, 53, dnsAddr, (err) => {
            if (err) {
                console.error(`[${getDateStr()}] [ERROR] - ${err}`);
                client.close();
            }
        });
    });
    serverUDP.bind(conf.bind[1], conf.bind[0], () => {
        console.info(`[${getDateStr()}] [INFO] - UDP Server start ${conf.bind[0]}:${conf.bind[1]}`);
    });
    return serverUDP;
}
const conf = {};
conf.bind = ["0.0.0.0", 53];
conf.domain_gfw = 'app.cloudcone.com,facebook.com,fbcdn.net,githubusercontent.com,gstatic.com,gmail.com,google.com,google.com.hk,googleapis.com,googleusercontent.com,googlevideo.com,instagram.com,line.me,line-apps.com,line-scdn.net,messenger.com,naver.jp,tdesktop.com,telegram.org,v2fly.org,youtube.com,ytimg.com';
proxyDNS(conf);

 

根据域名转发DNS到不同的服务器

 

标签:Node,const,DNS,err,JS,conf,getDateStr,return,com
From: https://www.cnblogs.com/xiangxisheng/p/16950723.html

相关文章

  • 八、JSP(Java Server Pages)
    八、JSP(JavaServerPages)8.1、什么是jspJavaServerPages:Java服务器端页面,也和Servlet一样,用于动态Web技术最大的特点:写jsp就像写HTML区别:HTMl只能给用户提......
  • 整理 js 日期对象的详细功能,使用 js 日期对象获取具体日期、昨天、今天、明天、每月天
    在javascript中内置了一个Date对象,可用于实现一些日期和时间的操作。本文整理js日期对象的详细功能,使用js日期对象获取具体日期、昨天、今天、明天、每月天数、时......
  • Nodejs安装教程
    【一】、安装环境 下载地址:https://nodejs.org/en/     【二】、安装步骤1、双击安装包,一直点击下一步。 2、点击change按钮,更换到自己的指定安装位置,......
  • 漫谈计算机网络:应用层 ----- 从DNS域名解析到WWW万维网再到P2P应用
    2022-12-0418:31:01纪念一下博主的《漫谈计算机网络》连载博客浏览量破500了!今天更新完结篇!面试答不上?计网很枯燥?听说你学习计网每次记了都会忘?不妨抽时间和我......
  • JS模块化
    模块化规范1.CommonJS规范​ 在node中,默认支持的模块化规范叫做CommonJS,​ 在CommonJS中,一个js文件就是一个模块CommonJS规范引入模块使用require('模块的路......
  • 前端之JavaScript(Js)基础
    JavaScript,简称JsHTML三把利剑之一,浏览器可解析Js,看着和Java像,实则和Java并无关系,和Python、Go、C++等都是一门独立的语言。一、Js基础引入JavaScript代码,类似于Python......
  • WebGIS|GeoJSON简介
    简介GeoJSON是用JSON的语法表达和存储地理数据,可以说是JSON的子集。图片数据参考:http://geojson.ioGeoJSON对象GeoJSON总是由一个单独的对象组成。GeoJSON对......
  • 学习Delphi原生JSON框架(三)
    基于前面写的内容,我们可以快速读取一个数组的JSON串了,直接上代码:procedureTForm6.Button2Click(Sender:TObject);beginvarjsonstr:='{'+......
  • Node.js实现国密算法
    一、node.js环境安装1去官网下载压缩包,并放置到/usr/local/bin文件夹下2进行环境变量配置vim/etc/profile在环境变量文件的末尾添加exportNODEJS=/usr/local/b......
  • Springboot之additional-spring-configuration-metadata.json自定义提示
    【3】@ConfigurationProperties注入属性https://blog.csdn.net/qq_25614773/article/details/124788923 https://docs.spring.io/spring-boot/docs/2.4.7/reference/ht......