
简介这份《SANGFOR_ACSG_v12.0.41版本_DNS代理功能测试实施指导书》面向深信服上网行为管理设备的管理员与网络运维人员聚焦DNS代理功能的测试与落地配置帮助解决非法DNS请求拦截、域名强制重定向及多链路流量分配不均等问题。资源包共1个PDF文件大小约1.74MB内容按概述、方案优势、使用场景、配置方法、注意事项五章展开涵盖重定向至DNS服务器、解析为指定IP、丢弃请求、重定向至指定线路四种代理方式并配有测试条件、需求描述、具体配置与效果呈现的完整验证流程。目前已有102人学习下载。读者可据此掌握按用户群体、网站类型、域名及目标DNS地址设定代理范围的精细化控制思路理解DNS透明代理在多出口链路下的负载均衡价值并借助分步配置示例与注意事项快速完成测试部署提升网络管控与链路利用效率。1. 从一份测试指导书说起SANGFOR ACSG v12.0.41 的 DNS 代理到底测什么手上拿到一份《SANGFOR_ACSG_v12.0.41版本_DNS代理功能测试实施指导书.pdf》很多人第一反应是「DNS 代理不就是把请求转出去吗有什么好测的」。真到现场部署过 ACSG应用交付安全网关的人不会这么想。DNS 代理在网关类设备里是个容易被低估的模块它既是内网终端解析域名的第一跳又是策略、健康检查、链路选择、缓存、日志多条链路的交汇点。一旦代理行为不符合预期表现出来往往不是「DNS 挂了」这么直白而是间歇性解析慢、部分域名解析到旧 IP、切换链路后解析结果不刷新这类玄学问题。这份指导书对应的场景很明确在 ACSG v12.0.41 上验证 DNS 代理功能是否按设计工作。适合谁看负责交付和验收的安全/网络工程师、做网关二次开发或集成的同学、以及需要给客户出一份可复现测试记录的人。下面我按「先搞清楚测什么 → 怎么搭环境 → 逐项怎么测 → 坑在哪 → 怎么把测试做扎实」的顺序讲参数和判定标准尽量给到能直接抄的程度。2. DNS 代理在 ACSG 上的工作模型与测试范围拆解2.1 代理模式决定你测的是哪条链路ACSG 上的 DNS 代理常见有三种落地形态测试前必须先确认当前版本启用的是哪一种否则用例设计会跑偏。第一种是转发型代理设备监听 53 端口收到查询后按配置的上游 DNS 服务器转发把应答原样回给客户端。这种模式测试重点是转发正确性、上游故障时的行为、超时重试。第二种是缓存型代理在转发基础上加本地缓存命中缓存直接应答。测试重点是 TTL 处理、缓存刷新、负缓存NXDOMAIN行为。第三种是策略型代理按源地址、域名后缀、时间段把查询分流到不同上游甚至对特定域名做改写或拦截。测试重点是策略匹配优先级和命中日志。提示指导书里如果没写清模式先登录设备看 DNS 代理配置页有没有「上游服务器组」「缓存开关」「域名策略」这几项有哪项就说明支持哪种模式测试范围据此收敛。2.2 测试范围要覆盖的四类行为把 DNS 代理拆开需要验证的行为其实就四类指导书里的用例基本都落在这四类里行为类别验证目标典型判定基础转发查询能到达上游并正确返回应答记录与直连上游一致缓存二次查询走缓存、TTL 递减正确抓包看应答来源与 TTL 变化策略分流不同源/域名走不同上游命中日志与预期策略一致异常处理上游不可达、超时、畸形包有明确失败应答而非静默丢弃这四类里基础转发和缓存是必测项策略分流取决于是否启用策略异常处理最容易被跳过但恰恰是现场翻车最多的地方。2.3 环境准备把测试拓扑固定下来测试前先把拓扑固定避免每次换环境导致结果不可比。我一般用最小三节点拓扑# 测试客户端发起 DNS 查询 # 假设客户端 IP: 192.168.10.100 # ACSG 设备 DNS 代理监听地址: 192.168.10.1 # 上游 DNS 服务器: 8.8.8.8 和 114.114.114.114 # 1. 确认客户端到 ACSG 的 53 端口可达 nc -zvu 192.168.10.1 53 # 2. 确认 ACSG 到上游的 53 端口可达在设备侧执行或通过设备诊断工具 # 3. 记录基线直连上游的解析结果 dig 8.8.8.8 www.example.com short dig 114.114.114.114 www.example.com short这段准备工作的逻辑是先证明链路通再拿直连上游的结果作为基线。后面所有通过 ACSG 的解析结果都要和这个基线对比才能判断代理是否「正确转发」而不是「碰巧返回了某个 IP」。参数上short只输出应答记录方便脚本比对如果要看 TTL 和应答标志位去掉short用完整输出。2.4 用 dig 构造可复现的查询用例测试用例要可复现关键是查询参数固定。下面这组命令覆盖了最常见的几类查询# 基础 A 记录查询指定走 ACSG dig 192.168.10.1 www.example.com A # 指定 TTL 观察缓存连续查两次看第二次 TTL 是否递减 dig 192.168.10.1 www.example.com A noall answer sleep 2 dig 192.168.10.1 www.example.com A noall answer # 查询不存在的域名验证负缓存和 NXDOMAIN 返回 dig 192.168.10.1 not-exist.example.com A # 指定查询类型验证代理是否透传非 A 记录 dig 192.168.10.1 example.com MX dig 192.168.10.1 example.com TXTnoall answer只打印应答段适合做前后对比。连续两次查询之间sleep 2是为了让 TTL 有可观察的递减量如果第二次 TTL 和第一次完全一样要么是缓存没生效要么是上游返回的 TTL 本身很短需要结合抓包判断。非 A 记录查询是很多代理实现的盲区有些实现只处理 A 记录MX/TXT 直接返回失败这类问题在邮件和验证类业务里会暴露。3. 逐项测试怎么落地转发、缓存、策略、异常3.1 基础转发测试与判定标准基础转发是地基。测试方法很直接通过 ACSG 查一批域名和直连上游的结果逐条比对。但「比对」这件事有讲究不能只看 IP 是否相同还要看应答标志位。# 批量比对脚本通过 ACSG 和直连上游分别解析输出差异 domainswww.example.com mail.example.com api.example.com for d in $domains; do via_proxy$(dig 192.168.10.1 $d A short | sort) via_upstream$(dig 8.8.8.8 $d A short | sort) if [ $via_proxy $via_upstream ]; then echo PASS $d else echo FAIL $d proxy[$via_proxy] upstream[$via_upstream] fi done判定标准要写清楚PASS的条件是应答记录集合一致。但要注意 CDN 类域名本身返回的就是一组会变的 IP这时候不能要求完全相等而应该判断「代理返回的 IP 是否属于该域名的合法解析范围」。参数上sort是为了消除返回顺序差异带来的误判。如果出现FAIL先别急着判定设备有问题用dig trace或直接抓包确认是上游返回就不同还是代理改写了应答。3.2 缓存行为测试TTL 是核心观察点缓存测试的关键是观察 TTL 递减和缓存命中。DNS 应答里的 TTL 表示这条记录还能缓存多少秒代理如果正确实现缓存第二次查询返回的 TTL 应该比第一次小减去间隔时间。# 缓存命中测试记录两次查询的 TTL echo 第一次查询: dig 192.168.10.1 cache-test.example.com A noall answer sleep 5 echo 5秒后第二次查询: dig 192.168.10.1 cache-test.example.com A noall answer逻辑说明如果缓存生效第二次的 TTL 应该约等于第一次 TTL 减 5。如果两次 TTL 完全相同说明要么没走缓存每次都回源要么缓存实现没有递减 TTL这是不符合 RFC 的行为会导致客户端缓存过期时间错误。如果第二次 TTL 反而变大说明代理在回源时重置了 TTL这在某些实现里是「缓存友好」的做法但严格来说改变了上游语义需要在测试记录里标注。负缓存同样要测。查询一个不存在的域名连续两次观察第二次是否还回源dig 192.168.10.1 nxdomain-test.example.com A sleep 3 dig 192.168.10.1 nxdomain-test.example.com A如果第二次明显更快返回且状态仍是 NXDOMAIN说明负缓存生效。负缓存 TTL 通常由 SOA 记录里的 minimum 字段决定测试时可以查一下该域名的 SOA 来预估合理的负缓存时间。3.3 策略分流测试命中日志比结果更重要如果启用了策略型代理测试重点从「结果对不对」转向「命中了哪条策略」。因为同一个域名在不同策略下可能返回不同结果只看结果无法判断策略是否按预期匹配。# 从不同源地址发起查询验证源地址策略 # 假设策略192.168.10.0/24 走上游A192.168.20.0/24 走上游B dig 192.168.10.1 policy-test.example.com A short # 期望走上游A # 在 192.168.20.x 的客户端上执行 dig 192.168.10.1 policy-test.example.com A short # 期望走上游B判定依据应该是设备上的 DNS 代理命中日志而不是解析结果本身。测试时同步打开日志确认每条查询命中的策略 ID 和预期一致。参数上要注意策略优先级多数实现是「精确域名 后缀匹配 默认策略」测试用例要专门构造一个同时匹配多条策略的域名验证优先级顺序。3.4 异常处理测试上游挂了会怎样这是最容易被跳过、现场却最要命的一环。上游 DNS 不可达时代理的行为直接决定内网终端是「解析慢」还是「解析失败」。# 模拟上游不可达把上游地址改成一个不可达 IP或在防火墙上封掉 # 然后观察代理行为 dig 192.168.10.1 timeout-test.example.com A time5 tries1time5设置单次查询超时 5 秒tries1只试一次避免默认重试掩盖真实超时。观察点有三个代理是否在合理时间内返回失败而不是让客户端一直等、是否返回 SERVFAIL 而不是静默丢弃、是否在日志里记录了上游不可达。如果代理配置了多个上游还要测「主上游挂了是否自动切到备上游」以及切换后解析结果是否正常。4. 避坑与排查DNS 代理测试里最容易翻车的五件事4.1 现象解析结果和直连上游不一致但设备日志显示转发成功原因多半是上游返回了多个 A 记录代理做了轮询或只取了第一条而直连查询拿到的是完整集合。也可能是中间有另一层 DNS 缓存比如客户端本机缓存、或路径上的其他设备在起作用。解决先用dig noall answer看完整应答确认记录条数再在代理侧抓包看代理实际收到和发出的报文是否一致。如果代理确实改了应答查配置里有没有「应答改写」或「负载均衡」相关选项。4.2 现象缓存测试时 TTL 不递减甚至每次查询都回源原因缓存开关没打开或者缓存容量设为 0也可能是查询的域名 TTL 本身极短比如 1 秒观察窗口内已经过期。解决先确认缓存配置项状态再换一个 TTL 较长的域名比如 300 秒以上重测。如果配置正常但仍不回源检查是否有「强制回源」的策略在生效。4.3 现象策略分流测试时所有查询都命中默认策略原因策略匹配条件写错比如源地址网段写成了单个 IP、域名后缀少了点号example.com写成examplecom、或者策略顺序被默认策略抢先匹配。解决逐条核对策略条件特别注意域名后缀匹配通常要求以点开头.example.com。把默认策略临时禁用看具体策略是否能命中以此定位是条件问题还是优先级问题。4.4 现象上游不可达时客户端解析要等很久才失败原因代理的超时和重试参数设置过大或者配置了多个上游但没设总超时导致逐个上游串行等待。解决检查代理的超时配置把单次超时和总超时设成合理值常见做法是单次 2-3 秒、总超时 5 秒以内。如果支持并发查询多个上游开启并发能显著缩短失败时间。4.5 现象非 A 记录查询MX/TXT/AAAA返回失败或空原因代理实现只处理了 A 记录其他类型直接丢弃或返回错误。解决这是实现层面的限制测试时如实记录。如果业务需要这些记录类型需要确认当前版本是否支持或考虑在策略里对特定类型做透传。测试记录里要明确写「该版本 DNS 代理对非 A 记录的支持情况」避免交付后才发现。5. 把测试做扎实从单次验证到可回归的测试集单次手工测试能证明「这次是通的」但交付和验收需要的是「可重复、可回归」的测试集。我的习惯是把上面所有用例脚本化每次版本升级或配置变更后跑一遍输出一份带时间戳的结果。#!/bin/bash # dns_proxy_regression.sh - DNS 代理回归测试 PROXY192.168.10.1 UPSTREAM8.8.8.8 PASS0; FAIL0 check() { local desc$1 domain$2 local p$(dig $PROXY $domain A short | sort | tr \n ,) local u$(dig $UPSTREAM $domain A short | sort | tr \n ,) if [ $p $u ]; then echo PASS | $desc | $domain PASS$((PASS1)) else echo FAIL | $desc | $domain | proxy$p upstream$u FAIL$((FAIL1)) fi } check 基础转发 www.example.com check 基础转发 mail.example.com check CDN域名 cdn.example.com echo ---- echo 通过: $PASS 失败: $FAIL这个脚本的价值在于把「比对」这件事标准化。参数上tr \n ,把多行结果压成一行方便对比和输出。实际使用时把域名列表换成自己业务相关的域名CDN 类域名单独标记因为它们的 IP 会变判定逻辑要放宽成「是否属于合法解析范围」。进阶一点的做法是加上 TTL 检查和超时检查# TTL 递减检查 ttl1$(dig $PROXY cache-test.example.com A noall answer | awk {print $2}) sleep 5 ttl2$(dig $PROXY cache-test.example.com A noall answer | awk {print $2}) if [ $ttl2 -lt $ttl1 ]; then echo PASS | 缓存TTL递减 | $ttl1 - $ttl2 else echo FAIL | 缓存TTL未递减 | $ttl1 - $ttl2 fiawk {print $2}取的是应答行里的 TTL 字段。这个检查能自动发现缓存失效问题比人工看输出可靠得多。最后说个我自己的教训早期做 DNS 代理测试我只测了「能解析」没测「解析失败时的行为」结果现场上游抖动时内网大面积解析超时排查了半天才发现是代理超时参数默认值太大。从那以后异常路径的测试用例我一条都不省而且一定用脚本固化下来。测试指导书给的是框架真正让测试有价值的是把每条用例变成能反复跑、能对比、能留痕的东西。希望帮到你。本文还有配套的精品资源点击获取