在 Linux 服务器中,可以通过内核调优、DPDK 以及 XDP 等多种方式提高服务器的抗攻击能力,降低 DDoS 对正常服务的影响。在应用程序中,可以使用各级缓存、WAF、CDN 等来缓解 DDoS 对应用程序的影响。
但是需要注意的是,如果 DDoS 流量已经到达 Linux 服务器,那么即使应用层做了各种优化,网络服务延迟一般也会比平时大很多。
因此,在实际应用中,我们通常使用 Linux 服务器,配合专业的流量清洗和网络防火墙设备,来缓解这个问题。
除了 DDoS 导致的网络延迟增加,我想你一定见过很多其他原因导致的网络延迟,例如:
网络传输慢导致的延迟。
Linux 内核协议栈数据包处理速度慢导致的延迟。
应用程序数据处理速度慢造成的延迟等。
那么当我们遇到这些原因造成的延误时,我们该怎么办呢?如何定位网络延迟的根本原因?让我们在本文中讨论网络延迟。
Linux 网络延迟
谈到网络延迟(Network Latency),人们通常认为它是指网络数据传输所需的时间。但是,这里的“时间”是指双向流量,即数据从源发送到目的地,然后从目的地地址返回响应的往返时间:RTT(Round-Trip Time)。
除了网络延迟之外,另一个常用的指标是应用延迟(Application Latency),它是指应用接收请求并返回响应所需的时间。通常,应用延迟也称为往返延迟,它是网络数据传输时间加上数据处理时间的总和。
通常人们使用ping命令来测试网络延迟,ping是基于 ICMP 协议的,它通过计算 ICMP 发出的响应报文和 ICMP 发出的请求报文之间的时间差来获得往返延迟时间。这个过程不需要特殊的认证,从而经常被很多网络攻击所利用,如,端口扫描工具nmap、分组工具hping3等。
因此,为了避免这些问题,很多网络服务都会禁用 ICMP,这使得我们无法使用 ping 来测试网络服务的可用性和往返延迟。在这种情况下,您可以使用traceroute或hping3的 TCP 和 UDP 模式来获取网络延迟。
例如:
#-c:3requests #-S:SetTCPSYN #-p:Setportto80 $hping3-c3-S-p80google.com HPINGgoogle.com(eth0142.250.64.110):Sset,40headers+0databytes len=46ip=142.250.64.110ttl=51id=47908sport=80flags=SAseq=0win=8192rtt=9.3ms len=46ip=142.250.64.110ttl=51id=6788sport=80flags=SAseq=1win=8192rtt=10.9ms len=46ip=142.250.64.110ttl=51id=37699sport=80flags=SAseq=2win=8192rtt=11.9ms ---baidu.comhpingstatistic--- 3packetstransmitted,3packetsreceived,0%packetloss round-tripmin/avg/max=9.3/10.9/11.9ms
当然,你也可以使用traceroute:
$traceroute--tcp-p80-ngoogle.com traceroutetogoogle.com(142.250.190.110),30hopsmax,60bytepackets 1*** 2240.1.236.340.198ms** 3**243.254.11.50.189ms 4*240.1.236.170.216ms240.1.236.240.175ms 5241.0.12.760.181ms108.166.244.150.234ms241.0.12.760.219ms ... 24142.250.190.11017.465ms108.170.244.118.532ms142.251.60.20718.595ms
traceroute会在路由的每一跳(hop)发送三个数据包,并在收到响应后输出往返延迟。如果没有响应或响应超时(默认 5s),将输出一个星号*。
案例展示
我们需要在此演示中托管 host1 和 host2 两个主机:
host1 (192.168.0.30):托管两个 Nginx Web 应用程序(正常和延迟)
host2 (192.168.0.2):分析主机
host1 准备
在 host1 上,让我们运行启动两个容器,它们分别是官方 Nginx 和具有延迟版本的 Nginx:
#Officialnginx $dockerrun--network=host--name=good-itdnginx fb4ed7cb9177d10e270f8320a7fb64717eac3451114c9fab3c50e02be2e88ba2 #Latencyversionofnginx $dockerrun--namenginx--network=host-itdfeisky/nginx:latency b99bd136dcfd907747d9c803fdc0255e578bad6d66f4e9c32b826d75b6812724
运行以下命令以验证两个容器都在为流量提供服务:
$curlhttp://127.0.0.1 ...Thankyouforusingnginx.