【App Service Linux】在Linux App Service中安装 tcpdump 并抓取网络包

发布时间:2026/7/28 20:33:08
【App Service Linux】在Linux App Service中安装 tcpdump 并抓取网络包
【App Service Linux】在Linux App Service中安装 tcpdump 并抓取网络包引言Azure App Service Linux 环境为开发者提供了灵活的容器化应用托管方案但有时我们需要深入网络层面排查问题比如检查出站流量、分析HTTP请求延迟或验证DNS解析结果。然而默认的容器环境并不包含tcpdump等网络诊断工具。本文将深入剖析在Linux App Service中安装和使用tcpdump的原理并提供完整的可运行代码示例帮助你在生产环境中安全、高效地抓取网络包。## 原理剖析为什么需要手动安装 tcpdump### 1. 容器环境的限制Azure App Service Linux 运行在Docker容器中基础镜像通常为mcr.microsoft.com/appsvc/python:3.9或类似轻量级镜像。这些镜像为了安全和体积默认只包含最小化工具集如curl、ping但不包含tcpdump和libpcap依赖库。### 2. 抓包的核心依赖tcpdump基于libpcap库工作而该库需要- 内核支持AF_PACKET套接字容器默认启用- 用户空间具备NET_RAW和NET_ADMIN能力App Service容器默认已具备- 在容器内安装libpcap-dev和tcpdump二进制文件### 3. 抓包流程1. 容器进程通过socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))创建原始套接字2. 内核将网络接口上的所有数据包复制到该套接字3.tcpdump通过pcap_loop()循环读取并应用过滤规则如BPF表达式## 环境准备在App Service中启用SSH访问在安装工具前确保你的App Service已启用SSH访问通过Azure门户 → 设置 → 开发工具 → SSH。App Service Linux容器默认在/home目录持久化但系统文件如/usr/bin在容器重启后会重置。因此我们需要将工具安装到可持久化的位置。### 检查当前环境通过SSH连接后运行以下命令验证基础环境bash# 检查内核版本uname -a# 检查是否已安装tcpdumpwhich tcpdump# 检查网络接口ip link show## 安装 tcpdump 的两种方法### 方法一使用apt-get在线安装推荐由于App Service容器基于Debian/Ubuntu可以直接使用包管理器安装。bash# 更新包列表可能需要几分钟sudo apt-get update# 安装tcpdump及其依赖sudo apt-get install -y tcpdump# 验证安装tcpdump --version### 方法二手动编译安装离线环境如果容器无法访问外部网络可以从本地编译后上传二进制文件。bash# 在本地编译tcpdumpwget https://www.tcpdump.org/release/tcpdump-4.99.4.tar.gztar xzf tcpdump-4.99.4.tar.gzcd tcpdump-4.99.4./configure --prefix/home/site/tcpdumpmakemake install# 上传到App Service通过SCP或Kudu控制台# 在App Service中设置PATHexport PATH$PATH:/home/site/tcpdump/bin## 可运行代码示例### 示例1Python脚本自动安装并抓取HTTP流量以下Python脚本演示了如何在App Service启动时自动安装tcpdump并抓取80端口的HTTP流量将结果保存到持久化存储中。python#!/usr/bin/env python3自动安装tcpdump并抓取网络包的Python脚本适用于Azure App Service Linux环境import subprocessimport osimport timeimport signalimport sysdef install_tcpdump(): 安装tcpdump如果已安装则跳过 try: # 检查是否已安装 result subprocess.run([which, tcpdump], capture_outputTrue, textTrue) if result.returncode 0: print(ftcpdump已安装于: {result.stdout.strip()}) return True # 更新包列表 print(正在更新包列表...) subprocess.run([sudo, apt-get, update], checkTrue, timeout120) # 安装tcpdump print(正在安装tcpdump...) subprocess.run([sudo, apt-get, install, -y, tcpdump], checkTrue, timeout120) print(tcpdump安装成功) return True except subprocess.CalledProcessError as e: print(f安装失败: {e}) return False except subprocess.TimeoutExpired: print(安装超时请检查网络连接) return Falsedef capture_traffic(output_file, duration30): 抓取网络流量并保存到pcap文件 参数: output_file: 输出文件路径建议放在/home目录下持久化 duration: 抓取持续时间秒 # 构建tcpdump命令抓取所有非SSH流量避免干扰 cmd [ sudo, tcpdump, -i, eth0, # 通常App Service使用eth0接口 -w, output_file, # 输出为pcap格式 -G, str(duration), # 自动停止 -W, 1, # 只保留一个文件 not port 22 # 排除SSH流量避免循环 ] print(f开始抓包持续 {duration} 秒...) print(f输出文件: {output_file}) try: # 启动tcpdump进程 process subprocess.Popen(cmd, stdoutsubprocess.PIPE, stderrsubprocess.PIPE) # 等待指定时间 time.sleep(duration 2) # 额外等待2秒确保文件写入完成 # 终止进程 process.terminate() process.wait() print(抓包完成) # 检查输出文件 if os.path.exists(output_file): file_size os.path.getsize(output_file) print(f文件大小: {file_size} 字节) return True else: print(警告输出文件未生成) return False except Exception as e: print(f抓包过程出错: {e}) return Falseif __name__ __main__: # 安装tcpdump if not install_tcpdump(): sys.exit(1) # 设置输出文件路径/home目录在App Service中持久化 output_path /home/site/wwwroot/captured_traffic.pcap # 抓取30秒流量 capture_traffic(output_path, duration30) # 使用tcpdump读取前10个包作为验证 print(\n验证抓取内容前10个包) subprocess.run([sudo, tcpdump, -r, output_path, -c, 10, -X, --no-stats])### 示例2Shell脚本实现持续监控并自动轮转以下Shell脚本适合作为App Service的启动命令实现长期网络监控。bash#!/bin/bash# 文件名: network_capture.sh# 用途在App Service Linux中持续抓取网络包并自动轮转# 配置参数CAPTURE_INTERFACEeth0 # 网络接口名称CAPTURE_DIR/home/site/logs # 持久化存储目录CAPTURE_DURATION60 # 每个文件抓取时长秒MAX_FILES5 # 最大保留文件数# 创建日志目录mkdir -p $CAPTURE_DIR# 检查tcpdump是否可用if ! command -v tcpdump /dev/null; then echo tcpdump未安装正在安装... sudo apt-get update -qq sudo apt-get install -y -qq tcpdump if [ $? -ne 0 ]; then echo 安装tcpdump失败退出 exit 1 fifi# 清理旧文件保留最近MAX_FILES个cleanup_old_files() { echo 清理旧文件... ls -t $CAPTURE_DIR/capture_*.pcap 2/dev/null | tail -n $((MAX_FILES1)) | xargs -r rm}# 启动抓包使用-G参数实现自动轮转echo 开始网络抓包监控...echo 接口: $CAPTURE_INTERFACEecho 每个文件时长: ${CAPTURE_DURATION}秒echo 最大保留文件数: $MAX_FILESecho 输出目录: $CAPTURE_DIR# 使用tcpdump的-G和-W参数实现自动轮转sudo tcpdump -i $CAPTURE_INTERFACE \ -w $CAPTURE_DIR/capture_%Y%m%d_%H%M%S.pcap \ -G $CAPTURE_DURATION \ -W $MAX_FILES \ -z cleanup_old_files \ -Z root \ not port 22 # 记录进程IDTCPDUMP_PID$!echo tcpdump进程PID: $TCPDUMP_PIDecho 要停止抓包请运行: kill $TCPDUMP_PID# 等待并保持脚本运行wait $TCPDUMP_PID## 高级用法分析抓取的数据包### 1. 使用tcpdump实时过滤bash# 只显示HTTP请求的GET方法sudo tcpdump -i eth0 -A tcp port 80 and (tcp[((tcp[12:1] 0xf0) 2):4] 0x47455420)# 显示DNS查询sudo tcpdump -i eth0 -n udp port 53### 2. 使用tshark进行深度分析如果安装了Wireshark可通过apt-get安装可以使用其命令行工具bash# 安装tsharksudo apt-get install -y tshark# 分析DNS响应时间tshark -r /home/site/captured.pcap -Y dns.flags.response 1 -T fields -e frame.time_relative -e dns.qry.name -e dns.resp.ttl## 注意事项与最佳实践1.存储空间管理App Service的临时存储/tmp有大小限制建议将pcap文件保存到/home目录持久化存储但注意Azure Files的IO性能2.权限控制使用sudo tcpdump确保有足够权限但避免在非SSH会话中运行3.性能影响抓包会消耗CPU和内存建议在低负载时段进行并限制抓包时长4.安全考虑抓取的数据包可能包含敏感信息处理完毕后及时删除或加密存储5.容器重启每次容器重启后安装的工具会丢失需要重新安装。建议将安装逻辑写入启动脚本## 总结本文深入剖析了在Azure App Service Linux环境中安装和使用tcpdump的原理与实现。通过理解容器的网络能力限制和libpcap的工作机制我们掌握了两种安装方法在线安装和离线编译并提供了完整的Python和Shell脚本示例支持自动安装、定时抓包和文件轮转。这些技术不仅适用于网络故障排查还可用于性能监控和安全审计。在实际应用中请务必结合存储管理、性能影响和安全合规要求谨慎使用抓包功能。通过合理利用这些工具你可以将App Service Linux的网络诊断能力提升到新的层次。