在 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.