背景与价值域名解析是外联的前置环节。通过白名单与DoH解析策略,可降低劫持风险并提升可控性与审计性。统一规范白名单:仅允许批准域名解析与外联。超时与重试:解析请求设置超时与最大重试次数,指数退避。记录审计:对解析结果与失败原因进行结构化记录。核心实现策略与解析const allowDomains = new Set(['example.com','app.example.com'])

function domainAllowed(d: string): boolean { return allowDomains.has(d) }

function backoff(baseMs: number, attempt: number, maxMs: number): number {

const exp = Math.min(maxMs, baseMs * Math.pow(2, attempt))

const jitter = Math.random() * exp * 0.5

return Math.floor(exp * 0.75 + jitter)

}

type DoHRes = { Status: number; Answer?: { name: string; data: string; type: number }[] }

async function dohResolve(domain: string, timeoutMs: number): Promise<DoHRes | null> {

const ctrl = new AbortController()

const t = setTimeout(() => ctrl.abort(), timeoutMs)

try {

const r = await fetch('https://cloudflare-dns.com/dns-query?name=' + encodeURIComponent(domain) + '&type=A', { headers: { 'accept': 'application/dns-json' }, signal: ctrl.signal })

clearTimeout(t)

if (!r.ok) return null

return r.json()

} catch {

clearTimeout(t)

return null

}

}

type Audit = { domain: string; status: number; answers: string[] }

async function resolveWithPolicy(domain: string, attempts = 3, baseMs = 100, maxMs = 1000): Promise<Audit | null> {

if (!domainAllowed(domain)) return null

let last: DoHRes | null = null

for (let i = 0; i < attempts; i++) {

const res = await dohResolve(domain, 800)

if (res && res.Status === 0) return { domain, status: res.Status, answers: (res.Answer || []).map(a => a.data) }

last = res

await new Promise(r => setTimeout(r, backoff(baseMs, i, maxMs)))

}

if (!last) return null

return { domain, status: last.Status || -1, answers: [] }

}

落地建议解析与外联仅允许白名单域名,统一DoH通道并设置超时与重试策略。对解析结果进行审计,失败与异常统一记录并报警。配合出口治理阻断对非白名单域的直接访问。验证清单请求域名是否命中白名单;解析是否在超时与重试策略内完成。审计是否记录解析结果与失败原因。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部