NTP协议:时间同步和DDOS攻击

NTP(Network Time Protocol)协议是多台互联网设备进行时间同步时使用的协议,我们的手机和电脑的时间可以设置为自动与互联网的其他设备同步,也基本上是使用了NTP协议。

NTP最早由特拉华州大学(University of Delaware)的David L. Mills设计。设计NTP协议的主要目的是抵消网络时间同步过程中由于网络延时带来的影响。

主要原理

NTP用于计算机网络多台设备之间的时间同步,为了方便说明原理,我们先介绍两台设备之间,即客户端和服务端的时间同步。在这里我们假设服务端的时间是准确的时间,客户端需要向服务端发起时间同步的请求,在完成时间同步之前,客户端的时间是不准确的。我们使用$t$代表服务端的时间,使用$t’$代表客户端的时间。那么服务端与客户端的时间差可以表示为:

$$d=t-t’$$

因此,我们只需要计算出$d$即可实现客户端与服务器端的时间同步。

相关流程

NTP协议的主要涉及到以下4个时间戳:

  • 客户端发送请求时,客户端本地的时间戳$t’_1$
  • 服务端收到客户端请求时,服务端本地的时间戳$t_2$
  • 服务端回复客户端的请求时,服务端本地的时间戳$t_3$
  • 客户端收到服务端回复时,客户端本地的时间戳$t’_4$

我们可以用上图表示这些时间的关系,假设客户端与服务端的时间差为$d$,那么我们可以计算出:

  • 客户端发送请求时,服务端的本地时间$t_1=t’_1+d$
  • 客户端收到服务端回复时,服务端的本地时间$t_4=t’_4+d$

设$T_{cs}$为客户端到服务端的传输时间,有:

$$T_{cs}=t_2-t_1=t_2-(t’_1+d)$$

整理得:

$$t_2-t’_1=d+T_{cs}$$

同理,设$T_{sc}$为服务端到客户端传输时间,有:

$$t_3-t’_4=d-T_{sc}$$

如果网络稳定,$T_{cs}$约等于$T_{sc}$,此时我们可以计算$d$的估计值:

$$d^*=d+\frac{T_{cs}-T_{sc}}{2}=\frac{(d+T_{cs})+(d-T_{sc})}{2}=\frac{(t_2-t’_1)+(t_3-t’_4)}{2}$$

上式就是客户端计算$d$的最终公式,可以发现$d$与服务器的处理时间$t_3-t_2$没有关系,如果$T_{cs} \approx T_{sc}$,则有$d^{*} \approx d$。目前NTP在广域网中的时间同步其误差通常能控制在50ms内,但是有时候误差也会到达500ms,这是因为每次通信是经过的路由路径可能不相同,造成$T_{cs}$和$T_{sc}$相差过大。

时钟同步的层级结构

在实际环境中,NTP协议涉及到很多设备的时间同步,这些设备以类似于树的形式相关联,并形成分层的结构。NTP协议将其称作阶层(Stratum),阶层是一个正整数,最顶层的设备阶层为0,如果一个设备的与一个阶层为$n$的服务端进行了时间同步,那么这个设备的阶层就是$n+1$。因此阶层代表了这个设备与处于顶层的设备(原始时钟设备)的距离,同时阶层的引入也避免了循环时间同步的问题。

在这里需要注意的是,虽然阶层代表了设备与原始时钟设备的同步距离,但是并不一定代表着阶层越低的设备时钟越精确,实际上经常会出现阶层高但是时间精度也更高的设备。下面是阶层0,1,2和3的简要介绍。

  • 阶层0
    这一层都是高精度的时钟设备,例如原子钟,GPS时钟以及无线电时钟。这些设备一般会每秒生成一个信号并发送给与它直接相连的计算机设备。阶层0的设备也可以叫做原始时钟设备。

  • 阶层1
    这一层的设备与原始时钟设备,一般这些设备每隔几毫秒都会和与其直接相连的原始时钟进行时间同步,除此之外,阶层1的设备也会相互之间进行时间的同步检查

  • 阶层2
    阶层2的设备通过网络与阶层1的设备进行同步,一般由阶层2的设备发起时间同步的请求。为了保证时间同步的稳定性,阶层2的设备之间也会相互进行时间同步检查。

  • 阶层3
    这一层的设备通过网络和阶层2进行时间同步,其使用的时间同步算法和阶层2相同,同时也作为服务端与阶层4同步。后面的阶层都使用类似的策略。

阶层的上限是15,阶层16表示这个设备的时钟未同步。NTP协议中使用Bellman-Ford算法来计算最短路径,用来寻找和阶层1最近的服务端。

NTP带来的网络安全风险

DDOS反射攻击

NTP协议提供了一系列监控命令,其中最值得注意的是命令monlist(MON_GETLIST)。当一个NTP服务器接收到monlist命令,它会返回最近600条交互记录,也就是说,只要给NTP服务器发送约250 Bytes的数据,就可以让其返回好几KB的数据,一般情况下,这个命令可以使流量放大约200倍(这个数据取决于NTP服务器可以报告的最近活动的数量)。换句话说,1GB的网络流量,借助NTP服务器的这条命令放大以后可以产生200GB的流量。

对于攻击者来说,只需要通过发送MON_GETLIST请求到多个NTP服务器,同时将IP地址伪装为攻击目标的IP,这样会导致NTP服务将处理的结果都发送到目标机器的123端口上。如果流量足够大,目标机器很快会因为系统资源枯竭而崩溃。

这样的DDOS攻击也叫做反射攻击,和其相似的攻击还有借助DNS协议及其服务器的攻击,原理都是通过欺骗IP的方法让服务端对目标机器发起进攻。

如何避免NTP产生的攻击

NTP服务器
如果你是NTP服务器的管理员,你需要做的就是防止自己的机器成为别人进行DDOS反射攻击的“帮凶”。

对于Windows系统来说,因为其实现的NTP协议默认禁止monlist命令,所以不会面临这个问题。但是对于多数Unix/Linux的机器,则会面临这个问题,可行的方法就是将NTP服务器的版本升级到4.2.7p26以后。如果无法升级,也可以考虑禁用monlist命令。

被攻击的目标服务器
NTP协议使用的端口是123,使用的协议是UDP协议,如果你发现你的的机器在这个端口上出现了UDP的流量激增,那么很可能目前机器正在遭受攻击。

  • 你可以使用这篇文章提到的方法,在路由层面阻止使用虚假IP的网络包。
  • 如果不需要和互联网进行时间同步,可以考虑对外关闭123端口的UDP连接。

参考资料

Network Time Protocol - Wikipedia, the free encyclopedia
Preventing NTP Reflection DDOS Attacks Based on CVE-2013-5211

此文有用? 求鼓励!

显示 Gitment 评论