简介本资源面向需要在无外网或网络受限服务器上部署抓包工具的运维与网络工程师提供 tcpdump 的离线安装方案解决内网环境无法通过 yum 在线获取依赖的痛点。压缩包共 3 个文件以 2 个 rpm 安装包和 1 个 sh 安装脚本为主rpm 分别对应 tcpdump 主程序与 libpcap 依赖库sh 脚本负责自动完成部署整体约 543KB体积轻便便于内网传输。已有 1965 人学习下载说明该方案在受限网络场景中具有实际参考价值。借助该资源读者可省去逐台联网下载依赖的繁琐过程直接在目标机器上完成抓包环境搭建进而开展网络流量监控、故障定位、协议分析与安全审计等工作适合作为内网服务器网络排查的基础工具储备。1. tcpdump离线安装内网机器抓包这件事为什么值得你花半小时搞定机房里有台 CentOS 7.9 的业务机网络偶发丢包但机器不出外网yum install tcpdump直接卡在源上转圈。这种场景我遇到过不止一次——金融、电力、制造的内网环境安全策略不允许任何机器直连公网可排查网络问题又离不开抓包工具。tcpdump 离线安装要解决的就是这件事在没有外网、没有 yum 源、甚至没有本地 RPM 仓库的机器上把 tcpdump 及其依赖装起来让它能正常抓包、正常输出 pcap 文件。适合谁看运维工程师、网络排障人员、需要在隔离环境做协议分析的开发。读完你能拿到一套可复现的离线安装流程知道依赖怎么找、RPM 怎么传、装完怎么验证、以及几个我踩过的坑。2. 先搞清楚 tcpdump 到底依赖什么别上来就拷 RPM2.1 tcpdump 和 libpcap 的关系tcpdump 本身是一个命令行抓包工具但它不直接跟网卡驱动打交道。真正负责从内核抓包的是 libpcap 这个库——tcpdump 调用 libpcap 的 APIlibpcap 通过 AF_PACKET 或 PF_PACKET 套接字从内核收包。所以离线安装 tcpdump本质上要装两个东西tcpdump 的 RPM 包和 libpcap 的 RPM 包。在 CentOS 7 / RHEL 7 上这两个包的名字通常是tcpdump和libpcap。但别以为只有这两个就够了——libpcap 可能还依赖glibc、libnl等基础库不过这些在标准系统里一般都有真正需要额外补的不多。我一般会先用rpm -qpR看一下依赖列表心里有数再动手。# 在有网的同类机器上查看 tcpdump RPM 的依赖 rpm -qpR tcpdump-4.9.2-4.el7.x86_64.rpm输出里会列出libpcap.so.1()(64bit)、libc.so.6()(64bit)等。如果目标机器上libpcap已经有了那只需要装 tcpdump 一个包如果没有就得把 libpcap 也带上。这一步花两分钟能省掉后面半小时的报错排查。2.2 确认目标机器的架构和系统版本离线安装最怕拿错包。x86_64 的包放到 ARM 机器上装不了el7 的包放到 el8 上也可能出问题。先在目标机器上确认两件事# 确认系统版本 cat /etc/redhat-release # 确认 CPU 架构 uname -mCentOS 7.9 输出x86_64那就找el7.x86_64的 RPM。如果是 Kylin、UOS 这类国产系统底层可能是 el7 或 el8 的衍生版包名规则类似但最好用rpm -qa | grep libpcap先看看系统里有没有预装。有些国产系统默认带了 libpcap只是没装 tcpdump这种情况就简单很多。提示如果目标机器是 aarch64 架构比如鲲鹏、飞腾一定要找aarch64的 RPM别拿 x86_64 的凑合。3. 离线包从哪来三种获取路径和各自的适用场景3.1 从同版本有网机器下载 RPM最稳妥的方式找一台跟目标机器系统版本、架构完全一致的有网机器用yumdownloader把 RPM 拉下来。# 在有网的 CentOS 7 机器上安装 yum-utils yum install -y yum-utils # 下载 tcpdump 及其所有依赖到当前目录 yumdownloader --resolve --destdir./tcpdump-offline tcpdump--resolve会自动把依赖树里的包一起下载--destdir指定输出目录。执行完之后tcpdump-offline目录里会有 tcpdump、libpcap 以及可能需要的其他依赖包。把这些 RPM 打包传到目标机器用rpm -ivh *.rpm或yum localinstall *.rpm安装。这里有个细节yumdownloader --resolve下载的依赖是基于有网机器的已装包状态计算的。如果两台机器的基础环境差异很大可能漏掉一些依赖。我一般会在目标机器上先跑rpm -ivh --test做一次干跑看缺什么再补。3.2 从系统 ISO 镜像里提取如果没有同版本的有网机器CentOS 的安装 ISO 里其实包含了大量 RPM 包。挂载 ISO 后在Packages目录下找 tcpdump 和 libpcap。# 挂载 ISO mount -o loop CentOS-7-x86_64-DVD-2009.iso /mnt # 查找 tcpdump 和 libpcap 的 RPM find /mnt/Packages -name tcpdump* -o -name libpcap*CentOS 7.9 的 DVD ISO 里通常有tcpdump-4.9.2-4.el7.x86_64.rpm和libpcap-1.5.3-12.el7.x86_64.rpm。直接拷出来传到目标机器安装即可。ISO 里的包版本可能比最新版旧但胜在跟系统版本严格匹配兼容性最好。3.3 从第三方 RPM 仓库站手动下载有些场景下既没有有网机器也没有 ISO。这时候只能从 RPM 搜索站手动下载。常见的做法是访问 rpmfind.net 或 pkgs.org搜索 tcpdump 对应的发行版和架构下载 RPM 文件。但要注意第三方站的包可能被重新打包过签名和完整性需要自己校验。我一般只在前两种方式都走不通时才用这个而且会优先选官方镜像站链接的包。注意不管从哪拿的 RPM传到目标机器后先用rpm -K校验签名确认包没被篡改或损坏。4. 安装步骤从传包到验证抓包的完整流程4.1 把 RPM 传到目标机器并安装假设你已经把 RPM 文件放到了目标机器的/tmp/tcpdump-offline/目录。安装顺序有讲究先装 libpcap再装 tcpdump。# 进入 RPM 目录 cd /tmp/tcpdump-offline # 先安装 libpcap rpm -ivh libpcap-1.5.3-12.el7.x86_64.rpm # 再安装 tcpdump rpm -ivh tcpdump-4.9.2-4.el7.x86_64.rpm如果依赖都齐了两条命令就完事。如果报Failed dependencies说明还缺包根据报错信息把缺的 RPM 补上再试。也可以用yum localinstall *.rpm让 yum 自动处理依赖关系——前提是本地有可用的 yum 仓库或缓存。# 用 yum 本地安装自动解析依赖 yum localinstall -y *.rpmyum localinstall的好处是它会检查依赖并尝试从已配置的源里补全但如果机器完全没源它也只能报错。所以最稳的还是提前把依赖下全。4.2 验证安装是否成功装完之后别急着抓包先做三层验证# 第一层确认 RPM 已注册 rpm -qa | grep tcpdump rpm -qa | grep libpcap # 第二层确认命令可用 which tcpdump tcpdump --version # 第三层确认能识别网卡 tcpdump -Dtcpdump -D会列出所有可抓包的网卡接口。如果这一步报No such device或者列表为空说明 libpcap 没正常工作可能是权限问题或者内核模块没加载。正常情况下你会看到eth0、lo等接口。4.3 跑一次最小抓包测试验证抓包功能是否正常用最简单的命令抓几个包看看# 抓 5 个包后自动停止不解析域名不打印时间戳 tcpdump -i eth0 -c 5 -nn # 抓包并写入文件供后续分析 tcpdump -i eth0 -c 100 -w /tmp/test.pcap-i eth0指定网卡-c 5表示抓满 5 个包就退出-nn禁止把 IP 和端口解析成域名和服务名加快输出速度。如果能看到类似IP 10.0.0.1.22 10.0.0.2.54321: Flags [P.]的输出说明抓包链路完全打通了。写入文件的模式用-w生成的是标准 pcap 格式可以拷出来用 Wireshark 打开做深度分析。这是离线环境里最实用的方式——在目标机器上抓拿回本地分析。5. 避坑指南tcpdump 离线安装最容易翻车的五个地方5.1 装了 tcpdump 但抓不到任何包现象tcpdump -i eth0运行后一直空白没有任何输出但网卡明明有流量。原因最常见的是权限问题——没用 root 运行。tcpdump 需要 raw socket 权限普通用户即使有 sudo 也可能因为环境变量或 capability 配置不对而抓不到包。另一个可能是网卡处于混杂模式失败或者目标网卡根本不是eth0比如 ens33、bond0。解决用sudo tcpdump或直接 root 运行用tcpdump -D确认正确的网卡名检查ip link确认网卡状态是 UP。5.2 RPM 安装报依赖缺失但不知道缺什么现象rpm -ivh tcpdump.rpm报Failed dependencies: libpcap.so.1()(64bit) is needed。原因目标机器上没有 libpcap 库或者版本不匹配。有时候系统里装了 libpcap 但版本太旧符号版本对不上。解决先rpm -qa | grep libpcap看有没有装。如果装了但版本旧用rpm -Uvh升级如果没装把对应版本的 libpcap RPM 传上来先装。实在找不到完全匹配的版本可以尝试--nodeps强制安装但这是下策可能导致运行时崩溃。5.3 国产系统上 RPM 装完命令找不到现象Kylin 或 UOS 上rpm -ivh显示安装成功但which tcpdump找不到命令。原因国产系统的文件系统布局可能跟标准 CentOS 不同tcpdump 可能被装到了非标准路径或者系统的PATH环境变量没包含/usr/sbin。解决用rpm -ql tcpdump | grep bin查看实际安装路径然后直接用绝对路径运行或者把路径加到PATH里。如果是/usr/sbin/tcpdump确认当前用户是否有权限访问该目录。5.4 抓包文件用 Wireshark 打不开现象tcpdump -w生成的 pcap 文件传到本地Wireshark 提示格式错误或无法识别。原因通常是抓包过程中 tcpdump 被强制中断比如 CtrlC 太多次或 kill -9文件头没写完整。另外如果用了-w但同时加了-v等参数可能输出格式有变化。解决抓包时用-c指定包数让 tcpdump 自然退出或者用timeout命令控制时长。已经损坏的文件基本救不回来只能重抓。养成习惯抓包时加-c或-G限制别让它无限跑。5.5 离线安装后 tcpdump 版本太旧不支持某些过滤表达式现象想用tcpdump tcp[tcpflags] (tcp-syn) ! 0过滤 SYN 包但报语法错误。原因CentOS 7 自带的 tcpdump 是 4.9.2 版本一些较新的过滤表达式或协议解析比如某些 VXLAN 场景支持不完整。解决如果业务场景需要新特性得找更高版本的 tcpdump RPM。但高版本可能依赖更高版本的 libpcap 和 glibc在 CentOS 7 上不一定能跑。我的经验是CentOS 7 就用 4.9.2够用真要新特性考虑在容器里跑新版本或者用其他抓包方案。6. 进阶技巧用 tcpdump 做长期抓包和远程分析的正确姿势离线环境里 tcpdump 最大的价值不是临时抓几个包看看而是做长期流量留存和远程分析。我一般会这么干在目标机器上用-G和-w组合做滚动抓包每个文件抓 100MB 或 10 分钟就切一个避免单个文件过大。# 每 600 秒切一个文件文件名带时间戳最多保留 24 个文件 tcpdump -i eth0 -G 600 -w /var/log/tcpdump/capture-%Y%m%d-%H%M%S.pcap -W 24 -z gzip-G 600表示每 600 秒轮转一次文件-W 24限制最多保留 24 个文件配合-G使用时-W是文件数量的上限-z gzip表示轮转后自动用 gzip 压缩节省磁盘。文件名里的%Y%m%d-%H%M%S会被替换成实际时间方便定位。这个方案跑起来之后机器上会持续保留最近 4 小时左右的抓包数据24 个文件 × 10 分钟。出问题时把对应时间段的 pcap 拷出来分析就行不用重现故障。另一个实用技巧是配合-s控制抓包长度。默认 tcpdump 抓完整包但很多时候你只关心包头。用-s 96只抓每个包的前 96 字节能大幅减少文件体积和磁盘 I/O。# 只抓每个包的前 96 字节适合分析 TCP 握手和协议头 tcpdump -i eth0 -s 96 -w /tmp/headers.pcap -c 100096 字节足够覆盖以太网头14 字节 IP 头20 字节 TCP 头20 字节 选项对于排查连接建立、重传、RST 这类问题完全够用。如果要做 payload 分析那就得抓全包磁盘消耗会大很多。最后说一个我自己的习惯每次离线装完 tcpdump我都会在目标机器上跑一条tcpdump -i any -c 1 -nn确认能抓到包然后把安装好的 RPM 包和安装命令记到内部 Wiki 里。下次再遇到同类机器直接照着做五分钟搞定。离线环境最怕的就是每次重新摸索把流程固化下来比什么都强。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?