全部產品
Search
文件中心

Container Compute Service:使用tcpdump工具進行網路抓包定位問題

更新時間:Feb 21, 2025

本文介紹如何在Container Compute Service (ACS)中,為工作負載注入整合了tcpdump等網路工具的臨時容器,進行網路抓包並排查網路問題。

背景資訊

tcpdump是一種常用的網路抓包工具,能夠捕獲通過網路介面傳輸的資料包並進行即時分析。營運人員可以利用tcpdump監控和記錄網路流量,擷取資料包的詳細資料,如源地址、目標地址和傳輸協議等。這些資訊對於識別網路問題、診斷延遲、丟包或串連異常等情況提供了重要線索,有助於快速定位並解決網路故障。

在ACS叢集中,為工作負載注入臨時容器進行網路抓包的操作流程如下:

操作步驟

以下樣本通過部署一個樣本應用,並手動嚮應用注入包含必要的工具軟體(如tcpdump)的臨時容器,示範如何在臨時容器內抓取樣本應用的網路資料包。

  1. 使用以下內容,建立acs-tcpdump.yaml。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: acs-tcpdump
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: acs-tcpdump
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          labels:
            alibabacloud.com/compute-class: general-purpose
            alibabacloud.com/compute-qos: default
            app: acs-tcpdump
        spec:
          containers:
          - image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6
            imagePullPolicy: IfNotPresent
            name: tcpdump
            resources:
              limits:
                cpu: 500m
                memory: 1Gi
              requests:
                cpu: 500m
                memory: 1Gi
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
  2. 執行以下命令,部署應用。

    kubectl apply -f acs-tcpdump.yaml
  3. 為樣本應用注入臨時容器。

    kubectl debug -n default acs-tcpdump-7d959xxxxx-xxxxx --image=registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/acs-tcpdump-demo:alpha.v1 -c acs-tcpdump --container=debug-container --profile=netadmin
    重要

    驗證過程中,如果參數profile的可選值netadmin所提供的許可權無法滿足您的需求,可以考慮將profile的值改為sysadmin。使用sysadmin參數需要為Pod開啟特權,建議在生產環境中謹慎操作,並確保執行充分的審計與監控。

    ACS叢集預設禁止啟用特權,若需要開啟特權模式,請提交工單

    上述臨時容器使用的鏡像中,包含以下工具:

    工具名稱

    工具作用

    是否依賴特權

    Trace-CMD

    追蹤核心功能的命令工具。更多資訊,請參見trace-cmd

    需要

    perf

    perf是Linux kernel內建的系統效能最佳化工具。更多資訊,請參見perf

    需要

    SysAK

    SysAK(System Analysis Kit)是龍蜥社區提供的營運工具軟體集,包含如問題診斷、事件監控/跟蹤以及系統和服務等相關操作工具。

    部分需要

    Strace

    Strace是一個可用於診斷和調試的Linux使用者空間跟蹤器。用它來監控使用者空間進程和核心的互動,比如系統調用、訊號傳遞、進程狀態變更等。更多資訊,請參見strace

    需要

    tcpdump

    tcpdump是一個強大的網路抓包工具,用於捕獲和分析網路流量。它可以在命令列中運行,並提供詳細的網路資料包資訊,協助使用者診斷網路問題、監控網路流量以及進行安全分析。

    需要

    IProute2

    IProute2是一組用於網路設定和管理的命令列工具,旨在替代舊的net-tools工具集(如ifconfig、route、netstat等)。

    需要

    Nmap-ncat

    Nmap-ncat是nmap專案中的一個工具,通常稱為ncat。Ncat是一個功能強大的網路工具,可以用於讀寫資料到網路連接,類似於netcat(nc),但提供了更多的功能和改進。

    需要

  4. 確認臨時容器的注入狀態。

    kubectl describe pod acs-tcpdump-7d959xxxxx-xxxxx | grep Containers: -A 10

    預期輸出:

    Containers:
      tcpdump:
        Container ID:   containerd://71da93ea68ec02a2bcd468b7835ecd12d8180d4a05ac80d77ff4dcab61aea701
        Image:          registry.openanolis.cn/openanolis/nginx:1.14.1-8.6
        Image ID:       registry.openanolis.cn/openanolis/nginx@sha256:bb8fe1e8d4353f29768340bdcbe2bfbc105081d550d259fc11d07d2abe53b5d1
        Port:           <none>
        Host Port:      <none>
        State:          Running
          Started:      Thu, 13 Feb 2025 10:23:33 +0800
        Ready:          True
        Restart Count:  0
    --
    Ephemeral Containers:
      debug-container:
        Container ID:   containerd://5a26877432ab93a6a056b48d34e6c888a4f98c0662627728cf8d8ee4486f3342
        Image:          registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/acs-tcpdump-demo:alpha.v1
        Image ID:       registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/acs-tcpdump-demo@sha256:64ee96ff1b0e000dc5ca0711685e09fe3a08e62a9c9bb1f354682b82f35bddee
        Port:           <none>
        Host Port:      <none>
        State:          Running
          Started:      Thu, 13 Feb 2025 10:24:38 +0800
        Ready:          False
        Restart Count:  0

    可以看到debug-container已經注入成功。

  5. 驗證抓取網路資料包。

    1. 進入臨時容器。

      kubectl exec -it acs-tcpdump-7d959xxxxx-xxxxx -c debug-container -- bash
    2. 通過tcpdump命令抓取本機所有的TCP協議到連接埠80的資料包。

      tcpdump -i eth0 'tcp port 80'

      預期輸出:

      dropped privs to tcpdump
      tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
      listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
      03:09:10.752193 IP acs-tcpdump-7d959bxxxxx-xxxxx.35656 > 100.xxx.xxx.209.http: Flags [S], seq 202950596, win 64240, options [mss 1460,sackOK,TS val 3648381756 ecr 0,nop,wscale 7], length 0
      03:09:10.753944 IP 100.xxx.xxx.209.http > acs-tcpdump-7d959bxxxxx-xxxxx.35656: Flags [S.], seq 270454912, ack 202950597, win 29200, options [mss 1440,nop,nop,sackOK,nop,wscale 9], length 0
      03:09:10.753966 IP acs-tcpdump-7d959bxxxxx-xxxxx.35656 > 100.xxx.xxx.209.http: Flags [.], ack 1, win 502, length 0
      03:09:10.754020 IP acs-tcpdump-7d959bxxxxx-xxxxx.35656 > 100.xxx.xxx.209.http: Flags [P.], seq 1:614, ack 1, win 502, length 613: HTTP: POST /logstores/kernel-logs/shards/lb HTTP/1.1
      03:09:10.755776 IP 100.xxx.xxx.209.http > acs-tcpdump-7d959bxxxxx-xxxxx.35656: Flags [.], ack 614, win 60, length 0
      03:09:10.755825 IP 100.xxx.xxx.209.http > acs-tcpdump-7d959bxxxxx-xxxxx.35656: Flags [P.], seq 1:26, ack 614, win 60, length 25: HTTP: HTTP/1.1 100 Continue
      03:09:10.755829 IP acs-tcpdump-7d959bxxxxx-xxxxx.35656 > 100.xxx.xxx.209.http: Flags [.], ack 26, win 502, length 0
      03:09:10.755867 IP acs-tcpdump-7d959bxxxxx-xxxxx.35656 > 100.xxx.xxx.209.http: Flags [P.], seq 614:1654, ack 26, win 502, length 1040: HTTP
      03:09:10.758773 IP 100.xxx.xxx.209.http > acs-tcpdump-7d959bxxxxx-xxxxx.35656: Flags [P.], seq 26:243, ack 1654, win 66, length 217: HTTP: HTTP/1.1 200 OK
      03:09:10.758786 IP acs-tcpdump-7d959bxxxxx-xxxxx.35656 > 100.xxx.xxx.209.http: Flags [.], ack 243, win 501, length 0
      03:09:10.758854 IP acs-tcpdump-7d959bxxxxx-xxxxx.50624 > 100.xxx.xxx.112.http: Flags [F.], seq 318721902, ack 4047870907, win 501, length 0
      03:09:10.763400 IP 100.xxx.xxx.112.http > acs-tcpdump-7d959bxxxxx-xxxxx.50624: Flags [F.], seq 1, ack 1, win 83, length 0
      03:09:10.763413 IP acs-tcpdump-7d959bxxxxx-xxxxx.50624 > 100.xxx.xxx.112.http: Flags [.], ack 2, win 501, length 0
      03:09:11.219397 IP acs-tcpdump-7d959bxxxxx-xxxxx.50638 > 100.xxx.xxx.112.http: Flags [P.], seq 2989834529:2989835691, ack 1755317949, win 501, length 1162: HTTP: POST /logstores/memory-metrics/shards/lb HTTP/1.1
      03:09:11.219451 IP acs-tcpdump-7d959bxxxxx-xxxxx.50644 > 100.xxx.xxx.112.http: Flags [P.], seq 1733121609:1733122681, ack 40604405, win 501, length 1072: HTTP: POST /logstores/disk-metrics/shards/lb HTTP/1.1

      臨時容器中內建了OSSUtil工具,您可以通過tcpdump的參數-w packets.pcap產生資料包,再使用OSSUtil工具將抓取的資料包上傳到OSS,方便下載到本地進行分析。

      image

      說明

      樣本提供的臨時容器內建了3600秒的倒計時。在抓包調試完成後,您可以等待臨時容器自行退出,或手動刪除被抓包的Pod,直接清理調試容器。請確保在業務低峰期進行操作,避免對實際業務造成影響。

相關內容

以下為構建本文臨時容器的Dockerfile,您可以根據此內容並結合實際需求進行構建。

FROM alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:latest

# 更新系統軟體
RUN dnf update --security -y && dnf upgrade --security -y && dnf clean all && rm -rf /var/cache/dnf/ && rm -rf /core.*
# 安裝必要的網路等一些工具包
RUN yum install net-tools iputils tcpdump wget iproute bind-utils nmap-ncat procps-ng -y && yum update -y
# 安裝必要的核心分析的trace工具包
RUN yum install perf sysak strace trace-cmd -y && yum clean all && rm -rf /var/cache/yum/

# 為了方便調試k8s相關的內容,放一些工具
# osscmd
COPY tools/ossutil64 /home/app/tools/ossutil

# 設定工作目錄
WORKDIR /home/app

ENTRYPOINT ["/bin/bash","-c","sleep 3600"]