Nodejs 用以下代码udp到google的dns,协议包内容用wireshark分析完全正确。但google就是不给我任何返回信息,大家帮看看为什么?

Nodejs 用以下代码udp到google的dns,协议包内容用wireshark分析完全正确。但google就是不给我任何返回信息,大家帮看看为什么?

用以下代码udp到google的dns,协议包内容用wireshark分析完全正确。但google就是不给我任何返回信息

var dgram = require(‘dgram’); var message = new Buffer(“518601000001000000000000027a680977696b697065646961036f72670000010001”,‘hex’);

var server = dgram.createSocket(“udp4”);

server.on(“message”, function (msg, rinfo) { console.log("server got: " + msg.toString(‘hex’) + " from " + rinfo.address + “:” + rinfo.port); });

server.on(“listening”, function () { var address = server.address(); console.log("server listening " + address.address + “:” + address.port); //console.log(message); server.send(message,0,message.length,53,‘8.8.8.8’); });

server.bind(41234);


5 回复

根据你提供的代码,问题可能在于使用了 dgram.createSocket("udp4") 创建了一个UDP服务器,但实际上你只是想发送一个DNS查询给Google的DNS服务器(如 8.8.8.8),而不是创建一个监听的UDP服务器。

问题分析:

  1. 错误地创建了UDP服务器:你在代码中创建了一个名为 server 的UDP服务器,并且绑定了端口 41234,但实际上你只是想发送一个DNS查询。
  2. 监听消息事件:你在代码中设置了 message 事件处理器,但实际上你并不需要它,因为你并不想接收任何来自其他主机的消息。

解决方案:

你可以使用 dgram.createSocket("udp4") 来创建一个UDP客户端,然后发送DNS查询数据包到 8.8.8.853 端口。

const dgram = require('dgram');

// DNS 查询数据包
const dnsQuery = Buffer.from("518601000001000000000000027a680977696b697065646961036f72670000010001", 'hex');

// 创建一个UDP客户端socket
const client = dgram.createSocket("udp4");

client.on("error", (err) => {
    console.error(`Server error:\n${err.stack}`);
    client.close();
});

client.on("close", () => {
    console.log("Client closed");
});

// 发送DNS查询数据包到Google的DNS服务器
client.send(dnsQuery, 0, dnsQuery.length, 53, "8.8.8.8", (err) => {
    if (err) throw err;
    console.log("DNS query sent successfully");
    // 关闭客户端连接
    client.close();
});

解释:

  1. DNS查询数据包:定义了一个变量 dnsQuery 包含了你要发送的DNS查询数据包。
  2. 创建UDP客户端:使用 dgram.createSocket("udp4") 创建一个UDP客户端 client
  3. 错误处理:添加了 error 事件处理器来捕获并处理可能出现的错误。
  4. 关闭处理:添加了 close 事件处理器,在操作完成后关闭客户端连接。
  5. 发送DNS查询:使用 client.send() 方法将DNS查询数据包发送到 8.8.8.853 端口。
  6. 成功提示:如果发送成功,则打印一条消息。

通过这种方式,你可以确保只发送DNS查询而不创建一个监听的UDP服务器,从而解决你的问题。


你能用google dns么? 很多地方8.8.8.8被墙了吧 你换个dns试试看 比如自己isp的dns

多谢,确实是被GFW了

msg.toString(‘hex’)这个信息如何解密出来

从你的描述来看,问题可能出在使用 dgram 模块发送 UDP 数据包时的处理方式上。你创建了一个 server 对象用于监听消息,但实际上你需要的是一个客户端来发送消息。你可以使用 dgram.createSocket("udp4") 创建一个 UDP 客户端来发送 DNS 查询请求。

以下是修改后的示例代码:

const dgram = require('dgram');

// 构建DNS查询包(此处示例为向Google的公共DNS服务器发送查询)
const message = Buffer.from("518601000001000000000000027a680977696b697065646961036f72670000010001", 'hex');

// 创建UDP客户端
const client = dgram.createSocket('udp4');

client.on('error', (err) => {
    console.error(`Server error:\n${err.stack}`);
    client.close();
});

client.on('message', (msg, rinfo) => {
    console.log(`Server got: ${msg.toString('hex')} from ${rinfo.address}:${rinfo.port}`);
    client.close(); // 接收到响应后关闭客户端
});

// 发送DNS查询请求到Google的公共DNS服务器
client.send(message, 0, message.length, 53, '8.8.8.8', (err) => {
    if (err) throw err;
    console.log('Message sent');
    client.unref(); // 防止Node.js进程保持运行状态
});

在这段代码中,我们创建了一个 UDP 客户端来发送 DNS 查询请求,而不是一个服务器。当收到响应时,我们打印接收到的数据,并关闭客户端。此外,我们还添加了错误处理机制。

请尝试上述代码,看看是否能够解决问题。如果还是无法正常工作,请检查网络配置或防火墙设置,确保没有阻止 UDP 流量。

回到顶部