攻击者用伪造的源地址向大量开放解析器发查询,解析器把放大的应答发给被冒充的受害者。一次几十字节的请求能换来上千字节的回应,带宽成倍放大,源头却查不到。
域名查询默认走无连接的传输方式,请求和应答都打成小数据报。第 31 期介绍过域名解析,这种传输方式效率高,代价是源地址可以随便填——服务器收到一条查询,没法确认它真的来自它声称的那个地址。
放大攻击利用的就是这一点。攻击者把源地址填成受害者的地址,向一个开放的递归解析器发出查询;解析器按这个地址把应答发出去,结果是受害者收到一批自己从没请求过的数据。
光有反射还不够,关键在"放大"。应答通常比请求大得多——一条构造过的查询只要几十字节,回来的应答可以上千字节。挑那些应答体积大的查询类型和域名,一次操作能换来几十倍的流量;再让一批被控制的设备同时发,规模就上去了。
这里的关键角色是"开放解析器":本该只服务自己网络内部,却对全世界开放查询的递归解析器。这类服务器一度数量很多,扫描一遍就能列出一串。攻击者不需要攻破它们,只需要用它们转发。
被选中当反射器的服务器本身没有被入侵。它们只是回应了收到的查询,自身动静很小,运营者往往察觉不到。承受流量的是受害者,而且看到的流量来自成百上千台正常的解析服务器,逐个封堵行不通。
防这件事要两头出力:解析器运营方关掉对外的递归服务,只应答自己网络内的查询——主流解析软件从 2007 年起就把默认设置改成了这样;网络运营方在出口处过滤源地址不匹配的数据包,让伪造的请求出不去,这条要求写在了二十多年前的技术文件里。