这个项目是本人对Talon Tools: Practical IEEE 802.11ad Research | talon-tools (seemoo-lab.github.io)上的一个项目:Talon Tools: Practical IEEE 802.11ad Research的实现,同时由于该项目中存在不少误区和省略掉的点,本人对其进行了进一步的完善,并结合自己论文所需进行了修改,现将本人学习该项目的过程由本人的OneNote转移至此。
该项目是用于IEEE 802.11ad设备的实际研究。它基于TP-Link的Talon AD7200,这是第一个支持IEEE 802.11ad标准的无线路由器,于2016年发布。利用该平台可以在真实的现场实验中对60ghz毫米波通信的各个方面进行研究。
这个项目是研一上刚刚进入实验室的时候,老师分配的任务。当时作为一个科研小白,对于Linux环境、vim、ssh、TFTP、openWrt等,基本都是一无所知。不过也正是因为这些使得我更有了对知识匮乏的羞愧心以及想努力完成这个项目的决心。个人感觉项目的难点就是对导入的LEDE环境的选择,具体来说就是自己去根据需求选择不同的功能,来组成一个可以运行的Liunx镜像;再一个难点就是去通过查阅资料和独立思考,来决定如何去选择控制某些功能的文件,如本项目中的决定ssh连接、决定wpa_supplicant、AP等模式的文件,并根据所需功能写入所需语句。最大的感受是通过项目锻炼了自己独立思考、勇于尝试、不怕出错、细心记录的好习惯,相信也能对之后的工作有帮助。
起初,准备使用虚拟机配置环境,但是后面用虚拟机一直无法导入系统,但还是简单说一下。
- 先用的virtualbox来安装虚拟机,但是到后面装完系统之后的重启,以及配置静态ip的时候都会有各种各样的错误,虽然都可以解决,但是不推荐,尤其是编译的时候出错了,我想录屏记录一下问题,结果系统直接崩溃了,得从头再来。
- 推荐使用Vmware Workstation来装虚拟机,这个更加稳定。安装Vmware Workstation及用其安装ubuntu系统,配置静态ip就参考这个即可:点击即可查看。但是配置静态ip时会有一些问题,教程中没有涉及。比如说在Desktop版本中,除了可以修改/etc/network/interfaces来进行配置以外;还可以直接在network-manager中配置。但如果修改了interfaces,又配置了network-manager(以下简称nm),你就会发现出现了一些莫名其妙的问题:
- 1,interfaces和 nm中的网络设置不一样,系统实际的IP是哪个?
- 2,有时候莫名其妙的,界面右上角的网络连接图标就丢失了。
- 3,明明在nm中配置了正确的网络设置,就是没法上网。归根结底就是interfaces和nm在争夺对网络的控制权,所以就会出现在修改了interfaces参数之后,无法上网等问题。
- 中间碰到一个问题,显示一个vmdk类的文件无法打开,后来删除了之前的虚拟机就好了,不知道具体原因,再就是在指定磁盘文件的时候,最好选择默认地址,不然容易出错。之后一路顺利到了安装虚拟机了,之前看到教程说最好安装英文版的,这里还是安装的中文版,暂时还没遇见问题。
- 之后就是安装完成重启的时候,出现了 please remove the installation and press enter.在编辑里找到SATA那一项,取消掉开机时启动就好了。
现在ubuntu就装完了,开始配置静态ip,版本是16.04,VMware,之后就跟着步骤一步步来即可,完美解决。最后有个小插曲,一直连不上网,后来才知道是在图形化页面那里网关配置错了,导致用netstat -rn 查看网关时,网关显示的不对,是我们在图形化页面哪里配置的信息,并且另一个地方也会显示failed。现在准备工作做好了,准备开始导入系统。
之后因为虚拟机无法导入系统,询问学长后得知实验室就有现成的ubuntu主机,也就是说之前的工作就在浪费时间,所以说以后有问题要及时问学长学姐和老师。
梳理思路之后,根据教程,配置镜像有两个方法,第一个方法是按照他的详细步骤一步步来,这个是我在用虚拟机的时候采用的方法,但是总会报错,具体为最后一步make之后总会显示make 1的error ,之后在桌面版的ubuntu上尝试也是出现make1 error,但是这次报错内容跟以前不一样,出现了recipe for target failed 。最后确定下来,一个是因为curl包没有安装,另一个就是系统虚拟缓存不够,最后编译成功,系统成功导入。
黄色区域的错误是因为系统给下载分配的虚拟内存不够,运行如下代码:
- git config --global http.postBuffer 2000000000,将其虚拟内存设置大些即可。
-
另一个方法就采用的预置的镜像,将其放在指定文件夹,下载了镜像之后结果无法复制过去,显示 permission denied ,后来给予那个文件夹权限即可 即 sudo chmod -R 777 /var/lib/tftpboot/。
之后按说明设置静态ip,建立tftp连接,小灯全部亮持续大概七八分钟,之后会只有最左边的灯亮,跟说明里面描述的错误的状况不一样,所以认为系统导入成功了。因为没有别的方法可以验证。之后试图用电脑和路由器之间建立ssh链接,一直无法成功,可以确认电脑的sshclient设置没问题,但是一直无法连接到ssh@192.168.0.1,现在怀疑教程给的设备的ip地址是错的,但是无法确定。经过wireshark抓包之后,确认ip不是教程里的给的了,而是动态分配的ip。
之前ssh登录路由器的时候,只是给路由器通上电,之后通过ssh连接,但是一直无法成功,根据百度到的也没法解决,那会试图给路由器连上网在用ssh登录,但是因为之前导入了系统,路由器的默认名字已经跟路由器的说明书里的不一样了,也就没法继续配置网络了,但是因为路由器此时的名字叫做LEDE,所以倒可以佐证我们的系统已经成功导入了。
现在的问题就是ssh一直无法登录,系统导入进去之后, 当用网线将lede和电脑直连进行抓包时,一直显示0.0.0.0和255.255.255.255在通信,抓不到路由器的ip; 当将lede连接到可以上网的路由器的时候,此时lede便可以获得ip,且和另一台路由器ip一样,也可以PING通此时的ip,就是无法用ssh登录,且显示 connection closed by remote host。
-
百度之后发现,一般的用ubuntu系统通过ssh登录一个基于openwrt系统的路由器的时候,需要路由器先开启这个服务,并且需要登陆密码。而教程里没涉及到密码,所以怀疑编译的时候,config文件里面默认配置了路由器的ip,以及ssh登录的公钥私钥等ssh登录必需的文件,但是现在还没找到。所以接下来打算继续在config文件里找ssh相关的文件,或者尝试自己配置一下公钥私钥之类的东西,然后找一下写好的文件应该放在哪里。
后面修改了一下关于ssh登陆的相关配置,如下图:
把圈住的'on'改成了'off',之后重新编译,设置静态ip,重新导入系统,之后路由器可以上网,即系统成功导入,
确认本机ssh客户端已经打开了,但是还是没法ssh登录192.168.0.1,之后通过手机查看路由器ip,此时还是10.108.168.1,跟上次ip一样,但是还是无法ssh登录。一直显示timeout,就是连接不上:Connection closed by remote host,Connection timeout。
-
之后先是在sshserver.pl中修改了Maxstartups,将其从5改到了100,并且查询到SCP/SFTP的端口号是8999,之后还在 package/network/services/dropbear/files/dropbear.config中将修改的需要密码off改回了on,将系统捎回去之后还是不可以,并且在烧系统的时候进行抓包,烧入的过程中还可以抓到路由器的ip为192.168.0.1,导入完成之后就识别不到IP了,跟以前一样。
之后又重看步骤,准备选择文中提到的那个可选择的另一种方法,搭建自己的系统,即alternatively 之后选择的内容。大致修改如下:关闭防火墙,打开ssh服务器,ipv4、ipv6相关。之后通过查看legacy.config确认了默认ip是192.168.1.1。在编译之前的准备大致如上。之后开始导入系统。再后,把主机ip修改为静态的192.168.1.166,可以成功ssh登录,记录如下:
在之后设置登录密码为ad7200,将设备的eth1ip设置为192.168.0.3,之后再通过ssh root@192.168.0.3,即可再次成功登录设备。
-
之后又开启wlan2口(本来网口是没有wlan2,只有wlan1),并将其设置为192.168.100.2,
ifconfig wlan2 192.168.100.2。如图:
-
之后将其设置为AP,再次报错:
hostapd -B /etc/hostapd_wlan2.conf,
通过查看所有文件,发现并没有教程给的 hostapd_wlan2.config,只hostapd.config,但是查询源码之后发现里面根本就没有提及wlan1,只有wlan2,所以有点迷糊。
-
但还是决定运行hostapd -B /etc/hostapd.conf,这样就设置成功了.
-
之后执行第三步 iperf3 -s,显示找不到文件,应该是没有安装。刚确认了一下,确实没有安装iperf3 ,明天准备给路由器连上网看看能不能下载安装,不行的话就重新烧一遍。
-
在进行alternativly后的那一项时,想着去看一下legacy.config,结果发现竟然跟以前看的不一样了,如图:
-
竟然只有这三行没有被注释,没有找到那个192.168.1.1这一项,反而之前记得default,config里面只有前三行没有被注释,这次反而出现了很多,在此之前是把之前的lede文件夹全部删除了的,从头开始,暂时还没想明白是为什么。刚才又想了想,可能是因为还没有进行make menuconfig那一项,导致很多内容还没有加进去,应该是这个的原因。并且之前的步骤就是下载文件,不可能改变源码的,是我草木皆兵了。
-
反思如下:
-
1. 这个是搜到的一个问题,到时候看看会不会是这个问题:今天遇到的问题,之前配置已经通过了,但是这次却不行。重新配置了几次还是不行,后来看论坛有人说这是没有用make clean的问题。因为之前编译通过的文件不会再编译了,所以可能里面当时是错误的,虽然后面改过编译选项了,但是这些文件仍然保留,所以还是会报错。
2. 现在怀疑是utilities/encryption中的crypt setup-openssl,并且还搜到hostapd是依赖于openssl和libnl库的,算是佐证。
3. 再就是现在登进去之后还是没有wifi,且没有hostapd命令,于是把这次目录下的文件与第一次可以成功登录且有hostapd命令时做对比,发现少了以下库,environment pam.conf Pam.d passwd- security shadow-ww。
-
之后针对以上问题做了调整,
1 管理员界面 openwisp中,新加了一个ssl config
2 管理员界面中加了sudo
3 network/support 加了IPSEC,且ipv4 ipv6全加了
4 luci/collection中加了openssl
5 utilities/encryption 中,新加了encrypt setup 和 openssl,但是后面编译的时候二者冲突了,取消了前者
6 选择了hostapd ,单独的,没选新增的那几个。
-
现在可以成功进去,此路由器所需设置均设置完毕,但是依然存在一个小问题,就是之前说的wlan2 wlan1 的问题,不过没有报错。这次是把eth1 设置成了192.168.2.2。
-
之后准备往另一台路由器内导入系统,在此之前,备份了一下这个镜像,以及那个隐藏文件,不过这次隐藏文件出现了两个,全部复制保存了。
现在有一个情况,因为两台路由器名字一样,且在路由器列表里面只出现了一个LEDE路由器,所以只能一个路由器通过无线连接,一个路由器通过有线连接。一台路由器是 t72a9c0 最终将他设置为AP,并开启iperf3的服务器,此时通过windows电脑无线连接此设备。一台路由器是 tc84124 将他设置为iperf3的客户端,此时通过linux主机有线连接此设备,无法建立连接,显示NetWork unreachable。所以我做了如下猜想:
-
猜想一 ,因为之前有一次两台路由器连接成功了,应该是,起码是显示教程里说的情况了,但是当时改了一个路由器的wlan2的ip后,两台路由器的wlan2全部变了,所以当时很迷惑,但是我因此猜测是不是需要两台路由器连接到一个电脑上,然后用这台电脑的无线有线连接这俩路由器。用我这个windows电脑尝试,还是报这个错误。
猜想二 看上面的图,wlan2,貌似没有网络连接,因为ifconfig的时候只有wlan2没有收发包,如图:
-
所以我怀疑是不是因为wlan2没有网才导致网络无法到达,于是我想把wlan1的ip设置为192.168.100.2,之后让他作为服务器,但是不可以,貌似必须得是wlan2。 目前两个尝试均出错。
-
现在发现当路由器作为AP时,执行完hoatapd.conf后,60GHZ灯会亮;但是当其作为客户端时,其60GHZ灯不亮,说明灯没坏,只是将其作为客户端时没有进行开启他60GHZ的步骤。所以去hostapd.conf文件里去找相关的配置,找到一个可能是负责配置AP的:
-
但是把这里注释掉以后就会报错:
-
此时,AP没有了,60GHZ灯依然不亮。之后再次恢复这一项,使能AP_isolation 这时在运行依然会把wlan2设置为AP,说明并没有屏蔽掉AP,还是不符合要求。之后再次把除了
Hw_mode = ad(这一项是设置设备为60GHZ的)的关于AP的全部屏蔽掉,还是不行,报错。加上后面老师说这个名字可能就是设置AP的,所以准备找一下有没有单独设置客户端的选项,暂时没找到。之后搜到如下内容:
-
搜到的这个也可以证明原来hostapd就是用来设置AP模式的,之后准备重点看看wap_supplicant, 另一个情况是阴差阳错的把客户端的60GHZ灯打开了,且也没有在AP模式,之后去连接服务器还是不可以。但是我用手机上下了一个软件就可以连接到这个服务器,说明服务器那里设置没有问题。
-
从头在捋一遍:
现在把之前想过的基本都尝试了一遍,包括改wpa_supplicant里的SSID名字,客户端尝试建立wlan2口且enable60GHZ灯等进一步的措施,认为改改ip那种重复了很多次的方法暂且没用,那就有一个问题,为什么可以通过手机app连接到服务器而我们安装的iperf客户端却连接不上,服务器真的可以认为没有问题吗,按理说作为一个客户端就把客户端装上去就行了,是不是还是像上次ssh登录服务器一样,一直让配客户端结果是服务器的问题,反正不能单独的认为某一个一定没问题。刚想明白应该不是客户端此时没建立起60GHZ的原因,因为我用手机去连192.168.100.2的时候,我的手机也没有60GHZ,但还是可以建立起链接。
另一个问题就是后面打算跳过测试这一步,直接进行建立60GHZ那里,还是报错,显示wpa连接的时候一直被拒绝。到这里 看来wpa是必须要编译的一个,上周记得编译的时候出错了,一会再接着试试。还是回到建立60GHZ那里,上面那行代码已知是把设备作为AP,且开启60GHZ,那么要建立起60GHZ链接,那么我下面这个wpa_supplicant里面肯定是把设备设置为managed 模式,且也会把设备开启60GHZ,但是现在wpa_wupplicant里面啥也没有,只有两行设置SSID相关的东西,所以就是这个文件里面一定是缺东西的,那么就要决定是从menuconfig里面重新看看是不是哪里漏选了,再一个就是看着CSDN的那个方法只编译wpa,我更倾向于前者,
目前正在尝试第一步,往里面加了make libnl等,且系统已经导进去了。但是ssh登陆的时候又变成ECDSA了,需要密码,进不去,此时关于libnl的全选了;之后全部取消掉,重新编译得到之前的正常系统导入。
-
重新理一下思路 ,可以通过wpa_cli和wpa_supplicant这俩分别连接AP,
对于wpa_cli,需要先打开wpa-supplicant,因他是作为服务器,在后台运行,我们用此代码:
wpa_supplicant -Dnl80211 -iwlan2 -c/etc/wpa_supplicant.conf -B
这个是教程里给的,而我们自己搜到的如下:
执行:/system/bin/wpa_supplicant -d -Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf
通过对比发现,下面的代码相比于教程里给的多了执行文件的路径。且二者路径不一样。但是这样的话按理说wpa_supplicant应该就在根目录里,但是没找到。总之按照教程进行显示wpa_supplicant 成功启动。之后按着教程来说应该已经连接上另一台设备了,但是此时处于managed状态的设备60GHZ灯没亮,所以认为并没有成功连接,主要是没有一个好的方法来确定是否已经连接。接下来就按照搜到的方法来进行。执行 wpa_cli -iwlan0 -p/data/system/wpa_supplicant
这里的-p/data/system/wpa_supplicant并不是一个可执行程序,是一个控制套接字?这里给的路径在我们的设备里并不存在,根目录里面并不存在data文件夹。之后会进入交互模式。但此时一直报错,显示wpa_cli无法连接到wpa_supplicant,这个问题还没解决。不过教程说一般不用这个方法。按照方法说,使用wpa_supplicant的配置文件也可以实现链接,我们的教程用的就是这个方法,这个方法也更常用一点,是把上面cli做的这些放在wpa_supplicant.conf里面,用代码来实现。加了几行代码之后报错了,目前来看就是用这个里面的代码来配置,教程给的代码也确实不对,要接着改。至此,终于可以建立连接了。11.17号。
-
现在回顾一下对wpa-supplicant.conf进行的修改。其实本来想着这次还不可以的话就用wpa_cli,因为这个是那种交互模式,没输入一行代码就会显示结果,即为处处有回应,不像wpa_supplicant一样,就显示一个结果。结果成功了,主要还是简单。当时根据搜到的,ctrl_interface=DIR=/data/system/wpa_supplicant
GROUP=system
update_config=1
基本上都有这三行,第一行貌似是所用接口的相关文件,即为wpa_supplicant的路径,据说这是个套接字,且跟上面黄色部分运行wpa_supplicant的路径一样。之后我按照这个路径去找,并不存在data这个文件夹;且我们的.conf也跟搜到的不一样,在/etc里面,且我们也不存在如他的文件夹。但是当时就以为我就搜索一下文件名找到了挨个试就行。搜到的如下:
-
找到了如上两个路径,之后便挨个试,都报错。之后便认为肯定是这个路径选的不对,但是这两个都试了也不对,便想到了上面说的。既然搜到的方法里面这一行的路径跟运行wpa_supplicant的路径一样,那么我的设备里是不是也要一样,事实证明猜对了。教程里事只用wpa_supplicant便开启服务,没有之前的路径。那么我在配置conf文件时,他前面也不加路径,之后便成功连接。此时wpa_supplicant.conf内配置如下:
此时我去掉了GROUP=system这一项,因为这个一直报错。之后便成功连接。此外还用iperf3测试了他的最大速率,当时把两个路由器间隔设在了大约20厘米,结果如下,约为1.5G。当吧一个路由器放在实验室左后角,另一个放在前面试验台时,结果如下约为400M。
-
现在有一个小问题,就是他的60GHZ灯有时候开启完连接指令后不亮,之前是开启之后迅速响应的,不知道到底是电源线的问题还是系统没有配置完美。
至此,平台搭建暂时告一段落。之后会重点学习信息的采集,之前一直以为导入的框架可以直接采集CSI信息,结果却还是RSS and SNR,之后经过计算获取CSI,而不是直接读出。接下来的打算是针对17,18这两个论文,争取复现一下,采集CSI。唯一的安慰就是发布该教程的实验室发布了几个新的框架,可以支持802.11a ac等设备了。相信不久以后就可以支持我们的ad设备。
-
对于下面这个文件 :有人说在这里读出来了RSSI,但是这里目前是空白的:
-
而对于下面这个文件,一开始记不得当时有没有连接AP和STATION了,总之看到了snr值为0.之后试着让STATION 一直ping AP,继续通过代码查看此文件,发现都是很大的数,如下:动辄+-1000dB
-
之后又通过iperf来测试连接的极限性能,因为期间也会进行收发信息,想再次运行代码来获取sweep_dump的值,发现出现的数字跟上面几乎是一样的数字。也很奇怪。因此之后采取了师兄师姐的意见,尝试着回复到snr为0的那次。于是便分别重启两台设备,想着能恢复到为0的状态。
于是在重启之后,且二者没有建立连接的情况下,sweep_dump的内容还是上图内容,至少此时没有回复到snr为0的状态。(此时一直获得的AP上sweep_dump的值)
现在打算建立起二者的连接,并准备查看STATION上sweep_dump的内容。这次数值较为正常,且随着我选择ping或者测试极限带宽,snr数值会变化了。但是这毕竟是客户端,他发送信号给服务器,即这是发射端的信噪比,最好还是要测接收端的信噪比,所以重新去查看iperf3服务器的sweep_dump。这次依然是无论采用ping 还是iperf3 得方法,其数值均一样,只不过不同于上面重启之前的数据,这么说的话貌似是每次重启之后产生一个数值就不变化了,很奇怪。
之后在教程所在的github里发现有人问了相关问题。总结如下:1 跟我们一样,他的sweep_dump_cur是空的,没有RSSI值,提问了,没人回答。
2 他的sweep_dump_cur里面有内容,不过内容很奇怪,也是RSSI数值极大,不正常。这个有人回复他说
There should be an initial association so the values are initilized.At first,they are initilized by random numbers.
我怀疑我们获得得服务器端得SNR值也是随机的数。刚意识到是什么原因了,忘了把文件复制到服务器这里了。现在是服务器端的,全0,现在是没有任何连接的情况:
-
这是一台设备ping另一台设备时,接收端读出来的信噪比。(显示不完整。)
-
之后的内容就涉及到信号和论文的实验了,大致包括通过shell语言写几个脚本来控制信号采集等,故不再赘述了。至此,该项目对我来说就算彻底结束了。这是我研一上刚刚进入实验室的时候第一次接触这种类型的项目,当时对我来说,Linux环境、ssh等等,都是之前较少接触的东西,但是个人还是认为自己有查阅资料、独立思考的能力,同时也离不开老师的指导,最终完成了这个项目。