29.3 无线网络

陈福康、 Marc Fonvieille 和 Murray Stokely.

29.3.1 无线网络基础

  绝大多数无线网络都采用了 IEEE 802.11 标准。 基本的无线网络中, 都包含多个以 2.4GHz 或 5GHz 频段的无线电波广播的站点 (不过, 随所处地域的不同, 或者为了能够更好地进行通讯, 具体的频率会在 2.3GHz 和 4.9GHz 的范围内变化)。

  802.11 网络有两种组织方式: 在 infrastructure 模式 中, 一个通讯站作为主站, 其他通讯站都与其关联; 这种网络称为 BSS, 而主站则成为无线访问点 (AP)。 在 BSS 中, 所有的通讯都是通过 AP 来完成的; 即使通讯站之间要相互通讯, 也必须将消息发给 AP。 在第二种形式的网络中, 并不存在主站, 通讯站之间是直接通讯的。 这种网络形式称作 IBSS, 通常也叫做 ad-hoc 网络

  802.11 网络最初在 2.4GHz 频段上部署, 并采用了由 IEEE 802.11 和 802.11b 标准所定义的协议。 这些标准定义了采用的操作频率、 包括分帧和传输速率 (通讯过程中可以使用不同的速率) 在内的 MAC 层特性等。 稍后的 802.11a 标准定义了使用 5GHz 频段进行操作, 以及不同的信号机制和更高的传输速率。 其后定义的 802.11g 标准启用了在 2.4GHz 上如何使用 802.11a 信号和传输机制, 以提供对较早的 802.11b 网络的向前兼容。

  802.11 网络中采用的各类底层传输机制提供了不同类型的安全机制。 最初的 802.11 标准定义了一种称为 WEP 的简单安全协议。 这个协议采用固定的预发布密钥, 并使用 RC4 加密算法来对在网络上传输的数据进行编码。 全部通讯站都必须采用同样的固定密钥才能通讯。 这一格局已经被证明很容易被攻破, 因此目前已经很少使用了, 采用这种方法只能让那些接入网络的用户迅速断开。 最新的安全实践是由 IEEE 802.11i 标准给出的, 它定义了新的加密算法, 并通过一种附加的协议来让通讯站向无线访问点验证身份, 并交换用于进行数据通讯的密钥。 更进一步, 用于加密的密钥会定期地刷新, 而且有机制能够监测入侵的尝试 (并阻止这种尝试)。 无线网络中另一种常用的安全协议标准是 WPA。 这是在 802.11i 之前由业界组织定义的一种过渡性标准。 WPA 定义了在 802.11i 中所规定的要求的子集, 并被设计用来在旧式硬件上实施。 特别地, WPA 要求只使用由最初 WEP 所采用的算法派生的 TKIP 加密算法。 802.11i 则不但允许使用 TKIP, 而且还要求支持更强的加密算法 AES-CCM 来用于加密数据。 (在 WPA 中并没有要求使用 AES 加密算法, 因为在旧式硬件上实施这种算法时所需的计算复杂性太高。)

  除了前面介绍的那些协议标准之外, 还有一种需要介绍的标准是 802.11e。 它定义了用于在 802.11 网络上运行多媒体应用, 如视频流和使用 IP 传送的语音 (VoIP) 的协议。 与 802.11i 类似, 802.11e 也有一个前身标准, 通常称作 WME (后改名为 WMM), 它也是由业界组织定义的 802.11e 的子集, 以便能够在旧式硬件中使用多媒体应用。 关于 802.11e 与 WME/WMM 之间的另一项重要区别是, 前者允许对流量通过服务品质 (QoS) 协议和增强媒体访问协议来安排优先级。 对于这些协议的正确实现, 能够实现高速突发数据和流量分级。

  从 6.0 版本开始, FreeBSD 支持采用 802.11a, 802.11b 和 802.11g 的网络。 类似地, 它也支持 WPA 和 802.11i 安全协议 (与 11a、 11b 和 11g 配合), 而 WME/WMM 所需要的 QoS 和流量分级, 则在部分无线设备上提供了支持。

29.3.2 基本安装

29.3.2.1 内核配置

  要使用无线网络, 您需要一块无线网卡, 并适当地配置内核令其提供无线网络支持。 后者被分成了多个模块, 因此您只需配置使用您所需要的软件就可以了。

  首先您需要的是一个无线设备。 最为常用的一种无线配件是 Atheros 生产的。 这些设备由 ath(4) 驱动程序提供支持, 您需要把下面的配置加入到 /boot/loader.conf 文件中:

if_ath_load="YES"

  Atheros 驱动分为三个部分: 驱动部分 (ath(4))、 用于处理芯片专有功能的支持层 (ath_hal(4)), 以及一组用以选择传输帧速率的算法 (ath_rate_sample here)。 当以模块方式加载这一支持时, 所需的其它模块会自动加载。 如果您使用的不是 Atheros 设备, 则应选择对应的模块; 例如:

if_wi_load="YES"

  表示使用基于 Intersil Prism 产品的无线设备 (wi(4) 驱动)。

注意: 在这篇文挡余下的部分中, 我们将使用一张 ath(4) 卡作示范, 如果您要套用这些配置的话, 就必须根据实际的配置情况来替换设备名。 在联机手册 wlan(4) 的开头部分给出了一份可用的驱动列表。 如果您的无线设备没有专用于 FreeBSD 的驱动程序, 也可以尝试使用 NDIS 驱动封装机制来直接使用 Windows® 驱动。

  在配置好设备驱动之后, 您还需要引入驱动程序所需要的 802.11 网络支持。 对于 ath(4) 驱动而言, 至少需要 wlan(4) 模块; 这个模块会自动随无线设备驱动一同加载。 除此之外, 您还需要提供您希望使用的安全协议所需的加密支持模块。 这些模块是设计来让 wlan(4) 模块根据需要自动加载的, 但目前还必须手工进行配置。 您可以使用下面这些模块: wlan_wep(4)wlan_ccmp(4)wlan_tkip(4)wlan_ccmp(4)wlan_tkip(4) 这两个驱动都只有在您希望采用 WPA 和/或 802.11i 安全协议时才需要。 如果您的网络是完全开放的 (也就是不加密) 则甚至连 wlan_wep(4) 支持也是不需要的。 要在系统引导时加载这些模块, 就需要在 /boot/loader.conf 中加入下面的配置:

wlan_wep_load="YES"
wlan_ccmp_load="YES"
wlan_tkip_load="YES"

  通过系统引导配置文件 (也就是 /boot/loader.conf) 中的这些信息生效, 您必须重新启动运行 FreeBSD 的计算机。 如果不想立刻重新启动, 也可以使用 kldload(8) 来手工加载。

注意: 如果不想加载模块, 也可以将这些驱动编译到内核中, 方法是在内核的编译配置文件中加入下面的配置:

device ath               # Atheros IEEE 802.11 wireless network driver
device ath_hal           # Atheros Hardware Access Layer
device ath_rate_sample   # John Bicket's SampleRate control algorithm.
device wlan              # 802.11 support (Required)
device wlan_wep          # WEP crypto support for 802.11 devices
device wlan_ccmp         # AES-CCMP crypto support for 802.11 devices
device wlan_tkip         # TKIP and Michael crypto support for 802.11 devices

将这些信息写到内核编译配置文件中之后, 您需要重新编译内核, 并重新启动运行 FreeBSD 的计算机。

  在系统启动之后, 您会在引导时给出的信息中, 找到类似下面这样的关于无线设备的信息:

ath0: <Atheros 5212> mem 0xff9f0000-0xff9fffff irq 17 at device 2.0 on pci2
ath0: Ethernet address: 00:11:95:d5:43:62
ath0: mac 7.9 phy 4.5 radio 5.6

29.3.3 Infrastructure 模式

  通常的情形中使用的是 infrastructure 模式或称 BSS 模式。 在这种模式中, 有一系列无线访问点接入了有线网络。 每个无线网都会有自己的名字, 这个名字称作网络的 SSID。 无线客户端都通过无线访问点来完成接入。

29.3.3.1 FreeBSD 客户机

29.3.3.1.1 如何查找无线访问点

  您可以通过使用 ifconfig 命令来扫描网络。 由于系统需要在操作过程中切换不同的无线频率并探测可用的无线访问点, 这种请求可能需要数分钟才能完成。 只有超级用户才能启动这种扫描:

# ifconfig ath0 up scan
SSID            BSSID              CHAN RATE  S:N   INT CAPS
dlinkap         00:13:46:49:41:76    6   54M 29:3   100 EPS  WPA WME
freebsdap       00:11:95:c3:0d:ac    1   54M 22:1   100 EPS  WPA

注意: 在开始扫描之前, 必须将网络接口设为 up。 后续的扫描请求就不需要再将网络接口设为 up 了。

  扫描会列出所请求到的所有 BSS/IBSS 网络列表。 除了网络的名字 SSID 之外, 我们还会看到 BSSID 即无线访问点的 MAC 地址。 而 CAPS 字段则给出了网络类型及其提供的功能, 其中包括:

E

Extended Service Set (ESS)。 表示通讯站是 infrastructure 网络 (相对于 IBSS/ad-hoc 网络) 的成员。

I

IBSS/ad-hoc 网络。 表示通讯站是 ad-hoc 网络 (相对于 ESS 网络) 的成员。

P

私密。 在 BSS 中交换的全部数据帧均需保证数据保密性。 这表示 BSS 需要通讯站使用加密算法, 例如 WEP、 TKIP 或 AES-CCMP 来加密/解密与其他通讯站交换的数据帧。

S

短前导码 (Short Preamble)。 表示网络采用的是短前导码 (由 802.11b High Rate/DSSS PHY 定义, 短前导码采用 56-位 同步字段, 而不是在长前导码模式中所采用的 128-位 字段)。

s

短碰撞槽时间 (Short slot time)。 表示由于不存在旧式 (802.11b) 通讯站, 802.11g 网络正使用短碰撞槽时间。

  要显示目前已知的网络, 可以使用下面的命令:

# ifconfig ath0 list scan

  这些信息可能会由无线适配器自动更新, 也可使用 scan 手动更新。 快取缓存中的旧数据会自动删除, 因此除非进行更多扫描, 这个列表会逐渐缩小。

29.3.3.1.2 基本配置

  在这一节中我们将展示一个简单的例子来介绍如何让无线网络适配器在 FreeBSD 中以不加密的方式工作。 在您熟悉了这些概念之后, 我们强烈建议您在实际的使用中采用 WPA 来配置网络。

  配置无线网络的过程可分为三个基本步骤: 选择无线访问点、 验证您的通讯站身份, 以及配置 IP 地址。 下面的几节中将分步骤地介绍它们。

29.3.3.1.2.1 选择无线访问点

  多数时候让系统以内建的探测方式选择无线访问点就可以了。 这是在您将网络接口置为 up 或在 /etc/rc.conf 中配置 IP 地址时的默认方式, 例如:

ifconfig_ath0="DHCP"

  如果存在多个无线访问点, 而您希望从中选择具体的一个, 则可以通过指定 SSID 来实现:

ifconfig_ath0="ssid your_ssid_here DHCP"

  在某些环境中, 多个访问点可能会使用同样的 SSID (通常, 这样做的目的是简化漫游), 这时可能就需要与某个具体的设备关联了。 这种情况下, 您还应指定无线访问点的 BSSID (这时可以不指定 SSID):

ifconfig_ath0="ssid your_ssid_here bssid xx:xx:xx:xx:xx:xx DHCP"

  除此之外, 还有一些其它的方法能够约束查找无线访问点的范围, 例如限制系统扫描的频段, 等等。 如果您的无线网卡支持多个频段, 这样做可能会非常有用, 因为扫描全部可用频段是一个十分耗时的过程。 要将操作限制在某个具体的频段, 可以使用 mode 参数; 例如:

ifconfig_ath0="mode 11g ssid your_ssid_here DHCP"

  就会强制卡使用采用 2.4GHz 的 802.11g, 这样在扫描的时候, 就不会考虑那些 5GHz 的频段了。 除此之外, 还可以通过 channel 参数来将操作锁定在特定频率, 以及通过 chanlist 参数来指定扫描的频段列表。 关于这些参数的进一步信息, 可以在联机手册 ifconfig(8) 中找到。

29.3.3.1.2.2 验证身份

  一旦您选定了无线访问点, 您的通讯站就需要完成身份验证, 以便开始发送和接收数据。 身份验证可以通过许多方式进行, 最常用的一种方式称为开放式验证, 它允许任意通讯站加入网络并相互通信。 这种验证方式只应在您第一次配置无线网络进行测试时使用。 其它的验证方式则需要在进行数据通讯之前, 首先进行密钥协商握手; 这些方式要么使用预先分发的密钥或密码, 要么是用更复杂一些的后台服务, 如 RADIUS。 绝大多数用户会使用默认的开放式验证, 而第二多的则是 WPA-PSK, 它也称为个人 WPA, 在 下面 的章节中将进行介绍。

注意: 如果您使用 Apple® AirPort® Extreme 基站作为无线访问点, 则可能需要同时在两端配置 WEP 共享密钥验证。 这可以通过在 /etc/rc.conf 文件中进行设置, 或使用 wpa_supplicant(8) 程序来手工完成。 如果您只有一个 AirPort 基站, 则可以用类似下面的方法来配置:

ifconfig_ath0="authmode shared wepmode on weptxkey 1 wepkey 01234567 DHCP"

一般而言, 应尽量避免使用共享密钥这种验证方法, 因为它以非常受限的方式使用 WEP 密钥, 使得攻击者能够很容易地破解密钥。 如果必须使用 WEP (例如, 为了兼容旧式的设备) 最好使用 WEP 配合 open 验证方式。 关于 WEP 的更多资料请参见 第 29.3.3.1.4 节

29.3.3.1.2.3 通过 DHCP 获取 IP 地址

  在您选定了无线访问点, 并配置了验证参数之后, 还必须获得 IP 地址才能真正开始通讯。 多数时候, 您会通过 DHCP 来获得无线 IP 地址。 要达到这个目的, 只需简单地编辑 /etc/rc.conf 并在配置中加入 DHCP

ifconfig_ath0="DHCP"

  现在您已经完成了启用无线网络接口的全部准备工作了, 下面的操作将启用它:

# /etc/rc.d/netif start

  一旦网络接口开始运行, 就可以使用 ifconfig 来查看网络接口 ath0 的状态了:

# ifconfig ath0
ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1
        inet 192.168.1.100 netmask 0xffffff00 broadcast 192.168.1.255
        ether 00:11:95:d5:43:62
        media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/54Mbps)
        status: associated
        ssid dlinkap channel 6 bssid 00:13:46:49:41:76
        authmode OPEN privacy OFF txpowmax 36 protmode CTS bintval 100

  这里的 status: associated 表示您已经连接到了无线网络 (在这个例子中, 这个网络的名字是 dlinkap)。 bssid 00:13:46:49:41:76 是指您所用无线访问点的 MAC 地址; authmode 这行指出您所做的通讯将不进行加密 (OPEN)。

29.3.3.1.2.4 静态 IP 地址

  如果无法从某个 DHCP 服务器获得 IP 地址, 则可以配置一个静态 IP 地址, 方法是将前面的 DHCP 关键字替换为地址信息。 请务必保持其他用于连接无线访问点的参数:

ifconfig_ath0="ssid your_ssid_here inet 192.168.1.100 netmask 255.255.255.0"

29.3.3.1.3 WPA

  WPA (Wi-Fi 保护访问) 是一种与 802.11 网络配合使用的安全协议, 其目的是消除 WEP 中缺少身份验证能力的问题, 以及一些其它的安全弱点。 WPA 采用了 802.1X 认证协议, 并采用从多种与 WEP 不同的加密算法中选择一种来保证数据保密性。 WPA 支持的唯一一种加密算法是 TKIP (临时密钥完整性协议), 这是一种对 WEP 所采用的基本 RC4 加密算法的扩展, 除此之外还提供了对检测到的入侵的响应机制。 TKIP 被设计用来与旧式硬件一同工作, 只需要进行部分软件修改; 它提供了一种改善安全性的折衷方案, 但仍有可能受到攻击。 WPA 也指定了 AES-CCMP 加密作为 TKIP 的替代品, 在可能时倾向于使用这种加密; 表达这一规范的常用术语是 WPA2 (或 RSN)。

  WPA 定义了验证和加密协议。 验证通常是使用两种方法之一来完成的: 通过 802.1X 或类似 RADIUS 这样的后端验证服务, 或通过在通讯站和无线访问点之间通过事先分发的密码来进行最小握手。 前一种通常称作企业 WPA, 而后者通常也叫做个人 WPA。 因为多数人不会为无线网络配置 RADIUS 后端服务器, 因此 WPA-PSK 是在 WPA 中最为常见的一种。

  对无线连接的控制和身份验证工作 (密钥协商或通过服务器验证) 是通过 wpa_supplicant(8) 工具来完成的。 这个程序运行时需要一个配置文件, /etc/wpa_supplicant.conf。 关于这个文件的更多信息, 请参考联机手册 wpa_supplicant.conf(5)

29.3.3.1.3.1 WPA-PSK

  WPA-PSK 也称作 个人-WPA, 它基于预先分发的密钥 (PSK), 这个密钥是根据作为无线网络上使用的主密钥的密码生成的。 这表示每个无线用户都会使用同样的密钥。 WPA-PSK 主要用于小型网络, 在这种网络中, 通常不需要或没有办法架设验证服务器。

警告: 无论何时, 都应使用足够长, 且包括尽可能多字母和数字的强口令, 以免被猜出和/或攻击。

  第一步是修改配置文件 /etc/wpa_supplicant.conf, 并在其中加入在您网络上使用的 SSID 和事先分发的密钥:

network={
  ssid="freebsdap"
  psk="freebsdmall"
}

  接下来, 在 /etc/rc.conf 中, 我们将指定无线设备的配置, 令其采用 WPA, 并通过 DHCP 来获取 IP 地址:

ifconfig_ath0="WPA DHCP"

  下面, 启用无线网络接口:

# /etc/rc.d/netif start
Starting wpa_supplicant.
DHCPDISCOVER on ath0 to 255.255.255.255 port 67 interval 5
DHCPDISCOVER on ath0 to 255.255.255.255 port 67 interval 6
DHCPOFFER from 192.168.0.1
DHCPREQUEST on ath0 to 255.255.255.255 port 67
DHCPACK from 192.168.0.1
bound to 192.168.0.254 -- renewal in 300 seconds.
ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
      inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1
      inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255
      ether 00:11:95:d5:43:62
      media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/36Mbps)
      status: associated
      ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac
      authmode WPA privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36
      protmode CTS roaming MANUAL bintval 100

  除此之外, 您也可以手动地使用 above 中那份 /etc/wpa_supplicant.conf 来配置, 方法是执行:

# wpa_supplicant -i ath0 -c /etc/wpa_supplicant.conf
Trying to associate with 00:11:95:c3:0d:ac (SSID='freebsdap' freq=2412 MHz)
Associated with 00:11:95:c3:0d:ac
WPA: Key negotiation completed with 00:11:95:c3:0d:ac [PTK=TKIP GTK=TKIP]

  接下来的操作, 是运行 dhclient 命令来从 DHCP 服务器获取 IP:

# dhclient ath0
DHCPREQUEST on ath0 to 255.255.255.255 port 67
DHCPACK from 192.168.0.1
bound to 192.168.0.254 -- renewal in 300 seconds.
# ifconfig ath0
ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
      inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1
      inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255
      ether 00:11:95:d5:43:62
      media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/48Mbps)
      status: associated
      ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac
      authmode WPA privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36
      protmode CTS roaming MANUAL bintval 100

注意: 如果 /etc/rc.conf 的配置中, 使用了 ifconfig_ath0="DHCP", 就不需要手工运行 dhclient 命令了, 因为 dhclient 将在 wpa_supplicant 探测到密钥之后执行。

  在这个例子中, DHCP 并不可用, 您可以在 wpa_supplicant 为通讯站完成了身份认证之后, 指定静态 IP 地址:

# ifconfig ath0 inet 192.168.0.100 netmask 255.255.255.0
# ifconfig ath0
ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
      inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1
      inet 192.168.0.100 netmask 0xffffff00 broadcast 192.168.0.255
      ether 00:11:95:d5:43:62
      media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/36Mbps)
      status: associated
      ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac
      authmode WPA privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36
      protmode CTS roaming MANUAL bintval 100

  如果没有使用 DHCP, 还需要手工配置默认网关, 以及域名服务器:

# route add default your_default_router
# echo "nameserver your_DNS_server" >> /etc/resolv.conf
29.3.3.1.3.2 使用 EAP-TLS 的 WPA

  使用 WPA 的第二种方式是使用 802.1X 后端验证服务器, 在这个例子中, WPA 也称作 企业-WPA, 以便与安全性较差、 采用事先分发密钥的 个人-WPA 区分开来。 在 企业-WPA 中, 验证操作是采用 EAP 完成的 (可扩展认证协议)。

  EAP 并未附带加密方法, 因此设计者决定将 EAP 放在加密信道中进行传送。 为此设计了许多 EAP 验证方法, 最常用的方法是 EAP-TLS、 EAP-TTLS 和 EAP-PEAP。

  EAP-TLS (带 传输层安全 的 EAP) 是一种在无线世界中得到了广泛支持的验证协议, 因为它是 Wi-Fi 联盟 核准的第一个 EAP 方法。 EAP-TLS 需要使用三个证书: CA 证书 (在所有计算机上安装)、 用以向您证明服务器身份的服务器证书, 以及每个无线客户端用于证明身份的客户机证书。 在这种 EAP 方式中, 验证服务器和无线客户端均通过自己的证书向对方证明身份, 它们均验证对方的证书是本机构的证书发证机构 (CA) 签发的。

  与之前介绍的方法类似, 配置也是通过 /etc/wpa_supplicant.conf 来完成的:

network={
  ssid="freebsdap" (1)
  proto=RSN  (2)
  key_mgmt=WPA-EAP (3)
  eap=TLS (4)
  identity="loader" (5)
  ca_cert="/etc/certs/cacert.pem" (6)
  client_cert="/etc/certs/clientcert.pem" (7)
  private_key="/etc/certs/clientkey.pem" (8)
  private_key_passwd="freebsdmallclient" (9)
}
(1)
这个字段表示网络名 (SSID)。
(2)
这里, 我们使用 RSN (IEEE 802.11i) 协议, 也就是 WPA2。
(3)
key_mgmt 这行表示所用的密钥管理协议。 在我们的例子中, 它是使用 EAP 验证的 WPA: WPA-EAP
(4)
这个字段中, 提到了我们的连接采用 EAP 方式。
(5)
identity 字段包含了 EAP 的实体串。
(6)
ca_cert 字段给出了 CA 证书文件的路径名。 在验证服务器证书时, 这个文件是必需的。
(7)
client_cert 这行给出了客户机证书的路径名。 对每个无线客户端而言, 这个证书都是在全网范围内唯一的。
(8)
private_key 字段是客户机证书私钥文件的路径名。
(9)
private_key_passwd 字段是私钥的口令字。

  接着, 把下面的配置加入到 /etc/rc.conf

ifconfig_ath0="WPA DHCP"

  下一步是使用 rc.d 机制来启用网络接口:

# /etc/rc.d/netif start
Starting wpa_supplicant.
DHCPREQUEST on ath0 to 255.255.255.255 port 67
DHCPREQUEST on ath0 to 255.255.255.255 port 67
DHCPACK from 192.168.0.20
bound to 192.168.0.254 -- renewal in 300 seconds.
ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
      inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1
      inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255
      ether 00:11:95:d5:43:62
      media: IEEE 802.11 Wireless Ethernet autoselect (DS/11Mbps)
      status: associated
      ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac
      authmode WPA2/802.11i privacy ON deftxkey UNDEF TKIP 2:128-bit
      txpowmax 36 protmode CTS roaming MANUAL bintval 100

  如前面提到的那样, 也可以手工通过 wpa_supplicantifconfig 命令达到类似的目的。

29.3.3.1.3.3 使用 EAP-TTLS 的 WPA

  在使用 EAP-TLS 时, 参与验证过程的服务器和客户机都需要证书, 而在使用 EAP-TTLS (带传输层安全隧道的 EAP) 时, 客户机证书则是可选的。 这种方式与某些安全 web 站点更为接近, 即使访问者没有客户端证书, 这些 web 服务器也能建立安全的 SSL 隧道。 EAP-TTLS 会使用加密的 TLS 隧道来传送验证信息。

  对于它的配置, 同样是通过 /etc/wpa_supplicant.conf 文件来进行的:

network={
  ssid="freebsdap"
  proto=RSN
  key_mgmt=WPA-EAP
  eap=TTLS (1)
  identity="test" (2)
  password="test" (3)
  ca_cert="/etc/certs/cacert.pem" (4)
  phase2="auth=MD5" (5)
}
(1)
这个字段是我们的连接所采用的 EAP 方式。
(2)
identity 字段中是在加密 TLS 隧道中用于 EAP 验证的身份串。
(3)
password 字段中是用于 EAP 验证的口令字。
(4)
ca_cert 字段给出了 CA 证书文件的路径名。 在验证服务器证书时, 这个文件是必需的。
(5)
这个字段中给出了加密 TLS 隧道中使用的验证方式。 在这个例子中, 我们使用的是带 MD5-加密口令 的 EAP。 “inner authentication” (译注:内部鉴定) 通常也叫 “phase2”。

  您还必须把下面的配置加入到 /etc/rc.conf

ifconfig_ath0="WPA DHCP"

  下一步是启用网络接口:

# /etc/rc.d/netif start
Starting wpa_supplicant.
DHCPREQUEST on ath0 to 255.255.255.255 port 67
DHCPREQUEST on ath0 to 255.255.255.255 port 67
DHCPREQUEST on ath0 to 255.255.255.255 port 67
DHCPACK from 192.168.0.20
bound to 192.168.0.254 -- renewal in 300 seconds.
ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
      inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1
      inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255
      ether 00:11:95:d5:43:62
      media: IEEE 802.11 Wireless Ethernet autoselect (DS/11Mbps)
      status: associated
      ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac
      authmode WPA2/802.11i privacy ON deftxkey UNDEF TKIP 2:128-bit
      txpowmax 36 protmode CTS roaming MANUAL bintval 100
29.3.3.1.3.4 使用 EAP-PEAP 的 WPA

  PEAP (受保护的 EAP) 被设计用以替代 EAP-TTLS。 有两种类型的 PEAP 方法, 最常用的是 PEAPv0/EAP-MSCHAPv2。 在这篇文档余下的部分中, 术语 PEAP 是指这种 EAP 方法。 PEAP 是在 EAP-TLS 之后最为常用的 EAP 标准, 换言之, 如果您的网络中有多种不同的操作系统, PEAP 将是仅次于 EAP-TLS 的支持最广的标准。

  PEAP 与 EAP-TTLS 很像: 它使用服务器端证书, 通过在客户端与验证服务器之间建立加密的 TLS 隧道来向用户验证身份, 这保护了验证信息的交换过程。 在安全方面, EAP-TTLS 与 PEAP 的区别是 PEAP 会以明文广播用户名, 只有口令是通过加密 TLS 隧道传送的。 而 EAP-TTLS 在传送用户名和口令时, 都使用 TLS 隧道。

  我们需要编辑 /etc/wpa_supplicant.conf 文件, 并加入与 EAP-PEAP 有关的配置:

network={
  ssid="freebsdap"
  proto=RSN
  key_mgmt=WPA-EAP
  eap=PEAP (1)
  identity="test" (2)
  password="test" (3)
  ca_cert="/etc/certs/cacert.pem" (4)
  phase1="peaplabel=0" (5)
  phase2="auth=MSCHAPV2" (6)
}
(1)
这个字段的内容是用于连接的 EAP 方式。
(2)
identity 字段中是在加密 TLS 隧道中用于 EAP 验证的身份串。
(3)
password 字段中是用于 EAP 验证的口令字。
(4)
ca_cert 字段给出了 CA 证书文件的路径名。 在验证服务器证书时, 这个文件是必需的。
(5)
这个字段包含了第一阶段验证 (TLS 隧道) 的参数。 随您使用的验证服务器的不同, 您需要指定验证的标签。 多数时候, 标签应该是 “客户端 EAP 加密”, 这可以通过使用 peaplabel=0 来指定。 更多信息可以在联机手册 wpa_supplicant.conf(5) 中找到。
(6)
这个字段的内容是验证协议在加密的 TLS 隧道中使用的信息。 对 PEAP 而言, 这是 auth=MSCHAPV2

  您还必须把下面的配置加入到 /etc/rc.conf

ifconfig_ath0="WPA DHCP"

  下一步是启用网络接口:

# /etc/rc.d/netif start
Starting wpa_supplicant.
DHCPREQUEST on ath0 to 255.255.255.255 port 67
DHCPREQUEST on ath0 to 255.255.255.255 port 67
DHCPREQUEST on ath0 to 255.255.255.255 port 67
DHCPACK from 192.168.0.20
bound to 192.168.0.254 -- renewal in 300 seconds.
ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
      inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1
      inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255
      ether 00:11:95:d5:43:62
      media: IEEE 802.11 Wireless Ethernet autoselect (DS/11Mbps)
      status: associated
      ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac
      authmode WPA2/802.11i privacy ON deftxkey UNDEF TKIP 2:128-bit
      txpowmax 36 protmode CTS roaming MANUAL bintval 100

29.3.3.1.4 WEP

  WEP (有线等效协议) 是最初 802.11 标准的一部分。 其中没有提供身份验证机制, 只提供了弱访问控制, 而且很容易破解。

  WEP 可以通过 ifconfig 配置:

# ifconfig ath0 ssid my_net wepmode on weptxkey 3 wepkey 3:0x3456789012 \
        inet 192.168.1.100 netmask 255.255.255.0
  • weptxkey 指明了使用哪个 WEP 密钥来进行数据传输。 这里我们使用第三个密钥。 它必须与无线访问点的配置一致。

  • wepkey 表示设置所选的 WEP 密钥。 其格式应为 index:key, 如果没有给出 index 值, 则默认为 1。 因此, 如果需要设置的密钥不是第一个, 就必需指定 index 了。

    注意: 您需要将 0x3456789012 改为在无线接入点上配置的那个。

  我们建议您阅读联机手册 ifconfig(8) 来了解进一步的信息。

  wpa_supplicant 机制也可以用来配置您的无线网卡使用 WEP。 前面的例子也可以通过在 /etc/wpa_supplicant.conf 中加入下述设置来实现:

network={
  ssid="my_net"
  key_mgmt=NONE
  wep_key3=3456789012
  wep_tx_keyidx=3
}

  接着:

# wpa_supplicant -i ath0 -c /etc/wpa_supplicant.conf
Trying to associate with 00:13:46:49:41:76 (SSID='dlinkap' freq=2437 MHz)
Associated with 00:13:46:49:41:76

29.3.4 Ad-hoc 模式

  IBSS 模式, 也称为 ad-hoc 模式, 是为点对点连接设计的。 例如, 如果希望在计算机 AB 之间建立 ad-hoc 网络, 我们只需选择两个 IP 地址和一个 SSID 就可以了。

  在计算机 A 上:

# ifconfig ath0 ssid freebsdap mediaopt adhoc inet 192.168.0.1 netmask 255.255.255.0
# ifconfig ath0
  ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
      inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
      inet6 fe80::211:95ff:fec3:dac%ath0 prefixlen 64 scopeid 0x4
      ether 00:11:95:c3:0d:ac
      media: IEEE 802.11 Wireless Ethernet autoselect <adhoc> (autoselect <adhoc>)
      status: associated
      ssid freebsdap channel 2 bssid 02:11:95:c3:0d:ac
      authmode OPEN privacy OFF txpowmax 36 protmode CTS bintval 100

  此处的 adhoc 参数表示无线网络接口应以 IBSS 模式运转。

  此时, 在 B 上应该能够检测到 A 的存在了:

# ifconfig ath0 up scan
  SSID            BSSID              CHAN RATE  S:N   INT CAPS
  freebsdap       02:11:95:c3:0d:ac    2   54M 19:3   100 IS

  在输出中的 I 再次确认了 A 机是以 ad-hoc 模式运行的。 我们只需给 B 配置一不同的 IP 地址:

# ifconfig ath0 ssid freebsdap mediaopt adhoc inet 192.168.0.2 netmask 255.255.255.0
# ifconfig ath0
  ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
      inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1
      inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255
      ether 00:11:95:d5:43:62
      media: IEEE 802.11 Wireless Ethernet autoselect <adhoc> (autoselect <adhoc>)
      status: associated
      ssid freebsdap channel 2 bssid 02:11:95:c3:0d:ac
      authmode OPEN privacy OFF txpowmax 36 protmode CTS bintval 100

  这样, AB 就可以交换信息了。

29.3.5 FreeBSD 基于主机的(无线)访问接入点

  FreeBSD 可以作为一个(无线)访问接入点(AP), 这样可以不必再去买一个硬件 AP 或者使用 ad-hoc 模式的网络。 当你的 FreeBSD 机器作为网关连接到另外一个网络的时候将非常有用。

29.3.5.1 基本配置

  在把你的 FreeBSD 机器配置成一个 AP 以前, 你首先需要先在内核配置好对你的无线网卡的无线网络支持。 当然你还需要加上你想用的安全协议。想获得更详细的信息, 请参阅 第 29.3.2 节

注意: 目前还不支持使用 Windows 驱动和 NDIS 驱动包装的网卡做为 AP 使用。只有 FreeBSD 原生的无线驱动能够支持 AP 模式。

  一旦装载了无线网络的支持, 你就可以检查一下看看你的无线设备是否支持基于主机的无线访问接入模式 (通常也被称为 hostap 模式):

# ifconfig ath0 list caps
ath0=783ed0f<WEP,TKIP,AES,AES_CCM,IBSS,HOSTAP,AHDEMO,TXPMGT,SHSLOT,SHPREAMBLE,MONITOR,TKIPMIC,WPA1,WPA2,BURST,WME>

  这段输出显示了网卡所支持的各种功能; 其中的关键字 HOSTAP 表示这块无线网卡能作为一个(无线)访问接入点使用。 同时也提到了各种加密算法: WEP,TKIP,WPA2,等等, 这些信息对于知道在访问接入点上使用何种安全协议非常重要。

  现在这块无线设备在配置了正确的 SSID 和 IP 地址后进入 hostap 模式了。

# ifconfig ath0 ssid freebsdap mode 11g mediaopt hostap inet 192.168.0.1 netmask 255.255.255.0

  再一次用 ifconfig 查看一下 ath0 网络接口的状态:

# ifconfig ath0
  ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
      inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
      inet6 fe80::211:95ff:fec3:dac%ath0 prefixlen 64 scopeid 0x4
      ether 00:11:95:c3:0d:ac
      media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap>
      status: associated
      ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac
      authmode OPEN privacy OFF txpowmax 38 bmiss 7 protmode CTS burst dtimperiod 1 bintval 100

  hostap 参数说明这个网络接口目前正运行在基于主机的接入访问模式。

  也可以在 /etc/rc.conf 中加入以下这行使得网络界面的配置能够在机器启动的时候自动完成:

ifconfig_ath0="ssid freebsdap mode 11g mediaopt hostap inet 192.168.0.1 netmask 255.255.255.0"

29.3.5.2 不使用认证或加密的(无线)访问接入点

  尽管我们不推荐运行一个不使用任何认证或加密的 AP, 但这是一个非常简单的检测 AP 是否正常工作的方法。 这样配置对于调试客户端问题也非常重要。

  一旦 AP 被配置成了我们前面所展示的那样, 就可以在另外一台无线机器上初始化一次扫描来找到这个 AP:

# ifconfig ath0 up scan
SSID            BSSID              CHAN RATE  S:N   INT CAPS
freebsdap       00:11:95:c3:0d:ac    1   54M 22:1   100 ES

  在客户机上能看到已经连接上了(无线)访问接入点:

# ifconfig ath0 ssid freebsdap inet 192.168.0.2 netmask 255.255.255.0
# ifconfig ath0
  ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
      inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1
      inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255
      ether 00:11:95:d5:43:62
      media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/54Mbps)
      status: associated
      ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac
      authmode OPEN privacy OFF txpowmax 36 protmode CTS bintval 100

29.3.5.3 使用 WPA 的(无线)访问接入点

  这一段将注重介绍在 FreeBSD (无线)访问接入点上配置使用 WPA 安全协议。 更多有关 WPA 和配置基于 WPA 无线客户端的细节 请参阅 第 29.3.3.1.3 节

  hostapd 守护进程将被用于处理与客户端的认证和在启用 WPA (无线)访问接入点上的密钥管理。

  接下来,所有的配置操作都将在作为 AP 的 FreeBSD 机器上完成。 一旦 AP 能够正确的工作了,便把如下这行加入 /etc/rc.conf 使得 hostapd 能在机器启动的时候自动运行:

hostapd_enable="YES"

  在配置 hostapd 以前, 请确保你已经完成了基本配置中所介绍的步骤 第 29.3.5.1 节

29.3.5.3.1 WPA-PSK

  WPA-PSK 旨在为没有认证服务器的小型网络而设计的。

  配置文件为 /etc/hostapd.conf file:

interface=ath0 (1)
debug=1 (2)
ctrl_interface=/var/run/hostapd (3)
ctrl_interface_group=wheel (4)
ssid=freebsdap (5)
wpa=1 (6)
wpa_passphrase=freebsdmall (7)
wpa_key_mgmt=WPA-PSK (8)
wpa_pairwise=CCMP TKIP (9)
(1)
这一项标明了访问接入点所使用的无线接口。
(2)
这一项设置了执行 hostapd 时候显示相关信息的详细程度。 1 表示最小的级别。
(3)
ctrl_interface 这项给出了 hostapd 存储与其他外部程序(比如 hostapd_cli(8)) 通信的域套接口文件路径。这里使用了默认值。
(4)
ctrl_interface_group 这行设置了允许访问控制界面文件的组属性 (这里我们使用了 wheel 组)。
(5)
这一项是设置网络的名称。
(6)
wpa 这项表示启用了 WPA 而且指明要使用何种 WPA 认证协议。 值 1 表示 AP 将使用 WPA-PSK。
(7)
wpa_passphrase 这项包含用于 WPA 认证的 ASCII 密码。

警告: 通常使用从丰富的字母表生成足够长度的强壮密码, 以不至于被轻易的猜测或攻击到。

(8)
wpa_key_mgmt 这行表明了我们所使用的密钥管理协议。 在这个例子中是 WPA-PSK。
(9)
wpa_pairwise 这项表示(无线)访问接入点所接受的加密算法。 在这个例子中,TKIP(WPA) 和 CCMP(WPA2) 密码都会被接受。 CCMP 密码是除 TKIP 外的另一种选择, CCMP 一般作为首选密码; 仅有在 CCMP 不能被使用的环境中选择 TKIP。

  接下来的一步就是运行 hostapd

# /etc/rc.d/hostapd forcestart
# ifconfig ath0
  ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2290
      inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
      inet6 fe80::211:95ff:fec3:dac%ath0 prefixlen 64 scopeid 0x4
      ether 00:11:95:c3:0d:ac
      media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap>
      status: associated
      ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac
      authmode WPA2/802.11i privacy MIXED deftxkey 2 TKIP 2:128-bit txpowmax 36 protmode CTS dtimperiod 1 bintval 100

  现在客户端能够连接上运行的(无线)访问接入点了, 更多细节可以参阅 第 29.3.3.1.3 节。 查看有哪些客户连接上了 AP 可以运行命令 ifconfig ath0 list sta

29.3.5.4 使用 WEP 的(无线)访问接入点

  我们不推荐使用 WEP 来设置一个(无线)访问接入点, 因为没有认证的机制并容易被破解。 一些历史遗留下的无线网卡仅支持 WEP 作为安全协议, 这些网卡仅允许搭建不含认证或 WEP 协议的 AP。

  在设置了正确的 SSID 和 IP 地址后,无线设备就可以进入 hostap 模式了:

# ifconfig ath0 ssid freebsdap wepmode on weptxkey 3 wepkey 3:0x3456789012 mode 11g mediaopt hostap \
    inet 192.168.0.1 netmask 255.255.255.0
  • weptxkey 表示传输中使用哪一个 WEP 密钥。 这个例子中用了第3把密钥(请注意密钥的编号从 1开始)。 这个参数必须设置以用来加密数据。

  • wepkey 表示设置所使用的 WEP 密钥。 它应该符合 index:key 这样的格式。 如果没有指定 index,那么默认值为 1。 这就是说如果我们使用了除第一把以外的密钥, 那么就需要指定 index。

  再使用一次 ifconfig 命令查看 ath0 接口的状态:

# ifconfig ath0
  ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
      inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
      inet6 fe80::211:95ff:fec3:dac%ath0 prefixlen 64 scopeid 0x4
      ether 00:11:95:c3:0d:ac
      media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap>
      status: associated
      ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac
      authmode OPEN privacy ON deftxkey 3 wepkey 3:40-bit txpowmax 36 protmode CTS dtimperiod 1 bintval 100

  现在可以从另外一台无线机器上初始化一次扫描来找到这个 AP 了:

# ifconfig ath0 up scan
SSID            BSSID              CHAN RATE  S:N   INT CAPS
freebsdap       00:11:95:c3:0d:ac    1   54M 22:1   100 EPS

  现在客户机能够使用正确的参数(密钥等) 找到并连上(无线)访问接入点了, 更多细节请参阅第 29.3.3.1.4 节

29.3.6 故障排除

  如果您在使用无线网络时遇到了麻烦, 此处提供了一系列用以帮助排除故障的步骤。

  如果上述信息没能帮助您找到具体的问题所在, 请提交问题报告, 并在其中附上这些工具的输出。

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

如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.