标签:路由器
系统运维, 经验杂笔华为光猫HS8145V交叉编译静态tcpdump
先森是个网速强迫症,闲着没事就喜欢研究光猫、路由器那一套,还希望在任何地方只要有网就能控制家里的设备。可惜先森的电信光猫是大内网,双层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的不同版本那么光猫是什么情况呢,可以在命令行进行查看: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实际在搜交叉编译的教程时,要不就是单纯的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.xzarmhf架构: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/binln -s arm-linux-gnueabi-gcc arm-linux-gcc建议增加环境变量,不然编译的时候./configure的参数需要加上'CC=/usr/local/arm/bin'echo 'export PATH=$PATH:/usr/local/arm/bin' >> /etc/profilesource /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.gzhttps://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=linuxmakemake 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=-staticexport CPPFLAGS=-staticexport LDFLAGS=-staticexport ac_cv_linux_vers=3./configure --prefix=/tmp/armroot --host=arm-linux --target=arm-linuxmakemake 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 -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 变量设置为上一个命令中发布的内核版本的主要编号,再尝试编译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 -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拿到光猫上去运行折腾了这么多,最终能在光猫上运行才是第一目标。先森是直接把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查看当前角色。二次提权后执行成功写在最后本来先森是想在文章最后把自己编译好的文件分享出来的,结果在完善本文的时候搜到了一篇Android官方写的tcpdump静态交叉编译的文档,其中有详细的静态编译步骤,也有官方编译好的文件下载地址。先森试了一下,直接下载Android官方编译的tcpdump也是能够在光猫运行的,如果先森一开始就搜到了这边文档或资源。。。。文档地址:https://www.androidtcpdump.com/android-tcpdump/compile直接下载:https://www.androidtcpdump.com/android-tcpdump/downloads
经验杂笔解决连接Aria2出现net::ERR_FAILED的问题
先森在家里的华硕AC86U路由器上插了一个移动硬盘,并在梅林系统里安装了Aira2的插件,做了内网穿透,方便随时随地的下载资源到移动硬盘上,结果用了一段时间发现,Aria2连接不上了。先森使用的Aria2的web页面是AriaNG,打开浏览器审查工具,报错如下:浏览器报错-未连接排查过程先森以为是Aria2插件的问题,排查配置了很多遍,没发现什么异常,甚至重装了一次插件,照样报错。然后怀疑是路由器防火墙问题,查看了下iptables也没啥毛病,改放通也放通了。在服务器上curl http://192.168.50.1:6800/jsonrpc也是有返回:curl的返回PS:因为服务器和路由器已经使用ZeroTier做了内网互通,所以服务器是可以直接访问家里路由器的内网IP的。也在电脑上尝试了telnet 6800端口,没毛病,也是通的。但偏偏就是浏览器上直接访问接口会报错,状态码是400:400 Bad Request发现异常最后,还是在浏览器的审查工具上找到了原因,在审查工具的右上角,除了先森常见的显示[控制台]报错数量的红色提醒外,还有一个[警告]的红色提醒数,点开后就看到了“Ensure private network requests are made from secure contexts”:找到问题原因这么一大串的英文,说的就是使用http站点访问你本地的资源有很大的风险,你得用https来访问,为了降低风险,Chrome浏览器从92版本(2021年7月)就开始禁止这种请求,怪不得用着用着就嗝屁了。解决问题那么知道问题原因了,解决起来就简单了,要么按照Chrome立的规矩来,使用https,要么就关闭这种新特性。先森也懒得换https了,直接关闭Chrome该特性得了。Chrome浏览器打开chrome://flags/#block-insecure-private-network-requests,打开后就是“Block insecure private network requests.”这一项,把它改成“disabled”关闭,再点右下角的“Relaunch”重新启动浏览器就生效了。修改浏览器配置这个问题困扰先森挺久的了,一直以为是服务端配置的问题,万万没想到问题出现在客户端,最后知道真相的先森眼泪。。。