简介:本资源面向需要在无外网或网络受限服务器上部署抓包工具的运维与网络工程师,提供 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 到底依赖什么:别上来就拷 RPM
2.1 tcpdump 和 libpcap 的关系
tcpdump 本身是一个命令行抓包工具,但它不直接跟网卡驱动打交道。真正负责从内核抓包的是 libpcap 这个库——tcpdump 调用 libpcap 的 API,libpcap 通过 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 被强制中断(比如 Ctrl+C 太多次或 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 里。下次再遇到同类机器,直接照着做,五分钟搞定。离线环境最怕的就是每次重新摸索,把流程固化下来比什么都强。
希望帮到你。
本文还有配套的精品资源,点击获取