我们在 Windows Server 2019 上有一个带有路由器和内部 DNS 的网络。DNS 通过路由器上的 NAT 对外部可见(UDP 53 -> 服务器 IP,这是必需的,因为我们是隐藏主/我们域的权威 DNS)。
一段时间以来,我们收到恶意 DNS 请求作为放大攻击的一部分。
我们按照本文使用Set-DNSServerresponseratelimiting
命令来使用响应率限制......到目前为止一切顺利。
现在,同一篇文章和另一篇文章描述了一种如何将递归仅限于内部客户端的方法。
本质上,这两篇文章都说您关闭递归,然后添加一条规则,允许符合特定条件的客户端使用递归。
第一步是关闭递归:
Set-DnsServerRecursionScope -Name . -EnableRecursion $false /* or $true */
我正在使用 IP 为 的 Mac 进行测试,192.168.1.149
并使用 dig 命令,例如dig -4 @server some.obscuredomain.com
检查 dig 命令是否打印禁用递归的警告。这取决于一般设置。如果我使用上述命令打开或关闭此功能,该dig
命令会相应地显示(或不显示)有关递归的警告。到目前为止也很好。
禁用它并添加例外的完整命令序列如下:
Add-DnsServerClientSubnet -Name "Internal-24" -IPv4Subnet "192.168.1.0/24" -PassThru
Set-DnsServerRecursionScope -Name . -EnableRecursion $False
Add-DnsServerRecursionScope -Name "InternalClients" -EnableRecursion $True
Add-DnsServerQueryResolutionPolicy -Name "AllowInternal" -Action ALLOW -ApplyOnRecursion -RecursionScope "InternalClients" -ClientSubnet "EQ,Internal-24"
但是,我使用这个命令序列,无论我做什么,我都无法让它在Mac上递归。
我以为我的子网可能是错误的,但是对于我刚刚使用的测试"NE,Internal-24"
,认为这两个子句中的任何一个都应该与请求匹配(EQ 或 NE 应该与这些请求匹配,你在子网上或者你在不是)。我也尝试过-Computername
或者-Fqdn
。显然没有什么区别。
有任何想法吗?
我想看看是否可以在您的 dns 服务器前面放置一个类似 cloudflare dns 防火墙的东西。Cloudflare DNS Firewall 通过 Cloudflare 的全球网络将所有 DNS 查询代理到您的域名服务器。此操作可保护上游名称服务器免受 DDoS 攻击,并通过缓存 DNS 响应来减少负载。
https://developers.cloudflare.com/dns/dns-firewall/
我在 docs.microsoft.com 上找到了一个允许内部客户端递归的示例
第一个命令创建一个名为 InternalClients 的递归作用域。此范围启用了递归。
第二个命令使用 Set-DnsServerRecursionScope cmdlet 修改默认递归范围。默认范围由点 (.) 标识,已禁用递归。
最后一个命令创建一个使用 InternalClients 范围的策略。对于该范围,在指定的服务器接口地址上,策略允许递归。
https://learn.microsoft.com/en-us/powershell/module/dnsserver/add-dnsserverqueryresolutionpolicy?view=windowsserver2022-ps
当您想使用-ClientSubnet时,首先需要使用以下命令添加子网
Add-DnsServerClientSubnet -Name "InternetNaLSubnet" -IPv4Subnet 172.21.33.0/16 -PassThru
然后你可以使用
我认为你的命令确实有效。
我首先在 Windows 客户端上进行了尝试,并
clear-dnsservercache
在每次使用这些命令进行测试后在服务器上使用。看起来Windows 客户端是否得到或未得到预期的答案(例如,能否将a 解析
ping
为名称),具体取决于Add-DnsServerQueryResolutionPolicy
命令和参数。macOS 客户端也做了同样的事情(在命令中获取 IP 地址的实际答案
dig
或可以解析ping
命令)。然而,中的递归警告dig
似乎是不正确的,我猜这只是一个表面问题。