edns-client-subnet是一种扩展DNS(DNS Extensions,简称EDNS)的选项,它允许DNS服务器了解查询的客户端的IP地址范围,以便提供更快和更准确的响应。EDNS客户端子网选项通常可以被用于两种情况:
- 帮助DNS服务器提供对特定地理区域更准确的解析
当客户端需要域名解析时,通常是向本地递归服务器或是配置的递归服务器去查询,递归服务器再去向权威DNS服务器发送查询请求时,权威DNS服务器只能递归服务器的IP地址,而没法准确的知道客户端所在的网络。因此,如果客户端使用CDN(内容分发网络)或者在某个大型网络的背后,那么请求将被发送到距离递归服务器最近的节点,而不是最接近用户的节点。这样会导致一些响应时间的延迟,用户可能会不满意。为了解决这个问题,EDNS(扩展DNS)引入了edns-client-subnet选项。
简单举一个例子,比如一个客户端在中国,配置了位于欧洲的递归服务器,它查询了位于欧洲的权威dns服务器,权威dns服务器根据递归服务器的地理位置,将返回一个同位于欧洲的最近的IP地址,这时如果位于中国的客户端去访问这个欧洲的ip,势必会有一定的网络延迟,从而影响了用户的体验。但是,如果该客户端使用了edns-client-subnet选项,将自己的客户端ip携带到dns请求包中,则权威DNS服务器就会知道该客户端位于中国区域,因此它将返回一个离客户端地址最近的位于中国数据中心的CDN地址,这样就可以尽可能的减少网络传输上带来的延迟,提高用户的体验。
- 防止DDoS攻击
DDoS攻击,攻击者通常会使用大量虚假请求来淹没服务器,以使其无法响应正常用户的请求。当服务器接收到具有edns-client-subnet选项的请求时,它可以看到客户端所在的IP地址子网掩码,这有助于服务器区分正常请求和被攻击的请求。服务器可以拒绝来自没有正确客户端子网信息的请求。这有助于减轻DDoS攻击对DNS服务器的影响。
edns-client-subnet在DNS消息报文中的位置是EDNS资源记录中的选项数据部分,edns-client-subnet选项由一个OPT(选项)记录组成。OPT的请求的TCP标志设置后,会将OPT记录的类设置为0,并将它的请求数据设置为一个或多个选项数据。edns-client-subnet的选项代码为0x08,选项数据格式为:
+--------------+-----------------+----------------+
| family | source netmask | scope netmask |
+--------------+-----------------+----------------+
1 octet 1 octet 1 octet
其中,family字段指示IP地址类型,仅支持IPv4和IPv6,IPv4为1,IPv6为2。source netmask字段为源IP地址的子网掩码的长度,范围为0-32(IPv4)或0-128(IPv6)。scope netmask字段为查询的作用域的子网掩码的长度,可选的,通常未使用,如果要使用,则将该字段设置为0;如果忽略该字段,则将其设置为family字段的默认长度。