【歪门邪道】使用Acrylic DNS Proxy搭建Windows上的本地DNS服务器
本文将记述使用Acrylic DNS Proxy搭建运行在Windows的本地DNS服务器的过程。昨天开始做计算机网络的实验了，其中有一块就是配置一个DNS服务器。后来经过一番操作，我发现由于微软的一些原因（似乎在使用M1芯片的Mac上也有类似的问题），使得Docker这些依赖虚拟化的服务在运行时需要操作系统提供一个网络接入服务，也就是ShareAccess服务，这个服务会默认监听0.0.0.0:53，为虚拟机提供默认DNS。尝试了诸多方法之后，我遗憾的发现这东西并不能关，除非我把Docker和Hyper-V那些全都卸了。但是好消息是我可以指定我自己的DNS服务器监听某一个具体的ip，例如0.0.0.0:53被占用了，可是127.0.0.1:53还是可以用的。于是找到很久之前配置的dnsforwarded，改了配置，遂全部解决。但是当我在Github找到这个repo时，发现它的最后更新时间是2017年，对于拥有版本号洁癖的我来说，我还是希望用上最新的DNS服务器。于是我想到了其他的代替品，比如dnsmasq和bind，但是dnsmasq不提供原生Windows二进制文件，对于笔记本来说Docker未免有些费电；而bind虽然有windows二进制文件，可它毕竟是能够担起世界级DNS根服务器的软件，配置起来太过复杂，而且用于本地DNS来说，或许有些杀鸡用宰牛刀了（其实就是懒，不想配置）。于是搜索来搜索去，我找到了Acrylic DNS Proxy，它本身的定位就是local DNS proxy for Windows，所以拿来做本地DNS最合适不过了。至于软件的安装过程我就不再赘述了，这里主要提供一下我的配置文件，其中提示信息已经翻译成中文，有些不熟悉的名字我尽可能多方搜索以确定其常用且无歧义的名字，对于没有把握的名字我将保留英文单词。; ; ACRYLIC DNS PROXY需要重新启动才可以使对本文件的修改生效。 ; [GlobalSection] ; ; 第一DNS服务器的IP地址。可以使用IPv4的点分十进制写法，或IPv6的冒分十六进制写法。 ; ; 默认值为谷歌的公共DNS服务器：8.8.8.8。 ; PrimaryServerAddress=8.8.8.8 ; ; 第一DNS服务器的TCP/UDP端口，默认的标准端口号是53。 ; 仅在第一DNS服务器使用非标准DNS服务器或非TCP/UDP协议时修改此值，例如DNS-over-HTTPS的标准端口号为443。 ; PrimaryServerPort=53 ; ; 第一DNS服务器使用的协议。 ; ; 当前支持的协议有UDP、TCP、SOCKS5和DOH（DNS-over-HTTPS）。 ; ; 使用UDP协议时，Acrylic根据RFC 5625，使用UDP或者TCP转发DNS请求。 ; ; 使用TCP协议时，Acrylic仅使用TCP转发DNS请求。由于每次请求时建立TCP链接需要一定时间，并且单位时间内可以建立的TCP ; 链接数量受限于操作系统，因此这个协议应当仅在UDP协议不可用时使用。 ; ; 使用SOCKS5协议时，Acrylic根据RFC 1928，使用SOCKS 5代理作为中介，向第一DNS服务器转发DNS请求。 ; 目前只支持无需验证的SOCKS 5协议（NO AUTHENTICATION REQUIRED method for SOCKS 5）。 ; ; 使用DOH协议时，Acrylic使用DNS-over-HTTPS向第一DNS服务器转发DNS请求，DOH协议将DNS查询通过HTTPS发出，因此能够提高用户的隐私和安全。 ; 因为该协议能够防止监听与中间人攻击。但请务必知晓：使用DNS-over-HTTPS时，操作系统可使用的加密算法（例如TLS）必须至少有一个被第一DNS服 ; 务器所接受，并且这通常不是根据操作系统与DNS服务器的组合所决定的。例如老旧的Windows版本可能与使用TLS 1.1或1.2的DNS服务器难以建立连接 ; 因此必须安装一些特殊的升级。 ; PrimaryServerProtocol=UDP ; ; 使用DNS-over-HTTPS时，需要指定第一DNS服务器的查询路径（query path of your primary DNS server）。 ; PrimaryServerDoHProtocolPath= ; ; 使用DNS-over-HTTPS时，需要指定第一DNS服务器的主机名（host name of your primary DNS server）。 ; PrimaryServerDoHProtocolHost= ; ; 使用DNS-over-HTTPS时，可以指定Acrylic使用系统代理（System）或直连（Direct）。 ; PrimaryServerDoHProtocolConnectionType=System ; ; 使用DNS-over-HTTPS时，可以指定Acrylic是否在向第一DNS服务器发送请求时重用已有TCP链接（reuse existing TCP ; connections when sending requests to your primary DNS server）。为每个DNS请求建立链接需要一定时间，并且 ; 单位时间内可以建立的TCP链接数受制于操作系统，因此重用已有TCP链接是提升DOH协议性能的最有效的方法。 ; PrimaryServerDoHProtocolReuseConnections=Yes ; ; 使用DNS-over-HTTPS时，可以指定Acrylic是否在向第一DNS服务器发出DNS请求时使用WinHttp库，以代替WinINet库。 ; ; WinINet设计上更偏向于作为桌面交互式应用的HTTP客户端，大多数情况下是WinHttp的超集。 ; WinHttp专门为服务器场景设计，用于作为HTTP客户端在服务器程序中请求其他HTTP服务器。 ; 对于Acrylic来说，在大部分情况下两者是等同的，但拥有在两种DNS服务等级（DNS server level）之间切换的能力， ; 在及特殊情况下会很有用。 ; PrimaryServerDoHProtocolUseWinHttp=Yes ; ; 这里是已知可用的DNS-over-HTTPS配置，使用Quad9的公共DNS服务器： ; ; PrimaryServerAddress=9.9.9.9 ; PrimaryServerPort=443 ; PrimaryServerProtocol=DOH ; PrimaryServerDoHProtocolPath=dns-query ; PrimaryServerDoHProtocolHost=dns.quad9.net ; ; 这里是已知可用的DNS-over-HTTPS配置，使用Google的公共DNS服务器： ; ; PrimaryServerAddress=8.8.8.8 ; PrimaryServerPort=443 ; PrimaryServerProtocol=DOH ; PrimaryServerDoHProtocolPath=dns-query ; PrimaryServerDoHProtocolHost=dns.google ; ; 这里是已知可用的DNS-over-HTTPS配置，使用CloudFlare的公共DNS服务器： ; ; PrimaryServerAddress=1.1.1.1 ; PrimaryServerPort=443 ; PrimaryServerProtocol=DOH ; PrimaryServerDoHProtocolPath=dns-query ; PrimaryServerDoHProtocolHost=cloudflare-dns.com ; ; 使用SOCKS5协议时，可以指定SOCKS5代理服务器的IP地址。可以使用IPv4的点分十进制写法，或IPv6的冒分十六进制写法。 ; PrimaryServerSocks5ProtocolProxyAddress= ; ; 使用SOCKS5协议时，可以指定SOCKS5代理服务器的TCP端口号。 ; PrimaryServerSocks5ProtocolProxyPort= ; ; 域名偏好掩码（The domain name affinity mask）是一个英文分号分割的列表，其内容可以是具体的值或广域通配符， ; 用以控制对应请求转发给的DNS服务器。 ; ; 下面的例子中，只有以“.com”结尾的域名才会被转发给第一DNS服务器： ; ; PrimaryServerDomainNameAffinityMask=*.com ; ; 下面的例子中只有以“.com”和“.org”结尾的域名才会被转发给第一DNS服务器： ; ; PrimaryServerDomainNameAffinityMask=*.com;*.org ; ; 否定（Negations）可以用插入符（^）作为前缀来表示。 ; ; 在下面的例子中，只有不以“.com”或“.org”结尾的域名才会被转发给第一DNS服务器， ; 其中最后一个通配符是非常重要的，如果缺失该通配符，那么没有任何请求会被转发给第一DNS服务器。 ; ; PrimaryServerDomainNameAffinityMask=^*.com;^*.org;* ; PrimaryServerDomainNameAffinityMask=^*.skyblond.info;* ; ; 查询类别偏好掩码（The query type affinity mask）是一个英文分号分割的列表，其内容是具体的查询类型名称， ; 用于控制哪种类别的查询请求将会转发给第一DNS服务器。 ; ; 在下面的例子中只有A、AAAA、MX和SRV的查询请求会转发给第一DNS服务器： ; ; PrimaryServerQueryTypeAffinityMask=A;AAAA;MX;SRV ; ; 所有的DNS查询类别都支持：明确的使用A、AAAA、CNAME、MX、NS、PTR、SOA、SRV和TXT来指定， ; 或者使用他们对应的数字编号。例如A记录的编号为1；TXT记录的编号为16。 ; PrimaryServerQueryTypeAffinityMask= ; ; 下方可以指定是否忽略来自第一DNS服务器的失败响应（failure responses）。 ; IgnoreFailureResponsesFromPrimaryServer=No ; ; 下方可以指定是否忽略来自第一DNS服务器的否定响应（negative responses）。 ; IgnoreNegativeResponsesFromPrimaryServer=No ; ; 第二DNS服务器的配置。具体细节可以参考上面的第一DNS服务器的相关配置的注释。 ; ; 首次安装后默认第二DNS服务器为谷歌的公共DNS服务器。 ; SecondaryServerAddress=8.8.4.4 SecondaryServerPort=53 SecondaryServerProtocol=SOCKS5 SecondaryServerDoHProtocolPath= SecondaryServerDoHProtocolHost= SecondaryServerDoHProtocolConnectionType=System SecondaryServerDoHProtocolReuseConnections=Yes SecondaryServerDoHProtocolUseWinHttp=Yes SecondaryServerSocks5ProtocolProxyAddress=127.0.0.1 SecondaryServerSocks5ProtocolProxyPort=1080 SecondaryServerDomainNameAffinityMask=^*.skyblond.info;* SecondaryServerQueryTypeAffinityMask= IgnoreFailureResponsesFromSecondaryServer=No IgnoreNegativeResponsesFromSecondaryServer=No ; ; 第三DNS服务器的配置。具体细节可以参考上面的第一DNS服务器的相关配置的注释。 ; TertiaryServerAddress=208.67.220.220 TertiaryServerPort=53 TertiaryServerProtocol=SOCKS5 TertiaryServerDoHProtocolPath= TertiaryServerDoHProtocolHost= TertiaryServerDoHProtocolConnectionType=System TertiaryServerDoHProtocolReuseConnections=Yes TertiaryServerDoHProtocolUseWinHttp=Yes TertiaryServerSocks5ProtocolProxyAddress=127.0.0.1 TertiaryServerSocks5ProtocolProxyPort=1080 TertiaryServerDomainNameAffinityMask=^*.skyblond.info;* TertiaryServerQueryTypeAffinityMask= IgnoreFailureResponsesFromTertiaryServer=No IgnoreNegativeResponsesFromTertiaryServer=No ; ; 第四DNS服务器的配置。具体细节可以参考上面的第一DNS服务器的相关配置的注释。 ; QuaternaryServerAddress=208.67.222.222 QuaternaryServerPort=53 QuaternaryServerProtocol=SOCKS5 QuaternaryServerDoHProtocolPath= QuaternaryServerDoHProtocolHost= QuaternaryServerDoHProtocolConnectionType=System QuaternaryServerDoHProtocolReuseConnections=Yes QuaternaryServerDoHProtocolUseWinHttp=Yes QuaternaryServerSocks5ProtocolProxyAddress=127.0.0.1 QuaternaryServerSocks5ProtocolProxyPort=1080 QuaternaryServerDomainNameAffinityMask=^*.skyblond.info;* QuaternaryServerQueryTypeAffinityMask= IgnoreFailureResponsesFromQuaternaryServer=No IgnoreNegativeResponsesFromQuaternaryServer=No ; ; 第五DNS服务器的配置。具体细节可以参考上面的第一DNS服务器的相关配置的注释。 ; QuinaryServerAddress=1.1.1.1 QuinaryServerPort=53 QuinaryServerProtocol=SOCKS5 QuinaryServerDoHProtocolPath= QuinaryServerDoHProtocolHost= QuinaryServerDoHProtocolConnectionType=System QuinaryServerDoHProtocolReuseConnections=Yes QuinaryServerDoHProtocolUseWinHttp=Yes QuinaryServerSocks5ProtocolProxyAddress=127.0.0.1 QuinaryServerSocks5ProtocolProxyPort=1080 QuinaryServerDomainNameAffinityMask=^*.skyblond.info;* QuinaryServerQueryTypeAffinityMask= IgnoreFailureResponsesFromQuinaryServer=No IgnoreNegativeResponsesFromQuinaryServer=No ; ; 第六DNS服务器的配置。具体细节可以参考上面的第一DNS服务器的相关配置的注释。 ; SenaryServerAddress=9.9.9.9 SenaryServerPort=53 SenaryServerProtocol=SOCKS5 SenaryServerDoHProtocolPath= SenaryServerDoHProtocolHost= SenaryServerDoHProtocolConnectionType=System SenaryServerDoHProtocolReuseConnections=Yes SenaryServerDoHProtocolUseWinHttp=Yes SenaryServerSocks5ProtocolProxyAddress=127.0.0.1 SenaryServerSocks5ProtocolProxyPort=1080 SenaryServerDomainNameAffinityMask=^*.skyblond.info;* SenaryServerQueryTypeAffinityMask= IgnoreFailureResponsesFromSenaryServer=No IgnoreNegativeResponsesFromSenaryServer=No ; ; 第七DNS服务器的配置。具体细节可以参考上面的第一DNS服务器的相关配置的注释。 ; SeptenaryServerAddress=9.9.9.9 SeptenaryServerPort=443 SeptenaryServerProtocol=DOH SeptenaryServerDoHProtocolPath=dns-query SeptenaryServerDoHProtocolHost=dns.quad9.net SeptenaryServerDoHProtocolConnectionType=System SeptenaryServerDoHProtocolReuseConnections=Yes SeptenaryServerDoHProtocolUseWinHttp=Yes SeptenaryServerSocks5ProtocolProxyAddress= SeptenaryServerSocks5ProtocolProxyPort= SeptenaryServerDomainNameAffinityMask=^*.skyblond.info;* SeptenaryServerQueryTypeAffinityMask= IgnoreFailureResponsesFromSeptenaryServer=No IgnoreNegativeResponsesFromSeptenaryServer=No ; ; 第八DNS服务器的配置。具体细节可以参考上面的第一DNS服务器的相关配置的注释。 ; OctonaryServerAddress=8.8.8.8 OctonaryServerPort=443 OctonaryServerProtocol=DOH OctonaryServerDoHProtocolPath=dns-query OctonaryServerDoHProtocolHost=dns.google OctonaryServerDoHProtocolConnectionType=System OctonaryServerDoHProtocolReuseConnections=Yes OctonaryServerDoHProtocolUseWinHttp=Yes OctonaryServerSocks5ProtocolProxyAddress= OctonaryServerSocks5ProtocolProxyPort= OctonaryServerDomainNameAffinityMask=^*.skyblond.info;* OctonaryServerQueryTypeAffinityMask= IgnoreFailureResponsesFromOctonaryServer=No IgnoreNegativeResponsesFromOctonaryServer=No ; ; 第九DNS服务器的配置。具体细节可以参考上面的第一DNS服务器的相关配置的注释。 ; NonaryServerAddress=1.1.1.1 NonaryServerPort=443 NonaryServerProtocol=DOH NonaryServerDoHProtocolPath=dns-query NonaryServerDoHProtocolHost=cloudflare-dns.com NonaryServerDoHProtocolConnectionType=System NonaryServerDoHProtocolReuseConnections=Yes NonaryServerDoHProtocolUseWinHttp=Yes NonaryServerSocks5ProtocolProxyAddress= NonaryServerSocks5ProtocolProxyPort= NonaryServerDomainNameAffinityMask=^*.skyblond.info;* NonaryServerQueryTypeAffinityMask= IgnoreFailureResponsesFromNonaryServer=No IgnoreNegativeResponsesFromNonaryServer=No ; ; 第十DNS服务器的配置。具体细节可以参考上面的第一DNS服务器的相关配置的注释。 ; ; 最后一个DNS用于必要域名的直连解析。使用114的域名服务。 ; DenaryServerAddress=114.114.114.114 DenaryServerPort=53 DenaryServerProtocol=UDP DenaryServerDoHProtocolPath= DenaryServerDoHProtocolHost= DenaryServerDoHProtocolConnectionType=Direct DenaryServerDoHProtocolReuseConnections=Yes DenaryServerDoHProtocolUseWinHttp=Yes DenaryServerSocks5ProtocolProxyAddress= DenaryServerSocks5ProtocolProxyPort= DenaryServerDomainNameAffinityMask=*.skyblond.info DenaryServerQueryTypeAffinityMask= IgnoreFailureResponsesFromDenaryServer=No IgnoreNegativeResponsesFromDenaryServer=No ; ; 在下方指定Acrylic是否吞噬（sinkhole）所有IPv6查询（即AAAA记录）。 ; SinkholeIPv6Lookups=No ; ; 在下方指定Acrylic是否需要转发对私有IP段的DNS反向查询（即PTR记录）。 ; 除了保护您和您的DNS服务器不受那些无用流量的打扰之外，选择否（No）也是避免泄露您 ; 私有IP地址空间的最佳选项。 ; ForwardPrivateReverseLookups=No ; ; ACRYLIC DNS代理链（PROXY CACHING）机制说明： ; ; 当Acrylic接收到一个来自客户端的DNS查询时，首先搜索域名缓存（hosts cache，一个静态内存缓存，来自AcrylicHosts.txt文件）。 ; 如果没有找到，则开始搜索地址缓存（address cache，一个动态内存缓存，使用AcrylicCache.dat文件作为备份）。 ; 此时可能会发生如下三种情况： ; ; [1] 若请求没有找到，或找到的结果超过了“AddressCacheScavengingTime”规定的分钟数（缓存失效）： ; 此时原请求将被同时转发到所有已经配置的服务器。对客户端的响应将被阻塞，直到首次得到任意DNS服务器的 ; 有效回复。之后来自其他DNS服务器的回复将被丢弃。 ; ; [2] 若请求找到了，并且找到的结果超过了“AddressCacheSilentUpdateTime”但没有超过“AddressCacheScavengingTime”的分钟数： ; 此时将立刻使用地址缓存中的结果回复客户端，并且原请求被同时转发到所有配置的DNS服务器。 ; 最先得到的回复将用于静默更新（silently update）地址缓存，之后收到的回复将会丢弃。 ; ; [3] 若请求找到了，并且找到的结果没有超过“AddressCacheSilentUpdateTime”的分钟数： ; 此时将立刻使用地址缓存中的结果回复客户端，并且不会与已配置的DNS服务器产生任何网络活动。 ; ; 请知晓：为了最小化用以将地址缓存持久化的磁盘活动，Acrylic只在被停止或系统关机将地址缓存前写入磁盘。 ; ; 下面是关于缓存的参数： ; ; 失败响应（failure response）在地址缓存中的存活分钟数。 ; AddressCacheFailureTime=0 ; ; 否定响应（negative response）在地址缓存中的存活分钟数。 ; AddressCacheNegativeTime=30 ; ; 有效响应（positive response）在地址缓存中的存活分钟数。 ; AddressCacheScavengingTime=360 ; ; 地址缓存中条目必须静默刷新的分钟数。 ; AddressCacheSilentUpdateTime=180 ; ; 定期清空地址缓存中失效条目的时间间隔，分钟为单位。 ; 设置为0表示永远不会清空地址缓存中的失效条目。 ; AddressCachePeriodicPruningTime=360 ; ; 地址缓存域名偏好掩码（The address cache domain name affinity mask）是一个英文分号分割的列表，其内容可以是具体的值或广域通配符， ; 用以控制哪些域名的响应可以被写入缓存。 ; AddressCacheDomainNameAffinityMask=^dns.msftncsi.com;^ipv6.msftncsi.com;^www.msftncsi.com;* ; ; 地址缓存类型偏好掩码（The address cache query type affinity mask）是一个英文分号分割的列表，其内容是具体的查询类型名称， ; 用于控制哪种类别的响应可以被写入缓存 ; ; 所有的DNS查询类别都支持：明确的使用A、AAAA、CNAME、MX、NS、PTR、SOA、SRV和TXT来指定， ; 或者使用他们对应的数字编号。例如A记录的编号为1；TXT记录的编号为16。 ; AddressCacheQueryTypeAffinityMask=A;AAAA;CNAME;MX;NS;PTR;SOA;SRV;TXT ; ; 下方可以通过设置为Yes禁用任何磁盘活动。 ; 这样做将会导致Acrylic只将地址缓存保留在内存中。 ; 设置为No以允许硬盘持久化。 ; AddressCacheInMemoryOnly=Yes ; ; 下方可以通过设置为Yes禁用地址缓存。 ; 这样做将会导致Acrylic作为一个仅用于DNS转发的DNS代理。 ; 设置为No以允许地址缓存。 ; AddressCacheDisabled=No ; ; Acrylic监听的本地IPv4地址。“0.0.0.0”表示在所有可用的地址上监听DNS请求。 ; 指定某一个具体的网卡IP将会只允许Acrylic监听来自该地址的DNS请求。 ; 留空则不会绑定任何IPv4地址。 ; LocalIPv4BindingAddress=127.0.0.1 ; ; 本地UDPv4端口号。默认端口号53是DNS解析服务的标准端口号。 ; 仅当你使用非标准DNS客户端时修改此值。 ; LocalIPv4BindingPort=53 ; ; Acrylic监听的本地IPv6地址。“0:0:0:0:0:0:0:0”表示在所有可用的地址上监听DNS请求。 ; 指定某一个具体的网卡IP将会只允许Acrylic监听来自该地址的DNS请求。 ; 留空则不会绑定任何IPv6地址。 ; LocalIPv6BindingAddress= ; ; 本地UDPv6端口号。默认端口号53是DNS解析服务的标准端口号。 ; 仅当你使用非标准DNS客户端时修改此值。 ; LocalIPv6BindingPort=53 ; ; 在Windows Vista或Windows Server 2008之前的Windows上，IPv6协议默认没有安装。 ; 对于Windows 2000，存在一个Microsoft IPv6 Technology Preview package可用于下载并安装。 ; 对于Windows XP，IPv6协议必须在网络连接属性窗口（network connection properties window）中 ; 添加到可用网络协议列表中。 ; ; 如果你想让Acrylic在Windows Vista或Windows Server 2008之前的Windows上启用本地IPv6绑定， ; 你可以在安装了上述依赖后将下面的选项设置为Yes。 ; LocalIPv6BindingEnabledOnWindowsVersionsPriorToWindowsVistaOrWindowsServer2008=No ; ; Acrylic生成的DNS响应的存活秒数。 ; 即来自AcrylicHosts.txt文件的条目。 ; GeneratedResponseTimeToLive=300 ; ; 使用UDP协议时，等待已配置的DNS服务器响应的最大毫秒数。 ; 即UDP协议的超时时间。 ; ServerUdpProtocolResponseTimeout=4999 ; ; 使用TCP协议时，等待第一个来自已配置服务器的字节的最大毫秒数。 ; ServerTcpProtocolResponseTimeout=4999 ; ; 使用TCP协议时，收到第一个来自已配置服务器的字节后，等待其他字节的最大毫秒数。 ; ServerTcpProtocolInternalTimeout=2477 ; ; 使用SOCKS 5作为中介通讯时，等待如下事件的最大毫秒数。 ; ServerSocks5ProtocolProxyFirstByteTimeout=2477 ServerSocks5ProtocolProxyOtherBytesTimeout=2477 ServerSocks5ProtocolProxyRemoteConnectTimeout=2477 ServerSocks5ProtocolProxyRemoteResponseTimeout=4999 ; ; 命中日志是一个文本文件，用于记录每一个DNS请求和响应。 ; ; 它通过指定一个非空的HitLogFileName参数来激活。文件中包含数行由TAB分割的数据： ; ; [01] DNS请求或回复收到的时间戳，格式为“YYYY-MM-DD HH:MM:SS.FFF”（本地时间）。 ; [02] DNS请求的源IP或DNS响应的目的IP。 ; [03] DNS请求或响应的状态： ; X => 由Acrylic直接解析 ; H => 使用域名缓存解析 ; C => 使用地址缓存解析 ; F => 转发到至少一个已经配置的DNS服务器 ; R => 某一台已配置的DNS服务器发来的响应，用于直接响应客户端 ; U => 某一台已配置的DNS服务器发来的响应，用于静默更新 ; [04] DNS响应的来源DNS服务器，为前面配置的编号。 ; [05] DNS服务器产生回应的耗时（毫秒）。 ; [06] 解析（dissected）的DNS请求或响应。 ; ; 一条解析的（dissected）DNS请求如下所示： ; ; OC=0;RD=1;QDC=1;Q[1]=x.com;T[1]=A ; ; 其中: ; ; [01] OC=0 意味着DNS操作码（OPCODE）是0，可能的值有：0 = 一个标准查询（QUERY）；1 = 一个反向查询（IQUERY）； ; 2 = 服务器状态请求（STATUS）。 ; [02] RD=1 意味着DNS递归响应需求位（DNS response recursion desired bit，RD）是1。如果RD被置位， ; 它指示名称服务器以递归方式进行查询。 ; [03] QDC=1 意味着DNS请求中的查询数（QDCOUNT）是1。 ; [04] Q[1]=x.com 意味着第1个DNS查询指向域名“x.com”。 ; [05] T[1]=A 意味着第一个DNS查询的类型是A记录。 ; ; 一条解析的（dissected）DNS响应如下所示： ; ; OC=0;RC=0;TC=0;RD=1;RA=1;AA=0;QDC=1;ANC=2;NSC=0;ARC=0;Q[1]=x.com;T[1]=CNAME;A[1]=x.com>y.com;T[2]=A;A[2]=y.com>1.2.3.4 ; ; Where: ; ; [01] OC=0 意味着DNS操作码（OPCODE）是0，可能的值有：0 = 一个标准查询（QUERY）；1 = 一个反向查询（IQUERY）； ; 2 = 服务器状态请求（STATUS）。 ; [02] RC=0 意味着DNS响应码（RCODE）是0，可能的值有：0 = 没有出错；1 = 格式错误（域名服务器未能解析查询） ; 2 = 服务器失败（域名服务器由于其自己的原因未能处理这个查询）；3 = 名字错误（仅当响应来自权威DNS服务器时有意义，此时表示查询的域名不存在）； ; 4 = 未实现（域名服务器不支持该类型的查询）；5 = 拒绝（域名服务器由于政策原因拒绝执行该操作） ; [03] TC=0 意味着DNS响应截断位（DNS response truncated bit，TC）是0，该位指示当前消息是否因为其长度超过了传输信道所允许的最大长度。 ; [04] RD=1 意味着DNS递归响应需求位（DNS response recursion desired bit，RD）是1。它指示名称服务器以递归方式进行查询。 ; [05] RA=1 意味着DNS递归响应可用位（DNS response recursion available bit，RA）是0，它指示域名服务器支持以递归方式查询。 ; [06] AA=0 意味着DNS权威响应位（DNS response authoritative answer bit，AA）是0，它指示响应是否来自一个权威DNS服务器。 ; [07] QDC=1 意味着DNS响应中的查询数（QDCOUNT）为1。 ; [08] ANC=2 意味着DNS响应中的应答数（ANCOUNT）为2。 ; [09] NSC=0 意味着DNS响应中的域名服务记录数（NSCOUNT）为0。 ; [10] ARC=0 意味着DNS响应中的附加记录数（ARCOUNT）为0。 ; [11] Q[1]=x.com 意味着第1个DNS查询指向域名“x.com”。 ; [12] T[1]=CNAME 意味着第1个DNS应答的类型为CNAME（规范名称，canonical name）。 ; [13] A[1]=x.com>y.com 意味着第1个DNS应答指向的域名“x.com”是“y.com”。 ; [14] T[2]=A 意味着第2个DNS应答的类型为A（IPv4）。 ; [15] A[2]=y.com>1.2.3.4 意味着第2个DNS应答指向的“y.com”是“1.2.3.4”。 ; ; HitLogFileName参数可以配置为绝对路径或相对路径。并且通过在文件名中包含“%DATE%”模板，可以实现每天滚动新的日志。 ; 所有可以使用的模板如下所列： ; ; %DATE% ; 以“YYYYMMDD”为格式的当前日期。 ; ; %TEMP% ; 环境变量“TEMP”的当前值。 ; ; %APPDATA% ; 环境变量“APPDATA”的当前值。 ; ; %LOCALAPPDATA% ; 环境变量“LOCALAPPDATA”的当前值。 ; ; 示例: ; ; HitLogFileName=HitLog.%DATE%.txt ; HitLogFileName=%TEMP%\AcrylicDNSProxyHitLog.%DATE%.txt ; HitLogFileName= ; ; 指定可以写入命中日志的过滤器。由一个或多个前面提到的状态码组成。 ; HitLogFileWhat=XHCF ; ; 通过指定为Yes开启full dump，即打印上方的DNS格式解析。 ; 指定为No禁用。 ; HitLogFullDump=No ; ; 留存在内存中的最大命中日志条目数。超过此值后命中日志将被写入磁盘。 ; 仅当内存中的命中日志条目超过该值，或进程结束，或系统关闭时，条目才会被写入文件。 ; 因此DNS请求或响应的信息不会实时写入文件。 ; HitLogMaxPendingHits=512 ; ; 允许来自其他计算机的请求 ; ; 出于安全原因，Acrylic默认拒绝响应来自其他计算机的DNS请求。但可以通过在下方的AllowedAddressesSection中指定 ; 一个IP白名单，可以是具体的IP地址或通配符，用以允许Acyclic处理来自特定IP的请求。 ; 每个条目必须拥有不同的键名，如下所示： ; ; [AllowedAddressesSection] ; IP1=192.168.45.254 -- 一个单独的IP ; IP2=192.168.44.100 -- 另一个单独的IP ; IP3=192.168.100.* -- 所有以“192.168.100”开头的IP地址 ; IP4=172.16.* -- 所有以“172.16”开头的IP地址 ; ; 尽管出于安全原因并不推荐这样做，但可以简单粗暴低允许来自所有IP的DNS请求： ; ; [AllowedAddressesSection] ; IP1=* ; ; 同时需要配置计算机的防火墙以允许Acrylic两个可执行文件的入站请求： ; “AcrylicService.exe”和“AcrylicConsole.exe”。 ; [AllowedAddressesSection]除了配置文件外，还有一个Hosts文件：# # ACRYLIC DNS PROXY需要重新启动才可以使对本文件的修改生效。 # # 这里是AcrylicHosts.txt文件。 # # 它包含了预定义的域名与地址之间的映射，与Windows的HOSTS文件类似，但有更多功能。 # # 标准格式如下：IP地址 域名1 [域名2] [域名3] ... # # 其中IP地址是点分十进制表示的IPv4地址或冒分十六进制表示的IPv6地址。 # 域名1、2、3是字符串。 # # 以‘#’开头的字符为注释，其后一行将被忽略。 # # 域名可以包含广域通配符‘*’（匹配0个或多个字符）与‘?’（精确匹配1个字符）： # # 127.0.0.1 ad.* ads.* # # 域名还可以包含以‘/’字符开头的正则表达式： # # 127.0.0.1 /^ads?\..*$ # # 注意在正则表达式结尾没有最终的‘/’字符。关于正则表达式引擎和其语法可以在下述URL中找到： # # http://www.pcre.org/ # # 字符‘>’开头的域名表示匹配所有以该域名结尾的域名，例如； # # 127.0.0.1 >google.com # # 等同于： # # 127.0.0.1 google.com *.google.com # # NXDOMAIN（或否定的，negative）响应和FORWARD条目同样可以被定义，并且可以使用上述通配符与正则表达式： # # NX www.google.com # NX >google.com # NX /^ads?\..*$ # # FORWARD条目总是优先计算，并可覆盖其他规则，例如： # # FW >apple.com # FW >google.com # FW >microsoft.com # NX * # # Acrylic将以“apple.com”或“google.com”或“microsoft.com”的DNS请求转发，并对余下的请求返回一个NXDOMAIN响应。 # 这样等同于屏蔽了所有未转发的域名。 # # 为了便于维护和管理，使用如下语法可以从多个外部文件“引入”HOSTS文件， # 即以字符‘@’开头的行，随后跟着被引入文件的相对或绝对路径： # # @ AcrylicHostsGroup1.txt # @ AcrylicHostsGroup2.txt # # 使用大量的模式或正则表达式将会使Acrylic显著变慢。从性能角度来说，最好使用列出了大量域名的列表，而非许多正则表达式 # 或模式。模式和正则应当仅用于在目标域名变化多端或位置时使用。 # 一个域名不会产生性能损耗，而模式的性能代价比较轻，正则表达式的性能代价则非常昂贵。 # 127.0.0.1 localhost localhost.localdomain ::1 localhost localhost.localdomain一切配置好后不要忘了重启Acrylic，然后将Windows和一些软件的DNS服务器设置为127.0.0.1。-全文完-