LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1937|回复: 10

彻底解决 FreeBSD-6.0 下 802.1X 验证问题

[复制链接]
发表于 2005-11-19 23:26:05 | 显示全部楼层 |阅读模式
彻底解决 FreeBSD-6.0 下 802.1X 验证问题

        By MAGPIE wgsicg@163.com 2005年11月19日
        (转载请注明作者出处)


欢呼吧,热爱 FreeBSD 的人们!长久一来困扰我们的 802.1X 验证问题,今天终于得以彻底地解决。wpa_supplicant 的出现为我们解决了这一个历史性难题。它自0.4.0版开始支持 wired (相对于 wireless )方式。

一、准备性工作

1) 我们需要安装 FreeBSD-6.0 及其开发环境,此外还要安装 gmake 包。

        gmake 在 FreeBSD-6.0 CD2 中,找到它 pkg_add 就行了。

2) 安装必要的库 libdnet libcap openssl。
       
        1>安装 libdnet
               
                -到 http://libdnet.sourceforge.net/ 下载 libdnet-1.10.tar.gz
                -$tar xzvf libdnet-1.10.tar.gz
                -$cd libdnet-1.10
                -$./configure --prefix=/usr
                -$make
                -#make install (要超级用户权限执行)
       
        2>安装 libpcap
       
                -到 http://www.tcpdump.org/release/ 下载 libpcap-0.9.4.tar.gz
                -$tar xzvf libpcap-0.9.4.tar.gz
                -$cd libpcap-0.9.4
                -$./configure --prefix=/usr
                -$make
                -#make install (要超级用户权限执行)
               
        3>安装 openssl
               
                -到 http://www.openssl.org/source/ 下载 openssl-0.9.7g.tar.gz
                -$tar xzvf openssl-0.9.7g.tar.gz
                -$cd openssl-0.9.7g
                -$./config --prefix=/usr
                -$make
                -$make test
                -#make install (要超级用户权限执行)
       
二、安装 wpa_supplicant

1)获取 wpa_supplicant 源码
       
        -到 http://hostap.epitest.fi/releases 下载 wpa_supplicant-0.4.0.tar.gz
        注:1、FreeBSD-6.0 自带 wpa_supplicant 的 0.3.9版,但此版本不支持 wired 方式,故不可用。
        注:2、0.4.0版以上的也可能可以用,但0.4.6版有问题,编译不能通过。
       
2)配置并安装
       
        -$tar xzvf wpa_supplicant-0.4.0.tar.gz
        -$cd wpa_supplicant-0.4.0
        -编辑生成 .config (可参看 defconfig 文件。下面是我的 .config 可供参考)
                -------我的.config 文件---------
       
                CONFIG_DRIVER_BSD=y
                CONFIG_DRIVER_WIRED=y
                CONFIG_IEEE8021X_EAPOL=y
                CONFIG_EAP_MD5=y
                CONFIG_EAP_MSCHAPV2=y
                CONFIG_EAP_TLS=y
                CONFIG_EAP_PEAP=y
                CONFIG_EAP_TTLS=y
                CONFIG_EAP_GTC=y
                CONFIG_EAP_OTP=y
                CONFIG_EAP_LEAP=y
                CONFIG_PKCS12=y
                CONFIG_SMARTCARD=y
                CONFIG_DNET_PCAP=y
                CONFIG_CTRL_IFACE=y

                ---------------------------
       
        -修改 Makefile 文件,将第274行的 LIBS += -ldl 用#注释掉,注意,这很重要。
               
                注:1、在 libdl 中有操纵动态连接库的函数,但在 FreeBSD 中这些函数已包含在 libc 中,因此没有 libdl。
               
        -$gmake  (注意是 gmake!)
        -#gmake install (要超级用户权限执行)
       
三、wpa_supplicant 的基本应用

  这里仅仅介绍它的基本使用方法,要完全了解它的用法请参看其文档。

        1>清除系统中旧版本的 wpa_supplicant 的干扰
               
                -#rm /usr/sbin/wpa_supplicant
                -#rm /usr/sbin/wpa_cli
               
        2>建立 wpa_supplicant 的配置文件 /etc/wpa_supplicant.conf
       
                注:1、可参照源代码目录中的 wpa_supplicant.conf 文件,根据具体情况进行配置(有些繁琐)。
                注:2、由于我们校园网用的是 eap_md5 验证方式,故我的 /etc/wpa_supplicant.conf 如下:
               
                ---------------------------
               
                ctrl_interface=/var/run/wpa_supplicant

                ctrl_interface_group=wheel

                ap_scan=0

                network={

                        key_mgmt=IEEE8021X

                        eap=MD5

                        identity="用户名"

                        password="密码"

                        eapol_flags=0

                }
       
                ----------------------------
               
        3>运行 wpa_supplicant 进行身份验证
               
                -#ifconfig rl0 down  (这里的 rl0 是网卡设备,根据你的实际情况填写,下同。)
                -#ifconfig rl0 up    (这里的 rl0 是网卡设备,根据你的实际情况填写,下同。)
                -#wpa_supplicant -B -c /etc/wpa_supplicant.conf -i rl0 -D wired >& /var/log/wpa.log
                -#cat /var/log/wpa.log (若没出错则不会有内容。)
               
        4>用 DHCP 方式申请 IP 地址 (我们校园网 IP 是动态分配的,估计很多学校都是这样。)
               
                -#dhclient rl0  (这里的 rl0 是网卡设备,根据你的实际情况填写。)
               
               
四、wpa_supplicant 的用法的进一步讨论

        1>可以将整个过程写成一个脚本
               
                -编辑生成 startnet1x.sh 内容如下
               
                -----------------------------
               
                #!/bin/csh

                ifconfig rl0 down
                ifconfig rl0  up

                echo "Start Wpa_supplicant ..."
                wpa_supplicant -B -c /etc/wpa_supplicant.conf -i rl0 -D wired >& /var/log/wpa.log
                sleep 1  
                echo "Done."

                dhclient rl0
               
                ------------------------------
               
                -#chmod 755 startnet1x.sh
                -#./startnet1x.sh  (测试用)
                -#cp startnet1x.sh /usr/local/sbin  (备用)
               
                (往后直接运行 startnet1x.sh 就行了。)
               
        2>开机自动运行
       
                这就留给精通 FreeBSD 的高手来做吧。
发表于 2005-11-20 22:15:55 | 显示全部楼层
多谢楼主了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-21 21:28:12 | 显示全部楼层
自家兄弟,不必客气。
回复 支持 反对

使用道具 举报

发表于 2005-11-22 12:30:48 | 显示全部楼层
我是自己写的一个,简单但够自己用 ^_^
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-22 17:23:50 | 显示全部楼层
Post by xdkui
我是自己写的一个,简单但够自己用 ^_^


拜读过你的文章,真是高手啊!佩服!我过去正是这个问题不能解决而迟迟不敢用FreeBSD。毕竟“幸福”还要靠自己去创造啊!向你学习。
回复 支持 反对

使用道具 举报

发表于 2005-11-23 13:12:31 | 显示全部楼层
xsupplicant自1.2.1的release以来就可以利用FreeBSD的BPF添加了兼容代码。同时,独立平台的基于libpcap的代码在早期被去掉之后也加入了进来。在configure的时候可以通过选项来选择是否启用。而且我给xsupplicant写的和锐捷的协议兼容的补丁最初就是在FreeBSD 5.4上开发完成的。而且在我现在用的FC4上不需要改动就可以顺利编译。大家请访问http://gnap.haokoo.net/获得补丁的代码。楼主所说的不兼容可能是1.2pre1。那个版本的确不支持FreeBSD.而且现在open1x官方网站上的下载连接有些错误。很容易没注意就下载了1,2pre1而非1.2.1。不过xsupplicant的确是在暑假开始就支持了FreeBSD的。对xsupplicant感兴趣又使用锐捷网络的朋友可以到我主页看看。由于没有在学校外部做过测试,不一定确保认证成功。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-23 18:15:25 | 显示全部楼层
Post by gnap
xsupplicant自1.2.1的release以来就可以利用FreeBSD的BPF添加了兼容代码。……不过xsupplicant的确是在暑假开始就支持了FreeBSD的。对xsupplicant感兴趣又使用锐捷网络的朋友可以到我主页看看。由于没有在学校外部做过测试,不一定确保认证成功。[/url]


谢谢指教。 Xsupplicant 的文档更新得太不及时了……
回复 支持 反对

使用道具 举报

发表于 2005-11-25 14:18:13 | 显示全部楼层
我用的是suse 10 .一直不能用xsupplicant
这是日志文件:(高手帮忙看看:))这是为什么?
[INT] Called event_core_setup()!
[INT] Called cardif_linux_rtnetlink_init()!
[INT] ADDING INTERFACE : eth0
[INT] Flags are : 06
[INT] Initializing socket for interface eth0..
[INT] Index : 3
[INT] Allmulti is currently disabled on this device!
Interface initalized!
[INT] Interface eth0 is NOT wireless!
[CONFIG] Working from config file /etc/xsupplicant.conf.
No configuration information for network "(null)" found.  Using default.
[CONFIG] Opened socket descriptor #8
[ALL] Processing command : echo "some command"
[ALL] Returning command : echo "some command"
[ALL] Actual command being called is echo
Checking event interface.
[INT] Got an RTM_NEWLINK!
[INT] Working with an interface with index of 3.
[INT]    -- Got a new interface request.
[INT] Found interface eth0, with index of 3! (Ignored)
[ALL] Processing interface eth0... (Flags : 06)
[INT] Interface eth0 is NOT wireless!
Couldn't get frame.  (Maybe there weren't any!)
Socket would block!
There are no frames to process.
[STATE] (global) -> DISCONNECTED
[STATE] Processing DISCONNECTED state.
[STATE] DISCONNECTED -> CONNECTING
Checking event interface.
[ALL] Processing interface eth0... (Flags : 04)
Couldn't get frame.  (Maybe there weren't any!)
Socket would block!
There are no frames to process.
[STATE] Processing CONNECTING state.
[STATE] Sending EAPOL-Start Frame.
[ALL] Frame to be sent :
01 80 C2 00 00 03 00 0F - B0 92 AA B4 88 8E 01 01 ................
00 00                                             ..
Checking event interface.
[ALL] Processing interface eth0... (Flags : 04)
Couldn't get frame.  (Maybe there weren't any!)
Socket would block!
There are no frames to process.
Checking event interface.
[ALL] Processing interface eth0... (Flags : 04)
Couldn't get frame.  (Maybe there weren't any!)
Socket would block!
There are no frames to process.
………………………
…………
…………
[ALL] Shutting down IPC socket!
[CONFIG] Closing socket descriptor #8
[ALL] Doing statemachine cleanup!
There was no active method in eap_cleanup()!
[STATE] Sending EAPOL-Logoff Frame.
[INT] Sending Logoff for int eth0!
[ALL] Frame to be sent :
01 80 C2 00 00 03 00 0F - B0 92 AA B4 88 8E 01 02 ................
00 00                                             ..
[ALL] Cleaning up interface eth0...
[INT] Turning off ALLMULTI mode!
[INT] Called event_core_cleanup()!
[INT] Called cardif_linux_rtnetlink_cleanup()!
AAAH! Trying to delete an undefined config type.
Notify developers. Type: 0x12
回复 支持 反对

使用道具 举报

发表于 2005-11-25 17:45:02 | 显示全部楼层
to:xdkui
    当时我找你找的好苦啊!那个时候网上找到的你的代码不知道哪里转载的格式丢失得一塌糊涂。还有你把代码中锐捷的部分去掉了,也着实让人郁闷了很长一段时间。不过还好,如今都通过各自的程序上网了!
回复 支持 反对

使用道具 举报

发表于 2005-11-25 18:04:29 | 显示全部楼层
Post by chenzhijin1980
我用的是suse 10 .一直不能用xsupplicant
这是日志文件:(高手帮忙看看:))这是为什么?
[INT] Called event_core_setup()!
[INT] Called cardif_linux_rtnetlink_init()!
[INT] ADDING INTERFACE : eth0
[INT] Flags are : 06
[INT] Initializing socket for interface eth0..
[INT] Index : 3
[INT] Allmulti is currently disabled on this device!
Interface initalized!
[INT] Interface eth0 is NOT wireless!
[CONFIG] Working from config file /etc/xsupplicant.conf.
No configuration information for network "(null)" found.  Using default.
[CONFIG] Opened socket descriptor #8
[ALL] Processing command : echo "some command"
[ALL] Returning command : echo "some command"
[ALL] Actual command being called is echo
Checking event interface.
[INT] Got an RTM_NEWLINK!
[INT] Working with an interface with index of 3.
[INT]    -- Got a new interface request.
[INT] Found interface eth0, with index of 3! (Ignored)
[ALL] Processing interface eth0... (Flags : 06)
[INT] Interface eth0 is NOT wireless!
Couldn't get frame.  (Maybe there weren't any!)
Socket would block!
There are no frames to process.
[STATE] (global) -> DISCONNECTED
[STATE] Processing DISCONNECTED state.
[STATE] DISCONNECTED -> CONNECTING
Checking event interface.
[ALL] Processing interface eth0... (Flags : 04)
Couldn't get frame.  (Maybe there weren't any!)
Socket would block!
There are no frames to process.
[STATE] Processing CONNECTING state.
[STATE] Sending EAPOL-Start Frame.
[ALL] Frame to be sent :
01 80 C2 00 00 03 00 0F - B0 92 AA B4 88 8E 01 01 ................
00 00                                             ..
Checking event interface.
[ALL] Processing interface eth0... (Flags : 04)
Couldn't get frame.  (Maybe there weren't any!)
Socket would block!
There are no frames to process.
Checking event interface.
[ALL] Processing interface eth0... (Flags : 04)
Couldn't get frame.  (Maybe there weren't any!)
Socket would block!
There are no frames to process.
………………………
…………
…………
[ALL] Shutting down IPC socket!
[CONFIG] Closing socket descriptor #8
[ALL] Doing statemachine cleanup!
There was no active method in eap_cleanup()!
[STATE] Sending EAPOL-Logoff Frame.
[INT] Sending Logoff for int eth0!
[ALL] Frame to be sent :
01 80 C2 00 00 03 00 0F - B0 92 AA B4 88 8E 01 02 ................
00 00                                             ..
[ALL] Cleaning up interface eth0...
[INT] Turning off ALLMULTI mode!
[INT] Called event_core_cleanup()!
[INT] Called cardif_linux_rtnetlink_cleanup()!
AAAH! Trying to delete an undefined config type.
Notify developers. Type: 0x12


你的日志中的组播地址是标准的组播地址。不知道和你所在网络的厂商的组播地址是否一样!比如锐捷的组播地址是不一样的。另外你的xsupplicant的版本是多少?日志的格式和我的1.2.1有一些差别。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表