updateing / minieap

可扩展的 802.1x 客户端,带有锐捷 v3 (v4) 算法插件支持
GNU General Public License v3.0
514 stars 93 forks source link

需求 #1

Closed sequencer closed 3 years ago

sequencer commented 7 years ago

膜Orz 聚聚能把程序的结构整理到文件夹一下吧 这样一片看下去好累hhh 等考研完了我想写一个Mac下的GUI

updateing commented 7 years ago

同考研…… 我也有按文件夹整理的想法,会去做的~

sequencer commented 7 years ago

同时if_ether.h的头是linux下的? 貌似FreeBSD和Mac都不支援? 我看了下在Mac下编译的话,Mac的底层也不是很好支持。 不知道这个头是用于做什么了? 还是就是一堆define? 能否用netinet/if_ether.h替代?#看来不行 差别很大 有没有办法绕过?

updateing commented 7 years ago

是为了ETH_P_PAE这个定义,就是0x888e.

此外,由于获取网关时用到了netlink,macOS应该就没办法了,得想点别的办法……

sequencer commented 7 years ago

Mac下有NKE使用 Mark一下 能把用了netlink的地方注释一下么? 我来改改。

sequencer commented 7 years ago

我准备调试才发现早把Clion删了hhh 晚上回家再看看代码

updateing commented 7 years ago

在net_util.c里的obtain_iface_ipv4_gateway就是。

功能:获得指定接口上的IPv4默认路由

参数:

返回:

这两个返回值定义在minieap_common.h里面。

updateing commented 7 years ago

macOS下PF_LINK不能直接使用,还是要上体积巨大的libpcap。这个问题过去了不知道还有什么问题……

sequencer commented 7 years ago

NKE 应该有需要的api 可惜都是swift和oc的 或者要不混合编译会不会好一点?

updateing commented 7 years ago

没有学过苹果这方面的开发……再写一个libpcap的网络插件?

sequencer commented 7 years ago

我表示只会swift 到时候注释完善之后,一个个写估计也不多

hyrathb commented 7 years ago

……大哥你们考研时间也真是多,我忙完申请之后也来看看吧。不过这个还是要考虑一下跨平台问题的,原来mac下mentohust不是用的pcap吗?

sequencer commented 7 years ago

pcap 好臃肿

updateing commented 7 years ago

我现在把文件整理到子目录了,但相应的Makefile编写遇到了些问题。我实现了下面两个方法:

  1. include每个子目录的makefile (minieap.mk)

    这种方法跟Android的编译系统有点像(但是Android应该不是这么实现的),可以实现以自定义的模块名称来选择编译哪些模块,而不需要像下面一个方法一样必须使用目录名来选择模块。而且,新加的模块目录可以任意放置,只要在这个项目底下,就可以搜到并被选中。一个目录里也能有多个模块可供选择。而且模块可以向整个程序的链接器添加选项,也可以告知顶层Makefile自己有在哪里有哪些.o文件需要参与链接,也就是变量能够回传到顶层的Makefile里。但问题在于这方法似乎不是100%稳定,也许是我的Makefile水平不足(毕竟一晚上速成23333)还请大家测试了。

  2. make -C进入每个子目录来编译

    这种是传统方法,每个子目录独立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条目删掉就好了。

sequencer commented 7 years ago

libpcap 看着还是好臃肿 话说如果仅仅是获取网关的话 你看看ifaddrs.h是不是够用了 对mac和linux都有支持

updateing commented 7 years ago

我在getifaddrsman里没有找到与网关或路由相关的功能……如有遗漏,还请指点一二。

不过目前MAC地址是通过getifaddrs获取了。macOS剩下的问题就是网关和硬盘序列号了。

sequencer commented 7 years ago

网关还是有点蛋疼 我查查底层 主要是mac不支持proc所以就sysctl还看不到 命令行用ioreg -rd1 -w0 -c AppleAHCIDiskDriver | grep Serial可以拿到序列号 它是开源的 但是竟然没有头文件 🍎💊 我继续看看sysctl.h去

updateing commented 7 years ago

看到有这个方法了,然后我在想要是NVMe或者USB启动的系统,那个驱动名是不是还要变23333 我还没试过能不能实地做认证,今晚可以试试。

sequencer commented 7 years ago

刚刚看到一个好脏的方法

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

updateing commented 7 years ago

引入libpcap不是为了获取网关啊。Google上查一下how to capture raw ethernet frames,都说用libpcap比较好😂AF_LINK这个socket又开不起来……

sequencer commented 7 years ago

哦哦哦 好吧 mac下有直接处理raw的CFNetwork类 不过都是oc和swift的接口

updateing commented 7 years ago

也许也可以直接操作/dev/bpf*,等有时间了来看看(我记得macOS上需要手动mknod?)

updateing commented 7 years ago

macOS 下直接操作 BPF 设备实现网络功能的插件已经做出来了。自己试了一下,可以过认证,网关那些再看看怎么搞……

BlingRbt commented 7 years ago

大大这个有没有小白使用的Luci呀~ 或者兼容Luci也行呀~

sequencer commented 7 years ago

luci很好写的 参见csdn的一个博客 如果写不了 我可以考研之后来试试

BlingRbt commented 7 years ago

谢谢~ 都是考研党啊....(我就是当个分母的...) 我看看再说~ 祝好运!

lyq1996 commented 7 years ago

考研+1😔 这两天我试试交叉编译你的这个项目。。。 我们学校是锐捷+安腾

BlingRbt commented 7 years ago

MiniEAP.pdf 我写了个按教程写了个luci? 只写了文件 不会链接啥的 也不会写makefile-=- 求教 请大大看看写对了么-=- 下载本地后缀改为zip....不知道为什么zip上传不成功

sequencer commented 7 years ago

话说有没有可能作为插件写入networkmanager...

updateing commented 7 years ago

感觉这种认证并不是典型方法,应该不需要加到 NetworkManager 里面吧……

sequencer commented 7 years ago

感觉这个写插件的话可以在所有国内大学适用哇( 让@felixonmars 大佬评估下可行么?

felixonmars commented 7 years ago

还是缺少其他地方的使用例子,我前些时放进 [community],看看能不能起到一点吸引作用……

BlingRbt commented 7 years ago

其实写个luci是个不错的选择,像inode、锐捷客户端mentohust、niji-client这种插件一样写一个Network下的luci-=- 有没有大大 帮个忙写一下-=- 我实在是不会写...

sequencer commented 7 years ago

@BlingRabbit 其实在openwrt上打个包估计就好了 luci基本没逻辑 主要感觉是这个eap认证的可扩展性很强才觉得适合加进去吧(

BlingRbt commented 7 years ago

@sequencer 不怎么会搞-=- 还是新手...只会编译一下... 现在的认证只扩展出了锐捷认证 其他还有待开发 luci也可以随时增加 也很方便 (大大怎么那么晚还没睡-=-

lyq1996 commented 7 years ago

各位大佬,你们觉得路由器用AP模式能实现把802.1X有线信号转换成无线信号发射出去吗😅

updateing commented 7 years ago

想要在无线上做普通 802.1x 认证还是使用锐捷自己的客户端?

如果是要通过无线使用锐捷客户端,那 AP 模式是可行的,但 Windows 客户端不知道为什么会找不到服务器,Linux 客户端正常。

lyq1996 commented 7 years ago

目的是想直接连接wifi,不要再次打开客户端认证

我们学校的锐捷就是标准的802.1x,没有v2也没有v3 ... 然后全校还有无线网覆盖,是H3C的AP, WPA Enterprise加密类型的,连接上wifi之后分配的地址等同于有线锐捷认证之后DHCP分配的地址,我想模仿它,直接连接wifi就完成802.1x认证。

AP模式我试了,加密也设置成 wpa_enterprise了,但是那个radius服务器和端口就直接懵逼了... 无法实现类似于之前所提的AP的效果。

经验证确实把信号发射出来了,但是限于windows和linux,而且还要打开锐捷客户端二次认证再dhcp分配地址,手机无力...

updateing commented 7 years ago

我对 WiFi 的 802.1x 了解不多,感觉像是要在 WiFi 接入点上实现有线交换机上 port-control 的功能,没有 RADIUS 信息恐怕是做不到了……

Droid-MAX commented 6 years ago

大佬们最近在搞啥?带带我这个菜鸡吧~