# 14.2 无线网络（Wi-Fi）配置

无线网络是移动计算环境和便携式设备的核心功能之一，也是 FreeBSD 系统在桌面和服务器环境中不可或缺的网络连接方式。

## 附录：更新系统版本后无法使用无线网络

### 固件与系统更新的兼容性问题

在 FreeBSD 中，固件（Firmware）是硬件设备正常工作所需的底层软件，它提供了硬件设备与操作系统内核之间的通信接口。

固件与内核版本之间存在紧密的耦合关系，这是因为固件接口可能随内核版本更新而发生变化，系统版本更新后可能导致原有固件与新内核不兼容。因此，在更新 FreeBSD 系统后，如果遇到无线网络问题，应首先检查固件兼容性。

### 固件重新获取方法

如果在更新系统版本后无法使用无线网络，需要重新获取与当前内核版本兼容的固件。FreeBSD 提供了 `fwget` 工具用于自动获取和安装所需固件：

```sh
# fwget
```

如果当前系统没有网络连接，可以通过 USB 网络共享等方式临时获得网络连接后再执行上述命令；也可手动从 <https://mirrors.ustc.edu.cn/freebsd-pkg/FreeBSD%3A14%3Aamd64/kmods_latest_3/All/> 等镜像站点下载所需固件包，然后使用以下命令进行安装：

```sh
# pkg add /path/to/firmware.pkg
```

## 一般无线网卡驱动方式（基于 COMFAST CF-912AC 1200M 802.11AC）

### 示例网卡选择说明

本节以 COMFAST CF-912AC 1200M 802.11AC 无线网卡为例，介绍一般无线网卡的驱动配置方法。该网卡采用 Realtek 芯片组，在 FreeBSD 中具有较好的兼容性。请注意，其他采用 Realtek 芯片的网卡配置方法类似。

### 硬件识别方法

在配置无线网络前，需要确认系统是否能够识别无线网卡。可通过查询内核无线设备列表来确认硬件识别状态，该命令会显示系统中可用的无线网络接口设备：

```sh
# sysctl net.wlan.devices
net.wlan.devices: rtwn0
```

上述输出中的 `rtwn0` 是示例网卡（COMFAST CF-912AC）的设备名称，实际输出可能因硬件而异。如果输出中冒号 `:` 后没有内容，则说明无线网卡未被识别，此时可能需要检查硬件连接或更换兼容性更好的无线网卡。

### 虚拟无线接口机制

在 FreeBSD 中，无线网络采用分层架构设计，需要创建一个虚拟的无线接口 `wlan0`，并将其绑定到物理无线网卡上才能使用。这种设计实现了物理设备与逻辑配置的分离，使得同一物理网卡可支持多个虚拟接口，同时便于网络参数的灵活配置。

创建一个新的无线接口 `wlan0`，并将其绑定到物理设备 `rtwn0`：

```sh
# ifconfig wlan0 create wlandev rtwn0
```

上述命令中，`rtwn0` 为 `sysctl net.wlan.devices` 输出中的物理网卡名称，需根据实际硬件进行替换（~~除非你也使用 COMFAST CF-912AC 1200M 802.11AC~~）。

创建完成后，可使用 `ifconfig` 命令查看接口状态（以下输出已省略以太网卡和 `lo0` 接口）：

```sh
# ifconfig

……此处省略一部分……

wlan0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=200001<RXCSUM,RXCSUM_IPV6>
	ether 20:0d:b0:c4:ab:59
	groups: wlan
	ssid "" channel 1 (2412 MHz 11b)
	regdomain FCC country US authmode OPEN privacy OFF txpower 30 bmiss 7
	scanvalid 60 wme bintval 0
	parent interface: rtwn0
	media: IEEE 802.11 Wireless Ethernet autoselect (autoselect)
	status: no carrier
	nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
```

正常情况下，输出中应包含 `wlan0` 接口。

### 扫描 WiFi

在连接到无线网络之前，需要先扫描周围可用的无线网络。启用 `wlan0` 接口并执行扫描操作：

```sh
# ifconfig wlan0 up scan
SSID/MESH ID                      BSSID              CHAN RATE    S:N     INT CAPS

……此处省略一部分……

test_5G                           50:d6:c5:93:d7:64   36   54M  -78:-95   100 EP   APCHANREP WPA RSN WPS BSSLOAD HTCAP VHTCAP VHTOPMODE WME
```

扫描结果会显示可用的无线网络列表，包括 SSID、BSSID、信道、信号强度等信息。

### SSID 的定义与作用

服务集标识符（Service Set Identifier，SSID）是无线网络的名称标识，用于区分不同的无线网络。

将 `wlan0` 接口连接到 SSID 为 `test_5G` 的无线网络（适用于无密码的开放网络）：

```sh
# ifconfig wlan0 ssid test_5G
```

上述命令中，`test_5G` 为示例 WiFi 名称（SSID），需替换为实际网络名称。

如果扫描不到 WiFi 网络，可能需要修改无线区域设置或路由器信道。此时可按以下步骤重新配置：

```sh
# ifconfig wlan0 destroy
# ifconfig wlan0 create wlandev rtwn0
# ifconfig wlan0 country HR regdomain ETSI
```

第一条命令销毁现有 `wlan0` 接口并释放其占用的资源，避免出现 `ifconfig: SIOCS80211: Device busy` 错误；第二条命令重新创建无线接口并绑定到物理设备；第三条命令设置无线国家码为 HR 并使用 ETSI 无线频段规范，当目标网络使用大于 48 的信道（DFS 信道）时需要进行此设置，如信道小于 48，可省略该步骤。

完成上述配置后，重启网络服务以接入 WiFi：

```sh
# service netif restart
# dhclient wlan0
```

第一条命令重新启动网络接口服务，第二条命令为 `wlan0` 接口获取动态 IP 地址。

### WPA 安全机制概述

对于加密的无线网络，需要使用 Wi-Fi 保护访问（Wi-Fi Protected Access，WPA）配置文件进行连接。WPA 是目前主流的无线网络安全协议，提供了数据加密与身份认证功能。

创建 `/etc/wpa_supplicant.conf` 配置文件，内容如下：

```ini
network={
ssid="test_5G"
psk="freebsdcn"
}
```

配置说明：

* `ssid` 指定要连接的无线网络 SSID（WiFi 名称），此处示例为 `test_5G`
* `psk` 指定无线网络的密码，此处示例为 `freebsdcn`

在 `/etc/rc.conf` 中添加或修改相关配置条目：

```ini
wlans_rtwn0="wlan0"                      # 将物理无线设备 rtwn0 绑定到 wlan0 接口
ifconfig_wlan0="WPA SYNCDHCP"           # 配置 wlan0 使用 WPA 并通过 DHCP 自动获取 IP 地址
create_args_wlan0="country HR regdomain ETSI"  # 创建 wlan0 接口时设置无线国家码为 HR，并使用 ETSI 频段规范；如果信道大于 48（DFS），需要这么设置。如信道小于 48，可以不设置
```

### 无线网络配置文件结构

```sh
/etc/
├── rc.conf              # 系统启动配置文件
└── wpa_supplicant.conf  # WPA 无线网络配置文件
```

完成上述配置后，重启系统以使所有配置生效：

```sh
# reboot
```

如果不想重启整个系统，可以通过以下命令重启网络服务来应用配置：

```sh
# service netif restart
# dhclient wlan0
```

重启后，使用 `ifconfig` 查看连接情况，正常情况下可看到已成功连接（示例输出中 IP 为 192.168.31.178）：

```sh
……省略一部分输出……

wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=200001<RXCSUM,RXCSUM_IPV6>
	ether 11:7c:e8:c4:ab:58
	inet 192.168.31.178 netmask 0xffffff00 broadcast 192.168.31.255
	groups: wlan
	ssid test_5G channel 36 (5180 MHz 11a ht/20) bssid 50:d6:c5:93:d7:64
	regdomain NONE country CN authmode WPA2/802.11i privacy ON
	deftxkey UNDEF TKIP 2:128-bit txpower 17 bmiss 7 mcastrate 6
	mgmtrate 6 scanvalid 60 ht20 ampdulimit 64k ampdudensity 4 shortgi
	-stbc -uapsd wme roaming MANUAL
	parent interface: rtwn0
	media: IEEE 802.11 Wireless Ethernet MCS mode 11na
	status: associated
	nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
```

## 英特尔无线网卡驱动概况

英特尔（Intel）网卡是目前使用较为广泛的无线网卡之一。iwlwifi 驱动 [适用于](https://wiki.freebsd.org/WiFi/Iwlwifi/Chipsets) `AC 8265、AC 9260、AC 9560、AX200、AX201、AX210、AX211` 以及旧的 iwm 驱动所包含的网卡，见 [英特尔 ® 无线适配器的 Linux\* 支持](https://www.intel.cn/content/www/cn/zh/support/articles/000005511/wireless.html)。

在 `/etc/rc.conf` 中添加以下配置：

```ini
wlans_iwlwifi0="wlan0"        # 将物理无线设备 iwlwifi0 绑定到 wlan0 接口
ifconfig_wlan0="WPA SYNCDHCP"  # 配置 wlan0 使用 WPA 并通过 DHCP 自动获取 IP 地址
```

创建 `/etc/wpa_supplicant.conf` 配置文件：

```sh
network={
ssid="WIFI 名称（SSID）"
psk="WIFI 密码"
}
```

完成配置后，执行以下命令启动 WiFi 进行测试：

```sh
# ifconfig wlan0 create wlandev iwlwifi0
# /etc/rc.d/netif start wlan0
```

第一条命令创建 `wlan0` 接口并绑定到物理无线设备 `iwlwifi0`，第二条命令启动 `wlan0` 接口。

故障排除与未竟事宜请参考：[wiki/WiFi/Iwlwifi](https://wiki.freebsd.org/WiFi/Iwlwifi)

## 博通（Broadcom）网卡驱动

博通（Broadcom）是另一家常用的无线网卡厂商。FreeBSD 内置的 Broadcom（博通）网卡驱动主要有两种：`bwi` 和 `bwn`，其中 `bwi` 支持较旧型号，`bwn` 支持较新型号。两者的支持范围部分重叠，但 `bwn` 对硬件的兼容性更好。

关于驱动选择的详细信息，请参考 [FreeBSD Broadcom Wi-Fi Improvements](https://www.landonf.org/code/freebsd/Broadcom_WiFi_Improvements.20180122.html)。若无法直接访问，可使用互联网档案馆的 [存档](https://web.archive.org/web/20240203102135/https://www.landonf.org/code/freebsd/Broadcom_WiFi_Improvements.20180122.html) 查看。

### 示例：BCM4301、BCM4303、BCM4306 rev 2

根据参考文献，上述型号的网卡只能使用 `bwi` 驱动。

首先，在 `/boot/loader.conf` 文件中添加以下配置，设置系统在启动时加载 `bwi` 驱动：

```sh
if_bwi_load="YES"
```

然后使用 ports 安装 Broadcom 无线设备的固件（该固件未提供二进制包）：

```sh
# cd /usr/ports/net/bwi-firmware-kmod/
# make install clean
```

可先通过 USB 或以太网共享网络来安装，也可以提前将所需依赖下载到指定目录。

在 `/etc/rc.conf` 文件中添加以下配置，将物理无线设备 `bwi0` 绑定到 `wlan0` 接口：

```ini
wlans_bwi0="wlan0"
```

完成上述配置后，重启系统即可。

### 示例：配置 bwn 驱动

安装 Broadcom 无线设备的固件：

```sh
# cd /usr/ports/net/bwn-firmware-kmod/
# make install clean
```

### 博通网卡驱动相关的文件结构

```sh
/
├── boot/
│   └── loader.conf        # 系统启动加载配置文件
├── usr/
│   ├── ports/
│   │   └── net/
│   │       ├── bwi-firmware-kmod/   # Broadcom bwi 固件 Port
│   │       └── bwn-firmware-kmod/   # Broadcom bwn 固件 Port
│   └── src/
│       └── sys/
│           └── amd64/
│               └── conf/              # 内核配置文件目录
└── home/
    └── ykla/
        └── wifi-firmware-iwlwifi-kmod-20241017.1403000_2.pkg  # 英特尔无线网卡固件包
```

编辑 `/boot/loader.conf` 文件添加以下配置，设置系统在启动时加载 `bwn` 驱动：

```ini
if_bwn_load="YES"
```

在 `/etc/rc.conf` 文件中添加以下配置，将物理无线设备 `bwn0` 绑定到 `wlan0` 接口：

```ini
wlans_bwn0="wlan0"
```

## 附录：特殊型号需要编译内核

对于一些特殊型号的博通无线网卡，可能需要重新编译内核才能获得完整支持。

在 FULLER L. FreeBSD Broadcom Wi-Fi Improvements\[EB/OL]. \[2026-03-26]. <https://web.archive.org/web/20240203102135/https://www.landonf.org/code/freebsd/Broadcom_WiFi_Improvements.20180122.html>. 中列出的部分型号带有 `$` 注释：`The optional bwn(4) PHY driver is derived from b43 GPL code, and must be explicitly enabled.`，表示需要使用基于通用公共许可证（GNU General Public License，GPL）协议的代码。由于 FreeBSD 基本系统及内核去除了 GNU 组件，因此需要重新编译内核以支持该选项。

```sh
# cd /usr/src/  # 此处是 FreeBSD 内核源码安装目录
# cd sys/amd64/conf/  # 切换到 FreeBSD 内核配置文件目录。注意架构！
# cp GENERIC MYKERNEL  # 复制默认内核配置文件 GENERIC 为自定义内核 MYKERNEL
# echo "options BWN_GPL_PHY" >> MYKERNEL  # 向 MYKERNEL 内核配置文件添加 BWN_GPL_PHY 选项
# cd /usr/src  # 此处是 FreeBSD 内核源码安装目录
# make -j4 buildkernel KERNCONF=MYKERNEL  # 使用 MYKERNEL 配置并启用 4 个并行任务编译内核
# make -j4 installkernel KERNCONF=MYKERNEL  # 安装使用 MYKERNEL 配置编译的内核，并启用 4 个并行任务
```

上述命令中，`/usr/src/` 为 FreeBSD 内核源码安装目录，需注意根据实际架构选择相应的配置文件目录。

然后在 `/boot/loader.conf` 文件中添加以下配置：

```ini
hw.bwn_pci.preferred="1"        # 设置首选使用 BWN PCI 无线设备
if_bwn_pci_load="YES"           # 在启动时加载 bwn_pci 驱动
bwn_v4_ucode_load="YES"         # 加载 BWN V4 无线固件
bwn_v4_n_ucode_load="YES"       # 加载 BWN V4 N 模式无线固件
bwn_v4_lp_ucode_load="YES"     # 加载 BWN V4 低功耗模式无线固件
```

完成后重启系统，使用 `ifconfig` 检查是否存在 `wlan0` 接口，然后按照前文教程进行配置。

### 参考文献

* FreeBSD 中文社区. 10.5.编译与安装定制内核\[EB/OL]. \[2026-03-26]. <https://handbook.bsdcn.org>.
* FreeBSD Foundation. Broadcom Wi-Fi Modernization\[EB/OL]. \[2026-03-26]. <https://freebsdfoundation.org/project/broadcom-wi-fi-modernization/>.
* FreeBSD Project. Revision 326841\[EB/OL]. \[2026-03-26]. <https://svnweb.freebsd.org/base?view=revision&revision=326841>.
* FreeBSD Forums. Installing Broadcom BCM43236 WiFi on 11.3 missing firmware error\[EB/OL]. \[2026-03-26]. <https://forums.freebsd.org/threads/installing-broadcom-bcm43236-wifi-on-11-3-missing-firmware-error.76470/>.
* helloSystem. ISO\[EB/OL]. \[2026-03-26]. <https://github.com/helloSystem/ISO/issues/78>.

## 故障排除概述

在配置无线网络的过程中，可能会遇到一些常见问题，以下是相关的故障排除方法。

### 如果连不上或者搜不到特定信道

无线网络的区域码设置会影响可用的信道列表。可尝试调整无线区域码设置。

在 `/etc/rc.conf` 中添加以下配置：

```ini
create_args_wlan0="country CN regdomain NONE"
```

该配置在创建 `wlan0` 接口时设置无线国家码为 CN，使用无特定无线频段限制。

完成配置后，重启系统。

### 断开 WiFi

禁用 `wlan0` 接口：

```sh
# ifconfig wlan0 down
```

### WPA 验证

在 `/etc/rc.conf` 中配置 `wlan0` 接口使用 WPA，并设置静态 IP 地址和子网掩码：

```ini
ifconfig_wlan0="WPA inet 192.168.1.100 netmask 255.255.255.0"
```

### 设置静态 IP

为 `wlan0` 接口配置静态 IPv4 地址和子网掩码：

```sh
# ifconfig wlan0 inet 192.168.0.100 netmask 255.255.255.0
```

### 开启无线热点

在配置无线热点前，需要确认网卡是否支持 hostap 模式。可通过以下命令列出 `wlan0` 接口支持的无线功能和能力：

```sh
# ifconfig wlan0 list caps
drivercaps=591c541<STA,FF,IBSS,HOSTAP,SHSLOT,SHPREAMBLE,MONITOR,WPA1,WPA2,WME>
cryptocaps=b<WEP,TKIP,AES_CCM>
htcaps=207002d<LDPC,SHORTGI20>
```

若输出中包含 `HOSTAP`，则说明该网卡支持 hostap 功能。

确认网卡支持后，销毁现有 `wlan0` 接口并释放其占用的资源：

```sh
# ifconfig wlan0 destroy
```

重新创建 `wlan0` 接口并配置为热点模式：

```sh
# ifconfig wlan0 create wlandev rtwn0 wlanmode hostap
# ifconfig wlan0 inet 192.168.0.1 netmask 255.255.255.0 ssid freebsdap mode 11g channel 1
```

第一条命令创建 `wlan0` 接口，绑定到 `rtwn0` 并设置为 Host AP 模式；第二条命令配置 `wlan0` 的 IP 地址、SSID、无线模式和信道。

![创建无线热点](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-1ab301fe6b442e19022360a2c9a10b0ee8a6416e%2Fwifi1.png?alt=media)

## 附录：图形化网络配置工具

FreeBSD 提供了图形化网络管理工具，功能类似于 Linux 的 Plasma NetworkManager 或 NetworkManager。

使用 pkg 安装：

```sh
pkg install net-mgmt/networkmgr
```

或者使用 Ports 安装：

```sh
# cd /usr/ports/net-mgmt/networkmgr/
# make install clean
```

## 课后习题

1. 使用两种不同厂商的无线网卡（如 Realtek 和 Intel），分别在 FreeBSD 上创建虚拟无线接口并连接同一 AP，使用 `systat -if` 监控两者的流量差异。
2. 配置 FreeBSD 为无线热点（Host AP 模式），修改默认信道和发射功率参数，使用另一设备连接并测试信号强度变化。
3. 查阅 FreeBSD 源码中 `wlan` 接口的创建逻辑，复现其最小实现，分析为什么系统采用“物理网卡 + 虚拟接口”的分层架构而非直接管理物理设备。
