blj28

导航

x86工控机安装tcpdump——或者交叉编译

tcpdump -i eth0 port 43842 -G 120 -W 1 -w capture.pcap

 

 

执行抓包操作,通常需要 root 权限,所以最基础的命令格式如下:

sudo tcpdump -i <网卡名> port <端口号> -w <文件名.pcap>
  • -i <网卡名>: 指定要监听的网络接口。使用 tcpdump -D 可以查看所有可用网卡。如果不确定,用 -i any 可抓取所有网卡的数据。

  • port <端口号>: 指定要抓取的端口号。这是过滤器的基础。

  • -w <文件名.pcap>: 指定输出文件名,推荐使用 .pcap 扩展名。

  • -c <数量>: 在命令中加入此参数,可以限制抓包的数量,达到指定数量后自动停止。例如,-c 100 表示抓取100个数据包后自动退出。

实际命令示例:
假设要抓取网卡 eth0 上所有 80 端口的流量,并保存为 port80_capture.pcap,命令如下:

bash
sudo tcpdump -i eth0 port 80 -w port80_capture.pcap

高级用法与过滤技巧

掌握基础命令后,这些进阶技巧能让你更精准地捕获所需数据。

  1. 更精细的过滤条件
    你可以组合使用过滤条件,更精确地定位数据包。这里有一些例子:

     
    过滤条件示例作用说明
    tcp port 80 只抓取 TCP 协议的 80 端口数据
    udp port 53 只抓取 UDP 协议的 53 端口数据
    host 192.168.1.100 and port 80 抓取与指定 IP 地址 和 端口 相关的数据
    not port 22 排除 指定的端口(如 SSH 端口)
  2. 管理抓包文件大小
    如果进行长时间抓包,文件可能会非常大。使用以下参数可以有效管理文件大小:

    • -C <文件大小>: 指定单个文件的最大大小(单位是百万字节)。例如 -C 10 表示每个文件不超过 10MB。

    • -W <文件数量>: 与 -C 联用,限制最大文件数量,实现文件轮转,避免写满磁盘。例如,以下命令会每小时轮转一次文件,最多保留10个文件:tcpdump -i eth0 -G 3600 -W 10 -w capture%Y%m%d%H%M%S.pcap

  3. 提升输出效率

    • 使用 -nn 选项可以直接显示 IP 和端口号,而不是尝试解析为主机名和服务名,这能提高输出效率。

分析与阅读抓包文件

  • 实时查看捕获内容:如果你想在保存的同时,在终端屏幕上实时查看抓包的内容,可以去掉 -w 参数。

  • 使用 Wireshark 进行详细分析:保存的 pcap 文件可以用功能更强大的图形化工具 Wireshark 打开,进行深度分析。在 Wireshark 中,你可以方便地过滤、跟踪 TCP 流和检查各种协议字段。

  • 使用 tcpdump 读取抓包文件:你也可以直接使用 tcpdump 命令来读取和过滤之前保存的抓包文件。使用 -r 参数即可。

    bash
    # 读取抓包文件
    sudo tcpdump -nn -r port80_capture.pcap
    # 读取抓包文件并施加过滤条件
    sudo tcpdump -nn -r port80_capture.pcap 'tcp and host 192.168.1.100'

⚠️ 注意事项

  • 权限问题:抓包通常需要管理员权限,记得在命令前加上 sudo

  • 磁盘空间:长时间抓包会生成大文件,请留意可用磁盘空间,并善用 -C 和 -W 选项。

  • 选择正确的网卡:确保你监听的是正确的网络接口,否则可能抓不到任何数据。使用 -i any 可以捕获所有接口的数据,但在繁忙的服务器上可能会产生大量数据

 

要让 tcpdump 在运行两分钟后自动停止,有几种方法可以实现。下面这个表格汇总了常用的方法,方便你快速了解和选择:

 
方法核心思路示例命令特点与说明
timeout 命令 使用系统命令限定程序运行时间。 timeout 2m sudo tcpdump -i any -w output.pcap 🟢 推荐此法:简单直接,无需复杂参数。2m 代表2分钟,也支持 s (秒)、h (小时)。
-G 参数 利用 tcpdump 的文件轮转功能,设置单个文件捕获时长。 sudo tcpdump -i any -G 120 -W 1 -w capture.pcap 需注意 -W 1 参数。此法实质是控制每个抓包文件的持续时间。

🛠️ 进阶用法与场景建议

在实际应用中,你可能还需要结合其他参数来满足特定需求:

  • 指定网卡与端口:在上述命令中加入过滤条件即可。例如,要抓取 eth0 网卡上端口 443 的流量,命令可以这样写:

    bash
    timeout 2m sudo tcpdump -i eth0 port 443 -w output.pcap
  • 限制抓包数量:如果你希望在2分钟内或者抓满特定数量的包就停止,可以组合使用 -c 参数。例如,以下命令会在2分钟时限内抓满1000个包后提前退出:

    bash
    timeout 2m sudo tcpdump -i any -c 1000 -w output.pcap
  • 保存文件的最佳实践:务必使用 -w 参数将数据包保存为 .pcap 文件,之后便可使用 Wireshark 等工具进行详细分析。使用 -C 参数可以限制单个文件的大小,防止文件过大。

 

 

 

1 下载官网源码

Home | TCPDUMP & LIBPCAP

image

 

2、安装需要的文件,否则编译报错

sudo apt-get install flex
sudo apt-get install bison

 

3、 解压、创建文件夹

注意在两个文件的同一目录下创建文件夹tools

image

 

mkdir tools

解压libpcap源码以及

# tar xvf libpcap-1.10.5.tar.gz
# cd libpcap-1.10.5/

执行上层configure,指定编译器和编译结果的安装目录

../configure --prefix=/val/tcpdump/tools   #使编译的东西放在这个目录里面
 #不使用交叉编译 --host=arm-linux CC=aarch64-linux-gnu-gcc
make && make install

再解压tcpdump-4.99.5.tar.xz 并编译

tar xvf tcpdump-4.99.5.tar.xz 
cd tcpdump-4.99.5
./configure --prefix=/val/tcpdump/tools   #使编译的东西放在这个目录里面
make && make install

编译后生成的文件目录如下:

image

 

root@blj-pc:/val/tcpdump/tools/lib# ls -lah
总用量 3.8M
drwxr-xr-x 3 root root 4.0K 8月   4 13:26 .
drwxr-xr-x 6 root root 4.0K 8月   4 13:26 ..
-rw-r--r-- 1 root root 2.6M 8月   4 13:26 libpcap.a
lrwxrwxrwx 1 root root   12 8月   4 13:26 libpcap.so -> libpcap.so.1
lrwxrwxrwx 1 root root   17 8月   4 13:26 libpcap.so.1 -> libpcap.so.1.10.5
-rwxr-xr-x 1 root root 1.3M 8月   4 13:26 libpcap.so.1.10.5
drwxr-xr-x 2 root root 4.0K 8月   4 13:26 pkgconfig
root@blj-pc:/val/tcpdump/tools/lib# ls ../bin/  -lah
总用量 16M
drwxr-xr-x 2 root root 4.0K 8月   4 13:29 .
drwxr-xr-x 6 root root 4.0K 8月   4 13:26 ..
-rwxr-xr-x 1 root root 3.8K 8月   4 13:26 pcap-config
-rwxr-xr-x 1 root root 7.7M 8月   4 13:29 tcpdump
-rwxr-xr-x 1 root root 7.7M 8月   4 13:29 tcpdump.4.99.5
root@blj-pc:/val/tcpdump/tools/lib# ls ../share/  -lah
总用量 12K
drwxr-xr-x 3 root root 4.0K 8月   4 13:26 .
drwxr-xr-x 6 root root 4.0K 8月   4 13:26 ..
drwxr-xr-x 6 root root 4.0K 8月   4 13:26 man
root@blj-pc:/val/tcpdump/tools/lib# ls ../include/  -lah
总用量 24K
drwxr-xr-x 3 root root 4.0K 8月   4 13:26 .
drwxr-xr-x 6 root root 4.0K 8月   4 13:26 ..
drwxr-xr-x 2 root root 4.0K 8月   4 13:26 pcap
-rw-r--r-- 1 root root 2.3K 8月   4 13:26 pcap-bpf.h
-rw-r--r-- 1 root root 2.2K 8月   4 13:26 pcap.h
-rw-r--r-- 1 root root 2.0K 8月   4 13:26 pcap-namedb.h
root@blj-pc:/val/tcpdump/tools/lib# 

 

 4、文件保存

方法一:使用 tcpdump 自带的日志轮转功能(推荐)

通过 -G(时间间隔)和 -W(文件数量)参数实现定期保存:

 
sudo tcpdump -i eth0 -s 0 -G 3600 -W 24 -w /path/to/capture_%Y-%m-%d_%H%M%S.pcap -Z root
  • -i eth0:监听的网卡(替换为需要抓取的网卡名)。

  • -s 0:抓取完整数据包(避免截断)。

  • -G 3600:每 3600 秒(1小时) 轮转一个新文件。

  • -W 24:保留最近 24 个文件(自动覆盖旧文件)。

  • -w capture_%Y-%m-%d_%H%M%S.pcap:文件名格式(时间戳会被替换,如 capture_2023-10-01_120000.pcap)。

  • -Z root:以 root 权限保存文件(避免权限问题)。

效果:每小时生成一个新文件,保留最近 24 小时数据,可直接用 Wireshark 打开 .pcap 文件。


方法二:结合 cron 定时任务 + 脚本

1. 创建抓包脚本 /root/capture.sh

#!/bin/bash
# 抓包时长(秒)和保存路径
DURATION=3600
SAVE_DIR="/path/to/save"
FILENAME="capture_$(date +%Y-%m-%d_%H%M%S).pcap"

# 抓包命令
tcpdump -i eth0 -s 0 -w $SAVE_DIR/$FILENAME -G $DURATION -W 1
赋予执行权限:

sudo chmod +x /root/capture.sh

2. 添加 cron 定时任务

sudo crontab -e

添加以下内容(每小时执行一次):

0 * * * * /root/capture.sh  # 每小时的第0分钟执行

关键说明

  1. 文件格式:.pcap 是 Wireshark 默认支持的格式,无需额外转换。

  2. 时间分割:

    • 方法一:由 tcpdump 自动管理轮转(更高效)。

    • 方法二:通过 cron 灵活控制(适合复杂调度)。

  3. 权限问题:
    使用 sudo 或 -Z root 避免权限错误。

  4. 清理旧文件:
    若需自动清理,可在脚本中添加删除命令(例如保留最近 7 天文件):

    find /path/to/save -name "*.pcap" -mtime +7 -delete

验证命令

  • 查看生成的 pcap 文件:

    ls -lh /path/to/save/
  • 用 Wireshark 打开文件:

    wireshark /path/to/save/capture_2023-10-01_120000.pcap

通过以上方法,你可以实现定时抓包并保存为 Wireshark 可读的文件。

 
 

5 交叉编译可参考

#将前面编译生成的libpcap相关文件挂载到当前目录

# ln -s ../../libpcap-1.10.5/build/install/ libpcap

#执行上层configure,指定编译器及依赖的libpcap头文件、库文件路径,生成makefile

# ../configure --host=arm-linux CC=aarch64-linux-gnu-gcc CFLAGS="-I./libpcap/include/ -L./libpcap/lib/"


编译

# make
编译完成,查看文件类型

# file tcpdump
tcpdump: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked,  not stripped

 

可以使用scp、ftp、lrzsz、tftp等命令,能把文件传到嵌入式设备上就行;

例如使用tftp,PC(IP:192.168.1.33)开启tftpd程序后,在嵌入式设备获取文件并添加执行权限:

# tftp -g -r tcpdump192.168.1.33
 # chmod +x tcpdump 
# tftp
-g -r libpcap.so.1.10.5 192.168.1.33
#
ln -s libpcap.so.1.10.5 libpcap.so.1
# export LD_LIBRARY_PATH
=./
#

root@blj-pc:/val/tcpdump/tools/bin# tcpdump --help
tcpdump version 4.9.3
libpcap version 1.9.1 (with TPACKET_V3)
OpenSSL 1.1.1f 31 Mar 2020
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
[ -Q in|out|inout ]
[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
[ -Z user ] [ expression ]

执行成功后,可以将libpcap.so都移动到默认库的位置,避免每次运行都需要配置环境变量。

 

2 如何交叉编译

2.1 解压源码,创建编译文件夹 source 环境

mkdir bild
source XXX

 

2.2 默认编译,但是提示错误,而且编译后的代码位置也是默认放在usr下不方便

checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... configure: error: in `/work/TS30/3tcpdump/libpcap-1.10.5':
configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details

上述错误的解决办法——编译带参数--host= XXX(If you meant to cross compile, use `--host'.),host参数可以查看环境文件

 

export TARGET_PREFIX=arm-ostl-linux-gnueabi-
export CONFIGURE_FLAGS="--target=arm-ostl-linux-gnueabi --host=arm-ostl-linux-gnueabi --build=x86_64-linux --with-libtool-sysroot=$SDKTARGETSYSROOT"
export CFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types "
export CXXFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types "
export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed "
export CPPFLAGS=""
export KCFLAGS="--sysroot=$SDKTARGETSYSROOT"

 

因此使用该命令编译

cd libpcap-1.10.5/

./configure --host=arm-ostl-linux-gnueabi --prefix=/work/TS30/3tcpdump/build
make
make install


cd tcpdump-4.99.5
root@blj-virtual-machine:/3tcpdump/tcpdump-4.99.5#

 

2.3 编译完成后拷贝至目标平台

root@blj-virtual-machine:/work/TS30/3tcpdump/build/lib# ls -lah
总用量 2.5M
drwxr-xr-x 3 root root 4.0K 10月 21 11:50 .
drwxr-xr-x 6 root root 4.0K 10月 21 11:50 ..
-rw-r--r-- 1 root root 1.5M 10月 21 11:50 libpcap.a
lrwxrwxrwx 1 root root   12 10月 21 11:50 libpcap.so -> libpcap.so.1
lrwxrwxrwx 1 root root   17 10月 21 11:50 libpcap.so.1 -> libpcap.so.1.10.5
-rwxr-xr-x 1 root root 1.1M 10月 21 11:50 libpcap.so.1.10.5
drwxr-xr-x 2 root root 4.0K 10月 21 11:50 pkgconfig
root@blj-virtual-machine:/work/TS30/3tcpdump/build/lib# scp libpcap.* root@192.168.1.108:/lib
libpcap.a                                                                                                                                         100% 1449KB   1.6MB/s   00:00    
libpcap.so                                                                                                                                        100% 1077KB   1.6MB/s   00:00    
libpcap.so.1                                                                                                                                      100% 1077KB   1.6MB/s   00:00    
libpcap.so.1.10.5                                                                                                                                 100% 1077KB   1.5MB/s   00:00    
root@blj-virtual-machine:/work/TS30/3tcpdump/build/lib# 

创建软链接

root@00:/lib# ln -s libpcap.so.1.10.5 libpcap.so.1
ln: libpcap.so.1: File exists
root@00:/lib# rm libpcap.so.1
root@00:/lib# ln -s libpcap.so.1.10.5 libpcap.so.1
root@00:/lib# rm libpcap.so
root@00:/lib# ln -s libpcap.so.1 libpcap.so
root@00:/lib# ls -lah

2.3.1 但是在执行的时候还是提示错误

(libnl-3.so.200 是一个动态链接库,属于 libnl 库的一部分,主要用于简化应用程序与 Linux 内核的 Netlink 接口交互。它通常在网络相关的开发中被使用,例如配置网络接口或管理路由表。)

root@00:~/work/00/blj# ./tcpdump
./tcpdump: error while loading shared libraries: libnl-genl-3.so.200: cannot open shared object file: No such file or directory
root@00:~/work/00/blj#

此库的下载地址为:

libnl - Netlink Protocol Library Suite

 

同样的方法编译,否则也是提示

 

checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... configure: error: in `/work/30/3tcpdump/libnl-1.1.4':
configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details


./configure --prefix=/work/30/3tcpdump/lib --host=arm-ostl-linux-gnueabi
make
make install

scp libnl-3.so.200.20.0 root@192.168.1.108:/lib

目标平台上执行:ln -s libnl-3.so.200.20.0 libnl-genl-3.so.200

2.3.2 上述库编译成功后又提示错误

libdbus-1.so.3 是 D-Bus(Desktop Bus)的核心库文件之一,主要用于进程间通信(IPC)。D-Bus 提供了一种简单的方式,让不同的应用程序或服务在同一系统中进行交互。

./tcpdump: error while loading shared libraries: libdbus-1.so.3: cannot open shared object file: No such file or directory

解决方案:

因为是进程的交互库,交叉编译环境中有该库,直接到交叉编译环境下搜索拷贝即可——成功抓取数据

scp libdbus-1.so.3.32.0 root@192.168.1.108:/lib

cd /lib

root@00:/lib# ln -s libdbus-1.so.3.32.0 libdbus-1.so.3
root@00:/lib# cd -
/home/root/work/00/blj
root@ts600:~/work/00/blj# ./tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes

 

posted on 2025-08-04 13:48  bailinjun  阅读(34)  评论(0)    收藏  举报