From 8ed5788ce2a24fe3e2bae3cdd0e2584a9a6e1819 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E8=89=AF?= <841369634@qq.com> Date: Thu, 6 Mar 2025 11:01:23 +0800 Subject: [PATCH] =?UTF-8?q?bugfix:=201=EF=BC=89`UDP`=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E7=9A=84DNS=EF=BC=8C=E5=B9=B6=E5=8F=91=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E6=97=B6IP=E8=B5=8B=E5=80=BC=E6=B7=B7=E4=B9=B1=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D=EF=BC=9B2=EF=BC=89`UDP`?= =?UTF-8?q?=E5=92=8C`TCP`=E7=B1=BB=E5=9E=8B=E7=9A=84DNS=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E6=9C=AA=E5=85=B3=E9=97=AD=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/mitmproxy/src/lib/dns/tcp.js | 6 ++- packages/mitmproxy/src/lib/dns/udp.js | 25 +++++----- packages/mitmproxy/test/dnsTest.mjs | 71 +++++++++++++++++---------- 3 files changed, 62 insertions(+), 40 deletions(-) diff --git a/packages/mitmproxy/src/lib/dns/tcp.js b/packages/mitmproxy/src/lib/dns/tcp.js index 779e75e..6141609 100644 --- a/packages/mitmproxy/src/lib/dns/tcp.js +++ b/packages/mitmproxy/src/lib/dns/tcp.js @@ -37,14 +37,16 @@ module.exports = class DNSOverTCP extends BaseDNS { tcpClient.write(Buffer.concat([lengthBuffer, packet])) }) - tcpClient.on('data', (data) => { + tcpClient.once('data', (data) => { const length = data.readUInt16BE(0) const response = dnsPacket.decode(data.subarray(2, 2 + length)) resolve(response) + tcpClient.end() }) - tcpClient.on('error', (err) => { + tcpClient.once('error', (err) => { reject(err) + tcpClient.end() }) }) } diff --git a/packages/mitmproxy/src/lib/dns/udp.js b/packages/mitmproxy/src/lib/dns/udp.js index 10464c3..86d9b30 100644 --- a/packages/mitmproxy/src/lib/dns/udp.js +++ b/packages/mitmproxy/src/lib/dns/udp.js @@ -3,8 +3,6 @@ const dnsPacket = require('dns-packet') const randi = require('random-int') const BaseDNS = require('./base') -const udpClient = dgram.createSocket('udp4') - const defaultPort = 53 // UDP类型的DNS服务默认端口号 module.exports = class DNSOverUDP extends BaseDNS { @@ -12,6 +10,9 @@ module.exports = class DNSOverUDP extends BaseDNS { super(dnsName, 'UDP', cacheSize, preSetIpList) this.dnsServer = dnsServer this.dnsServerPort = Number.parseInt(dnsServerPort) || defaultPort + + this.isIPv6 = dnsServer.includes(':') && dnsServer.includes('[') && dnsServer.includes(']') + this.socketType = this.isIPv6 ? 'udp6' : 'udp4' } _doDnsQuery (hostname) { @@ -27,17 +28,19 @@ module.exports = class DNSOverUDP extends BaseDNS { }], }) - // 发送 UDP 查询 - udpClient.send(packet, 0, packet.length, this.dnsServerPort, this.dnsServer, (err) => { - if (err) { - reject(err) - } - }) - - // 接收 UDP 响应 - udpClient.on('message', (msg) => { + // 创建客户端 + const udpClient = dgram.createSocket(this.socketType, (msg, _rinfo) => { const response = dnsPacket.decode(msg) resolve(response) + udpClient.close() + }) + + // 发送 UDP 查询 + udpClient.send(packet, 0, packet.length, this.dnsServerPort, this.dnsServer, (err, _bytes) => { + if (err) { + reject(err) + udpClient.close() + } }) }) } diff --git a/packages/mitmproxy/test/dnsTest.mjs b/packages/mitmproxy/test/dnsTest.mjs index cb50beb..75a36b0 100644 --- a/packages/mitmproxy/test/dnsTest.mjs +++ b/packages/mitmproxy/test/dnsTest.mjs @@ -106,9 +106,9 @@ let ip console.log('\n--------------- test PreSet ---------------\n') ip = await dnsProviders.PreSet.lookup(presetHostname) -assert.strictEqual(ip, presetIp) // test preset console.log('===> test PreSet:', ip, '\n\n') console.log('\n\n') +assert.strictEqual(ip, presetIp) // test preset console.log('\n--------------- test https ---------------\n') @@ -118,31 +118,31 @@ console.log('\n\n') assert.strictEqual(dnsProviders.cloudflare.dnsType, 'HTTPS') // ip = await dnsProviders.cloudflare.lookup(hostname1) -// console.log('===> test cloudflare:', ip, '\n\n') +// console.log(`===> test cloudflare: ${hostname1} ->`, ip, '\n\n') assert.strictEqual(dnsProviders.quad9.dnsType, 'HTTPS') // ip = await dnsProviders.quad9.lookup(hostname1) -// console.log('===> test quad9:', ip, '\n\n') +// console.log(`===> test quad9: ${hostname1} ->`, ip, '\n\n') assert.strictEqual(dnsProviders.aliyun.dnsType, 'HTTPS') -// ip = await dnsProviders.aliyun.lookup(hostname1) -// console.log('===> test aliyun:', ip, '\n\n') +ip = await dnsProviders.aliyun.lookup(hostname1) +console.log(`===> test aliyun: ${hostname1} ->`, ip, '\n\n') assert.strictEqual(dnsProviders.aliyun2.dnsType, 'HTTPS') -// ip = await dnsProviders.aliyun2.lookup(hostname1) -// console.log('===> test aliyun2:', ip, '\n\n') +ip = await dnsProviders.aliyun2.lookup(hostname1) +console.log(`===> test aliyun2: ${hostname1} ->`, ip, '\n\n') assert.strictEqual(dnsProviders.safe360.dnsType, 'HTTPS') -// ip = await dnsProviders.safe360.lookup(hostname1) -// console.log('===> test safe360:', ip, '\n\n') +ip = await dnsProviders.safe360.lookup(hostname1) +console.log(`===> test safe360: ${hostname1} ->`, ip, '\n\n') assert.strictEqual(dnsProviders.rubyfish.dnsType, 'HTTPS') // ip = await dnsProviders.rubyfish.lookup(hostname1) -// console.log('===> test rubyfish:', ip, '\n\n') +// console.log(`===> test rubyfish: ${hostname1} ->`, ip, '\n\n') assert.strictEqual(dnsProviders.py233.dnsType, 'HTTPS') // ip = await dnsProviders.py233.lookup(hostname1) -// console.log('===> test py233:', ip, '\n\n') +// console.log(`===> test py233: ${hostname1} ->`, ip, '\n\n') console.log('\n--------------- test TLS ---------------\n') @@ -152,23 +152,23 @@ console.log('\n\n') assert.strictEqual(dnsProviders.cloudflareTLS.dnsType, 'TLS') // ip = await dnsProviders.cloudflareTLS.lookup(hostname1) -// console.log('===> test cloudflareTLS:', ip, '\n\n') +// console.log(`===> test cloudflareTLS: ${hostname1} ->`, ip, '\n\n') assert.strictEqual(dnsProviders.quad9TLS.dnsType, 'TLS') // ip = await dnsProviders.quad9TLS.lookup(hostname1) -// console.log('===> test quad9TLS:', ip, '\n\n') +// console.log(`===> test quad9TLS: ${hostname1} ->`, ip, '\n\n') assert.strictEqual(dnsProviders.aliyunTLS.dnsType, 'TLS') -// ip = await dnsProviders.aliyunTLS.lookup(hostname1) -// console.log('===> test aliyunTLS:', ip, '\n\n') +ip = await dnsProviders.aliyunTLS.lookup(hostname1) +console.log(`===> test aliyunTLS: ${hostname1} ->`, ip, '\n\n') assert.strictEqual(dnsProviders.aliyunTLS2.dnsType, 'TLS') -// ip = await dnsProviders.aliyunTLS2.lookup(hostname1) -// console.log('===> test aliyunTLS2:', ip, '\n\n') +ip = await dnsProviders.aliyunTLS2.lookup(hostname1) +console.log(`===> test aliyunTLS2: ${hostname1} ->`, ip, '\n\n') assert.strictEqual(dnsProviders.safe360TLS.dnsType, 'TLS') -// ip = await dnsProviders.safe360TLS.lookup(hostname1) -// console.log('===> test safe360TLS:', ip, '\n\n') +ip = await dnsProviders.safe360TLS.lookup(hostname1) +console.log(`===> test safe360TLS: ${hostname1} ->`, ip, '\n\n') console.log('\n--------------- test TCP ---------------\n') @@ -177,12 +177,12 @@ assert.strictEqual(ip, presetIp) // test preset console.log('\n\n') assert.strictEqual(dnsProviders.googleTCP.dnsType, 'TCP') -// ip = await dnsProviders.googleTCP.lookup(hostname1) -// console.log('===> test googleTCP:', ip, '\n\n') +ip = await dnsProviders.googleTCP.lookup(hostname1) +console.log(`===> test googleTCP: ${hostname1} ->`, ip, '\n\n') assert.strictEqual(dnsProviders.aliyunTCP.dnsType, 'TCP') -// ip = await dnsProviders.aliyunTCP.lookup(hostname1) -// console.log('===> test aliyunTCP:', ip, '\n\n') +ip = await dnsProviders.aliyunTCP.lookup(hostname1) +console.log(`===> test aliyunTCP: ${hostname1} ->`, ip, '\n\n') console.log('\n--------------- test UDP ---------------\n') @@ -191,9 +191,26 @@ assert.strictEqual(ip, presetIp) // test preset console.log('\n\n') assert.strictEqual(dnsProviders.googleUDP.dnsType, 'UDP') -// ip = await dnsProviders.googleUDP.lookup(hostname1) -// console.log('===> test googleUDP:', ip, '\n\n') +ip = await dnsProviders.googleUDP.lookup(hostname1) +console.log(`===> test googleUDP: ${hostname1} ->`, ip, '\n\n') assert.strictEqual(dnsProviders.aliyunUDP.dnsType, 'UDP') -// ip = await dnsProviders.aliyunUDP.lookup(hostname1) -// console.log('===> test aliyunUDP:', ip, '\n\n') +ip = await dnsProviders.aliyunUDP.lookup(hostname1) +console.log(`===> test aliyunUDP: ${hostname1} ->`, ip, '\n\n') + +dnsProviders.aliyunUDP.lookup(hostname1).then(ip0 => { + console.log(`===> test aliyunUDP: ${hostname1} ->`, ip0, '\n\n') + assert.strictEqual(ip0, ip) +}) +dnsProviders.aliyunUDP.lookup(hostname2).then(ip0 => { + console.log(`===> test aliyunUDP: ${hostname2} ->`, ip0, '\n\n') + assert.notStrictEqual(ip0, ip) +}) +dnsProviders.aliyunUDP.lookup('baidu.com').then(ip0 => { + console.log('===> test aliyunUDP: baidu.com ->', ip0, '\n\n') + assert.notStrictEqual(ip0, ip) +}) +dnsProviders.aliyunUDP.lookup('gitee.com').then(ip0 => { + console.log('===> test aliyunUDP: gitee.com ->', ip0, '\n\n') + assert.notStrictEqual(ip0, ip) +})