我有分寸

Linux下的WPA无线认证

gnawux linuxwirelesswlanworkswpawpasupplicant

2004年12月,我还是LinuxFocus的中文编辑(志愿者,呵呵),为她写了一篇关于Linux 下玩弄无线网卡的文章(中文版英文版),时至今日,仍在被转载中,也很容易 Google 到,不过该文章中对各种无线认证技术的描述语焉不详,这实在是当时水平有限,而且也缺少环境。直到今年,才自己在家弄了个 Linksys 搭上玩玩。

搭上无线网之后,一直也没准备写这篇介绍,一来是自己没什么长进,不想丢人来,二来也是 NetworkManager 实在很方便,比 Windows 的无线网卡配置要简单很多,觉得完全没有必要写东西介绍。不过,后来发现 NetworkManager 作为新兴工具,还存在很多不稳定的地方,有时会有一些莫名其妙的问题,因此,又回到了命令行/配置文件+后台Daemon的老朋友那,这里,向各位介绍 wpa_supplicant 的使用。

[注:如果你的环境中,NetworkManager 可以使用的话,大可不必如此费力,保持所有配置文件都是空的,在图形界面中配置即可。]
[注2:本文适用于 Debian 系统,其它 Distro 有所不同,仅供参考。]

WPA_supplicant 是 WPA/WPA2 认证的客户端,同时也适用于 WEAP,对有线、无线网络都可以使用,不过,WPA2/TKIP (就是前两天说被破解了的那个,不过目前仍然是最安全的WLAN无线连接方式。哦?你说WAPI?哦,不好意思,我没见过真的,不好说哈。)还是我们最首选的方式。

要使用 WPA_Supplicant,在 /etc/network/interfaces (这个网卡配置文件的格式是 Debian 系的特点 RH/SuSE 系有明显不同,未做研究)中,需要指定使用 WPA_supplicant

allow-hotplug wlan0
iface wlan0 inet manual
wpa-driver wext
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

这里,注意第二行的 manual,指定既不配置固定IP,又不使用 DHCP,要“手工”配置,而后,指定了 WPA 的驱动,wext 是 Linux kernel 的 Wireless Extension,凡是使用 Linux 原生驱动的情况,只有使用固定网络的情况和使用 atmel 芯片的情况例外,关于这些例外,请参考软件文档。

wpa-roam (漫游模式)是指,根据后面指定的配置文件进行匹配,接入可以发现的网络,当然,也可以配置成不使用 wpa-roam,而是固定在这里写明配置,但对于大部分笔记本用户来说,在不同时间地点接入两个以上的网络是常有的事,因此 roam 是更常见的模式。

wpa_supplicant.conf 这个文件很简单,是用来描述一个个网络的,下面是我家的网络配置

network={
ssid="fusion"
scan_ssid=1
key_mgmt=WPA-PSK
proto=WPA
pairwise=TKIP
group=TKIP
psk="my-wlan-passwd"
id_str="fusion"
}


对每个网络都是这么一段,这里面 ssid 是无线路由器设置的 SSID,后面 key_mgment, proto, group 这几个字段指定了 WPA/TKIP 方式,而 psk 指定的就是我的密钥,这几个对于不同的认证方式有所不同,scan_ssid=1 是用来对付设置不广播网络SSID的路由器的,我的路由器就是这么配置的,呵呵,理由自然是增强一层安全性了。最后的 id_str 是这段描述的一个标记,在 /etc/network/interfaces 里,可以针对这个 id 进行配置,如

iface fusion inet dhcp

指定对这个网络进行 dhcp 获取 IP。如果是 WEP 的话,设置可能是这样

network={
ssid="wepnet"
key_mgmt=NONE
wep_key0="WEPKEY"
wep_tx_keyidx=0
id_str="wep"
}
字段含义与 WPA 的类似。 当然,在 wpa_supplicant.conf 里可以设定一个缺省的网络,在没有其他网络时进行尝试
network={
key_mgmt=NONE
}

在 interfaces 里也可以指定一个缺省配置,如,对没有特殊声明的大多数网络都采用 dhcp

iface default inet dhcp

以上就是使用 wpa_supplicant 配置无线网络认证的简单方法,wpa_supplicant 也提供了很多例子可供参考,大家可以尝试一下。

gnawux
me!#$!@#$@#$wangxu!@#$%^&*()_me