绝大多数无线网络都采用了 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) 协议和增强媒体访问协议来安排优先级。 对于这些协议的正确实现, 能够实现高速突发数据和流量分级。
FreeBSD 支持采用 802.11a, 802.11b 和 802.11g 的网络。 类似地, 它也支持 WPA 和 802.11i 安全协议 (与 11a、 11b 和 11g 配合), 而 WME/WMM 所需要的 QoS 和流量分级, 则在部分无线设备上提供了支持。
要使用无线网络, 您需要一块无线网卡, 并适当地配置内核令其提供无线网络支持。 后者被分成了多个模块, 因此您只需配置使用您所需要的软件就可以了。
首先您需要的是一个无线设备。 最为常用的一种无线配件是 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) 卡来进行示范, 如果要套用这些配置的话, 可能需要根据您实际的配置情况来修改示例中的设备名称。 在 FreeBSD 兼容硬件说明中提供了目前可用的无线网络驱动, 以及兼容硬件的列表。 针对不同版本和硬件平台的说明可以在 FreeBSD 网站的 Release Information 页面找到。 如果您的无线设备没有与之对应的 FreeBSD 专用驱动程序, 也可以尝试使用 NDIS 驱动封装机制来直接使用 Windows® 驱动。
对于 FreeBSD 7.X, 在配置好设备驱动之后, 您还需要引入驱动程序所需要的 802.11 网络支持。 对于 ath(4) 驱动而言, 至少需要 wlan(4) wlan_scan_ap 和 wlan_scan_sta 模块; wlan(4) 模块会自动随无线设备驱动一同加载, 剩下的模块必须要在系统引导时加载, 就需要在 /boot/loader.conf 中加入下面的配置:
wlan_scan_ap_load="YES" wlan_scan_sta_load="YES"
从 FreeBSD 8.0 起, 这些模块成为了 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 wlan # 802.11 support device wlan_wep # 802.11 WEP support device wlan_ccmp # 802.11 CCMP support device wlan_tkip # 802.11 TKIP support device wlan_amrr # AMRR transmit rate control algorithm device ath # Atheros pci/cardbus NIC's device ath_hal # pci/cardbus chip support options AH_SUPPORT_AR5416 # enable AR5416 tx/rx descriptors device ath_rate_sample # SampleRate tx rate control for ath使用 FreeBSD 7.X 时, 还需要配置下面这两行; FreeBSD 的其他版本不需要它们。
device wlan_scan_ap # 802.11 AP mode scanning device wlan_scan_sta # 802.11 STA mode scanning将这些信息写到内核编译配置文件中之后, 您需要重新编译内核, 并重新启动运行 FreeBSD 的计算机。
在系统启动之后, 您会在引导时给出的信息中, 找到类似下面这样的关于无线设备的信息:
ath0: <Atheros 5212> mem 0x88000000-0x8800ffff irq 11 at device 0.0 on cardbus1 ath0: [ITHREAD] ath0: AR2413 mac 7.9 RF2413 phy 4.5
通常的情形中使用的是 infrastructure 模式或称 BSS 模式。 在这种模式中, 有一系列无线访问点接入了有线网络。 每个无线网都会有自己的名字, 这个名字称作网络的 SSID。 无线客户端都通过无线访问点来完成接入。
您可以通过使用 ifconfig 命令来扫描网络。 由于系统需要在操作过程中切换不同的无线频率并探测可用的无线访问点, 这种请求可能需要数分钟才能完成。 只有超级用户才能启动这种扫描:
# ifconfig wlan0 create wlandev ath0 # ifconfig wlan0 up scan SSID/MESH ID BSSID CHAN RATE S:N INT CAPS dlinkap 00:13:46:49:41:76 11 54M -90:96 100 EPS WPA WME freebsdap 00:11:95:c3:0d:ac 1 54M -83:96 100 EPS WPA
注意: 在开始扫描之前, 必须将网络接口设为
up
。 后续的扫描请求就不需要再将网络接口设为 up 了。
注意: 在 FreeBSD 7.X 中, 会直接适配器设备, 例如 ath0, 而不是 wlan0 设备。 因此您需要把前面的命令行改为:
# ifconfig ath0 up scan在这份文档余下的部分中, 您也需要注意 FreeBSD 7.X 上的这些差异, 并对命令行示例进行类似的改动。
扫描会列出所请求到的所有 BSS/IBSS 网络列表。 除了网络的名字 SSID 之外, 我们还会看到 BSSID 即无线访问点的 MAC 地址。 而 CAPS 字段则给出了网络类型及其提供的功能, 其中包括:
Extended Service Set (ESS)。 表示通讯站是 infrastructure 网络 (相对于 IBSS/ad-hoc 网络) 的成员。
IBSS/ad-hoc 网络。 表示通讯站是 ad-hoc 网络 (相对于 ESS 网络) 的成员。
私密。 在 BSS 中交换的全部数据帧均需保证数据保密性。 这表示 BSS 需要通讯站使用加密算法, 例如 WEP、 TKIP 或 AES-CCMP 来加密/解密与其他通讯站交换的数据帧。
短前导码 (Short Preamble)。 表示网络采用的是短前导码 (由 802.11b High Rate/DSSS PHY 定义, 短前导码采用 56-位 同步字段, 而不是在长前导码模式中所采用的 128-位 字段)。
短碰撞槽时间 (Short slot time)。 表示由于不存在旧式 (802.11b) 通讯站, 802.11g 网络正使用短碰撞槽时间。
要显示目前已知的网络, 可以使用下面的命令:
# ifconfig wlan0 list scan
这些信息可能会由无线适配器自动更新, 也可使用 scan
手动更新。 快取缓存中的旧数据会自动删除, 因此除非进行更多扫描, 这个列表会逐渐缩小。
在这一节中我们将展示一个简单的例子来介绍如何让无线网络适配器在 FreeBSD 中以不加密的方式工作。 在您熟悉了这些概念之后, 我们强烈建议您在实际的使用中采用 WPA 来配置网络。
配置无线网络的过程可分为三个基本步骤: 选择无线访问点、 验证您的通讯站身份, 以及配置 IP 地址。 下面的几节中将分步骤地介绍它们。
多数时候让系统以内建的探测方式选择无线访问点就可以了。 这是在您将网络接口置为 up 或在 /etc/rc.conf 中配置 IP 地址时的默认方式, 例如:
wlans_ath0="wlan0" ifconfig_wlan0="DHCP"
注意: 如前面提到的那样, FreeBSD 7.X 只需要一行配置:
ifconfig_ath0="DHCP"
如果存在多个无线访问点, 而您希望从中选择具体的一个, 则可以通过指定 SSID 来实现:
wlans_ath0="wlan0" ifconfig_wlan0="ssid your_ssid_here DHCP"
在某些环境中, 多个访问点可能会使用同样的 SSID (通常, 这样做的目的是简化漫游), 这时可能就需要与某个具体的设备关联了。 这种情况下, 您还应指定无线访问点的 BSSID (这时可以不指定 SSID):
wlans_ath0="wlan0" ifconfig_wlan0="ssid your_ssid_here bssid xx:xx:xx:xx:xx:xx DHCP"
除此之外, 还有一些其它的方法能够约束查找无线访问点的范围,
例如限制系统扫描的频段, 等等。 如果您的无线网卡支持多个频段, 这样做可能会非常有用,
因为扫描全部可用频段是一个十分耗时的过程。 要将操作限制在某个具体的频段, 可以使用 mode
参数; 例如:
wlans_ath0="wlan0" ifconfig_wlan0="mode 11g ssid your_ssid_here DHCP"
就会强制卡使用采用 2.4GHz 的 802.11g, 这样在扫描的时候, 就不会考虑那些 5GHz
的频段了。 除此之外, 还可以通过 channel
参数来将操作锁定在特定频率, 以及通过 chanlist
参数来指定扫描的频段列表。 关于这些参数的进一步信息, 可以在联机手册 ifconfig(8)
中找到。
一旦您选定了无线访问点, 您的通讯站就需要完成身份验证, 以便开始发送和接收数据。 身份验证可以通过许多方式进行, 最常用的一种方式称为开放式验证, 它允许任意通讯站加入网络并相互通信。 这种验证方式只应在您第一次配置无线网络进行测试时使用。 其它的验证方式则需要在进行数据通讯之前, 首先进行密钥协商握手; 这些方式要么使用预先分发的密钥或密码, 要么是用更复杂一些的后台服务, 如 RADIUS。 绝大多数用户会使用默认的开放式验证, 而第二多的则是 WPA-PSK, 它也称为个人 WPA, 在 下面 的章节中将进行介绍。
注意: 如果您使用 Apple® AirPort® Extreme 基站作为无线访问点, 则可能需要同时在两端配置 WEP 共享密钥验证。 这可以通过在 /etc/rc.conf 文件中进行设置, 或使用 wpa_supplicant(8) 程序来手工完成。 如果您只有一个 AirPort 基站, 则可以用类似下面的方法来配置:
wlans_ath0="wlan0" ifconfig_wlan0="authmode shared wepmode on weptxkey 1 wepkey 01234567 DHCP"一般而言, 应尽量避免使用共享密钥这种验证方法, 因为它以非常受限的方式使用 WEP 密钥, 使得攻击者能够很容易地破解密钥。 如果必须使用 WEP (例如, 为了兼容旧式的设备) 最好使用 WEP 配合 open 验证方式。 关于 WEP 的更多资料请参见 第 31.3.3.1.4 节。
在您选定了无线访问点, 并配置了验证参数之后, 还必须获得 IP 地址才能真正开始通讯。 多数时候, 您会通过 DHCP 来获得无线 IP 地址。 要达到这个目的, 只需简单地编辑 /etc/rc.conf 并在配置中加入 DHCP:
wlans_ath0="wlan0" ifconfig_wlan0="DHCP"
现在您已经完成了启用无线网络接口的全部准备工作了, 下面的操作将启用它:
# /etc/rc.d/netif start
一旦网络接口开始运行, 就可以使用 ifconfig 来查看网络接口 ath0 的状态了:
# ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:11:95:d5:43:62 inet 192.168.1.100 netmask 0xffffff00 broadcast 192.168.1.255 media: IEEE 802.11 Wireless Ethernet OFDM/54Mbps mode 11g status: associated ssid dlinkap channel 11 (2462 Mhz 11g) bssid 00:13:46:49:41:76 country US ecm authmode OPEN privacy OFF txpower 21.5 bmiss 7 scanvalid 60 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS wme burst
这里的 status: associated 表示您已经连接到了无线网络 (在这个例子中, 这个网络的名字是 dlinkap)。 bssid 00:13:46:49:41:76 是指您所用无线访问点的 MAC 地址; authmode OPEN 表示您通讯的内容将将不加密。
如果无法从某个 DHCP 服务器获得 IP 地址, 则可以配置一个静态 IP 地址, 方法是将前面的 DHCP 关键字替换为地址信息。 请务必保持其他用于连接无线访问点的参数:
wlans_ath0="wlan0" ifconfig_wlan0="inet 192.168.1.100 netmask 255.255.255.0 ssid your_ssid_here"
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)。
WPA-PSK 也称作 个人-WPA, 它基于预先分发的密钥 (PSK), 这个密钥是根据作为无线网络上使用的主密钥的密码生成的。 这表示每个无线用户都会使用同样的密钥。 WPA-PSK 主要用于小型网络, 在这种网络中, 通常不需要或没有办法架设验证服务器。
警告: 无论何时, 都应使用足够长, 且包括尽可能多字母和数字的强口令, 以免被猜出和/或攻击。
第一步是修改配置文件 /etc/wpa_supplicant.conf, 并在其中加入在您网络上使用的 SSID 和事先分发的密钥:
network={ ssid="freebsdap" psk="freebsdmall" }
接下来, 在 /etc/rc.conf 中, 我们将指定无线设备的配置, 令其采用 WPA, 并通过 DHCP 来获取 IP 地址:
wlans_ath0="wlan0" ifconfig_wlan0="WPA DHCP"
下面, 启用无线网络接口:
# /etc/rc.d/netif start Starting wpa_supplicant. DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 5 DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 6 DHCPOFFER from 192.168.0.1 DHCPREQUEST on wlan0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.1 bound to 192.168.0.254 -- renewal in 300 seconds. wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:11:95:d5:43:62 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet OFDM/36Mbps mode 11g status: associated ssid freebsdap channel 1 (2412 Mhz 11g) bssid 00:11:95:c3:0d:ac country US ecm authmode WPA2/802.11i privacy ON deftxkey UNDEF AES-CCM 3:128-bit txpower 21.5 bmiss 7 scanvalid 450 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS wme burst roaming MANUAL
除此之外, 您也可以手动地使用 above 中那份 /etc/wpa_supplicant.conf 来配置, 方法是执行:
# wpa_supplicant -i wlan0 -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=CCMP GTK=CCMP] CTRL-EVENT-CONNECTED - Connection to 00:11:95:c3:0d:ac completed (auth) [id=0 id_str=]
接下来的操作, 是运行 dhclient 命令来从 DHCP 服务器获取 IP:
# dhclient wlan0 DHCPREQUEST on wlan0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.1 bound to 192.168.0.254 -- renewal in 300 seconds. # ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:11:95:d5:43:62 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet OFDM/36Mbps mode 11g status: associated ssid freebsdap channel 1 (2412 Mhz 11g) bssid 00:11:95:c3:0d:ac country US ecm authmode WPA2/802.11i privacy ON deftxkey UNDEF AES-CCM 3:128-bit txpower 21.5 bmiss 7 scanvalid 450 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS wme burst roaming MANUAL
注意: 如果 /etc/rc.conf 的配置中, 使用了 ifconfig_wlan0="DHCP", 就不需要手工运行 dhclient 命令了, 因为 dhclient 将在 wpa_supplicant 探测到密钥之后执行。
在这个例子中, DHCP 并不可用, 您可以在 wpa_supplicant 为通讯站完成了身份认证之后, 指定静态 IP 地址:
# ifconfig wlan0 inet 192.168.0.100 netmask 255.255.255.0 # ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:11:95:d5:43:62 inet 192.168.0.100 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet OFDM/36Mbps mode 11g status: associated ssid freebsdap channel 1 (2412 Mhz 11g) bssid 00:11:95:c3:0d:ac country US ecm authmode WPA2/802.11i privacy ON deftxkey UNDEF AES-CCM 3:128-bit txpower 21.5 bmiss 7 scanvalid 450 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS wme burst roaming MANUAL
如果没有使用 DHCP, 还需要手工配置默认网关, 以及域名服务器:
# route add default your_default_router # echo "nameserver your_DNS_server" >> /etc/resolv.conf
使用 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" proto=RSN key_mgmt=WPA-EAP eap=TLS identity="loader" ca_cert="/etc/certs/cacert.pem" client_cert="/etc/certs/clientcert.pem" private_key="/etc/certs/clientkey.pem" private_key_passwd="freebsdmallclient" }
接着, 把下面的配置写入 /etc/rc.conf:
wlans_ath0="wlan0" ifconfig_wlan0="WPA DHCP"
下一步是使用 rc.d 机制来启用网络接口:
# /etc/rc.d/netif start Starting wpa_supplicant. DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 7 DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 15 DHCPACK from 192.168.0.20 bound to 192.168.0.254 -- renewal in 300 seconds. wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:11:95:d5:43:62 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet DS/11Mbps mode 11g status: associated ssid freebsdap channel 1 (2412 Mhz 11g) bssid 00:11:95:c3:0d:ac country US ecm authmode WPA2/802.11i privacy ON deftxkey UNDEF AES-CCM 3:128-bit txpower 21.5 bmiss 7 scanvalid 450 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS wme burst roaming MANUAL
如前面提到的那样, 也可以手工通过 wpa_supplicant 和 ifconfig 命令达到类似的目的。
在使用 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 identity="test" password="test" ca_cert="/etc/certs/cacert.pem" phase2="auth=MD5" }
您还必须把下面的配置写入 /etc/rc.conf:
wlans_ath0="wlan0" ifconfig_wlan0="WPA DHCP"
下一步是启用网络接口:
# /etc/rc.d/netif start Starting wpa_supplicant. DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 7 DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 15 DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 21 DHCPACK from 192.168.0.20 bound to 192.168.0.254 -- renewal in 300 seconds. wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:11:95:d5:43:62 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet DS/11Mbps mode 11g status: associated ssid freebsdap channel 1 (2412 Mhz 11g) bssid 00:11:95:c3:0d:ac country US ecm authmode WPA2/802.11i privacy ON deftxkey UNDEF AES-CCM 3:128-bit txpower 21.5 bmiss 7 scanvalid 450 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS wme burst roaming MANUAL
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 identity="test" password="test" ca_cert="/etc/certs/cacert.pem" phase1="peaplabel=0" phase2="auth=MSCHAPV2" }
您还必须把下面的配置加入到 /etc/rc.conf:
wlans_ath0="wlan0" ifconfig_wlan0="WPA DHCP"
下一步是启用网络接口:
# /etc/rc.d/netif start Starting wpa_supplicant. DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 7 DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 15 DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 21 DHCPACK from 192.168.0.20 bound to 192.168.0.254 -- renewal in 300 seconds. wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:11:95:d5:43:62 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet DS/11Mbps mode 11g status: associated ssid freebsdap channel 1 (2412 Mhz 11g) bssid 00:11:95:c3:0d:ac country US ecm authmode WPA2/802.11i privacy ON deftxkey UNDEF AES-CCM 3:128-bit txpower 21.5 bmiss 7 scanvalid 450 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS wme burst roaming MANUAL
WEP (有线等效协议) 是最初 802.11 标准的一部分。 其中没有提供身份验证机制, 只提供了弱访问控制, 而且很容易破解。
WEP 可以通过 ifconfig 配置:
# ifconfig wlan0 create wlandev ath0 # ifconfig wlan0 inet 192.168.1.100 netmask 255.255.255.0 \ ssid my_net wepmode on weptxkey 3 wepkey 3:0x3456789012
weptxkey 指明了使用哪个 WEP 密钥来进行数据传输。 这里我们使用第三个密钥。 它必须与无线接入点的配置一致。 如果你不清楚你的无线接入点, 你应该尝试用 1 (就是说第一个密钥)来设置这个变量。
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 wlan0 -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
IBSS 模式, 也称为 ad-hoc 模式, 是为点对点连接设计的。 例如, 如果希望在计算机 A 和 B 之间建立 ad-hoc 网络, 我们只需选择两个 IP 地址和一个 SSID 就可以了。
在计算机 A 上:
# ifconfig wlan0 create wlandev ath0 wlanmode adhoc # ifconfig wlan0 inet 192.168.0.1 netmask 255.255.255.0 ssid freebsdap # ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 00:11:95:c3:0d:ac inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <adhoc> status: running ssid freebsdap channel 2 (2417 Mhz 11g) bssid 02:11:95:c3:0d:ac country US ecm authmode OPEN privacy OFF txpower 21.5 scanvalid 60 protmode CTS wme burst
此处的 adhoc 参数表示无线网络接口应以 IBSS 模式运转。
此时, 在 B 上应该能够检测到 A 的存在了:
# ifconfig wlan0 create wlandev ath0 wlanmode adhoc # ifconfig wlan0 up scan SSID/MESH ID BSSID CHAN RATE S:N INT CAPS freebsdap 02:11:95:c3:0d:ac 2 54M -64:-96 100 IS WME
在输出中的 I 再次确认了 A 机是以 ad-hoc 模式运行的。 我们只需给 B 配置一不同的 IP 地址:
# ifconfig wlan0 inet 192.168.0.2 netmask 255.255.255.0 ssid freebsdap # ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 00:11:95:d5:43:62 inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <adhoc> status: running ssid freebsdap channel 2 (2417 Mhz 11g) bssid 02:11:95:c3:0d:ac country US ecm authmode OPEN privacy OFF txpower 21.5 scanvalid 60 protmode CTS wme burst
这样, A 和 B 就可以交换信息了。
FreeBSD 可以作为一个(无线)访问接入点(AP), 这样可以不必再去买一个硬件 AP 或者使用 ad-hoc 模式的网络。 当你的 FreeBSD 机器作为网关连接到另外一个网络的时候将非常有用。
在把你的 FreeBSD 机器配置成一个 AP 以前, 你首先需要先在内核配置好对你的无线网卡的无线网络支持。 当然你还需要加上你想用的安全协议。想获得更详细的信息, 请参阅 第 31.3.2 节。
注意: 目前还不支持使用 Windows 驱动和 NDIS 驱动包装的网卡做为 AP 使用。只有 FreeBSD 原生的无线驱动能够支持 AP 模式。
一旦装载了无线网络的支持, 你就可以检查一下看看你的无线设备是否支持基于主机的无线访问接入模式 (通常也被称为 hostap 模式):
# ifconfig wlan0 create wlandev ath0 # ifconfig wlan0 list caps drivercaps=6f85edc1<STA,FF,TURBOP,IBSS,HOSTAP,AHDEMO,TXPMGT,SHSLOT,SHPREAMBLE,MONITOR,MBSS,WPA1,WPA2,BURST,WME,WDS,BGSCAN,TXFRAG> cryptocaps=1f<WEP,TKIP,AES,AES_CCM,TKIPMIC>
这段输出显示了网卡所支持的各种功能; 其中的关键字 HOSTAP 表示这块网卡可以作为无线网络接入点来使用。 此外, 这里还会给出所支持的加密算法: WEP、 TKIP、 AES, 等等, 这些信息对于知道在访问接入点上使用何种安全协议非常重要。
只有创建网络伪设备时能够配置无线设备是否以 hostap 模式运行, 如果之前已经存在了相应的设备, 则需要首先将其销毁:
# ifconfig wlan0 destroy
接着, 在配置其它参数前, 以正确的选项重新生成设备:
# ifconfig wlan0 create wlandev ath0 wlanmode hostap # ifconfig wlan0 inet 192.168.0.1 netmask 255.255.255.0 ssid freebsdap mode 11g channel 1
再次使用 ifconfig 检查 wlan0 网络接口的状态:
# ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 00:11:95:c3:0d:ac inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap> status: running ssid freebsdap channel 1 (2412 Mhz 11g) bssid 00:11:95:c3:0d:ac country US ecm authmode OPEN privacy OFF txpower 21.5 scanvalid 60 protmode CTS wme burst dtimperiod 1 -dfs
hostap 参数指定了接口以主机接入点的方式运行。
通过在 /etc/rc.conf 中加入下面的配置, 也可以在系统引导的过程中自动完成对于网络接口的配置:
wlans_ath0="wlan0" create_args_wlan0="wlanmode hostap" ifconfig_wlan0="inet 192.168.0.1 netmask 255.255.255.0 ssid freebsdap mode 11g channel 1"
尽管我们不推荐运行一个不使用任何认证或加密的 AP, 但这是一个非常简单的检测 AP 是否正常工作的方法。 这样配置对于调试客户端问题也非常重要。
一旦 AP 被配置成了我们前面所展示的那样, 就可以在另外一台无线机器上初始化一次扫描来找到这个 AP:
# ifconfig wlan0 create wlandev ath0 # ifconfig wlan0 up scan SSID/MESH ID BSSID CHAN RATE S:N INT CAPS freebsdap 00:11:95:c3:0d:ac 1 54M -66:-96 100 ES WME
在客户机上能看到已经连接上了(无线)访问接入点:
# ifconfig wlan0 inet 192.168.0.2 netmask 255.255.255.0 ssid freebsdap # ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 00:11:95:d5:43:62 inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet OFDM/54Mbps mode 11g status: associated ssid freebsdap channel 1 (2412 Mhz 11g) bssid 00:11:95:c3:0d:ac country US ecm authmode OPEN privacy OFF txpower 21.5 bmiss 7 scanvalid 60 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS wme burst
这一段将注重介绍在 FreeBSD (无线)访问接入点上配置使用 WPA 安全协议。 更多有关 WPA 和配置基于 WPA 无线客户端的细节 请参阅 第 31.3.3.1.3 节。
hostapd 守护进程将被用于处理与客户端的认证和在启用 WPA (无线)访问接入点上的密钥管理。
接下来,所有的配置操作都将在作为 AP 的 FreeBSD 机器上完成。 一旦 AP 能够正确的工作了,便把如下这行加入 /etc/rc.conf 使得 hostapd 能在机器启动的时候自动运行:
hostapd_enable="YES"
在配置 hostapd 以前, 请确保你已经完成了基本配置中所介绍的步骤 第 31.3.5.1 节。
WPA-PSK 旨在为没有认证服务器的小型网络而设计的。
配置文件为 /etc/hostapd.conf file:
interface=wlan0 debug=1 ctrl_interface=/var/run/hostapd ctrl_interface_group=wheel ssid=freebsdap wpa=1 wpa_passphrase=freebsdmall wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP TKIP
警告: 通常使用从丰富的字母表生成足够长度的强壮密码, 以不至于被轻易的猜测或攻击到。
接下来的一步就是运行 hostapd:
# /etc/rc.d/hostapd forcestart
# ifconfig wlan0 wlan0: 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
现在客户端能够连接上运行的(无线)访问接入点了, 更多细节可以参阅 第 31.3.3.1.3 节。 查看有哪些客户连接上了 AP 可以运行命令 ifconfig wlan0 list sta。
我们不推荐使用 WEP 来设置一个(无线)访问接入点, 因为没有认证的机制并容易被破解。 一些历史遗留下的无线网卡仅支持 WEP 作为安全协议, 这些网卡仅允许搭建不含认证或 WEP 协议的 AP。
在设置了正确的 SSID 和 IP 地址后,无线设备就可以进入 hostap 模式了:
# ifconfig wlan0 create wlandev ath0 wlanmode hostap # ifconfig wlan0 inet 192.168.0.1 netmask 255.255.255.0 \ ssid freebsdap wepmode on weptxkey 3 wepkey 3:0x3456789012 mode 11g
weptxkey 表示传输中使用哪一个 WEP 密钥。 这个例子中用了第3把密钥(请注意密钥的编号从 1开始)。 这个参数必须设置以用来加密数据。
wepkey 表示设置所使用的 WEP 密钥。 它应该符合 index:key 这样的格式。 如果没有指定 index,那么默认值为 1。 这就是说如果我们使用了除第一把以外的密钥, 那么就需要指定 index。
再使用一次 ifconfig 命令查看 wlan0 接口的状态:
# ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 00:11:95:c3:0d:ac inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap> status: running ssid freebsdap channel 4 (2427 Mhz 11g) bssid 00:11:95:c3:0d:ac country US ecm authmode OPEN privacy ON deftxkey 3 wepkey 3:40-bit txpower 21.5 scanvalid 60 protmode CTS wme burst dtimperiod 1 -dfs
现在可以从另外一台无线机器上初始化一次扫描来找到这个 AP 了:
# ifconfig wlan0 create wlandev ath0 # ifconfig wlan0 up scan SSID BSSID CHAN RATE S:N INT CAPS freebsdap 00:11:95:c3:0d:ac 1 54M 22:1 100 EPS
现在客户机能够使用正确的参数(密钥等) 找到并连上(无线)访问接入点了, 更多细节请参阅第 31.3.3.1.4 节。
一般而言, 有线网络的速度更快而且更可靠, 而无线网络则提供更好的灵活及机动性, 使用笔记本的用户, 往往会希望结合两者的优点, 并能够在两种连接之间无缝切换。
在 FreeBSD 上可以将多个网络接口合并到一起, 并以 “故障转移” 的方式自动切换, 也就是说, 这一组网络接口有一定的优先顺序, 而操作系统在链路状态发生变化时则自动进行切换, 例如当同时存在有线和无线连接的时候优先使用有线网络, 而当有线网络断开时, 则自动切换到无线网络。
如果您在使用无线网络时遇到了麻烦, 此处提供了一系列用以帮助排除故障的步骤。
如果您在列表中找不到无线访问点, 请确认您没有将无线设备配置为使用有限的一组频段。
如果您无法关联到无线访问点, 请确认您的通讯站配置与无线访问点的配置一致。 这包括认证模式以及安全协议。 尽可能简化您的配置。 如果您正使用类似 WPA 或 WEP 这样的安全协议, 请将无线访问点配置为开放验证和不采用安全措施, 并检查是否数据能够通过。
一旦您能够关联到无线访问点之后, 就可以使用简单的工具如 ping(8) 来诊断安全配置了。
wpa_supplicant 提供了许多调试支持; 尝试手工运行它,
在启动时指定 -dd
选项, 并察看输出结果。
除此之外还有许多其它的底层调试工具。 您可以使用 /usr/src/tools/tools/net80211 中的 wlandebug 命令来启用 802.11 协议支持层的调试功能。 例如:
# wlandebug -i ath0 +scan+auth+debug+assoc net.wlan.0.debug: 0 => 0xc80000<assoc,auth,scan>
可以用来启用与扫描无线访问点和 802.11 协议在安排通讯时与握手有关的控制台信息。
还有许多有用的统计信息是由 802.11 层维护的; wlanstats 工具可以显示这些信息。 这些统计数据能够指出由 802.11 层识别出来的错误。 请注意某些错误可能是由设备驱动在 802.11 层之下识别出来的, 因此这些错误可能并不显示。 要诊断与设备有关的问题, 您需要参考设备驱动程序的文档。
如果上述信息没能帮助您找到具体的问题所在, 请提交问题报告, 并在其中附上这些工具的输出。
本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.