这是转载的一篇用于802.1x上网的文章,里面主要介绍了如何在路由器内直接架设802.1X拨号,架设以后随便任何用户端连接该路由器都可以直接上网。这对很多设备来说非常有用,比如PS3。当然,对于我这种linux盲来说,太高端了,转过来仅作参考。

原文来自:http://hi.baidu.com/zyp_fantasy/blog/item/396ec5c83b34ca96c81768e4.html

最近的校园网环境换成了 H3C 的 iNode 认证,相比于之前的锐捷我觉得已经好多了,最起码 iNode 提供有官方的 Linux 和 Mac OS 认证客户端。之前用锐捷的校园网时,我编译了 mentohust 在路由器的 openwrt 系统下运行,可以直接由路由提供认证,手机打开 wifi 连上路由就可以直接上校园网了。现在换成了 H3C 的认证,能不能也把它放到路由器上呢?我首先找到了 xclient 这个兼容的认证客户端,但经试验,xclient 在我的网络环境下,连接上几分钟就会掉线。于是继续找,找到了 njit-client(感谢 liuqun 等同学们的开发和测试!)。在 Ubuntu 下编译运行,运行非常稳定,不掉线。接下来的工作就有挑战性了,就是把 njit-client 交叉编译到路由器平台的 openwrt 系统中。

(PS:我首先找到了一个 njit-client 之前的版本,在我的 Ubuntu 系统下没什么问题,但是编译到路由器上后,虽然可以运行,但是死活不能认证,现在也没搞清楚到底是为什么。后来编译了git 仓库中的最新版本,问题解决了。)

首先我们要作的就是搭建 openwrt 的交叉编译平台(这里是一份详细的英文教程)。以我的 Ubuntu 9.10 系统为例。首先建立一个文件夹,如 ~/openwrt 。进入文件夹,用 svn 获得 openwrt 的源代码。

svn checkout svn://svn.openwrt.org/openwrt/trunk kamikaze

源代码保存在 ~/openwrt/kamikaze 文件夹中,我们把它叫做工作目录。接下来用 make menuconfig 进行编译配置。make 首先会检查系统要求,如果提示你缺少什么必要的软件包,先安装全了(要编译 njit-client 可能还需要安装 libpcap-dev)。如果一切正常,就进入到配置界面了。

首先注意的是目标平台的选择,我的路由器是 broadcom 63xx 平台,属于 mips 架构的处理器。由于我们编译 njit-client 需要 libpcap 和 libgcrypt,所以还需要一些设置。libpcap 好办,Libraries 菜单下直接选择就行了。libgcrypt 就需要手动添加了。这里是 libgcrypt 和它依赖的 libgpg-error 的编译文件,将这两个文件夹放到工作目录的 package 目录下,重新运行 make menuconfig,进入 Libraries 菜单选择即可。

配置完成后,保存退出。输入 make V=99,就开始漫长的编译过程了。编译过程中会随时从网络上下载所需要的软件,如果你的网速不给力,可以按 ctrl+c 先取消,然后用下载工具手动下载下来,放到工作目录的 dl 文件夹下,然后重新编译。经过漫长的一段时间,openwrt 的平台就准备好了,可以开始编译 njit-client 了。

首先准备好 njit-client 的源代码,进入 src 目录下,运行 autoconf,生成 configure,接着 ./configure,生成 Makefile。在编译之前,我们要先进行一些小修改。njit-client 是利用一个 python 脚本来实现认证后获取和刷新 IP 地址的,路由器上我们不需要这么做。打开 auth.c,第261行改为

system(“dhclient”);

即使用 dhclient 这个脚本来刷新和获取 IP。然后修改 Makefile,加入 PATH 变量,就是 openwrt 工作目录下 staging_dir/toolchain-xxx…xxx/bin,将 CC 改为对应的编译器,去掉 CFLAGS 的调试标记参数 -g。如在我的环境下,就是

# Compiler options
PATH += $PATH:/home/ivan/openwrt/kamikaze/staging_dir/toolchain-mips_gcc-4.3.3+cs_uClibc-0.9.30.1/bin/
CC = mips-openwrt-linux-gcc
CFLAGS ?= -O2
EXEEXT :=

接着再往下找,有两行 libgcrypt-config 的调用

fillmd5.o: CFLAGS+=$(shell libgcrypt-config –cflags)

njit-client: LDLIBS+=$(shell libgcrypt-config –libs)

将其中的 libgcrypt 改为 openwrt 工作目录/staging_dir/target-xxx…xxx/usr/bin/libgcrypt-config,如在我的环境下,就是

fillmd5.o: CFLAGS+=$(shell /home/ivan/openwrt/kamikaze/staging_dir/target-mips_uClibc-0.9.30.1/usr/bin/libgcrypt-config –cflags)

njit-client: LDLIBS+=$(shell /home/ivan/openwrt/kamikaze/staging_dir/target-mips_uClibc-0.9.30.1/usr/bin/libgcrypt-config –libs)

上面还有一行 auth.o: CFLAGS+=$(shell pcap-config –cflags),在前面加个#注释掉。

接下来做最后一些准备工作。到 staging_dir/target-xxx…xxx/usr/include 目录下,拷贝 pcap 文件夹、pcap.h、pcap-bpf.h、pcap-namedb.h、gcrypt.h、gcrypt-module.h、gpg-error.h 到 staging_dir/toolchain-xxx…xxx/include 文件夹下。再到 staging_dir/target-xxx…xxx/usr/lib 目录下,拷贝 libgcrypt.a、libgpg-error.a、libpcap.a 到 staging_dir/toolchain-xxx…xxx/lib 目录下。

万事俱备,接下来输入 make,编译成功!

最后就是把相关的文件拷贝到路由器中,可以使用路由的 ftp 服务。拷贝 staging_dir/target-xxx…xxx/usr/lib 下的 libpcap.so.1.0.0、libgcrypt.so.11.5.3 和 libgpg-error.so.0.5.0 到路由器的 /usr/lib 目录下。拷贝编译好的可执行文件 njit-client 到 路由器的 /usr/bin 目录。接下来 ssh 登录路由器,chmod +x /usr/bin/njit-client 加上可执行属性,运行一下,如果还提示缺少什么 libpcap.so 什么的,就自己建立符号连接,指向 libpcap.so.1.0.0

cd /usr/lib

ln -s libpcap.so.1.0.0 libpcap.so

libgcrypt 和 libgpg-error 同理。

njit-client 到此应该可以正常运行了,认证下试试?

为了方便使用,可以在路由器的 /ect/init.d/ 目录下建立一个自动运行脚本 njit-client,内容如下

#!/bin/sh /etc/rc.common
#(c) 2010 ivan_wl
START=50

start() {
njit-client [username] [password] [interface] &
}

stop() {
killall njit-client
killall udhcpc
}

然后 chmod +x 加上可执行属性, /ect/init.d/njit-client enable 开启开机自动运行。

一切搞定,把电脑手机什么的都连上路由,享受网络吧!

附一些下载:

njit-client 的源代码

libgcrypt 和 libgpg-error 编译文件

njit-client 编译后的二进制文件(Broadcom 63xx mips 格式)

 想说点什么吗?

 (拖动评论框右下角可扩展评论框面积;若评论发表后未显示请耐心等待审核)

左半红印发表于2011.09.6th