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) {
|
if (!this.config || !this.config.server || !this.config.server.dns || !this.config.server.dns.providers) {
|
||||||
return options
|
return options
|
||||||
}
|
}
|
||||||
_.forEach(this.config.server.dns.providers, (dnsConf, key) => {
|
_.forEach(this.config.server.dns.providers, (dnsConfig, key) => {
|
||||||
options.push({
|
options.push({
|
||||||
value: key,
|
value: key,
|
||||||
label: key
|
label: key
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
const DNSOverTLS = require('./tls.js')
|
const DNSOverTLS = require('./tls.js')
|
||||||
const DNSOverHTTPS = require('./https.js')
|
const DNSOverHTTPS = require('./https.js')
|
||||||
const DNSOverIpAddress = require('./ipaddress.js')
|
const DNSOverIpAddress = require('./ipaddress.js')
|
||||||
|
const DNSOverPreSetIpList = require('./preset.js')
|
||||||
const matchUtil = require('../../utils/util.match')
|
const matchUtil = require('../../utils/util.match')
|
||||||
const log = require('../../utils/util.log')
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
initDNS (dnsProviders, preSetIpList) {
|
initDNS (dnsProviders, preSetIpList) {
|
||||||
const dnsMap = {}
|
const dnsMap = {}
|
||||||
|
|
||||||
|
// 创建普通的DNS
|
||||||
for (const provider in dnsProviders) {
|
for (const provider in dnsProviders) {
|
||||||
const conf = dnsProviders[provider]
|
const conf = dnsProviders[provider]
|
||||||
|
|
||||||
|
@ -22,32 +24,31 @@ module.exports = {
|
||||||
dnsMap[provider].name = provider
|
dnsMap[provider].name = provider
|
||||||
dnsMap[provider].type = conf.type
|
dnsMap[provider].type = conf.type
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 创建预设IP的DNS
|
||||||
|
dnsMap.PreSet = new DNSOverPreSetIpList(preSetIpList)
|
||||||
|
|
||||||
return dnsMap
|
return dnsMap
|
||||||
},
|
},
|
||||||
hasDnsLookup (dnsConfig, hostname) {
|
hasDnsLookup (dnsConfig, hostname) {
|
||||||
let providerName = matchUtil.matchHostname(dnsConfig.mapping, hostname, 'get dns providerName')
|
let providerName = null
|
||||||
|
|
||||||
// usa已重命名为cloudflare,以下为向下兼容处理
|
// 先匹配 预设IP配置
|
||||||
if (providerName === 'usa' && dnsConfig.providers[providerName] == null) {
|
|
||||||
providerName = 'cloudflare'
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果为空,尝试从预设IP中匹配,如果配置过预设IP,则随便
|
|
||||||
if (providerName == null || dnsConfig.providers[providerName] == null) {
|
|
||||||
const hostnamePreSetIpList = matchUtil.matchHostname(dnsConfig.preSetIpList, hostname, 'matched preSetIpList')
|
const hostnamePreSetIpList = matchUtil.matchHostname(dnsConfig.preSetIpList, hostname, 'matched preSetIpList')
|
||||||
if (hostnamePreSetIpList) {
|
if (hostnamePreSetIpList) {
|
||||||
for (const name in dnsConfig.providers) {
|
return dnsConfig.dnsMap.PreSet
|
||||||
const provider = dnsConfig.providers[name]
|
|
||||||
if (provider.type === 'https') {
|
|
||||||
log.debug(`当前域名未配置过DNS,但配置了预设IP,现返回DNS '${name}' 作为预设IP的使用工具,hostname: ${hostname}, preSetIpList:`, hostnamePreSetIpList)
|
|
||||||
return dnsConfig.providers[name]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 再匹配 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) {
|
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,
|
host: hostname,
|
||||||
connectTimeout: 10000
|
connectTimeout: 10000
|
||||||
}
|
}
|
||||||
if (dnsConfig && dnsConfig.providers) {
|
if (dnsConfig && dnsConfig.dnsMap) {
|
||||||
const dns = DnsUtil.hasDnsLookup(dnsConfig, hostname)
|
const dns = DnsUtil.hasDnsLookup(dnsConfig, hostname)
|
||||||
if (dns) {
|
if (dns) {
|
||||||
options.lookup = dnsLookup.createLookupFunc(null, dns, 'connect', hostport, isDnsIntercept)
|
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))
|
log.info('发起代理请求:', url, (rOptions.servername ? ', sni: ' + rOptions.servername : ''), ', headers:', jsonApi.stringify2(rOptions.headers))
|
||||||
|
|
||||||
const isDnsIntercept = {}
|
const isDnsIntercept = {}
|
||||||
if (dnsConfig && dnsConfig.providers) {
|
if (dnsConfig && dnsConfig.dnsMap) {
|
||||||
let dns = DnsUtil.hasDnsLookup(dnsConfig, rOptions.hostname)
|
let dns = DnsUtil.hasDnsLookup(dnsConfig, rOptions.hostname)
|
||||||
if (!dns && rOptions.servername) {
|
if (!dns && rOptions.servername) {
|
||||||
dns = dnsConfig.providers.quad9
|
dns = dnsConfig.dnsMap.quad9
|
||||||
if (dns) {
|
if (dns) {
|
||||||
log.info(`域名 ${rOptions.hostname} 在dns中未配置,但使用了 sni: ${rOptions.servername}, 必须使用dns,现默认使用 'quad9' DNS.`)
|
log.info(`域名 ${rOptions.hostname} 在dns中未配置,但使用了 sni: ${rOptions.servername}, 必须使用dns,现默认使用 'quad9' DNS.`)
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ module.exports = {
|
||||||
|
|
||||||
port = ~~port
|
port = ~~port
|
||||||
const speedTestConfig = dnsConfig.speedTest
|
const speedTestConfig = dnsConfig.speedTest
|
||||||
const dnsMap = dnsConfig.providers
|
const dnsMap = dnsConfig.dnsMap
|
||||||
if (speedTestConfig) {
|
if (speedTestConfig) {
|
||||||
const dnsProviders = speedTestConfig.dnsProviders
|
const dnsProviders = speedTestConfig.dnsProviders
|
||||||
const map = {}
|
const map = {}
|
||||||
|
|
|
@ -95,7 +95,7 @@ module.exports = (serverConfig) => {
|
||||||
port: serverConfig.port,
|
port: serverConfig.port,
|
||||||
dnsConfig: {
|
dnsConfig: {
|
||||||
preSetIpList,
|
preSetIpList,
|
||||||
providers: dnsUtil.initDNS(serverConfig.dns.providers, preSetIpList),
|
dnsMap: dnsUtil.initDNS(serverConfig.dns.providers, preSetIpList),
|
||||||
mapping: matchUtil.domainMapRegexply(dnsMapping),
|
mapping: matchUtil.domainMapRegexply(dnsMapping),
|
||||||
speedTest: serverConfig.dns.speedTest
|
speedTest: serverConfig.dns.speedTest
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue