27.3 无线网络

作者:Eric Anderson. 中文翻译:张 雪平 和 袁 苏义.

27.3.1 简介

  如果可以使用没有烦人的随时都通过网线连接的计算机, 会真的很有用。FreeBSD 可以充当无线客户端, 甚至可以做为无线“接入点(access point)”。

27.3.2 无线操作模式

  802.11无线设备有两种不同的配置方式:BSS 和 IBSS.

27.3.2.1 BSS 模式

  BSS 模式是常用的模式。 它也被叫做“底层结构(infrastructure)”模式。 在此种模式里,一些无线接入点连接到有线网络。 每个无线网络有个名字。这个名字被称为网络的 SSID。

  无线客户端连接到这些无线接入点上。 IEEE 802.11 标准定义了用于无线网络连接的协议。 在设定了 SSID 后,一个无线客户端可以连接到一个指定的网络。 若不明确指定 SSID,一个无线客户端可以被连接到任何的网络。

27.3.2.2 IBSS 模式

  IBSS 模式,也叫专属(ad-hoc)模式, 是设计来进行点对点的接连的。实际上有两种类型的专属模式。 一种是 IBSS 模式,也叫"ad-hoc" 或"IEEE ad-hoc"模式。 这个模式由 IEEE 802.11 标准定义。 第二个叫做演示专属 (demo ad-hoc) 模式或朗讯专属 (Lucent ad-hoc) 模式 (而有时与专属模式是混淆的)。 这个是早先的,准 802.11 专属模式,并且应该只用于过渡性的安装里。 对于两类专属模式我不再做进一步介绍了。

27.3.3 底层结构 (Infrastructure) 模式

27.3.3.1 接入点

  接入点是一种无线网络设备, 它允许一个或更多的无线客户端使用此设备作为中心集线器 (hub)。 使用接入点时, 所有的客户端通过接入点通信。 常用多个接入点来覆盖一个完整的区域,比如一所住房、 一片商业区,或一座公园。

  接入点一般具有多个网络连接:无线网卡、 一块或多块用于连接其它网络有线的以太网适配器。

  可以购买预建的接入点, 您也可以使用 FreeBSD 及其兼容的无线网卡自己建立接入点。 一些产商制造了带有不同功能的无线接入点和无线网卡。

27.3.3.2 建立 FreeBSD 接入点

27.3.3.2.1 要求

  为了在 FreeBSD 上建立接入点,您要有一块兼容的无线网卡。 至今为止,FreeBSD 只支持带有 Prism 芯片组的网卡。 您还需要被 FreeBSD 支持的有线网卡 (这个不难找到,FreeBSD 支持很多不同的设备)。在这里,我们假定您要桥接 (bridge(4)) 有线网卡连接的网络与无线设备之间的所有传输。

  FreeBSD 用来实现接入点的"hostap"功能与一定版本的 firmware (固件) 工作得很好。Prism 2 网卡应该使用 firmware1.3.4或更新的版本。Prism 2.5 和 Prism 3 网卡应使用firmware1.4.9。老版本的firmware 可能无法正常工作。这时候,升级网卡的唯一方式是使用厂商提供的 Windows® firmware 升级工具。

27.3.3.2.2 设置并运行

  首先,确保您的系统能识别无线网卡:

# ifconfig -a
wi0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet6 fe80::202:2dff:fe2d:c938%wi0 prefixlen 64 scopeid 0x7
        inet 0.0.0.0 netmask 0xff000000 broadcast 255.255.255.255
        ether 00:09:2d:2d:c9:50
        media: IEEE 802.11 Wireless Ethernet autoselect (DS/2Mbps)
        status: no carrier
        ssid ""
        stationname "FreeBSD Wireless node"
        channel 10 authmode OPEN powersavemode OFF powersavesleep 100
        wepmode OFF weptxkey 1

  现在不用考虑细节部分,只要确认有信息表明您已安装了无线网卡。 如果您无法找到无线接口,您可能使用的是 PC 卡,需要查看 pccardc(8)pccardd(8) 联机手册以获取更多信息。

  下一步,您需要加载一个模块使 FreeBSD 的桥接部分为接入点作好准备。 加载桥接 bridge(4) 模块,只需运行以下命令:

# kldload bridge

  加载模块应该不会产生任何错误。如果发生了错误, 您就需要将桥接 bridge(4) 代码编译入内核。手册的桥接(Bridging) 部分应该能帮您完成这个任务。

  现在已经完成了桥接的组件, 接着我们需要告诉内核将哪些接口桥接在一起。 我们使用 sysctl(8) 来完成:

# sysctl net.link.ether.bridge.enable=1
# sysctl net.link.ether.bridge.config="wi0 xl0"
# sysctl net.inet.ip.forwarding=1

  在 FreeBSD 5.2 之前的版本中, 则必须使用下面的选项:

# sysctl net.link.ether.bridge=1
# sysctl net.link.ether.bridge_cfg="wi0,xl0"
# sysctl net.inet.ip.forwarding=1

  现在来设置并启动无线网卡。以下的命令将网卡设置为接入点状态:

# ifconfig wi0 ssid my_net channel 11 media DS/11Mbps mediaopt hostap up stationname "FreeBSD AP"
        

  ifconfig(8) 行用于启动 wi0 接口, 并把它的 SSID 设置为 my_net, 还有把工作站名设置为 FreeBSD APmedia DS/11Mbps 是把卡设置成 11Mbps 模式, 它是任何mediaopt产生作用所必需的。 mediaopt hostap 选项把接口设置成接入点模式。 channel 11 选项设置为要使用的 802.11b channel(频道)。 wicontrol(8) 手册包含一些有效的channel选项。

  现在应该启动并运行着一个完全功能的接入点。 推荐阅读 wicontrol(8)ifconfig(8)wi(4) 以求更深入的了解。

  同样建议您阅读接着关于加密那一节。

27.3.3.2.3 状态信息

  一旦接入点配置完成且可操作, 操作者都会希望查看连入接入点的客户。 在任何时候,都可以键入:

# wicontrol -l
1 station:
00:09:b7:7b:9d:16  asid=04c0, flags=3<ASSOC,AUTH>, caps=1<ESS>, rates=f<1M,2M,5.5M,11M>, sig=38/15

  显示连接了一个站点,接着的是各种参数。 显示的信号通常只作为强度的相对指示。到 dBm 或其它单元的转换因 firmware 版本的不同而有所差异。

27.3.3.3 客户端

  一个无线客户端是一个连入接入点或直接连接另一个客户端的系统。

  一般地,无线客户端只有一个网络设备,也就是无线网卡。

  配置无线客户端的方法有好几种。基于不同的无线模式,一般有 BSS (infrastructure 模式,它需要有一个接入点) 和 IBSS 模式 (ad-hoc,或点对点模式)。在我们的例子中我们使用了最流行的BSS模式, 讨论接入点。

27.3.3.3.1 要求

  将FreeBSD设置为无线客户端事实上只有一个条件。 就是您需要有一块能被FreeBSD支持的无线网卡。

27.3.3.3.2 设置FreeBSD无线客户端

  在开始之前,您需要了解有关要连入的无线网络的一些信息。 在本例中,我们将连入一个名为 my_net 的无线网络,且关闭了加密功能。

注意: 在本例中,我们不使用加密,这是非常危险的。 在下一节中,您将会学到如何开启加密和这样做的重要性的原因, 以及为什么一些加密技术仍不能完全地保护您。

  确保您的网卡能被 FreeBSD 识别:

# ifconfig -a
wi0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet6 fe80::202:2dff:fe2d:c938%wi0 prefixlen 64 scopeid 0x7
        inet 0.0.0.0 netmask 0xff000000 broadcast 255.255.255.255
        ether 00:09:2d:2d:c9:50
        media: IEEE 802.11 Wireless Ethernet autoselect (DS/2Mbps)
        status: no carrier
        ssid ""
        stationname "FreeBSD Wireless node"
        channel 10 authmode OPEN powersavemode OFF powersavesleep 100
        wepmode OFF weptxkey 1

  现在,我们要正确地设置网卡:

# ifconfig wi0 inet 192.168.0.20 netmask 255.255.255.0 ssid my_net

  将 192.168.0.20255.255.255.0 替换为有线网络上合法的 IP 地址和网络掩码。记住, 接入点桥连了无线网络和有线网络之间的数据, 所以对于网络上的其它设备来说,您就如同在有线网络上。

  完成了这些,您应该能 ping 通有线网络上的主机, 就像是通过有线网络连接的一样。

  如果您遇到了问题,确认您是否连上了接入点:

# ifconfig wi0

  此命令会返回一些信息,您应该能看到:

status: associated

  如果显示没有连接上 (associated), 那您可能在接入点的范围以外,需要关闭加密或者可能有配置问题。

27.3.3.4 加密

  无线网络的加密非常重要因为您无法让网络处于一个被良好保护的区域。 您的无线数据会向整个社区广播,任何人都可以读到它。 这就需要加密。通过加密向电波发送的数据, 使得任何有兴趣的组织从电波中提取数据变得更难。

  加密客户端与接入点之间数据的最常用的方法有两种:WEP和ipsec(4)

27.3.3.4.1 WEP

  WEP 是 Wired Equivalency Protocol(有线等效协议) 的缩写。 WEP试图使无线网络变得如有线网络一样安全与可靠。 不幸的是它已经被攻破,是非常容易被破解的。 这也意味着它不适用于加密敏感数据。

  但有总比没有好,使用以下命令 FreeBSD 接入点上打开 WEP:

# ifconfig wi0 inet up ssid my_net wepmode on wepkey 0x1234567890 media DS/11Mbps mediaopt hostap

  您可以使用以下这个命令在客户端上打开 WEP:

# ifconfig wi0 inet 192.168.0.20 netmask 255.255.255.0 ssid my_net wepmode on wepkey 0x1234567890

  注意您应该将 0x1234567890 替换为更独特的密钥。

27.3.3.4.2 IPsec

  ipsec(4) 是一个更加强大的网络数据加密工具。 它无疑是加密无线网络数据的首选。在手册的 IPsec 部分,您将能更多了解 ipsec(4) 的安全性及其实现。

27.3.3.5 工具

  有少量用于诊断和设置无线网络的工具,这里我们将介绍几个这样的工具。

27.3.3.5.1 bsd-airtools

  bsd-airtools 包是一套完整的工具集,包括了用于破解 WEP 密匙的无线审核工具,接入点检测等等。

  bsd-airtools 工具集可以用net-mgmt/bsd-airtools port 来安装。关于安装 ports 的信息可以在手册的 第 4 章 里找到。

  dstumbler 是一个用于接入点发现和显示音噪比 (noise ratio) 图表的工具。在您启动运行接入点有困难时, dstumbler 可能会帮您大忙。

  为了测试无线网络的安全性,您可以选用 “dweputils” (dwepcrackdwepdumpdwepkeygen) 来帮您测定 WEP 是否是您的无线网络安全需要的正确解决方案。

27.3.3.5.2 wicontrolancontrolraycontrol 工具集

  这些工具用于控制无线网卡在无线网络上行为。 在以上的例子中,我们选择了 wicontrol(8), 因为我们的无线网卡是 wi0 接口。 如果您有 Cisco (思科) 的无线设备,出现的将是 an0,于是您可以使用 ancontrol(8)

27.3.3.5.3 ifconfig 命令

  ifconfig(8) 命令可以用来处理大量与 wicontrol(8) 相同的设置,但它还是少了几个选项。 查看 ifconfig(8) 可以了解到命令行参数和选项。

27.3.3.6 支持的卡

27.3.3.6.1 接入点

  现在唯一被支持用于 BSS (作为接入点) 模式的卡都是基于 Prism 2、2.5,或 3 芯片组的。要完整的列表, 查看 wi(4)

27.3.3.6.2 802.11b 客户端

  现在几乎所有的 802.11b 无线网卡都能被 FreeBSD 支持。大多数基于 Prism、Spectrum24、Hermes、Aironet 和 Raylink 的网卡能在 IBSS (ad-hoc, peer-to-peer, 和 BSS)模式下工作。

27.3.3.6.3 802.11a & 802.11g 客户端

  ath(4) 设备驱动能够支持 802.11a 和 802.11g。 如果您的网卡采用的是 Atheros 芯片组, 就可以使用这个驱动。

  不幸的是, 由于认为设计许多敏感的商业机密, 许多厂商至今仍不愿意将把驱动程序作为开放源代码形式发布列入时间表。 因此, FreeBSD 以及其它操作系统的开发人员只剩下了两种选择: 要么经历长时间的痛苦过程来对驱动进行逆向工程, 要么使用现存的为 Microsoft® Windows 平台编译好的驱动程序。 许多开发人员, 包括参与 FreeBSD 的那些, 选择了后者。

  得益于 Bill Paul (wpaul) 的工作, 从 FreeBSD 5.3-RELEASE 开始, 已经可以 “直接” 支持网络驱动接口规范 (NDIS)。 FreeBSD NDISulator (也被称为 Project Evil) 可以支持二进制形式的 Windows 驱动程序, 并让它相信正在运行的是 Windows。 这是一个相对较新的功能, 但许多测试证明, 它确实相当有效。

  要使用 NDISulator, 您需要三件东西:

  1. 内核源代码

  2. 二进制形式的 Windows XP 驱动程序 (扩展名是 .SYS)

  3. Windows XP 驱动程序配置文件 (扩展名是 .INF)

  您可能需要编译 ndis(4) 袖珍端口驱动封装模块。 这一操作需要以 root 身份来完成:

# cd /usr/src/sys/modules/ndis
# make && make install

  找到您的卡所需的文件。 一般来说, 您应该能在随卡的 CD 或者制造商的网站上找到。 下面的例子中, 我们将使用 W32DRIVER.SYSW32DRIVER.INF 这两个名字。

  接下来的步骤是将二进制形式的驱动程序组装成内核模块。 要完成这一任务, 需要以 root 身份进入 if_ndis 模块的目录, 并将 Windows 驱动程序复制到这里:

# cd /usr/src/sys/modules/if_ndis
# cp /path/to/driver/W32DRIVER.SYS ./
# cp /path/to/driver/W32DRIVER.INF ./

  接下来我们将使用 ndiscvt 工具来创建驱动定义的头文件 ndis_driver_data.h, 用以构建驱动程序:

# ndiscvt -i W32DRIVER.INF -s W32DRIVER.SYS -o ndis_driver_data.h

  选项 -i-s 分别用于指定配置和二进制形式的驱动程序。 我们使用 -o ndis_driver_data.h 参数, 因为 Makefile 在构建内核模块时会查找它。

注意: 某些 Windows 驱动程序需要一些额外的文件才能正常工作。 您可以把它们放到 ndiscvt 命令的 -f 参数后面。 请参考 ndiscvt(8) 联机手册了解更多详情。

  最后, 就可以构建并安装内核模块了:

# make && make install

  要使用驱动程序, 您需要加在适当的内核模块:

# kldload ndis
# kldload if_ndis

  第一个命令会加载 NDIS 袖珍端口驱动封装模块, 第二个则加载实际的网卡。 请查看 dmesg(8) 的输出以了解是否在加载过程中存在错误。 如果一切正常, 您应该能看到类似下面的输出:

ndis0: <Wireless-G PCI Adapter> mem 0xf4100000-0xf4101fff irq 3 at device 8.0 on pci1
ndis0: NDIS API version: 5.0
ndis0: Ethernet address: 0a:b1:2c:d3:4e:f5
ndis0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
ndis0: 11g rates: 6Mbps 9Mbps 12Mbps 18Mbps 36Mbps 48Mbps 54Mbps

  这里您可以像使用其它任何无线设备 (例如 wi0) 那样使用 ndis0 设备。 具体细节可以参考线面章节的讨论。

本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<[email protected]>.
关于本文档的问题请发信联系 <[email protected]>.