標(biāo)簽:路由器
系統(tǒng)運(yùn)維, 經(jīng)驗(yàn)雜筆華為光貓HS8145V交叉編譯靜態(tài)tcpdump
先森是個(gè)網(wǎng)速?gòu)?qiáng)迫癥,閑著沒(méi)事就喜歡研究光貓、路由器那一套,還希望在任何地方只要有網(wǎng)就能控制家里的設(shè)備??上壬碾娦殴庳埵谴髢?nèi)網(wǎng),雙層NAT,沒(méi)有ipv4公網(wǎng)IP,結(jié)果偶然先森發(fā)現(xiàn)家里設(shè)備都可以直連ipv6了,而且分配到設(shè)備的ipv6地址還是公網(wǎng)的,先森就想著使用ipv6來(lái)突破網(wǎng)絡(luò)限制。結(jié)果,運(yùn)營(yíng)商為了保證安全,默認(rèn)是限制了ipv6入訪的。由于家里寬帶不是先森辦理的,先森不太方便直接將光貓改為橋接的模式,所幸是先森拿到了光貓超管密碼,還可以通過(guò)shell的方式去操作iptables調(diào)整入訪策略。但光貓的iptables策略特別多,先森也得為安全考慮,不能直接全放通,所以得進(jìn)行測(cè)試。結(jié)果問(wèn)題來(lái)了,光貓的shell中沒(méi)有tcpdump的命令,沒(méi)法抓包,讓先森調(diào)試的心態(tài)爆炸,當(dāng)時(shí)各種搜索都沒(méi)有找到光貓抓包的方法。由于ipv6的支持在先森身邊依舊不是那么普遍,像先森公司的商纖就沒(méi)有分配ipv6(不知道是不是公司IT把ipv6分配給關(guān)了),騰訊云CDN回源也不支持ipv6源站,所以當(dāng)時(shí)先森一條條iptables策略調(diào)試的差不多之后,也就擱置了。但是沒(méi)法運(yùn)行tcpdump抓包這個(gè)事一直讓先森如鯁在喉,然后最近突然知道了“交叉編譯”這么一個(gè)玩意兒,讓先森沉寂的心死灰復(fù)燃。交叉編譯:交叉編譯是在一個(gè)平臺(tái)上生成另一個(gè)平臺(tái)上的可執(zhí)行代碼。如在x86平臺(tái)上編譯ARM平臺(tái)上運(yùn)行的可執(zhí)行代碼。先森在折騰的過(guò)程中遇到很多坑,在這里記錄一下。配置情況光貓:華為HS8145V,已經(jīng)開(kāi)啟telnet;交叉編譯主機(jī):CentOS 7.9 x86_64,其實(shí)應(yīng)該用Ubuntu來(lái)交叉編譯更方便,但是先森對(duì)這系統(tǒng)不熟。交叉編譯器的尋找歷程確認(rèn)平臺(tái)在網(wǎng)上搜交叉編譯tcpdump的教程,一開(kāi)始根本沒(méi)注意到編譯器,然后直接上手編譯,這就跟平時(shí)正常編譯一樣,編譯出來(lái)的是gcc編譯的,根本不是交叉編譯的。網(wǎng)上教程說(shuō)要確認(rèn)目標(biāo)機(jī)是arm-linux還是mips-linux什么的,先森看光貓通過(guò)telnet登錄的時(shí)候有什么BusyBox、Dopra Linux,搜了一圈也沒(méi)能明確搜出來(lái)華為光貓的系統(tǒng)屬于什么,只是搜到有說(shuō)華為光貓使用的是海思芯片,屬于arm架構(gòu)的,最后是`uname -m`確認(rèn)到華為這個(gè)是arm平臺(tái)。選擇arm-linux-gcc確認(rèn)了光貓HS8145V是arm后,目標(biāo)就很明確了,下載一下交叉編譯器,然后開(kāi)整。但先森萬(wàn)萬(wàn)沒(méi)想到,arm-linux-gcc的下載鏈接那么難找,好不容易找到了,結(jié)果又發(fā)現(xiàn)arm-linux-gcc有很多版本,還要根據(jù)光貓arm的情況來(lái)選。arm-linux-gcc的不同版本那么光貓是什么情況呢,可以在命令行進(jìn)行查看:WAP(Dopra Linux) # uname -aLinux EchoLife_WAP 3.10.53-HULK2 #1 SMP Fri Oct 20 01:08:58 CST 2017 armv7l GNU/Linux或者直接WAP(Dopra Linux) # uname -marmv7l實(shí)際在搜交叉編譯的教程時(shí),要不就是單純的arm-linux-gcc,不然就是gcc-arm-linux-gnueabi和gcc-arm-linux-gnueabihf,所以就搜a(bǔ)rmv7l屬于哪種。百度了半天,好像都說(shuō)armV7屬于armhf,想來(lái)armv7l應(yīng)該也是,但實(shí)測(cè)不行,還得是armel。具體可以了解一下:arm-linux-gnueabi-gcc 和 arm-linux-gnueabihf-gcc:兩個(gè)交叉編譯器分別適用于 armel 和 armhf 兩個(gè)不同的架構(gòu),armel 和 armhf 這兩種架構(gòu)在對(duì)待浮點(diǎn)運(yùn)算采取了不同的策略(有 fpu 的 arm 才能支持這兩種浮點(diǎn)運(yùn)算策略)。其實(shí)這兩個(gè)交叉編譯器只不過(guò)是 gcc 的選項(xiàng) -mfloat-abi 的默認(rèn)值不同。gcc 的選項(xiàng) -mfloat-abi 有三種值 soft、softfp、hard(其中后兩者都要求arm 里有 fpu 浮點(diǎn)運(yùn)算單元,soft 與后兩者是兼容的,但 softfp 和 hard 兩種模式互不兼容):soft: 不用fpu進(jìn)行浮點(diǎn)計(jì)算,即使有fpu浮點(diǎn)運(yùn)算單元也不用,而是使用軟件模式。softfp: armel架構(gòu)(對(duì)應(yīng)的編譯器為 arm-linux-gnueabi-gcc )采用的默認(rèn)值,用fpu計(jì)算,但是傳參數(shù)用普通寄存器傳,這樣中斷的時(shí)候,只需要保存普通寄存器,中斷負(fù)荷小,但是參數(shù)需要轉(zhuǎn)換成浮點(diǎn)的再計(jì)算。hard: armhf架構(gòu)(對(duì)應(yīng)的編譯器 arm-linux-gnueabihf-gcc )采用的默認(rèn)值,用fpu計(jì)算,傳參數(shù)也用fpu中的浮點(diǎn)寄存器傳,省去了轉(zhuǎn)換,性能最好,但是中斷負(fù)荷高。下載arm-linux-gcc由于先森arm-linux-gcc的下載地址時(shí)比較痛苦,有點(diǎn)難找,所以顯示把各種版本的鏈接在這里列一下。下載單純的arm-linux-gcc,版本較老,4.4.3貌似是2010年發(fā)布的了資源地址:http://www.friendlyelec.com.cn/download.asp在頁(yè)面中可以找到下載地址:http://112.124.9.243/arm9net/mini2440/linux/arm-linux-gcc-4.4.3-20100728.tar.gz下載arm-linux-gnueabi或arm-linux-gnueabihf,資源下載列表頁(yè)是先選gcc版本,再選編譯器架構(gòu),最后還要選架構(gòu)運(yùn)行平臺(tái),這里先森選的是最新版本latest-7中的arm-linux-gnueabi的64位系統(tǒng)版本。由于這個(gè)頁(yè)面加載較慢或者未free無(wú)法打開(kāi),所以先森把兩個(gè)版本的下載地址都貼出來(lái):資源列表頁(yè):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.xzarmhf架構(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# 可選,先森是將其移動(dòng)重命名了一下mv gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi /usr/local/arm# 可選,但建議操作cd /usr/local/arm/binln -s arm-linux-gnueabi-gcc arm-linux-gcc建議增加環(huán)境變量,不然編譯的時(shí)候./configure的參數(shù)需要加上'CC=/usr/local/arm/bin'echo 'export PATH=$PATH:/usr/local/arm/bin' >> /etc/profilesource /etc/profile添加環(huán)境變量后,需要執(zhí)行`arm-linux-gcc -v`測(cè)試一下arm-linux-gcc是否存在問(wèn)題,可能會(huì)遇到下面的問(wèn)題: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到這里終于把a(bǔ)rm-linux-gcc部分弄完了,下面進(jìn)入編譯環(huán)節(jié)。交叉編譯libpcap和tcpdump由于tcpdump需要依賴libpcap,所以需要下載這個(gè)包,分別編譯,先森下載的最新版本:https://www.tcpdump.org/release/tcpdump-4.99.1.tar.gzhttps://www.tcpdump.org/release/libpcap-1.10.1.tar.gz交叉編譯libpcap前面準(zhǔn)備工作做好了,libpcap還是很好編譯的。下載解壓后,進(jìn)入libpcap目錄中:./configure --prefix=/tmp/armroot --host=arm-linux --target=arm-linux --with-pcap=linuxmakemake install# –prefix指定目標(biāo)文件生成路徑(makefile里面的target存放路徑);# –host、–target都寫(xiě)成目標(biāo)平臺(tái)即可,例如:arm-liux或mips-linux,光貓是arm的,所以寫(xiě)arm-linux# --with-pcap將告訴編譯器我們正在編譯哪種數(shù)據(jù)包捕獲類型# 如果前面沒(méi)有加arm-linux-gcc的環(huán)境變量,那么需要加上CC='/usr/local/arm/bin'編譯鏈路徑編譯時(shí)遇到的問(wèn)題:# 問(wèn)題1:configure: error: Neither flex nor lex was found.# 解決:yum install -y flex bison# 問(wèn)題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位的庫(kù)即可yum install -y libstdc++.i686# 問(wèn)題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實(shí)際測(cè)試,tcpdump的交叉編譯,必須是編譯靜態(tài)鏈接,編譯器默認(rèn)是動(dòng)態(tài)鏈接庫(kù)。由于光貓的根路徑是只讀的,而lib庫(kù)就在系統(tǒng)路徑中,無(wú)法在光貓?zhí)砑哟_實(shí)的動(dòng)態(tài)鏈接庫(kù)文件,所以只能選擇靜態(tài)交叉編譯這條路了。解壓tcpdump包后,進(jìn)入目錄進(jìn)行操作:# 指定靜態(tài)交叉編譯export CFLAGS=-staticexport CPPFLAGS=-staticexport LDFLAGS=-staticexport ac_cv_linux_vers=3./configure --prefix=/tmp/armroot --host=arm-linux --target=arm-linuxmakemake install# 編譯好的文件就是當(dāng)前目錄下的tcpdump文件,也可以去--prefix執(zhí)行的目錄的bin或sbin目錄找到tcpdump編譯tcpdump時(shí)遇到的問(wèn)題:# 問(wèn)題1:configure: error: cannot determine linux version when cross-compiling# 解決辦法:我們需要找出我們的 Ubuntu(或 Linux)操作系統(tǒng)內(nèi)核正在運(yùn)行的主要版本。執(zhí)行 uname -a 命令。# 注意:您的輸出可能會(huì)有所不同,但請(qǐng)查找類似于版本號(hào)的內(nèi)容。下面,先森的主機(jī)是 3.10.0-1160.45.1.el7.x86_64,我們抓住第一個(gè)“3”。uname -aLinux 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è)置為上一個(gè)命令中發(fā)布的內(nèi)核版本的主要編號(hào),再嘗試編譯export ac_cv_linux_vers=3# 問(wèn)題2:/mnt/jffs2/tcpdump: can't load library 'libc.so.6'# 解決:缺的動(dòng)態(tài)鏈接庫(kù)又沒(méi)法塞進(jìn)光貓的系統(tǒng),所以需要靜態(tài)交叉編譯# 問(wèn)題3:靜態(tài)編譯會(huì)遇到此類警告tcpdump.c:(.text+0x5a6): warning: Using 'initgroups' in statically linked applications requires at runtime the shared libraries from the glibc version used for linkin# 解決:正?,F(xiàn)象,只是警告,不影響使用建議操作剝離符號(hào)信息,使二進(jìn)制文件更小,這些符號(hào)僅在調(diào)試應(yīng)用程序時(shí)有用,而光貓的存儲(chǔ)容量比較小。[root@VM-0-4-centos bin]# ll -htotal 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 -htotal 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拿到光貓上去運(yùn)行折騰了這么多,最終能在光貓上運(yùn)行才是第一目標(biāo)。先森是直接把tcpdump放到服務(wù)器的web目錄中,然后光貓直接wget下載到光貓中的。先森在測(cè)試交叉編譯的運(yùn)行中,遇到了很多錯(cuò)誤,總結(jié)下來(lái)是以下4種:# 第一種報(bào)錯(cuò)WAP(Dopra Linux) # ./tcpdump.Ullegal Illegal instruction# 第二種報(bào)錯(cuò)WAP(Dopra Linux) # ./tcpdump.libc /mnt/jffs2/tcpdump.libc: can't load library 'libc.so.6'# 第三種報(bào)錯(cuò)WAP(Dopra Linux) # ./tcpdump.0\:08 /mnt/jffs2/tcpdump.0:08: can't resolve symbol '__libc_start_main'# 第四種報(bào)錯(cuò)WAP(Dopra Linux) # ./android-tcpdump android-tcpdump: eth0: You don't have permission to capture on that device(socket: Operation not permitted)事實(shí)上,除了第四種,前三種都是編譯有問(wèn)題的版本,第四種只是提醒沒(méi)有權(quán)限執(zhí)行。沒(méi)有權(quán)限的情況,經(jīng)過(guò)一番搜索,先森找到了再次提權(quán)的方法(本來(lái)以為shell提權(quán)已經(jīng)是終點(diǎn)了),二次提權(quán)只需要su切到root,密碼:admin,可以通過(guò)whoami查看當(dāng)前角色。二次提權(quán)后執(zhí)行成功寫(xiě)在最后本來(lái)先森是想在文章最后把自己編譯好的文件分享出來(lái)的,結(jié)果在完善本文的時(shí)候搜到了一篇Android官方寫(xiě)的tcpdump靜態(tài)交叉編譯的文檔,其中有詳細(xì)的靜態(tài)編譯步驟,也有官方編譯好的文件下載地址。先森試了一下,直接下載Android官方編譯的tcpdump也是能夠在光貓運(yùn)行的,如果先森一開(kāi)始就搜到了這邊文檔或資源。。。。文檔地址:https://www.androidtcpdump.com/android-tcpdump/compile直接下載:https://www.androidtcpdump.com/android-tcpdump/downloads
經(jīng)驗(yàn)雜筆解決連接Aria2出現(xiàn)net::ERR_FAILED的問(wèn)題
先森在家里的華碩AC86U路由器上插了一個(gè)移動(dòng)硬盤(pán),并在梅林系統(tǒng)里安裝了Aira2的插件,做了內(nèi)網(wǎng)穿透,方便隨時(shí)隨地的下載資源到移動(dòng)硬盤(pán)上,結(jié)果用了一段時(shí)間發(fā)現(xiàn),Aria2連接不上了。先森使用的Aria2的web頁(yè)面是AriaNG,打開(kāi)瀏覽器審查工具,報(bào)錯(cuò)如下:瀏覽器報(bào)錯(cuò)-未連接排查過(guò)程先森以為是Aria2插件的問(wèn)題,排查配置了很多遍,沒(méi)發(fā)現(xiàn)什么異常,甚至重裝了一次插件,照樣報(bào)錯(cuò)。然后懷疑是路由器防火墻問(wèn)題,查看了下iptables也沒(méi)啥毛病,改放通也放通了。在服務(wù)器上curl http://192.168.50.1:6800/jsonrpc也是有返回:curl的返回PS:因?yàn)榉?wù)器和路由器已經(jīng)使用ZeroTier做了內(nèi)網(wǎng)互通,所以服務(wù)器是可以直接訪問(wèn)家里路由器的內(nèi)網(wǎng)IP的。也在電腦上嘗試了telnet 6800端口,沒(méi)毛病,也是通的。但偏偏就是瀏覽器上直接訪問(wèn)接口會(huì)報(bào)錯(cuò),狀態(tài)碼是400:400 Bad Request發(fā)現(xiàn)異常最后,還是在瀏覽器的審查工具上找到了原因,在審查工具的右上角,除了先森常見(jiàn)的顯示[控制臺(tái)]報(bào)錯(cuò)數(shù)量的紅色提醒外,還有一個(gè)[警告]的紅色提醒數(shù),點(diǎn)開(kāi)后就看到了“Ensure private network requests are made from secure contexts”:找到問(wèn)題原因這么一大串的英文,說(shuō)的就是使用http站點(diǎn)訪問(wèn)你本地的資源有很大的風(fēng)險(xiǎn),你得用https來(lái)訪問(wèn),為了降低風(fēng)險(xiǎn),Chrome瀏覽器從92版本(2021年7月)就開(kāi)始禁止這種請(qǐng)求,怪不得用著用著就嗝屁了。解決問(wèn)題那么知道問(wèn)題原因了,解決起來(lái)就簡(jiǎn)單了,要么按照Chrome立的規(guī)矩來(lái),使用https,要么就關(guān)閉這種新特性。先森也懶得換https了,直接關(guān)閉Chrome該特性得了。Chrome瀏覽器打開(kāi)chrome://flags/#block-insecure-private-network-requests,打開(kāi)后就是“Block insecure private network requests.”這一項(xiàng),把它改成“disabled”關(guān)閉,再點(diǎn)右下角的“Relaunch”重新啟動(dòng)瀏覽器就生效了。修改瀏覽器配置這個(gè)問(wèn)題困擾先森挺久的了,一直以為是服務(wù)端配置的問(wèn)題,萬(wàn)萬(wàn)沒(méi)想到問(wèn)題出現(xiàn)在客戶端,最后知道真相的先森眼淚。。。

川公網(wǎng)安備 51011202000104號(hào)