diff --git a/packages/mitmproxy/src/lib/dns/https.js b/packages/mitmproxy/src/lib/dns/https.js index 49a4946..d2c6807 100644 --- a/packages/mitmproxy/src/lib/dns/https.js +++ b/packages/mitmproxy/src/lib/dns/https.js @@ -4,43 +4,48 @@ const BaseDNS = require('./base') const log = require('../../utils/util.log') const dohQueryAsync = promisify(doh.query) -module.exports = class DNSOverHTTPS extends BaseDNS { - constructor(dnsServer) { - super(); - this.dnsServer = dnsServer; +const PRESETS = { + 'github.com': ['20.27.177.113', '20.205.243.166', '20.200.245.247'], + 'api.github.com': ['20.27.177.116', '20.205.243.168', '20.200.245.245'] +} + +class DNSOverHTTPS extends BaseDNS { + constructor (dnsServer) { + super() + this.dnsServer = dnsServer + this.lastLookupError = null // 添加属性来记录最后一次查询错误 } - async _lookup(hostname) { - // 直接判断域名是否为example.com - if (hostname === 'github.com') { - log.info('域名github.com使用内置IP集') - // 返回预设的IP地址集 - return ['20.27.177.113', '20.205.243.166', '20.200.245.247'] - // 20.27.177.113日本(三网平均延时88MS(三网优秀)) 20.205.243.166新加坡(三网平均延时96MS(电信联通106.5平均延时,移动平均77MS)) 20.200.245.247韩国(三网平均108ms(移动平均120ms)) - } - if (hostname === 'api.github.com') { - log.info('域名api.github.com使用内置IP集') - // 返回预设的IP地址集 - return ['20.27.177.116', '20.205.243.168', '20.200.245.245'] + processQueryResult (result) { + if (result.answers.length === 0) { + log.error('该域名没有ip地址解析:', result.name) + return [] } + return result.answers + .filter(item => item.type === 'A') + .map(item => item.data) + } + async _lookup (hostname) { + const preset = PRESETS[hostname] + if (preset) { + log.debug(`使用预设IP集:${hostname}`) + return preset + } try { - const result = await dohQueryAsync({ url this.dnsServer }, [{ type 'A', name hostname }]) - if (result.answers.length === 0) { - // 说明没有获取到ip - log.info('该域名没有ip地址解析', hostname) - return []; + const result = await dohQueryAsync({ url: this.dnsServer }, [{ type: 'A', name: hostname }]) + const ips = this.processQueryResult(result) + if (ips.length > 0) { + log.info('获取到域名地址:', hostname, ips) } - const ret = result.answers.filter(item => item.type === 'A').map(item => item.data) - if (ret.length === 0) { - log.info('该域名没有IPv4地址解析', hostname) - } else { - log.info('获取到域名地址:', hostname, JSON.stringify(ret)) - } - return ret; + this.lastLookupError = null // 重置错误记录 + return ips } catch (e) { - log.warn('DNS query error', hostname, ', dns', this.dnsServer, ', error', e) - return []; + log.error('DNS查询错误:', hostname, ', DNS服务器:', this.dnsServer, ', 错误:', e) + this.lastLookupError = e // 记录错误 + throw e // 重新抛出错误,让调用者处理 } } } + +module.exports = DNSOverHTTPS