使用tcpdump工具进行网络抓包定位问题

本文介绍如何在容器计算服务 ACS(Container Compute Service)中,为工作负载注入集成了tcpdump等网络工具的临时容器,进行网络抓包并排查网络问题。

背景信息

tcpdump是一种常用的网络抓包工具,能够捕获通过网络接口传输的数据包并进行实时分析。运维人员可以利用tcpdump监控和记录网络流量,获取数据包的详细信息,如源地址、目标地址和传输协议等。这些信息对于识别网络问题、诊断延迟、丢包或连接异常等情况提供了重要线索,有助于快速定位并解决网络故障。

ACS集群中,为工作负载注入临时容器进行网络抓包的操作流程如下:

image

操作步骤

以下示例通过部署一个示例应用,并手动向应用注入包含必要的工具软件(如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

    perfLinux kernel自带的系统性能优化工具。更多信息,请参见perf

    需要

    SysAK

    SysAK(System Analysis Kit)是龙蜥社区提供的运维工具软件集,包含如问题诊断、事件监控/跟踪以及系统和服务等相关操作工具。

    部分需要

    Strace

    Strace是一个可用于诊断和调试的Linux用户空间跟踪器。用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。更多信息,请参见strace

    需要

    tcpdump

    tcpdump是一个强大的网络抓包工具,用于捕获和分析网络流量。它可以在命令行中运行,并提供详细的网络数据包信息,帮助用户诊断网络问题、监控网络流量以及进行安全分析。

    需要

    IProute2

    IProute2是一组用于网络配置和管理的命令行工具,旨在替代旧的net-tools工具集(如ifconfig、route、netstat等)。

    需要

    Nmap-ncat

    Nmap-ncatnmap项目中的一个工具,通常称为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"]