有了這款 Linux 網(wǎng)絡(luò)延遲排查方法,再也不用加班了

在 Linux 服務(wù)器中,可以通過內(nèi)核調(diào)優(yōu)、DPDK 以及 XDP 等多種方式提高服務(wù)器的抗攻擊能力,降低 DDoS 對正常服務(wù)的影響。在應(yīng)用程序中,可以使用各級緩存、WAF、CDN 等來緩解 DDoS 對應(yīng)用程序的影響。
但是需要注意的是,如果 DDoS 流量已經(jīng)到達 Linux 服務(wù)器,那么即使應(yīng)用層做了各種優(yōu)化,網(wǎng)絡(luò)服務(wù)延遲一般也會比平時大很多。
因此,在實際應(yīng)用中,我們通常使用 Linux 服務(wù)器,配合專業(yè)的流量清洗和網(wǎng)絡(luò)防火墻設(shè)備,來緩解這個問題。
除了 DDoS 導(dǎo)致的網(wǎng)絡(luò)延遲增加,我想你一定見過很多其他原因?qū)е碌木W(wǎng)絡(luò)延遲,例如:
網(wǎng)絡(luò)傳輸慢導(dǎo)致的延遲。 Linux 內(nèi)核協(xié)議棧數(shù)據(jù)包處理速度慢導(dǎo)致的延遲。 應(yīng)用程序數(shù)據(jù)處理速度慢造成的延遲等。
那么當(dāng)我們遇到這些原因造成的延誤時,我們該怎么辦呢?如何定位網(wǎng)絡(luò)延遲的根本原因?讓我們在本文中討論網(wǎng)絡(luò)延遲。
Linux 網(wǎng)絡(luò)延遲
談到網(wǎng)絡(luò)延遲(Network Latency),人們通常認(rèn)為它是指網(wǎng)絡(luò)數(shù)據(jù)傳輸所需的時間。但是,這里的“時間”是指雙向流量,即數(shù)據(jù)從源發(fā)送到目的地,然后從目的地地址返回響應(yīng)的往返時間:RTT(Round-Trip Time)。
除了網(wǎng)絡(luò)延遲之外,另一個常用的指標(biāo)是應(yīng)用延遲(Application Latency),它是指應(yīng)用接收請求并返回響應(yīng)所需的時間。通常,應(yīng)用延遲也稱為往返延遲,它是網(wǎng)絡(luò)數(shù)據(jù)傳輸時間加上數(shù)據(jù)處理時間的總和。
通常人們使用?ping?命令來測試網(wǎng)絡(luò)延遲,ping?是基于 ICMP 協(xié)議的,它通過計算 ICMP 發(fā)出的響應(yīng)報文和 ICMP 發(fā)出的請求報文之間的時間差來獲得往返延遲時間。這個過程不需要特殊的認(rèn)證,從而經(jīng)常被很多網(wǎng)絡(luò)攻擊所利用,如,端口掃描工具?nmap、分組工具?hping3?等。
因此,為了避免這些問題,很多網(wǎng)絡(luò)服務(wù)都會禁用 ICMP,這使得我們無法使用 ping 來測試網(wǎng)絡(luò)服務(wù)的可用性和往返延遲。在這種情況下,您可以使用?traceroute?或?hping3?的 TCP 和 UDP 模式來獲取網(wǎng)絡(luò)延遲。
例如:
#?-c:?3?requests??
#?-S:?Set?TCP?SYN??
#?-p:?Set?port?to?80??
$?hping3?-c?3?-S?-p?80?google.com??
HPING?google.com?(eth0?142.250.64.110):?S?set,?40?headers?+?0?data?bytes??
len=46?ip=142.250.64.110?ttl=51?id=47908?sport=80?flags=SA?seq=0?win=8192?rtt=9.3?ms??
len=46?ip=142.250.64.110?ttl=51?id=6788??sport=80?flags=SA?seq=1?win=8192?rtt=10.9?ms??
len=46?ip=142.250.64.110?ttl=51?id=37699?sport=80?flags=SA?seq=2?win=8192?rtt=11.9?ms??
---?baidu.com?hping?statistic?---??
3?packets?transmitted,?3?packets?received,?0%?packet?loss??
round-trip?min/avg/max?=?9.3/10.9/11.9?ms??
當(dāng)然,你也可以使用?traceroute:
$?traceroute?--tcp?-p?80?-n?google.com??
traceroute?to?google.com?(142.250.190.110),?30?hops?max,?60?byte?packets??
?1??*?*?*??
?2??240.1.236.34??0.198?ms?*?*??
?3??*?*?243.254.11.5??0.189?ms??
?4??*?240.1.236.17??0.216?ms?240.1.236.24??0.175?ms??
?5??241.0.12.76??0.181?ms?108.166.244.15??0.234?ms?241.0.12.76??0.219?ms??
?...??
24??142.250.190.110??17.465?ms?108.170.244.1??18.532?ms?142.251.60.207??18.595?ms??
traceroute?會在路由的每一跳(hop)發(fā)送三個數(shù)據(jù)包,并在收到響應(yīng)后輸出往返延遲。如果沒有響應(yīng)或響應(yīng)超時(默認(rèn) 5s),將輸出一個星號?*。
案例展示
我們需要在此演示中托管 host1 和 host2 兩個主機:
host1 (192.168.0.30):托管兩個 Nginx Web 應(yīng)用程序(正常和延遲) host2 (192.168.0.2):分析主機
host1 準(zhǔn)備
在 host1 上,讓我們運行啟動兩個容器,它們分別是官方 Nginx 和具有延遲版本的 Nginx:
#?Official?nginx??
$?docker?run?--network=host?--name=good?-itd?nginx??
fb4ed7cb9177d10e270f8320a7fb64717eac3451114c9fab3c50e02be2e88ba2??
#?Latency?version?of?nginx??
??
$?docker?run?--name?nginx?--network=host?-itd?feisky/nginx:latency??
b99bd136dcfd907747d9c803fdc0255e578bad6d66f4e9c32b826d75b6812724??
運行以下命令以驗證兩個容器都在為流量提供服務(wù):
$?curl?http://127.0.0.1??
??
??
...??
Thank?you?for?using?nginx.
??
??
