Closed sequencer closed 3 years ago
同考研…… 我也有按文件夹整理的想法,会去做的~
同时if_ether.h的头是linux下的? 貌似FreeBSD和Mac都不支援? 我看了下在Mac下编译的话,Mac的底层也不是很好支持。 不知道这个头是用于做什么了? 还是就是一堆define? 能否用netinet/if_ether.h替代?#看来不行 差别很大 有没有办法绕过?
是为了ETH_P_PAE这个定义,就是0x888e.
此外,由于获取网关时用到了netlink,macOS应该就没办法了,得想点别的办法……
我准备调试才发现早把Clion删了hhh 晚上回家再看看代码
在net_util.c里的obtain_iface_ipv4_gateway就是。
功能:获得指定接口上的IPv4默认路由
参数:
const char* ifname
接口名称uint8_* buf
成功的话默认路由的二进制表示会写到这里面(4个字节,比如DA C5 01 01/218.197.1.1)返回:
这两个返回值定义在minieap_common.h里面。
macOS下PF_LINK不能直接使用,还是要上体积巨大的libpcap。这个问题过去了不知道还有什么问题……
NKE 应该有需要的api 可惜都是swift和oc的 或者要不混合编译会不会好一点?
没有学过苹果这方面的开发……再写一个libpcap的网络插件?
我表示只会swift 到时候注释完善之后,一个个写估计也不多
……大哥你们考研时间也真是多,我忙完申请之后也来看看吧。不过这个还是要考虑一下跨平台问题的,原来mac下mentohust不是用的pcap吗?
pcap 好臃肿
我现在把文件整理到子目录了,但相应的Makefile编写遇到了些问题。我实现了下面两个方法:
include每个子目录的makefile (minieap.mk)
这种方法跟Android的编译系统有点像(但是Android应该不是这么实现的),可以实现以自定义的模块名称来选择编译哪些模块,而不需要像下面一个方法一样必须使用目录名来选择模块。而且,新加的模块目录可以任意放置,只要在这个项目底下,就可以搜到并被选中。一个目录里也能有多个模块可供选择。而且模块可以向整个程序的链接器添加选项,也可以告知顶层Makefile自己有在哪里有哪些.o文件需要参与链接,也就是变量能够回传到顶层的Makefile里。但问题在于这方法似乎不是100%稳定,也许是我的Makefile水平不足(毕竟一晚上速成23333)还请大家测试了。
这种是传统方法,每个子目录独立make,然后顶层Makefile收集所有的.o做链接(不知道有没有其他收集目标文件的做法,现在这个会收集到以前编译了但这次没有被选择的文件)。这个方法里选择模块是通过目录完成的,每个选择的模块要在if_impl或packet_plugin下有同名目录。此外,每次make的时候不知道为什么总是要全部重新编译。相比上面的方法,不能由模块来给链接器附加选项,像选择libpcap插件的时候需要自己在顶层Makefile里添加LDFLAGS := -lpcap
,如果不选择libpcap模块的话又要删掉。但这个方法胜在稳定。
这些话看起来好像我明显偏袒前一个方法2333不过大家还是看看到底哪一种更有道理吧……
此外,我也写了一个使用libpcap的插件,链接libpcap后可以用--if-impl libpcap
启用。对于macOS而言可以编译时把sockraw.c排除掉,再把if_impl里的new条目删掉就好了。
libpcap 看着还是好臃肿 话说如果仅仅是获取网关的话 你看看ifaddrs.h是不是够用了 对mac和linux都有支持
我在getifaddrs
的man里没有找到与网关或路由相关的功能……如有遗漏,还请指点一二。
不过目前MAC地址是通过getifaddrs
获取了。macOS剩下的问题就是网关和硬盘序列号了。
网关还是有点蛋疼 我查查底层
主要是mac不支持proc所以就sysctl还看不到
命令行用ioreg -rd1 -w0 -c AppleAHCIDiskDriver | grep Serial
可以拿到序列号
它是开源的
但是竟然没有头文件
🍎💊
我继续看看sysctl.h去
看到有这个方法了,然后我在想要是NVMe或者USB启动的系统,那个驱动名是不是还要变23333 我还没试过能不能实地做认证,今晚可以试试。
刚刚看到一个好脏的方法
char* GetGatewayForInterface(const char* interface) {
char* gateway = NULL;
FILE* fp = popen("netstat -rn", "r");
char line[256]={0x0};
while(fgets(line, sizeof(line), fp) != NULL)
{
/*
* Get destination.
*/
char* destination;
destination = strndup(line, 15);
/*
* Extract iface to compare with the requested one
* todo: fix for iface names longer than eth0, eth1 etc
*/
char* iface;
iface = strndup(line + 73, 4);
// Find line with the gateway
if(strcmp("0.0.0.0 ", destination) == 0 && strcmp(iface, interface) == 0) {
// Extract gateway
gateway = strndup(line + 16, 15);
}
free(destination);
free(iface);
}
pclose(fp);
return gateway;
}
感觉硬盘这样拿也行 反正就启动的时候运行一次 总比引入一个库好hhh
引入libpcap不是为了获取网关啊。Google上查一下how to capture raw ethernet frames,都说用libpcap比较好😂AF_LINK这个socket又开不起来……
哦哦哦 好吧 mac下有直接处理raw的CFNetwork类 不过都是oc和swift的接口
也许也可以直接操作/dev/bpf*,等有时间了来看看(我记得macOS上需要手动mknod?)
大大这个有没有小白使用的Luci呀~ 或者兼容Luci也行呀~
谢谢~ 都是考研党啊....(我就是当个分母的...) 我看看再说~ 祝好运!
考研+1😔 这两天我试试交叉编译你的这个项目。。。 我们学校是锐捷+安腾
MiniEAP.pdf 我写了个按教程写了个luci? 只写了文件 不会链接啥的 也不会写makefile-=- 求教 请大大看看写对了么-=- 下载本地后缀改为zip....不知道为什么zip上传不成功
话说有没有可能作为插件写入networkmanager...
感觉这种认证并不是典型方法,应该不需要加到 NetworkManager 里面吧……
感觉这个写插件的话可以在所有国内大学适用哇( 让@felixonmars 大佬评估下可行么?
还是缺少其他地方的使用例子,我前些时放进 [community],看看能不能起到一点吸引作用……
其实写个luci是个不错的选择,像inode、锐捷客户端mentohust、niji-client这种插件一样写一个Network下的luci-=- 有没有大大 帮个忙写一下-=- 我实在是不会写...
@BlingRabbit 其实在openwrt上打个包估计就好了 luci基本没逻辑 主要感觉是这个eap认证的可扩展性很强才觉得适合加进去吧(
@sequencer 不怎么会搞-=- 还是新手...只会编译一下... 现在的认证只扩展出了锐捷认证 其他还有待开发 luci也可以随时增加 也很方便 (大大怎么那么晚还没睡-=-
各位大佬,你们觉得路由器用AP模式能实现把802.1X有线信号转换成无线信号发射出去吗😅
想要在无线上做普通 802.1x 认证还是使用锐捷自己的客户端?
如果是要通过无线使用锐捷客户端,那 AP 模式是可行的,但 Windows 客户端不知道为什么会找不到服务器,Linux 客户端正常。
目的是想直接连接wifi,不要再次打开客户端认证
我们学校的锐捷就是标准的802.1x,没有v2也没有v3 ... 然后全校还有无线网覆盖,是H3C的AP, WPA Enterprise加密类型的,连接上wifi之后分配的地址等同于有线锐捷认证之后DHCP分配的地址,我想模仿它,直接连接wifi就完成802.1x认证。
AP模式我试了,加密也设置成 wpa_enterprise了,但是那个radius服务器和端口就直接懵逼了... 无法实现类似于之前所提的AP的效果。
经验证确实把信号发射出来了,但是限于windows和linux,而且还要打开锐捷客户端二次认证再dhcp分配地址,手机无力...
我对 WiFi 的 802.1x 了解不多,感觉像是要在 WiFi 接入点上实现有线交换机上 port-control 的功能,没有 RADIUS 信息恐怕是做不到了……
大佬们最近在搞啥?带带我这个菜鸡吧~
膜Orz 聚聚能把程序的结构整理到文件夹一下吧 这样一片看下去好累hhh 等考研完了我想写一个Mac下的GUI