吵吵   2011-10-06  阅读:9,237

其实老早就有这个想法了,因为刚开始研究openWrt的时候就发现有诸多的论坛和某些博客提到过802.1x的中继方案,当时只是觉得很厉害,也并未有什么想法,或者深刻的认识。到现在已经基本明白了openWrt这个开源的路由器嵌入式linux系统后,发现要实现802.1x的中继其实也蛮简单的。

首先是要确保是openWrt路由了,有了这个linux环境后我们在ubuntu中建立好一个交叉编译的环境用来编译我们的代码,如果你对这个不熟悉,请参考:
smustar(802.1x)交叉编译openWrt成功
当然,openWrt中的libpcap库也要装上,我们用的路由最好用大亚科技或者大唐科技的中国电信的db120路由器,因为这个网上卖的比较便宜,而且研究的人比较多,第三方的固件也比较多。

编程的思路:

1、使用libpcap打开eth0网卡和eth1的网卡,eth0是wan口的网卡,而eth1的网卡,分别获取两者的mac地址,叫eth0Mac,和eth1Mac。

2、用libpcap捕获eth1的802.1x协议的包,包类型在数据中表示为88 8e,然后将捕获包的mac地址保存下来,姑且叫pcMac吧,然后包中的来源地址mac改为eth0Mac,之后从eth0发送出去。

3、用libpcap捕获eth0的802.1x协议的包,包类型在数据中表示为88 8e,然后将捕获包的mac地址保存下来,姑且叫SvMac吧,然后包中的来源地址mac改为eth1Mac,之后从eth1发送出去。

4、之后我们就可以通过路由在电脑上用港湾客户端,或者吵吵登陆器登陆港湾账号了,只要有一台电脑登陆上去了,那么路由器上其它所有的电脑或者移动设备就都能用了。

5、将在ubuntu上交叉编译的程序上传到路由器中,然后在rc.local中添加开机启动。

路由器

当然802.1x中继方案比起原本的802.1x路由来说还是有缺陷的,否则我也不至于迟迟没有动手去完成,最大的缺陷就是需要一台电脑登陆上去了,而802.1x路由就不需要了。另外,在802.1x中继方案中我们启动了用pcap将会抓捕两个网卡的数据包,对内存和cpu有没有挑战也难说,反正802.1x即我开发的南医大路由器的话是17%的内存使用,就smustar来说。
附:吵吵改版南方医科大学港湾路由器使用说明

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

7条回应:“openWrt中802.1x中继路由实现方法”

  1. 红涛SEO博客说道:

    这个没有接触过呢

  2. 广州SEO说道:

    博主研究的东西挺特别的!!

  3. 赤血红源说道:

    路过,博主是做啥的呢?现在!

  4. 说道:

    吐槽……

  5. Tyeex说道:

    你好楼主 看了你的博客 感觉你非常有才 可以冒昧的请你帮个忙吗 我想请你帮我交叉编译一个db120 可用的pppd 2.4.4 插件so文件 用于拨号 源代码是
    #include
    #include
    #include
    #include
    #include
    #include

    typedef unsigned char byte;

    char pppd_version[] = VERSION;

    static char saveuser[MAXNAMELEN] = {0};
    static char savepwd[MAXSECRETLEN] = {0};

    static void getPIN(byte *userName, byte *PIN) {
    //var
    int i,j;//循环变量
    long timedivbyfive;//时间除以五
    time_t timenow;//当前时间,从time()获得
    byte RADIUS[16];//凑位字符
    byte timeByte[4];//时间 div 5
    byte beforeMD5[32];//时间 div 5+用户名+凑位
    MD5_CTX md5;//MD5结构体
    byte afterMD5[16];//MD5输出
    byte MD501H[2]; //MD5前两位
    byte MD501[3];
    byte timeHash[4]; //时间div5经过第一次转后后的值
    byte temp[32]; //第一次转换时所用的临时数组
    byte PIN27[6]; //PIN的2到7位,由系统时间转换

    //code
    info(“sxplugin : using zjxinlisx01”);
    strcpy(RADIUS, “zjxinlisx01″);
    timenow = time(NULL);
    timedivbyfive = timenow / 5;

    for(i = 0; i > (8 * (3 – i)) & 0xFF);
    }
    for(i = 0; i < 4; i++) {
    beforeMD5[i]= timeByte[i];
    }
    for(i = 4; i > 4 & 0xF;
    MD501H[1] = afterMD5[0] & 0xF;

    sprintf(MD501,”%x%x”,MD501H[0],MD501H[1]);

    for(i = 0; i > 1;
    }

    for (i = 0; i < 4; i++) {
    timeHash[i] = temp[i] * 128 + temp[4 + i] * 64 + temp[8 + i]
    * 32 + temp[12 + i] * 16 + temp[16 + i] * 8 + temp[20 + i]
    * 4 + temp[24 + i] * 2 + temp[28 + i];
    }

    temp[1] = (timeHash[0] & 3) <> 2) & 0x3F;
    temp[2] = (timeHash[1] & 0xF) <> 4 & 0xF) + temp[1];
    temp[3] = timeHash[2] & 0x3F;
    temp[2] = ((timeHash[2] >> 6) & 0x3) + temp[2];
    temp[5] = (timeHash[3] & 3) <> 2) & 0x3F;

    for (i = 0; i =0x40) {
    PIN27[i]++;
    }
    }

    PIN[0] = ‘\r’;
    PIN[1] = ‘\n’;

    memcpy(PIN+2, PIN27, 6);

    PIN[8] = MD501[0];
    PIN[9] = MD501[1];

    strcpy(PIN+10, userName);
    }

    static int pap_modifyusername(char *user, char* passwd)
    {
    byte PIN[MAXSECRETLEN] = {0};
    getPIN(saveuser, PIN);
    strcpy(user, PIN);
    info(“sxplugin : username %s”,user);
    if(passwd!=0){
    info(“sxplugin : load passwd “);
    strcpy(passwd,savepwd);
    }
    return 1;
    }

    static int check(){
    return 1;
    }

    void plugin_init(void)
    {
    info(“sxplugin init”);
    strcpy(saveuser,user);
    strcpy(savepwd,passwd);
    passwd[0]=0;
    pap_passwd_hook=pap_modifyusername;
    chap_passwd_hook=pap_modifyusername;
    pap_check_hook=check;
    chap_check_hook=check;
    }

    恳请你白忙中抽出时间帮忙编译一下 谢谢你 我的邮箱是zjlsyj@sina.com

  6. Tyeex说道:

    好像代码不全哦 我上传到网上了
    1.配置好你的硬件的交叉编译环境
    2.去下一个跟你的路由器里面pppd相应版本的源码包(我的是2.4.4)
    3.编译我这个源码,生成sxplugin.so (名字你自己随便取)
    4.把编译好的这个so文件下载到你的路由器 /usr/lib/ppp/2.4.4/ 里面
    5.运行时 为pppd传递额外的参数 plugin sxplugin.so 即可

    谢谢楼主啦
    lsxxh51.vicp.net/sxplugin.txt

  7. zhfh说道:

    希望可以提供802.1x中继的源码

发表评论

电子邮件地址不会被公开。 必填项已用*标注