OpenHarmony移植tcpdump

本文主要介绍如何在OpenHarmony系统下交叉编译tcpdump工具。
tcpdump官方下载渠道:https://www.tcpdump.org/#latest-releases
主要依赖libpcap,如果需要支持RFMON模式的话,libpcap还需要依赖libnl。

交叉编译libnl

https://www.linuxfromscratch.org/blfs/view/svn/basicnet/libnl.html
源码下载和解压:

wget https://github.com/thom311/libnl/releases/download/libnl3_9_0/libnl-3.9.0.tar.gz
tar -xvf libnl-3.9.0.tar.gz
cd libnl-3.9.0/

编译脚本build.sh:

#!/bin/bash

set -e

if [ "$1" == "clean" ] || [ "$1" == "distclean" ];then
    make $1
    exit 0
fi

compile_mode=static

if [ "$1" == "static" ];then
compile_mode=static
elif [ "$1" == "shared" ];then
compile_mode=shared
fi

export OHOS_SDK_HONE=/opt/sdk/ohos
export OHOS_NATIVE_HOME=/opt/sdk/ohos/native/4.0.10.13

export PATH=$OHOS_NATIVE_HOME/llvm/bin:$PATH
export AR=$OHOS_NATIVE_HOME/llvm/bin/llvm-ar
export AS=$OHOS_NATIVE_HOME/llvm/bin/llvm-as
export LD=$OHOS_NATIVE_HOME/llvm/bin/ld.lld
export RANLIB=$OHOS_NATIVE_HOME/llvm/bin/llvm-ranlib
export STRIP=$OHOS_NATIVE_HOME/llvm/bin/llvm-strip
export CC="$OHOS_NATIVE_HOME/llvm/bin/clang"
export NM="$OHOS_NATIVE_HOME/llvm/bin/llvm-nm"
export OBJDUMP="$OHOS_NATIVE_HOME/llvm/bin/llvm-objdump"
export CFLAGS="--target=arm-linux-ohos --sysroot=$OHOS_NATIVE_HOME/sysroot -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -mfpu=neon -funwind-tables -fstack-protector -fno-strict-aliasing -fPIC"
export CPPFLAGS="--target=arm-linux-ohos --sysroot=$OHOS_NATIVE_HOME/sysroot -fPIC"
export LDFLAGS="--target=arm-linux-ohos --rtlib=compiler-rt -fuse-ld=lld"
export LIBS="-lunwind"

EXTOPTS=""

# static compile, maybe we need disable shared library
if [ "$compile_mode" == "static" ];then
#EXTOPTS="--disable-shared"
EXTOPTS=""
fi

./configure --prefix=${PWD}/_install \
            --target=arm-linux-ohos \
            --host=arm-linux \
            ${EXTOPTS}

sed -i 's/archive_cmds="\\$CC -shared \\$pic_flag/archive_cmds="\\$CC -shared --target=arm-linux-ohos \\$pic_flag/g' ./libtool

make && make install

这里链接动态库的时候调用的是自动生成的libtool脚本,clang命令下需要增加–target=arm-linux-ohos选项,否则链接时会报ELF头不匹配的错误。

执行编译脚本:

bash build.sh distclean;bash build.sh

交叉编译libpcap

https://www.linuxfromscratch.org/blfs/view/svn/basicnet/libpcap.html
源码下载和解压:

wget https://www.tcpdump.org/release/libpcap-1.10.4.tar.gz
tar -xf libpcap-1.10.4.tar.gz
cd libpcap-1.10.4/

编译脚本build.sh:

#!/bin/bash

set -e

if [ "$1" == "clean" ] || [ "$1" == "distclean" ];then
    make $1
    exit 0
fi

compile_mode=static

if [ "$1" == "static" ];then
compile_mode=static
elif [ "$1" == "shared" ];then
compile_mode=shared
fi

export OHOS_SDK_HONE=/opt/sdk/ohos
export OHOS_NATIVE_HOME=/opt/sdk/ohos/native/4.0.10.13

export PATH=$OHOS_NATIVE_HOME/llvm/bin:$PATH
export AR=$OHOS_NATIVE_HOME/llvm/bin/llvm-ar
export AS=$OHOS_NATIVE_HOME/llvm/bin/llvm-as
export LD=$OHOS_NATIVE_HOME/llvm/bin/ld.lld
export RANLIB=$OHOS_NATIVE_HOME/llvm/bin/llvm-ranlib
export STRIP=$OHOS_NATIVE_HOME/llvm/bin/llvm-strip
export CC="$OHOS_NATIVE_HOME/llvm/bin/clang"
export NM="$OHOS_NATIVE_HOME/llvm/bin/llvm-nm"
export OBJDUMP="$OHOS_NATIVE_HOME/llvm/bin/llvm-objdump"
export CFLAGS="--target=arm-linux-ohos --sysroot=$OHOS_NATIVE_HOME/sysroot -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -mfpu=neon -funwind-tables -fstack-protector -fno-strict-aliasing -D__MUSL__ -I${PWD}/../libnl-3.9.0/_install/include/libnl3"
export CPPFLAGS="--target=arm-linux-ohos --sysroot=$OHOS_NATIVE_HOME/sysroot -D__MUSL__"
export LDFLAGS="--target=arm-linux-ohos --rtlib=compiler-rt -fuse-ld=lld"
export LIBS="-lunwind"

./configure --prefix=${PWD}/_install \
            --target=arm-linux-ohos \
            --host=arm-linux \
            --with-pcap=linux \
            --with-libnl=${PWD}/../libnl-3.9.0/_install

# static compile, link the static library libnl-genl-3.a and libnl-3.a
if [ "$compile_mode" == "static" ];then
    sed -i 's%-lnl-genl-3%../libnl-3.9.0/_install/lib/libnl-genl-3.a%g' ./Makefile
    sed -i 's%-lnl-3%../libnl-3.9.0/_install/lib/libnl-3.a%g' ./Makefile
fi

make && make install

# script pcap-config generated by make install
if [ "$compile_mode" == "static" ];then
    sed -i 's%-lnl-genl-3%'${PWD}'/../libnl-3.9.0/_install/lib/libnl-genl-3.a%g' ./pcap-config
    sed -i 's%-lnl-3%'${PWD}'/../libnl-3.9.0/_install/lib/libnl-3.a%g' ./pcap-config
fi

这里如果需要静态方式来链接libnl的库的话,需要修改一下Makefile以及pcap-config文件。

执行编译脚本:

bash build.sh distclean;bash build.sh

交叉编译tcpdump

https://www.tcpdump.org/#latest-releases
源码下载和解压:

wget https://www.tcpdump.org/release/tcpdump-4.99.4.tar.gz
tar -xf tcpdump-4.99.4.tar.gz
cd tcpdump-4.99.4/

编译脚本build.sh:

#!/bin/bash

set -e

if [ "$1" == "clean" ] || [ "$1" == "distclean" ];then
    make $1
    exit 0
fi

compile_mode=static

if [ "$1" == "static" ];then
compile_mode=static
elif [ "$1" == "shared" ];then
compile_mode=shared
fi

export OHOS_SDK_HONE=/opt/sdk/ohos
export OHOS_NATIVE_HOME=/opt/sdk/ohos/native/4.0.10.13

export PATH=$OHOS_NATIVE_HOME/llvm/bin:$PATH
export AR=$OHOS_NATIVE_HOME/llvm/bin/llvm-ar
export AS=$OHOS_NATIVE_HOME/llvm/bin/llvm-as
export LD=$OHOS_NATIVE_HOME/llvm/bin/ld.lld
export RANLIB=$OHOS_NATIVE_HOME/llvm/bin/llvm-ranlib
export STRIP=$OHOS_NATIVE_HOME/llvm/bin/llvm-strip
export CC="$OHOS_NATIVE_HOME/llvm/bin/clang"
export NM="$OHOS_NATIVE_HOME/llvm/bin/llvm-nm"
export OBJDUMP="$OHOS_NATIVE_HOME/llvm/bin/llvm-objdump"
export CFLAGS="--target=arm-linux-ohos --sysroot=$OHOS_NATIVE_HOME/sysroot -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -mfpu=neon -funwind-tables -fstack-protector -fno-strict-aliasing -D__MUSL__"
export CPPFLAGS="--target=arm-linux-ohos --sysroot=$OHOS_NATIVE_HOME/sysroot -D__MUSL__"
export LDFLAGS="--target=arm-linux-ohos --rtlib=compiler-rt -fuse-ld=lld"

EXTOPTS=""
#EXTOPTS="--disable-local-libpcap"

./configure --prefix=${PWD}/_install \
            --target=arm-linux-ohos \
            --host=arm-linux \
            ${EXTOPTS}

# static compile, link the static library libnl-genl-3.a and libnl-3.a
#if [ "$compile_mode" == "static" ];then
#   sed -i 's%-lnl-genl-3%../libnl-3.9.0/_install/lib/libnl-genl-3.a%g' ./Makefile
#   sed -i 's%-lnl-3%../libnl-3.9.0/_install/lib/libnl-3.a%g' ./Makefile
#fi

make && make install

编译tcpdump的时候,会自动去上一级目录下的libpcap-1.10.4目录中查找并执行pcap-config文件,即…/libpcap-1.10.4/pcap-config,获取链接选项。编译libpcap时修改了pcap-config脚本的话,编译tcpdump时就不需要修改Makefile了。

执行编译脚本:

bash build.sh distclean;bash build.sh

OpenHarmony 4.0 Release(4.0.10.13)版本下网络管理服务针对以太网的处理存在BUG。tcpdump执行时会触发内核上报以太网网络接口的状态(通过ip monitor我们可以监测到link up的通知,对比Android系统的行为一致),网络管理服务收到通知之后会更新该接口的信息。针对IP地址和路由的处理,会先清空旧的IP地址和路由,然后重新设置,会导致以太网网络短暂断开。所以,如果在SSH会话下执行tcpdump命令时,SSH会话会立即退出,其他网络通信的场景也会被打断。解决方案就是修改网络管理器中更新IP地址和路由的逻辑,如果新的IP地址和路由并未发生改变,则不应执行删除动作。具体的修改代码这里就不贴出来了。

### 3. Linux 下如何监控网络通信数据 在 Linux 系统中,监控网络通信数据是网络调试、性能优化和安全审计的重要手段。可以通过命令行工具、系统内核接口以及第三方抓包软件实现对网络通信的全面监控。 #### 3.1 使用 `ss` 命令查看连接状态 `ss`(Socket Statistics)命令用于显示网络连接、路由表、接口统计信息等。它可以替代 `netstat` 并提供更快的性能和更简洁的输出。例如: - 查看所有建立的 TCP 连接(不包括监听端口): ```bash ss -tna ``` - 查看主机监听的 TCP 端口信息: ```bash ss -tnl ``` 这些命令可用于快速识别当前活跃的连接和监听端口,适用于日常网络状态检查 [^1]。 #### 3.2 使用 `nc` 和 `nmap` 扫描开放端口 `nc`(Netcat)和 `nmap` 是用于端口扫描和网络调试的常用工具。`nc` 可用于测试目标主机的端口是否开放: ```bash nc -zv 192.168.1.1 22 ``` 而 `nmap` 可用于更全面的端口扫描和网络发现: ```bash nmap -sT 192.168.1.1 ``` 这些工具可用于检测本地或远程主机上开放的网络服务 。 #### 3.3 使用 `ping` 监控网络连通性 `ping` 命令可用于测试主机之间的网络连通性和延迟情况。其常用选项包括: - 指定发送包的次数: ```bash ping -c 4 google.com ``` - 设置包的大小: ```bash ping -s 1000 google.com ``` 通过 `ping` 的输出可以判断网络是否稳定,是否存在丢包或延迟过高的情况 [^2]。 #### 3.4 使用 `tcpdump` 抓包分析 `tcpdump` 是 Linux 系统中常用的命令行抓包工具,能够捕获和分析网络接口上的数据包。例如: - 抓取指定接口上的所有通信数据: ```bash sudo tcpdump -i eth0 ``` - 将抓包数据保存为 pcap 文件供后续分析: ```bash sudo tcpdump -i eth0 -w capture.pcap ``` 该工具适用于网络故障排查、协议分析和安全审计等场景。 #### 3.5 使用 Wireshark 实现远程抓包 Wireshark 支持通过 `rpcapd` 协议实现远程抓包。在 Linux 系统上安装并运行 `rpcapd` 服务后,可以在本地运行 Wireshark 捕获远程主机的网络通信数据: ```bash sudo rpcapd -n ``` 然后在本地 Wireshark 中选择远程接口进行抓包。这种方式适用于跨网络环境的调试和监控 [^3]。 #### 3.6 使用 `sar` 监控网络性能 `sar` 是 `sysstat` 工具集的一部分,可用于收集和报告系统活动,包括网络接口的统计信息: ```bash sar -n DEV 1 5 ``` 该命令每秒输出一次网络接口的收发数据速率,适用于长期监控网络 IO 性能 [^2]。 #### 3.7 字节序转换在网络通信中的作用 在网络通信中,不同主机可能使用不同的字节序(大端或小端)。TCP/IP 协议栈规定使用大端字节序传输数据,因此在处理网络数据时,应用程序需使用 `htonl`、`htons`、`ntohl`、`ntohs` 等函数进行字节序转换,以确保数据正确解析 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值