optimize: 优化预设IP相关代码。
parent
f7e5d58af1
commit
e3e7710ee4
|
@ -260,7 +260,7 @@ export default {
|
|||
if (!this.config || !this.config.server || !this.config.server.dns || !this.config.server.dns.providers) {
|
||||
return options
|
||||
}
|
||||
_.forEach(this.config.server.dns.providers, (dnsConf, key) => {
|
||||
_.forEach(this.config.server.dns.providers, (dnsConfig, key) => {
|
||||
options.push({
|
||||
value: key,
|
||||
label: key
|
||||
|
|
|
@ -1,12 +1,14 @@
|
|||
const DNSOverTLS = require('./tls.js')
|
||||
const DNSOverHTTPS = require('./https.js')
|
||||
const DNSOverIpAddress = require('./ipaddress.js')
|
||||
const DNSOverPreSetIpList = require('./preset.js')
|
||||
const matchUtil = require('../../utils/util.match')
|
||||
const log = require('../../utils/util.log')
|
||||
|
||||
module.exports = {
|
||||
initDNS (dnsProviders, preSetIpList) {
|
||||
const dnsMap = {}
|
||||
|
||||
// 创建普通的DNS
|
||||
for (const provider in dnsProviders) {
|
||||
const conf = dnsProviders[provider]
|
||||
|
||||
|
@ -22,32 +24,31 @@ module.exports = {
|
|||
dnsMap[provider].name = provider
|
||||
dnsMap[provider].type = conf.type
|
||||
}
|
||||
|
||||
// 创建预设IP的DNS
|
||||
dnsMap.PreSet = new DNSOverPreSetIpList(preSetIpList)
|
||||
|
||||
return dnsMap
|
||||
},
|
||||
hasDnsLookup (dnsConfig, hostname) {
|
||||
let providerName = matchUtil.matchHostname(dnsConfig.mapping, hostname, 'get dns providerName')
|
||||
let providerName = null
|
||||
|
||||
// usa已重命名为cloudflare,以下为向下兼容处理
|
||||
if (providerName === 'usa' && dnsConfig.providers[providerName] == null) {
|
||||
providerName = 'cloudflare'
|
||||
}
|
||||
|
||||
// 如果为空,尝试从预设IP中匹配,如果配置过预设IP,则随便
|
||||
if (providerName == null || dnsConfig.providers[providerName] == null) {
|
||||
// 先匹配 预设IP配置
|
||||
const hostnamePreSetIpList = matchUtil.matchHostname(dnsConfig.preSetIpList, hostname, 'matched preSetIpList')
|
||||
if (hostnamePreSetIpList) {
|
||||
for (const name in dnsConfig.providers) {
|
||||
const provider = dnsConfig.providers[name]
|
||||
if (provider.type === 'https') {
|
||||
log.debug(`当前域名未配置过DNS,但配置了预设IP,现返回DNS '${name}' 作为预设IP的使用工具,hostname: ${hostname}, preSetIpList:`, hostnamePreSetIpList)
|
||||
return dnsConfig.providers[name]
|
||||
}
|
||||
}
|
||||
return dnsConfig.dnsMap.PreSet
|
||||
}
|
||||
|
||||
// 再匹配 DNS映射配置
|
||||
providerName = matchUtil.matchHostname(dnsConfig.mapping, hostname, 'get dns providerName')
|
||||
|
||||
// 由于DNS中的usa已重命名为cloudflare,所以做以下处理,为了向下兼容
|
||||
if (providerName === 'usa' && dnsConfig.dnsMap.usa == null && dnsConfig.dnsMap.cloudflare != null) {
|
||||
return dnsConfig.dnsMap.cloudflare
|
||||
}
|
||||
|
||||
if (providerName) {
|
||||
return dnsConfig.providers[providerName]
|
||||
return dnsConfig.dnsMap[providerName]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
const BaseDNS = require('./base')
|
||||
const matchUtil = require('../../utils/util.match')
|
||||
|
||||
function mapToList (ipMap) {
|
||||
const ipList = []
|
||||
for (const key in ipMap) {
|
||||
if (!ipMap[key]) continue
|
||||
ipList.push(ipMap[key])
|
||||
}
|
||||
return ipList
|
||||
}
|
||||
|
||||
module.exports = class DNSOverPreSetIpList extends BaseDNS {
|
||||
constructor (preSetIpList) {
|
||||
super()
|
||||
this.preSetIpList = preSetIpList
|
||||
this.name = 'PreSet'
|
||||
this.type = 'PreSet'
|
||||
}
|
||||
|
||||
async _lookup (hostname) {
|
||||
// 获取当前域名的预设IP列表
|
||||
let hostnamePreSetIpList = matchUtil.matchHostname(this.preSetIpList, hostname, 'matched preSetIpList')
|
||||
if (hostnamePreSetIpList && (hostnamePreSetIpList.length > 0 || hostnamePreSetIpList.length === undefined)) {
|
||||
if (hostnamePreSetIpList.length > 0) {
|
||||
hostnamePreSetIpList = hostnamePreSetIpList.slice()
|
||||
} else {
|
||||
hostnamePreSetIpList = mapToList(hostnamePreSetIpList)
|
||||
}
|
||||
|
||||
if (hostnamePreSetIpList.length > 0) {
|
||||
return hostnamePreSetIpList
|
||||
}
|
||||
}
|
||||
|
||||
// 未预设当前域名的IP列表
|
||||
return []
|
||||
}
|
||||
}
|
|
@ -106,7 +106,7 @@ function connect (req, cltSocket, head, hostname, port, dnsConfig = null, isDire
|
|||
host: hostname,
|
||||
connectTimeout: 10000
|
||||
}
|
||||
if (dnsConfig && dnsConfig.providers) {
|
||||
if (dnsConfig && dnsConfig.dnsMap) {
|
||||
const dns = DnsUtil.hasDnsLookup(dnsConfig, hostname)
|
||||
if (dns) {
|
||||
options.lookup = dnsLookup.createLookupFunc(null, dns, 'connect', hostport, isDnsIntercept)
|
||||
|
|
|
@ -110,10 +110,10 @@ module.exports = function createRequestHandler (createIntercepts, middlewares, e
|
|||
log.info('发起代理请求:', url, (rOptions.servername ? ', sni: ' + rOptions.servername : ''), ', headers:', jsonApi.stringify2(rOptions.headers))
|
||||
|
||||
const isDnsIntercept = {}
|
||||
if (dnsConfig && dnsConfig.providers) {
|
||||
if (dnsConfig && dnsConfig.dnsMap) {
|
||||
let dns = DnsUtil.hasDnsLookup(dnsConfig, rOptions.hostname)
|
||||
if (!dns && rOptions.servername) {
|
||||
dns = dnsConfig.providers.quad9
|
||||
dns = dnsConfig.dnsMap.quad9
|
||||
if (dns) {
|
||||
log.info(`域名 ${rOptions.hostname} 在dns中未配置,但使用了 sni: ${rOptions.servername}, 必须使用dns,现默认使用 'quad9' DNS.`)
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ module.exports = {
|
|||
|
||||
port = ~~port
|
||||
const speedTestConfig = dnsConfig.speedTest
|
||||
const dnsMap = dnsConfig.providers
|
||||
const dnsMap = dnsConfig.dnsMap
|
||||
if (speedTestConfig) {
|
||||
const dnsProviders = speedTestConfig.dnsProviders
|
||||
const map = {}
|
||||
|
|
|
@ -95,7 +95,7 @@ module.exports = (serverConfig) => {
|
|||
port: serverConfig.port,
|
||||
dnsConfig: {
|
||||
preSetIpList,
|
||||
providers: dnsUtil.initDNS(serverConfig.dns.providers, preSetIpList),
|
||||
dnsMap: dnsUtil.initDNS(serverConfig.dns.providers, preSetIpList),
|
||||
mapping: matchUtil.domainMapRegexply(dnsMapping),
|
||||
speedTest: serverConfig.dns.speedTest
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue