成航先森 成航先森

成都航院计算机系一个学生的个人博客

 

系统运维

  • 没有分类目录

最新文章

系统运维
当前位置: 首页 » 系统运维 » 华为光猫HS8145V交叉编译静态tcpdump

华为光猫HS8145V交叉编译静态tcpdump

编辑:狂族晨曦 来源:系统运维经验杂笔 日期:2022-04-03 阅读: 1,563 次 5 条评论 » 百度已收录

先森是个网速强迫症,闲着没事就喜欢研究光猫、路由器那一套,还希望在任何地方只要有网就能控制家里的设备。可惜先森的电信光猫是大内网,双层NAT,没有ipv4公网IP,结果偶然先森发现家里设备都可以直连ipv6了,而且分配到设备的ipv6地址还是公网的,先森就想着使用ipv6来突破网络限制。

结果,运营商为了保证安全,默认是限制了ipv6入访的。

由于家里宽带不是先森办理的,先森不太方便直接将光猫改为桥接的模式,所幸是先森拿到了光猫超管密码,还可以通过shell的方式去操作iptables调整入访策略。但光猫的iptables策略特别多,先森也得为安全考虑,不能直接全放通,所以得进行测试。结果问题来了,光猫的shell中没有tcpdump的命令,没法抓包,让先森调试的心态爆炸,当时各种搜索都没有找到光猫抓包的方法。

由于ipv6的支持在先森身边依旧不是那么普遍,像先森公司的商纤就没有分配ipv6(不知道是不是公司IT把ipv6分配给关了),腾讯云CDN回源也不支持ipv6源站,所以当时先森一条条iptables策略调试的差不多之后,也就搁置了。但是没法运行tcpdump抓包这个事一直让先森如鲠在喉,然后最近突然知道了“交叉编译”这么一个玩意儿,让先森沉寂的心死灰复燃。

交叉编译:

交叉编译是在一个平台上生成另一个平台上的可执行代码。如在x86平台上编译ARM平台上运行的可执行代码。

先森在折腾的过程中遇到很多坑,在这里记录一下。

配置情况

光猫:华为HS8145V,已经开启telnet;

交叉编译主机:CentOS 7.9 x86_64,其实应该用Ubuntu来交叉编译更方便,但是先森对这系统不熟。

交叉编译器的寻找历程

确认平台

在网上搜交叉编译tcpdump的教程,一开始根本没注意到编译器,然后直接上手编译,这就跟平时正常编译一样,编译出来的是gcc编译的,根本不是交叉编译的。

网上教程说要确认目标机是arm-linux还是mips-linux什么的,先森看光猫通过telnet登录的时候有什么BusyBox、Dopra Linux,搜了一圈也没能明确搜出来华为光猫的系统属于什么,只是搜到有说华为光猫使用的是海思芯片,属于arm架构的,最后是`uname -m`确认到华为这个是arm平台。

选择arm-linux-gcc

确认了光猫HS8145V是arm后,目标就很明确了,下载一下交叉编译器,然后开整。

但先森万万没想到,arm-linux-gcc的下载链接那么难找,好不容易找到了,结果又发现arm-linux-gcc有很多版本,还要根据光猫arm的情况来选。

arm-linux-gcc的不同版本 -1

arm-linux-gcc的不同版本

那么光猫是什么情况呢,可以在命令行进行查看:

WAP(Dopra Linux) # uname -a
Linux EchoLife_WAP 3.10.53-HULK2 #1 SMP Fri Oct 20 01:08:58 CST 2017 armv7l GNU/Linux

或者直接

WAP(Dopra Linux) # uname -m
armv7l

实际在搜交叉编译的教程时,要不就是单纯的arm-linux-gcc,不然就是gcc-arm-linux-gnueabi和gcc-arm-linux-gnueabihf,所以就搜armv7l属于哪种。

百度了半天,好像都说armV7属于armhf,想来armv7l应该也是,但实测不行,还得是armel。

具体可以了解一下:

arm-linux-gnueabi-gcc 和 arm-linux-gnueabihf-gcc:

两个交叉编译器分别适用于 armel 和 armhf 两个不同的架构,armel 和 armhf 这两种架构在对待浮点运算采取了不同的策略(有 fpu 的 arm 才能支持这两种浮点运算策略)。

其实这两个交叉编译器只不过是 gcc 的选项 -mfloat-abi 的默认值不同。gcc 的选项 -mfloat-abi 有三种值 soft、softfp、hard(其中后两者都要求arm 里有 fpu 浮点运算单元,soft 与后两者是兼容的,但 softfp 和 hard 两种模式互不兼容):

soft: 不用fpu进行浮点计算,即使有fpu浮点运算单元也不用,而是使用软件模式。

softfp: armel架构(对应的编译器为 arm-linux-gnueabi-gcc )采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。

hard: armhf架构(对应的编译器 arm-linux-gnueabihf-gcc )采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换,性能最好,但是中断负荷高。

下载arm-linux-gcc

由于先森arm-linux-gcc的下载地址时比较痛苦,有点难找,所以显示把各种版本的链接在这里列一下。

下载单纯的arm-linux-gcc,版本较老,4.4.3貌似是2010年发布的了

资源地址:http://www.friendlyelec.com.cn/download.asp

在页面中可以找到下载地址:http://112.124.9.243/arm9net/mini2440/linux/arm-linux-gcc-4.4.3-20100728.tar.gz

下载arm-linux-gnueabi或arm-linux-gnueabihf,资源下载列表页是先选gcc版本,再选编译器架构,最后还要选架构运行平台,这里先森选的是最新版本latest-7中的arm-linux-gnueabi的64位系统版本。由于这个页面加载较慢或者未free无法打开,所以先森把两个版本的下载地址都贴出来:

资源列表页:http://releases.linaro.org/components/toolchain/binaries/

armel架构:http://124.156.146.205/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

armhf架构:http://124.156.146.205/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi.tar.xz

配置arm-linux-gcc

# 下载后解压
tar -xJvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi.tar.xz
# 可选,先森是将其移动重命名了一下
mv gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi /usr/local/arm
# 可选,但建议操作
cd /usr/local/arm/bin
ln -s arm-linux-gnueabi-gcc arm-linux-gcc

建议增加环境变量,不然编译的时候./configure的参数需要加上'CC=/usr/local/arm/bin'

echo 'export PATH=$PATH:/usr/local/arm/bin' >> /etc/profile
source /etc/profile

添加环境变量后,需要执行`arm-linux-gcc -v`测试一下arm-linux-gcc是否存在问题,可能会遇到下面的问题:

bin/.arm-none-linux-gnueabi-gcc: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
# 解决方法:
yum install -y ld-linux.so.2

到这里终于把arm-linux-gcc部分弄完了,下面进入编译环节。

交叉编译libpcap和tcpdump

由于tcpdump需要依赖libpcap,所以需要下载这个包,分别编译,先森下载的最新版本:

https://www.tcpdump.org/release/tcpdump-4.99.1.tar.gz

https://www.tcpdump.org/release/libpcap-1.10.1.tar.gz

交叉编译libpcap

前面准备工作做好了,libpcap还是很好编译的。下载解压后,进入libpcap目录中:

./configure --prefix=/tmp/armroot --host=arm-linux --target=arm-linux --with-pcap=linux
make
make install

# –prefix指定目标文件生成路径(makefile里面的target存放路径);
# –host、–target都写成目标平台即可,例如:arm-liux或mips-linux,光猫是arm的,所以写arm-linux
# --with-pcap将告诉编译器我们正在编译哪种数据包捕获类型
# 如果前面没有加arm-linux-gcc的环境变量,那么需要加上CC='/usr/local/arm/bin'编译链路径

编译时遇到的问题:

# 问题1:
configure: error: Neither flex nor lex was found.
# 解决:
yum install -y flex bison

# 问题2:
/usr/local/arm/bin/../libexec/gcc/arm-none-linux-gnueabi/4.4.3/cc1: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
# 解决:貌似和系统是64位,gcc是32位有关,安装32位的库即可
yum install -y libstdc++.i686

# 问题3:
/usr/local/arm/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.3/../../../../arm-none-linux-gnueabi/bin/as: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory
# 解决:
yum -y install zlib.i686

交叉编译tcpdump

实际测试,tcpdump的交叉编译,必须是编译静态链接,编译器默认是动态链接库。

由于光猫的根路径是只读的,而lib库就在系统路径中,无法在光猫添加确实的动态链接库文件,所以只能选择静态交叉编译这条路了。

解压tcpdump包后,进入目录进行操作:

# 指定静态交叉编译
export CFLAGS=-static
export CPPFLAGS=-static
export LDFLAGS=-static

export ac_cv_linux_vers=3
./configure --prefix=/tmp/armroot --host=arm-linux --target=arm-linux
make
make install
# 编译好的文件就是当前目录下的tcpdump文件,也可以去--prefix执行的目录的bin或sbin目录找到tcpdump

编译tcpdump时遇到的问题:

# 问题1:
configure: error: cannot determine linux version when cross-compiling
# 解决办法:我们需要找出我们的 Ubuntu(或 Linux)操作系统内核正在运行的主要版本。执行 uname -a 命令。
# 注意:您的输出可能会有所不同,但请查找类似于版本号的内容。下面,先森的主机是 3.10.0-1160.45.1.el7.x86_64,我们抓住第一个“3”。
uname -a
Linux VM-0-4-centos 3.10.0-1160.45.1.el7.x86_64 #1 SMP Wed Oct 13 17:20:51 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
# 然后将ac_cv_linux_vers 变量设置为上一个命令中发布的内核版本的主要编号,再尝试编译
export ac_cv_linux_vers=3

# 问题2:
/mnt/jffs2/tcpdump: can't load library 'libc.so.6'
# 解决:缺的动态链接库又没法塞进光猫的系统,所以需要静态交叉编译

# 问题3:静态编译会遇到此类警告
tcpdump.c:(.text+0x5a6): warning: Using 'initgroups' in statically linked applications requires at runtime the shared libraries from the glibc version used for linkin
# 解决:正常现象,只是警告,不影响使用

建议操作

剥离符号信息,使二进制文件更小,这些符号仅在调试应用程序时有用,而光猫的存储容量比较小。

[root@VM-0-4-centos bin]# ll -h
total 14M
-rwxr-xr-x 1 root root 1.9K Apr  2 16:32 pcap-config
-rwxr-xr-x 1 root root 6.9M Apr  2 16:33 tcpdump
-rwxr-xr-x 1 root root 6.9M Apr  2 16:33 tcpdump.4.99.1
[root@VM-0-4-centos bin]# arm-linux-gnueabi-strip tcpdump
[root@VM-0-4-centos bin]# ll -h
total 8.4M
-rwxr-xr-x 1 root root 1.9K Apr  2 16:32 pcap-config
-rwxr-xr-x 1 root root 1.5M Apr  2 16:34 tcpdump
-rwxr-xr-x 1 root root 6.9M Apr  2 16:33 tcpdump.4.99.1

拿到光猫上去运行

折腾了这么多,最终能在光猫上运行才是第一目标。

先森是直接把tcpdump放到服务器的web目录中,然后光猫直接wget下载到光猫中的。

先森在测试交叉编译的运行中,遇到了很多错误,总结下来是以下4种:

# 第一种报错
WAP(Dopra Linux) # ./tcpdump.Ullegal 
Illegal instruction
# 第二种报错
WAP(Dopra Linux) # ./tcpdump.libc 
/mnt/jffs2/tcpdump.libc: can't load library 'libc.so.6'
# 第三种报错
WAP(Dopra Linux) # ./tcpdump.0\:08 
/mnt/jffs2/tcpdump.0:08: can't resolve symbol '__libc_start_main'
# 第四种报错
WAP(Dopra Linux) # ./android-tcpdump 
android-tcpdump: eth0: You don't have permission to capture on that device
(socket: Operation not permitted)

事实上,除了第四种,前三种都是编译有问题的版本,第四种只是提醒没有权限执行。

没有权限的情况,经过一番搜索,先森找到了再次提权的方法(本来以为shell提权已经是终点了),二次提权只需要su切到root,密码:admin,可以通过whoami查看当前角色。

二次提权后执行成功 -2

二次提权后执行成功

写在最后

本来先森是想在文章最后把自己编译好的文件分享出来的,结果在完善本文的时候搜到了一篇Android官方写的tcpdump静态交叉编译的文档,其中有详细的静态编译步骤,也有官方编译好的文件下载地址。先森试了一下,直接下载Android官方编译的tcpdump也是能够在光猫运行的,如果先森一开始就搜到了这边文档或资源。。。。

文档地址:https://www.androidtcpdump.com/android-tcpdump/compile

直接下载:https://www.androidtcpdump.com/android-tcpdump/downloads

历史上的今天:

标签:
除特别注明外,本站所有文章均为成航先森 www.capjsj.cn 原创,本文共7051个字
转载请注明出处来自https://www.capjsj.cn/arm_linux_gcc_tcpdump.html
已有 5 位"计工"发布了激烈的评论,还有N多人围观笑而不语评论
的头像
欢迎发表评论
取消评论

表情
疑问调皮伤心抠鼻黑线微笑可爱奸笑震惊吓到了撇嘴大兵忍不住笑笑狂骂狂怒噢?鼓掌酷⊙﹏⊙b汗鄙视大哭嘿嘿

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. 的头像
    QQ2062886936:

    博客卖吗

    2022-06-27 13:40 回复
  2. 的头像
    Hcat:

    请问如何把/bin目录挂载为可读写,试过很多方法没有作用,有没有交流群之类想一起交流学习一下

    2022-07-24 21:45 回复
  3. 的头像
    Hcat:

    请问如何把光猫/bin目录挂载为可读写的

    2022-07-25 20:21 回复
    • 博主的Gravatar 头像

      @Hcat: 这个目前据我所知没啥好办法,可能把系统重刷可以搞定,但是这就违背初衷了

      2022-08-30 11:24 回复
官方微信
发表评论 返回顶部