華為光貓HS8145V交叉編譯靜態(tài)tcpdump
編輯:狂族晨曦 來源:系統(tǒng)運維,經(jīng)驗雜筆 日期:2022-04-03 閱讀: 2,895 次 5 條評論 » 百度已收錄
先森是個網(wǎng)速強迫癥,閑著沒事就喜歡研究光貓、路由器那一套,還希望在任何地方只要有網(wǎng)就能控制家里的設(shè)備。可惜先森的電信光貓是大內(nèi)網(wǎng),雙層NAT,沒有ipv4公網(wǎng)IP,結(jié)果偶然先森發(fā)現(xiàn)家里設(shè)備都可以直連ipv6了,而且分配到設(shè)備的ipv6地址還是公網(wǎng)的,先森就想著使用ipv6來突破網(wǎng)絡限制。
結(jié)果,運營商為了保證安全,默認是限制了ipv6入訪的。
由于家里寬帶不是先森辦理的,先森不太方便直接將光貓改為橋接的模式,所幸是先森拿到了光貓超管密碼,還可以通過shell的方式去操作iptables調(diào)整入訪策略。但光貓的iptables策略特別多,先森也得為安全考慮,不能直接全放通,所以得進行測試。結(jié)果問題來了,光貓的shell中沒有tcpdump的命令,沒法抓包,讓先森調(diào)試的心態(tài)爆炸,當時各種搜索都沒有找到光貓抓包的方法。
由于ipv6的支持在先森身邊依舊不是那么普遍,像先森公司的商纖就沒有分配ipv6(不知道是不是公司IT把ipv6分配給關(guān)了),騰訊云CDN回源也不支持ipv6源站,所以當時先森一條條iptables策略調(diào)試的差不多之后,也就擱置了。但是沒法運行tcpdump抓包這個事一直讓先森如鯁在喉,然后最近突然知道了“交叉編譯”這么一個玩意兒,讓先森沉寂的心死灰復燃。
交叉編譯:交叉編譯是在一個平臺上生成另一個平臺上的可執(zhí)行代碼。如在x86平臺上編譯ARM平臺上運行的可執(zhí)行代碼。
先森在折騰的過程中遇到很多坑,在這里記錄一下。
配置情況
光貓:華為HS8145V,已經(jīng)開啟telnet;
交叉編譯主機:CentOS 7.9 x86_64,其實應該用Ubuntu來交叉編譯更方便,但是先森對這系統(tǒng)不熟。
交叉編譯器的尋找歷程
確認平臺
在網(wǎng)上搜交叉編譯tcpdump的教程,一開始根本沒注意到編譯器,然后直接上手編譯,這就跟平時正常編譯一樣,編譯出來的是gcc編譯的,根本不是交叉編譯的。
網(wǎng)上教程說要確認目標機是arm-linux還是mips-linux什么的,先森看光貓通過telnet登錄的時候有什么BusyBox、Dopra Linux,搜了一圈也沒能明確搜出來華為光貓的系統(tǒng)屬于什么,只是搜到有說華為光貓使用的是海思芯片,屬于arm架構(gòu)的,最后是`uname -m`確認到華為這個是arm平臺。
選擇arm-linux-gcc
確認了光貓HS8145V是arm后,目標就很明確了,下載一下交叉編譯器,然后開整。
但先森萬萬沒想到,arm-linux-gcc的下載鏈接那么難找,好不容易找到了,結(jié)果又發(fā)現(xiàn)arm-linux-gcc有很多版本,還要根據(jù)光貓arm的情況來選。

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 兩個不同的架構(gòu),armel 和 armhf 這兩種架構(gòu)在對待浮點運算采取了不同的策略(有 fpu 的 arm 才能支持這兩種浮點運算策略)。
其實這兩個交叉編譯器只不過是 gcc 的選項 -mfloat-abi 的默認值不同。gcc 的選項 -mfloat-abi 有三種值 soft、softfp、hard(其中后兩者都要求arm 里有 fpu 浮點運算單元,soft 與后兩者是兼容的,但 softfp 和 hard 兩種模式互不兼容):
soft: 不用fpu進行浮點計算,即使有fpu浮點運算單元也不用,而是使用軟件模式。
softfp: armel架構(gòu)(對應的編譯器為 arm-linux-gnueabi-gcc )采用的默認值,用fpu計算,但是傳參數(shù)用普通寄存器傳,這樣中斷的時候,只需要保存普通寄存器,中斷負荷小,但是參數(shù)需要轉(zhuǎn)換成浮點的再計算。
hard: armhf架構(gòu)(對應的編譯器 arm-linux-gnueabihf-gcc )采用的默認值,用fpu計算,傳參數(shù)也用fpu中的浮點寄存器傳,省去了轉(zhuǎn)換,性能最好,但是中斷負荷高。
下載arm-linux-gcc
由于先森arm-linux-gcc的下載地址時比較痛苦,有點難找,所以顯示把各種版本的鏈接在這里列一下。
下載單純的arm-linux-gcc,版本較老,4.4.3貌似是2010年發(fā)布的了
資源地址: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版本,再選編譯器架構(gòu),最后還要選架構(gòu)運行平臺,這里先森選的是最新版本latest-7中的arm-linux-gnueabi的64位系統(tǒng)版本。由于這個頁面加載較慢或者未free無法打開,所以先森把兩個版本的下載地址都貼出來:
資源列表頁:http://releases.linaro.org/components/toolchain/binaries/armel架構(gòu):http://124.156.146.205/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
armhf架構(gòu):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
建議增加環(huán)境變量,不然編譯的時候./configure的參數(shù)需要加上'CC=/usr/local/arm/bin'
echo 'export PATH=$PATH:/usr/local/arm/bin' >> /etc/profile source /etc/profile
添加環(huán)境變量后,需要執(zhí)行`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部分弄完了,下面進入編譯環(huán)節(jié)。
交叉編譯libpcap和tcpdump
由于tcpdump需要依賴libpcap,所以需要下載這個包,分別編譯,先森下載的最新版本:
https://www.tcpdump.org/release/tcpdump-4.99.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將告訴編譯器我們正在編譯哪種數(shù)據(jù)包捕獲類型 # 如果前面沒有加arm-linux-gcc的環(huán)境變量,那么需要加上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 # 解決:貌似和系統(tǒng)是64位,gcc是32位有關(guān),安裝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的交叉編譯,必須是編譯靜態(tài)鏈接,編譯器默認是動態(tài)鏈接庫。
由于光貓的根路徑是只讀的,而lib庫就在系統(tǒng)路徑中,無法在光貓?zhí)砑哟_實的動態(tài)鏈接庫文件,所以只能選擇靜態(tài)交叉編譯這條路了。
解壓tcpdump包后,進入目錄進行操作:
# 指定靜態(tài)交叉編譯 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執(zhí)行的目錄的bin或sbin目錄找到tcpdump
編譯tcpdump時遇到的問題:
# 問題1: configure: error: cannot determine linux version when cross-compiling # 解決辦法:我們需要找出我們的 Ubuntu(或 Linux)操作系統(tǒng)內(nèi)核正在運行的主要版本。執(zhí)行 uname -a 命令。 # 注意:您的輸出可能會有所不同,但請查找類似于版本號的內(nèi)容。下面,先森的主機是 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 變量設(shè)置為上一個命令中發(fā)布的內(nèi)核版本的主要編號,再嘗試編譯 export ac_cv_linux_vers=3 # 問題2: /mnt/jffs2/tcpdump: can't load library 'libc.so.6' # 解決:缺的動態(tài)鏈接庫又沒法塞進光貓的系統(tǒng),所以需要靜態(tài)交叉編譯 # 問題3:靜態(tài)編譯會遇到此類警告 tcpdump.c:(.text+0x5a6): warning: Using 'initgroups' in statically linked applications requires at runtime the shared libraries from the glibc version used for linkin # 解決:正常現(xiàn)象,只是警告,不影響使用
建議操作
剝離符號信息,使二進制文件更小,這些符號僅在調(diào)試應用程序時有用,而光貓的存儲容量比較小。
[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下載到光貓中的。
先森在測試交叉編譯的運行中,遇到了很多錯誤,總結(jié)下來是以下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)
事實上,除了第四種,前三種都是編譯有問題的版本,第四種只是提醒沒有權(quán)限執(zhí)行。
沒有權(quán)限的情況,經(jīng)過一番搜索,先森找到了再次提權(quán)的方法(本來以為shell提權(quán)已經(jīng)是終點了),二次提權(quán)只需要su切到root,密碼:admin,可以通過whoami查看當前角色。

二次提權(quán)后執(zhí)行成功
寫在最后
本來先森是想在文章最后把自己編譯好的文件分享出來的,結(jié)果在完善本文的時候搜到了一篇Android官方寫的tcpdump靜態(tài)交叉編譯的文檔,其中有詳細的靜態(tài)編譯步驟,也有官方編譯好的文件下載地址。先森試了一下,直接下載Android官方編譯的tcpdump也是能夠在光貓運行的,如果先森一開始就搜到了這邊文檔或資源。。。。
文檔地址:https://www.androidtcpdump.com/android-tcpdump/compile直接下載:https://www.androidtcpdump.com/android-tcpdump/downloads
歷史上的今天:
轉(zhuǎn)載請注明出處來自http://www.cnidcc.cn/arm_linux_gcc_tcpdump.html

川公網(wǎng)安備 51011202000104號
博客賣嗎
@QQ2062886936: 抱歉,不賣
請問如何把/bin目錄掛載為可讀寫,試過很多方法沒有作用,有沒有交流群之類想一起交流學習一下
請問如何把光貓/bin目錄掛載為可讀寫的
@Hcat: 這個目前據(jù)我所知沒啥好辦法,可能把系統(tǒng)重刷可以搞定,但是這就違背初衷了