<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    Linux 網絡延遲故障排查

    VSole2022-08-09 06:38:30

    在我的上一篇文章中,我向您展示了如何模擬 DDoS 攻擊以及如何緩解它。簡單回顧一下,DDoS 利用了大量的偽造請求,導致目標服務器消耗大量資源來處理這些無效請求,從而無法正常響應正常用戶請求。

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

    當然,你也可以使用 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)發送三個數據包,并在收到響應后輸出往返延遲。如果沒有響應或響應超時(默認 5s),將輸出一個星號 *

    案例展示

    我們需要在此演示中托管 host1 和 host2 兩個主機:

    • host1 (192.168.0.30):托管兩個 Nginx Web 應用程序(正常和延遲)
    • host2 (192.168.0.2):分析主機

    host1 準備

    在 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
    

    運行以下命令以驗證兩個容器都在為流量提供服務:

    $ curl http://127.0.0.1
    ...
    Thank you for using nginx.
    $ curl http://127.0.0.1:8080
    ...
    Thank you for using nginx.
    

    host2 準備

    現在讓我們用上面提到的 hping3 來測試它們的延遲,看看有什么區別。在 host2 中,執行以下命令分別測試案例機的 8080 端口和 80 端口的延遲:

    80 端口:

    $ hping3 -c 3 -S -p 80 192.168.0.30
    HPING 192.168.0.30 (eth0 192.168.0.30): S set, 40 headers + 0 data bytes
    len=44 ip=192.168.0.30 ttl=64 DF id=0 sport=80 flags=SA seq=0 win=29200 rtt=7.8 ms
    len=44 ip=192.168.0.30 ttl=64 DF id=0 sport=80 flags=SA seq=1 win=29200 rtt=7.7 ms
    len=44 ip=192.168.0.30 ttl=64 DF id=0 sport=80 flags=SA seq=2 win=29200 rtt=7.6 ms
    --- 192.168.0.30 hping statistic ---
    3 packets transmitted, 3 packets received, 0% packet loss
    round-trip min/avg/max = 7.6/7.7/7.8 ms
    

    8080 端口:

    # 測試8080端口延遲
    $ hping3 -c 3 -S -p 8080 192.168.0.30
    HPING 192.168.0.30 (eth0 192.168.0.30): S set, 40 headers + 0 data bytes
    len=44 ip=192.168.0.30 ttl=64 DF id=0 sport=8080 flags=SA seq=0 win=29200 rtt=7.7 ms
    len=44 ip=192.168.0.30 ttl=64 DF id=0 sport=8080 flags=SA seq=1 win=29200 rtt=7.6 ms
    len=44 ip=192.168.0.30 ttl=64 DF id=0 sport=8080 flags=SA seq=2 win=29200 rtt=7.3 ms
    --- 192.168.0.30 hping statistic ---
    3 packets transmitted, 3 packets received, 0% packet loss
    round-trip min/avg/max = 7.3/7.6/7.7 ms
    

    從這個輸出中您可以看到兩個端口的延遲大致相同,均為 7 毫秒。但這僅適用于單個請求。如果換成并發請求怎么辦?接下來,讓我們用 wrk (https://github.com/wg/wrk) 試試。

    80 端口:

    $ wrk --latency -c 100 -t 2 --timeout 2 http://192.168.0.30/
    Running 10s test @ http://192.168.0.30/
      2 threads and 100 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency     9.19ms   12.32ms 319.61ms   97.80%
        Req/Sec     6.20k   426.80     8.25k    85.50%
      Latency Distribution
         50%    7.78ms
         75%    8.22ms
         90%    9.14ms
         99%   50.53ms
      123558 requests in 10.01s, 100.15MB read
    Requests/sec:  12340.91
    Transfer/sec:     10.00MB
    

    8080 端口:

    $ wrk --latency -c 100 -t 2 --timeout 2 http://192.168.0.30:8080/
    Running 10s test @ http://192.168.0.30:8080/
      2 threads and 100 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency    43.60ms    6.41ms  56.58ms   97.06%
        Req/Sec     1.15k   120.29     1.92k    88.50%
      Latency Distribution
         50%   44.02ms
         75%   44.33ms
         90%   47.62ms
         99%   48.88ms
      22853 requests in 10.01s, 18.55MB read
    Requests/sec:   2283.31
    Transfer/sec:      1.85MB
    

    從以上兩個輸出可以看出,官方 Nginx(監聽 80 端口)的平均延遲為 9.19ms,而案例 Nginx(監聽 8080 端口)的平均延遲為 43.6ms。從延遲分布上來看,官方 Nginx 可以在 9ms 內完成 90% 的請求;對于案例 Nginx,50% 的請求已經達到 44ms。

    那么這里發生了什么呢?我們來做一些分析:

    在 host1 中,讓我們使用 tcpdump 捕獲一些網絡數據包:

    $ tcpdump -nn tcp port 8080 -w nginx.pcap
    

    現在,在 host2 上重新運行 wrk 命令

    $ wrk --latency -c 100 -t 2 --timeout 2 http://192.168.0.30:8080/
    

    當 wrk 命令完成后,再次切換回 Terminal 1(host1 的終端)并按 Ctrl+C 結束 tcpdump 命令。然后,用 Wireshark 把抓到的 nginx.pcap 復制到本機(如果 VM1(host1 的虛擬機)已經有圖形界面,可以跳過復制步驟),用 Wireshark 打開。

    由于網絡包的數量很多,我們可以先過濾一下。例如,選中一個包后,可以右鍵選擇 “Follow”->“TCP Stream”,如下圖:

    然后,關閉彈出的對話框并返回 Wireshark 主窗口。這時你會發現 Wireshark 已經自動為你設置了一個過濾表達式 tcp.stream eq 24。如下圖所示(圖中省略了源 IP 和目的 IP):

    從這里,您可以看到從三次握手開始,此 TCP 連接的每個請求和響應。當然,這可能不夠直觀,可以繼續點擊菜單欄中的 Statistics -> Flow Graph,選擇 “Limit to display filter”,將 Flow type 設置為 “TCP Flows”:

    請注意,此圖的左側是客戶端,而右側是 Nginx 服務器。從這個圖中可以看出,前三次握手和第一次 HTTP 請求和響應都相當快,但是第二次 HTTP 請求就比較慢了,尤其是客戶端收到服務器的第一個數據包后,該 ACK 響應(圖中的藍線)在 40ms 后才被發送。

    看到 40ms 的值,你有沒有想到什么?事實上,這是 TCP 延遲 ACK 的最小超時。這是 TCP ACK 的一種優化機制,即不是每次請求都發送一個 ACK,而是等待一段時間(比如 40ms),看看有沒有“搭車”的數據包。如果在此期間還有其他數據包需要發送,它們將與 ACK 一起被發送。當然,如果等不及其他數據包,超時后會單獨發送 ACK。

    由于案例中的客戶端發生了 40ms 延遲,我們有理由懷疑客戶端開啟了延遲確認機制(Delayed Acknowledgment Mechanism)。這里的客戶端其實就是之前運行的 wrk

    根據 TCP 文檔,只有在 TCP 套接字專門設置了 TCP_QUICKACK 時才會啟用快速確認模式(Fast Acknowledgment Mode);否則,默認使用延遲確認機制

    TCP_QUICKACK (since Linux 2.4.4)
                  Enable  quickack mode if set or disable quickack mode if cleared.  In quickack mode, acks are sent imme‐
                  diately, rather than delayed if needed in accordance to normal TCP operation.  This flag is  not  perma‐
                  nent,  it only enables a switch to or from quickack mode.  Subsequent operation of the TCP protocol will
                  once again enter/leave quickack mode depending on internal  protocol  processing  and  factors  such  as
                  delayed ack timeouts occurring and data transfer.  This option should not be used in code intended to be
                  portable.
    

    讓我們測試一下我們的質疑:

    $ strace -f wrk --latency -c 100 -t 2 --timeout 2 http://192.168.0.30:8080/
    ...
    setsockopt(52, SOL_TCP, TCP_NODELAY, [1], 4) = 0
    ...
    

    可以看到 wrk 只設置了 TCP_NODELAY 選項,沒有設置 TCP_QUICKACK。現在您可以看到為什么延遲 Nginx(案例 Nginx)響應會出現一個延遲。

    結論

    在本文中,我將向您展示如何分析增加的網絡延遲。網絡延遲是核心網絡性能指標。由于網絡傳輸、網絡報文處理等多種因素的影響,網絡延遲是不可避免的。但過多的網絡延遲會直接影響用戶體驗。

    • 使用 hping3 和 wrk 等工具確認單個請求和并發請求的網絡延遲是否正常。
    • 使用 traceroute,確認路由正確,并查看路由中每個網關跳躍點的延遲。
    • 使用 tcpdump 和 Wireshark 確認網絡數據包是否正常收發。
    • 使用 strace 等觀察應用程序對網絡 socket 的調用是否正常。
    linux系統網絡延遲
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    本文要介紹的就是業內知名的一款能夠用于內網滲透時團隊協同作戰的工具“Cobalt Strike”。Cobalt Strike 是一款美國 Red Team 開發的滲透測試神器,常被業界人稱為 CS。
    監控體系的核心指標
    2022-07-31 09:41:04
    持續的高或低流量數字可能表明服務可能需要更多資源,或者問題阻止流量正確路由。但是,在大多數情況下,流量率對于幫助了解通過其他信號浮出水面的問題最有用。例如,如果延遲增加超過可接受的水平,能夠將該時間范圍與流量峰值相關聯是有幫助的。流量可用于了解可以處理的最大流量以及服務在不同負載階段如何降級或失敗。因此,一層中的飽和和延遲問題可能與底層中流量或錯誤測量的顯著增加相對應。
    AI安全論文第21篇介紹S&P經典的離地攻擊論文,希望您喜歡
    Linux下的TCP測試工具
    2021-12-08 07:36:31
    測量到遠程主機的網絡延遲的一種常用方法是使用ping應用程序。該ping工具依賴 ICMP ECHO 請求和回復數據包來測量遠程主機的往返延遲。但是,在某些情況下,ICMP 流量可能會被防火墻阻止,這使得該ping應用程序對于受限制的防火墻后面的主機毫無用處。在這種情況下,你將需要依賴使用 TCP/UDP 數據包的第 3 層測量工具,因為這些第 3 層數據包更有可能繞過常見的防火墻規則。
    網絡排查工具
    2022-08-26 14:54:33
    mtr 全稱 my traceroute,是一個把 ping 和 traceroute 合并到一個程序的網絡診斷工具。traceroute默認使用UDP數據包探測,而mtr默認使用ICMP報文探測,ICMP在某些路由節點的優先級要比其他數據包低,所以測試得到的數據可能低于實際情況。也可以在https://github.com/oott123/WinMTR/releases GitHub上下載MTR專用工具,該工具為免安裝,下載后可以直接使用。延遲很大的原因也有可能是在返回過程中引發的。
    現有關于ftrace hook技術的資料大多比較零散,難以學習和實踐。本文針對其中一些難點和常見問題的處置進行了整理
    常用的 ping,tracert,nslookup 一般用來判斷主機的網絡連通性,其實 Linux 下有一個更好用的網絡聯通性判斷工具,它可以結合ping nslookup tracert 來判斷網絡的相關特性,這個命令就是?全稱 my traceroute,是一個把 ping 和 traceroute 合并到一個程序的網絡診斷工具。
    常用的 ping,tracert,nslookup 一般用來判斷主機的網絡連通性,其實 Linux 下有一個更好用的網絡聯通性判斷工具,它可以結合ping nslookup tracert 來判斷網絡的相關特性,這個命令就是 mtr。mtr 全稱 my traceroute,是一個把 ping 和 traceroute 合并到一個程序的網絡診斷工具。
    Linux是一種開源操作系統,它支持各種硬件平臺,Linux服務器全球知名,它和Windows之間最主要的差異在于,Linux服務器默認情況下一般不提供GUI(圖形用戶界面),而是命令行界面,它的主要目的是高效處理非交互式進程,響應時間并不是那么重要,相反,能夠長時間處理高負載才是最關鍵的。
    Linux高可用服務器集群解決方案讓IT系統管理員可以從容應對許多常見的硬件和軟件故障,允許多臺計算機一起工作,為關鍵服務正常運行提供保障,系統管理員可以不中斷服務執行維護和升級。Linux功能豐富、強大、靈活,你可以用它完成各種任務,在這篇文章中,我們將討論一些提高Linux服務器性能的技巧。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类