UP | HOME

无线网络

Table of Contents

FreeBSD 支持多种无线网卡和认证方式

Wi-Fi 并不是任何单词的缩写

该词仅为 Wi-Fi 联盟(Wi-Fi Alliance)持有的注册商标,并无“Wireless Fidelity”等引申含义

快速连接(基于 COMFAST CF-912AC 1200M 802.11AC)

无线网络配置

基本无线网络由多个站点组成,各站点通过 2.4 GHz 与 5 GHz 频段的无线电通信实现互联(6 GHz 频段在 FreeBSD 上的支持仍处于开发阶段)。配置无线网络包含三个步骤:

  1. 扫描并选择接入点
  2. 认证站点
  3. 配置 IP 地址或使用 DHCP

示例网卡

本节以 COMFAST CF-912AC 1200M 802.11AC 无线网卡为例,介绍一般无线网卡的驱动配置方法

该网卡采用 Realtek 芯片组。其他采用 Realtek 芯片的网卡配置方法类似

识别无线网卡

在配置无线网络前,需确认系统是否识别了无线网卡。可查询内核无线设备列表来确认硬件识别状态:

$ sysctl net.wlan.devices
net.wlan.devices: rtwn0

上述输出中的 rtwn0 是示例网卡(COMFAST CF-912AC)的 设备名称 ,实际输出因硬件而异

若输出中冒号 : 后为空,表示无线网卡未被识别,此时需检查硬件连接或更换兼容性更好的无线网卡

虚拟无线接口机制

在 FreeBSD 中,无线网络采用分层架构,需创建 虚拟无线接口 wlan0 并将其绑定至物理无线网卡方可使用。创建一个新的无线接口 wlan0,并将其绑定到物理设备 rtwn0:

$ ifconfig wlan0 create wlandev rtwn0

上述命令中,rtwn0 为 sysctl net.wlan.devices 输出中的物理网卡名称,需根据实际硬件替换

示例中的 wlan0、rtwn0、192.168.1.100、freebsdap、freebsdcn 为占位符,须替换为实际的值

创建完成后,可使用 ifconfig 命令查看接口状态(以下输出已省略以太网卡和 lo0 接口):

$ 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 接口

扫描无线网络

在连接到无线网络之前,需先扫描周围可用的无线网络。可使用 ifconfig(8) 扫描可用的无线网络:

# 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
Table 1: 参数说明
参数 含义
SSID/MESH ID 标识网络名称
BSSID 标识接入点的 MAC 地址
CHAN 信道
RATE 速率
S:N 信号强度和质量
INT 信标间隔
CAPS 标识每个网络的类型和站点支持的功能特性

扫描结果会显示可用的无线网络列表

SSID 的定义与作用

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

将 wlan0 接口连接到 SSID 为 test_5G 的无线网络(适用于无密码的开放网络):

$ ifconfig wlan0 ssid test_5G
上述命令中,test_5G 为示例 Wi-Fi 名称(SSID),需替换为实际网络名称

如果无法扫描到 Wi-Fi 网络,可能需要修改无线区域设置或路由器信道,可按以下步骤重新配置:

$ ifconfig wlan0 destroy
$ ifconfig wlan0 create wlandev rtwn0
$ ifconfig wlan0 country HR regdomain ETSI
  1. 第一条命令销毁现有 wlan0 接口并释放其占用的资源,避免出现 ifconfig: SIOCS80211: Device busy 错误
  2. 第二条命令重新创建无线接口并绑定到物理设备
  3. 第三条命令设置无线国家码为 HR 并使用 ETSI 无线频段规范

    在目标网络使用大于 48 的信道(DFS 信道)时需执行此设置,如信道小于 48,可省略该步骤
    

完成上述配置后,重启网络服务以接入 Wi-Fi:

$ service netif restart
$ dhclient wlan0

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

使用 WPA2 认证

加密无线网络需使用 Wi-Fi 保护访问 Wi-Fi Protected Access WPA 配置文件连接

WPA2 是 FreeBSD 当前已能正常使用的无线网络安全协议,提供数据加密和身份认证功能

对于 WPA3/SAE,FreeBSD 基本系统的 wpa_supplicant 可通过 CONFIG_SAE=y 编译选项支持 SAE 协商配置

但内核 net80211 协议栈尚未完成 SAE 认证支持

客户端实际连接会因可用密钥管理类型为空(available key_mgmt 0x0)而失败

截至 2025 年末,多名用户在 FreeBSD 14.3、15.0 下的实测均确认此情况

FreeBSD 基金会已将 net80211 协议栈更新列为在研工作

无线网络中的认证过程由 wpa_supplicant(8) 管理

  • 可使用 wpa_passphrase(8) 工具将 SSID 和明文密码转换为安全的 PSK 配置条目,避免在配置文件中直接书写明文密码
  • 此外, wpa_cli(8) 提供了 wpa_supplicant 的交互式命令行管理接口,可用于运行时调试和状态查询

创建 /etc/wpa_supplicant.conf 配置文件,内容如下:

ctrl_interface=/var/run/wpa_supplicant   # 可选,控制接口路径,用于 wpa_supplicant 与 wpa_cli 等工具通信
fast_reauth=1                             # 可选,启用快速重新认证,加快已认证网络的重连速度

network={
   ssid="test_5G"
   psk="freebsdcn"
}
参数 说明
ssid 指定要连接的无线网络 SSID(Wi-Fi 名称),此处示例为 test_5G
psk 指定无线网络的密码,此处示例为 freebsdcn
如果无法获取无线网络的服务集标识符(SSID)和预共享密钥(PSK,Pre-Shared Key),可联系网络管理员或重置网络设备以获取凭据

下一步在 /etc/rc.conf 文件中配置无线连接。使用动态地址:

$ sysrc ifconfig_wlan0="WPA DHCP"

随后重启网络:

$ service netif restart

如果网络连接正常,则可永久配置。在 /etc/rc.conf 文件中添加或修改相关配置:

wlans_rtwn0="wlan0"                      # 将物理无线设备 rtwn0 绑定到 wlan0 接口
ifconfig_wlan0="WPA SYNCDHCP"           # 配置 wlan0 使用 WPA 并通过 DHCP 自动获取 IP 地址(SYNCDHCP 为同步模式,会暂停启动直至 DHCP 完成;如需异步/后台模式可改用 DHCP)
create_args_wlan0="country HR regdomain ETSI"  # 创建 wlan0 接口时设置无线国家码为 HR,并使用 ETSI 频段规范。如信道大于 48(DFS),则需执行此设置。

无线网络配置文件结构

FreeBSD 无线网络涉及以下配置文件:

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

完成上述配置后,重启系统或网络服务使所有配置生效

重启后,使用 ifconfig 查看连接情况,在正常情况下可看到已成功连接(示例输出中 IP 为 192.168.31.178):

……省略一部分输出……

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 驱动支持的芯片范围是 iwm 的超集:

iwlwifi 目前仅移植了 Linux 上游驱动的 mvm 子驱动部分,覆盖了 iwm 支持的全部芯片以及更新的 Wi-Fi 6E/7 芯片

Linux 上游的 iwlwifi 驱动还包含 MLD/MLO 扩展功能(用于 Wi-Fi 7 MLO 多链路操作),但 MLO 等 Wi-Fi 7 新特性在 FreeBSD 上仍处于开发阶段

在 /etc/rc.conf 文件中添加以下配置:

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

创建 /etc/wpa_supplicant.conf 配置文件:

network={
ssid="WIFI 名称(SSID)"
psk="WIFI 密码"
}

完成配置后,执行以下命令启动 Wi-Fi 测试:

$ ifconfig wlan0 create wlandev iwlwifi0
$ service netif start wlan0

故障排除与未竟事宜请参考:wiki/WiFi/Iwlwifi

博通(Broadcom)网卡驱动

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

这两个驱动仅支持 802.11b/g,现代 802.11ac/ax 博通网卡在 FreeBSD 上尚无原生驱动支持

关于驱动选择的详细信息,可参考 Fuller L. Broadcom WiFi Improvements for FreeBSD[EB/OL

示例:BCM4301、BCM4303、BCM4306 rev 2

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

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

if_bwi_load="YES"

随后使用 Ports 安装 Broadcom 无线设备的固件(该固件未提供二进制包):

$ cd /usr/ports/net/bwi-firmware-kmod/
$ make install clean
可先通过 USB 或以太网共享获取网络连接后安装,也可提前将所需依赖下载到指定目录

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

wlans_bwi0="wlan0"

完成上述配置后,重启系统

示例:配置 bwn 驱动

安装 Broadcom 无线设备的固件:

$ cd /usr/ports/net/bwn-firmware-kmod/
$ make install clean

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

博通网卡驱动涉及以下文件:

/
├── boot/
│   └── loader.conf        # 系统启动加载配置文件
├── usr/
│   ├── ports/
│   │   └── net/
│   │       ├── bwi-firmware-kmod/   # Broadcom bwi 固件 Port
│   │       └── bwn-firmware-kmod/   # Broadcom bwn 固件 Port
│   └── src/
│       └── sys/
│           └── amd64/
│               └── conf/              # 内核配置文件目录

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

if_bwn_load="YES"

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

wlans_bwn0="wlan0"

无线网络故障排除

  • 如果扫描时未列出接入点,可尝试切换路由器的信道,或将协议降级至 Wi-Fi 4
  • 如果设备无法与接入点关联,需验证配置是否与接入点上的设置匹配,包括认证方案和安全协议

    建议尽可能简化配置
    
    如果使用 WPA2 或 WPA 等安全协议,可先将接入点配置为开放认证、关闭安全功能,以验证流量能否通过
    
  • 如果系统可与接入点关联,使用 ping(8) 等工具诊断网络配置

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

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

FreeBSD 中,*固件* Firmware 是硬件设备正常工作所需的底层软件,提供硬件设备与操作系统内核之间的通信接口。固件接口可能随内核版本更新而变化

固件重新获取方法

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

$ fwget

如果当前系统没有网络连接,可通过 USB 网络共享等方式临时获得网络连接后再执行上述命令;也可手动从 USTC 镜像站点 下载所需固件包(请将 URL 中的 14 替换为当前系统主版本号),随后使用以下命令安装:

$ pkg add /path/to/firmware.pkg

蓝牙

蓝牙是一种无线技术,用于在 2.4 GHz 免授权频段内创建个人网络,覆盖范围通常为 10 米

此类网络通常由便携设备(如手机、手持设备和笔记本电脑)按需形成

与 Wi-Fi 不同,蓝牙提供更高级别的服务协议,例如 FTP 类文件服务器、文件推送、语音传输、串行线路仿真等

本节介绍在 FreeBSD 系统上使用 USB 蓝牙适配器的方法,以及各种蓝牙协议和实用程序

加载蓝牙支持

FreeBSD 蓝牙协议栈基于 Netgraph 框架实现。USB 蓝牙适配器需加载 ng_ubt 内核模块。若需开机自动加载,可将以下配置写入 /boot/loader.conf

ng_ubt_load="YES"

蓝牙功能的实现依赖多个系统服务协同工作。需在 /etc/rc.conf 中添加以下配置(或使用 service 命令启用):

hcsecd_enable="YES"
sdpd_enable="YES"
bthidd_enable="YES"

也可通过以下命令启用并启动相关服务:

$ service hcsecd enable  # 启用 hcsecd 服务
$ service sdpd enable    # 启用 sdpd 服务
$ service bthidd enable  # 启用 bthidd 服务
$ service hcsecd start   # 立即启动 hcsecd 服务
$ service sdpd start     # 立即启动 sdpd 服务
$ service bthidd start   # 立即启动 bthidd 服务
Table 2: 蓝牙组件
组件 说明
ng_ubt Netgraph USB 蓝牙驱动,为 USB 蓝牙适配器提供传输层支持,是蓝牙协议栈的基础驱动
hcsecd 管理蓝牙设备的链路密钥和 PIN 码,负责蓝牙设备的 安全认证
sdpd 蓝牙服务发现协议 Service Discovery Protocol 守护进程,负责发现和通告蓝牙服务
bthidd 支持 Bluetooth HID Human Interface Device 设备,如蓝牙鼠标、键盘等
hccontrol 通过 hccontrol(8) 可控制蓝牙 HCI 底层接口,包括查询设备状态、扫描附近设备、管理连接等操作,是蓝牙调试的核心工具

蓝牙鼠标配对

以罗技 M337 鼠标为例,需长按鼠标底部的配对按钮直至指示灯快速闪烁,使其进入可被发现的配对模式

使用 root 权限运行 bluetooth-config scan 命令,扫描附近可用的蓝牙设备,并按提示信息完成设备配对与添加:

$ bluetooth-config scan
Scanning for new Bluetooth devices (Attempt 1 of 5) ... done.
Found 1 new bluetooth device (now scanning for names):
[ 1] 34:88:5d:12:34:56  "Bluetooth Mouse M336/M337/M535" (Logitech-M337)
Select device to pair with [1, or 0 to rescan]: 1

This device provides human interface device services.
Set it up? [yes]:

附录:英特尔蓝牙

由 iwm、iwx 或 iwlwifi 驱动的 Intel 无线网卡通常集成了蓝牙功能,可通过安装 comms/iwmbt-firmware 固件包来加载蓝牙硬件所需的微码:

  • 使用 pkg(二进制包管理器)安装:

    $ pkg install iwmbt-firmware
    
  • 使用 Ports 安装:

    $ cd /usr/ports/comms/iwmbt-firmware/
    $ make install clean
    

蓝牙设备通过 USB 总线连接,可使用 usbconfig 工具查看所有 USB 设备(包括蓝牙设备)。如果系统启动时固件未自动加载,可手动加载。例如,如果蓝牙设备标识为 ugen1.5,则可执行:

$ iwmbtfw -d ugen1.5 -f /usr/local/share/iwmbt-firmware/
FreeBSD 蓝牙协议栈初始化脚本(/etc/rc.d/bluetooth)可能在系统服务启动阶段(蓝牙 HID 守护进程尝试打开设备时)导致设备锁定

因此,必须在启动蓝牙协议栈之前先运行 iwmbtfw 加载固件,否则须执行完整的断电重启或挂起恢复周期方可解锁设备

故障排除与未竟事宜

配对连接后自动断开

此问题可能由 bthidd 服务缓存的设备信息与实际设备状态不一致所致

解决方案:删除 /var/db/bthidd.hids 文件中对应鼠标的 bd_addr 行(该行包含设备的蓝牙地址,格式为 xx:xx:xx:xx:xx:xx,如 34:88:5d:12:34:56),清除旧的配对信息。完成上述操作后,重启蓝牙 HID 守护进程服务使更改生效:

$ service bthidd restart

USB 网络共享

概述

USB 网络共享 USB tethering 是通过 通用串行总线 USB 物理层将移动设备(如智能手机、平板电脑)的 广域网 WAN 连接共享给计算机系统的技术。

以下配置方法已在红米 Note 12 5G 上完成测试验证,可支持 Android 设备和 iPhone 13 及更早型号的 iOS 设备

iPhone 14 及更新型号因 NCM 协议兼容性问题暂不可用,详见下文 Apple 设备驱动部分说明

Wi-Fi 共享的流量特性

部分 Android 手机(如 Google Pixel 3 及更新机型)开启 Wi-Fi 并关闭移动数据后,可将网络共享给 FreeBSD。该功能通过将手机已建立的 Wi-Fi 连接经由 USB 接口转发给 FreeBSD 实现,不产生移动数据流量

usb_tethering.avif

已获取 root 权限的 Android 设备,还可通过数据线将手机的 VPN 连接共享给 FreeBSD 设备。相关软件可参考 VPN 热点,使用方法可参考 通过创建 Wifi 热点来共享 V2ray 代理

加载内核模块

首先需加载相应内核模块,使系统能识别 USB 网络共享设备(若默认未加载)

通用 Android 设备驱动

一般 Android 设备使用 远程网络驱动接口规范 Remote Network Driver Interface Specification,RNDIS 协议,需加载以下内核模块:

$ kldload if_urndis

该命令加载 USB RNDIS 网络驱动,使系统能够识别使用 RNDIS 协议的 Android 设备

Apple 设备驱动

Apple iPhone/iPad 设备需加载以下内核模块:

$ kldload if_ipheth

该命令加载 iPhone/iPad 以太网网络驱动,使系统能够识别 iOS 设备的 USB 网络共享功能。加载成功后,系统通常会创建类似 ue0 的网络接口

自 iPhone 14 系列起,Apple 已将 USB 网络共享协议从传统 IP-over-USB 切换为 NCM 协议

FreeBSD 的 if_ipheth 驱动目前不支持 NCM 模式,if_cdce 驱动对 Apple 的 NCM 实现也存在兼容性问题(Apple 的 NCM 实现不完全符合标准),可能导致连接不可用

截至 2025 年末,此问题尚无完善的解决方案

较新 Android 设备驱动(CDC NCM)

自 Google Pixel 6 系列(2021 年)起,Google 已将 Android 原生 USB 网络共享协议从 RNDIS 切换为 网络控制模型 Network Control Model,NCM ,其他部分厂商的新款设备也逐步跟进。此类设备需加载以下内核模块:

$ kldload if_cdce

该命令加载 USB CDC ECM/NCM 网络驱动,使系统能够识别使用 NCM 协议的 Android 设备。加载成功后,系统通常会创建类似 ue0 的网络接口

持久化驱动加载机制

如需系统启动时自动加载上述模块,可根据设备类型选择相应条目写入 /boot/loader.conf 文件:

if_urndis_load="YES"  # 设置系统启动时自动加载 USB RNDIS 网络驱动
if_cdce_load="YES"    # 设置系统启动时自动加载 USB CDC ECM/NCM 网络驱动
if_ipheth_load="YES"  # 设置系统启动时自动加载 iPhone/iPad 以太网驱动

编辑完成后,保存文件并重启系统使更改生效

物理连接与网络共享启用

加载所需内核模块后,将 USB 数据线连接到 FreeBSD 系统与移动设备之间,随后在移动设备上开启 USB 网络共享功能。具体开启方式因设备品牌和系统版本而异,通常可在移动设备的“设置”、“网络”或“个人热点”菜单中找到相关选项

需注意,部分 Android 设备可能需先启用 USB 调试才能识别 USB 网络共享设备(大多数现代 Android 设备无需此步骤)

iOS 设备可能需在弹出的对话框中确认信任该计算机方可正常工作

获取 IP 地址

移动设备开启 USB 网络共享后,FreeBSD 系统会自动创建相应的网络接口,通常接口名称为 ue0,可通过 ifconfig 命令确认实际接口名称。确认接口名称后,通过 DHCP 为该接口获取 IP 地址:

$ dhclient ue0 

该命令为 ue0 接口发送 DHCP 请求,从移动设备获取 IP 地址、子网掩码、默认网关和 DNS 服务器等网络配置参数。获取成功后,可使用 ifconfig ue0 命令查看分配的 IP 地址

Next:系统代理 Previous:网络基础 Home: 高级网络