软件接入点
软件接入点,也称为虚拟路由器或虚拟 Wi-Fi,允许计算机将其无线接口转换为 Wi-Fi 接入点。这可以省去购买独立无线路由器的麻烦。
需求
Wi-Fi 设备必须支持 AP 模式
您需要一个 兼容 nl80211 的无线设备,该设备支持 AP 无线模式。可以通过运行 iw list 命令来验证。在 Supported interface modes 部分应该列有 AP。
$ iw list
Wiphy phy1 ... Supported interface modes: * IBSS * managed * AP * AP/VLAN * WDS * monitor * mesh point ...
使用单个 Wi-Fi 设备时的无线客户端和软件 AP
创建软件 AP 与您自己的网络连接(以太网、无线等)是独立的。许多无线设备甚至支持同时作为 AP 和无线“客户端”进行同步操作。利用此功能,您可以使用单个无线设备创建一个充当现有网络“无线中继器”的软件 AP。此功能在 iw list 命令的输出的下一部分中列出。
$ iw list
Wiphy phy1
...
valid interface combinations:
* #{ managed } <= 2048, #{ AP, mesh point } <= 8, #{ P2P-client, P2P-GO } <= 1,
total <= 2048, #channels <= 1, STA/AP BI must match
...
约束 #channels <= 1 意味着您的软件 AP 必须与您的 Wi-Fi 客户端连接运行在同一频道上;请参阅下方 hostapd.conf 中的 channel 设置。
如果您想使用该功能/特性,可能是因为以太网连接不可用,您需要为使用它创建两个独立的虚拟接口。物理设备 wlan0 的虚拟接口可以按如下方式创建:为网络连接(wlan0_sta)本身和软件 AP/hostapd“无线中继器”创建具有唯一 MAC 地址的虚拟接口。
# iw dev wlan0 interface add wlan0_sta type managed addr 12:34:56:78:ab:cd # iw dev wlan0 interface add wlan0_ap type managed addr 12:34:56:78:ab:ce
可以使用 systemd.netdev(5) 使这些持久化,如 BBS#236923 中所述。或者,如果未使用 systemd-networkd,则可以创建一个 systemd 单元文件。
/etc/systemd/system/create-virtual-interface.service
[Unit] Description=Create virtual wireless interface Requires=sys-subsystem-net-devices-wlan0.device After=network.target After=sys-subsystem-net-devices-wlan0.device [Service] Type=oneshot ExecStart=/usr/bin/iw dev wlan0 interface add wlan0_ap type managed addr "12:34:56:78:ab:ce" [Install] WantedBy=multi-user.target
可以使用 macchanger 生成随机 MAC 地址。
配置
设置接入点包含两个主要部分:
- 设置Wi-Fi 链路层,以便无线客户端可以连接到您的计算机的软件接入点并与之交换 IP 数据包。
- 设置您计算机上的网络配置,以便它能正确地在中继您的互联网连接和无线客户端之间的 IP 数据包。
Wi-Fi 链路层
实际的 Wi-Fi 链路通过 hostapd 包建立,该包支持 WPA2。
hostapd 自带一个默认配置文件,其中包含许多列出的选项和相应的描述,您可以参考以获取一些基本知识。
必要时调整 hostapd 配置文件中的选项。特别是,更改 ssid 和 wpa_passphrase。可以为最新的 Wi-Fi 5 和 Wi-Fi 6 适配器启用 ieee80211ac 和 ieee80211ax。ht_capab 选项会影响您的 AP 的功能,包括对传输速度很重要的信道宽度。
有关更多信息,请参阅 hostapd Linux 文档页面。
/etc/hostapd/hostapd.conf
interface=wlan0_ap bridge=br0 # SSID to be used in IEEE 802.11 management frames ssid=YourWiFiName # Driver interface type (hostap/wired/none/nl80211/bsd) driver=nl80211 # Country code (ISO/IEC 3166-1) country_code=US # Operation mode (a = IEEE 802.11a (5 GHz), b = IEEE 802.11b (2.4 GHz) hw_mode=g # Channel number channel=7 # Maximum number of stations allowed max_num_sta=5 # Bit field: bit0 = WPA, bit1 = WPA2 wpa=2 # Bit field: 1=wpa, 2=wep, 3=both auth_algs=1 # Set of accepted cipher suites; disabling insecure TKIP wpa_pairwise=CCMP # Set of accepted key management algorithms wpa_key_mgmt=WPA-PSK wpa_passphrase=Somepassphrase # hostapd event logger configuration logger_stdout=-1 logger_stdout_level=2 ## Enable 802.11n support #ieee80211n=1 ## Enable 802.11ac support #ieee80211ac=1 ## Enable 802.11ax support #ieee80211ax=1 ## QoS support #wmm_enabled=1 ## Use "iw list" to show device capabilities and modify ht_capab and vht_capab accordingly #ht_capab=[HT40+][SHORT-GI-40][TX-STBC][RX-STBC1][DSSS_CCK-40] #vht_capab=[RXLDPC][SHORT-GI-80][TX-STBC-2BY1][RX-STBC-1]
utf8_ssid=1。一些客户端在识别正确编码时可能会遇到问题(例如 wpa_supplicant 或 Windows 7)。要自动在启动时启动 hostapd,请启用 hostapd.service。
如果您在启动时启动 hostapd,请确保无线 网络接口 首先被启动,否则将会失败。为了确保您的无线接口已准备就绪,请编辑单元配置文件,并声明它已绑定到您的网络接口并且应该在您的网络接口之后启动。
/etc/systemd/system/hostapd.service.d/override.conf
[Unit] BindsTo=sys-subsystem-net-devices-wlan0.device After=sys-subsystem-net-devices-wlan0.device
还要确保该接口未被其他网络管理器管理。如果您正在使用 NetworkManager,请参阅 NetworkManager#Ignore specific devices。
hostapd.conf 文件中将 driver=nl80211 替换为 driver=rtl871xdrv。网络配置
实现此目的有两种基本方法:
- 桥接:在您的计算机上创建一个网络桥接,无线客户端将看起来像访问您计算机使用的同一个网络接口和同一个子网。
- NAT:通过 IP 转发/NAT 和 DHCP 服务,无线客户端将使用专用子网,来自/到该子网的数据将进行 NAT 处理。这类似于连接到互联网的普通 Wi-Fi 路由器。
桥接方法更简单,但它要求无线客户端需要的任何服务,特别是 DHCP,在计算机的外部接口上可用。这意味着如果外部调制解调器分配的 IP 地址相同,则对不同客户端不起作用。
NAT 方法更通用,因为它清晰地将 Wi-Fi 客户端与您的计算机分开,并且对外界完全透明。它适用于任何类型的网络连接,并且(如果需要)可以使用常规的 iptables 方法引入流量策略。
可以将这两种方法结合起来:例如,有一个桥接,其中包含以太网设备和具有静态 IP 的无线设备,提供 DHCP 并设置 NAT 以将流量转发到连接到 WAN 的其他网络设备。
桥接设置
您需要创建一个网络桥接并将您的网络接口(例如 eth0)添加到其中。您不应将无线设备(例如 wlan0)添加到桥接器;hostapd 会自行添加。
请参阅 Network bridge。
NAT 设置
有关配置详细信息,请参阅 Internet sharing#Configuration。
在该文章中,连接到 LAN 的设备是 net0。该设备在这种情况下将是您的无线设备(例如 wlan0)。
工具
linux-wifi-hotspot
linux-wifi-hotspotAUR 包提供了一个脚本,可以创建桥接或 NAT 的接入点用于互联网共享。它结合了 hostapd、dnsmasq 和 iptables 以确保接入点的正常运行。包括命令行和 GUI。创建 NAT 虚拟网络的基本语法如下:
# create_ap wlan0 eth0 MyAccessPoint MyPassPhrase
或者,可以根据需要调整 /etc/create_ap.conf 中提供的模板配置文件,并运行脚本:
# create_ap --config /etc/create_ap.conf
要使用 GUI,请在终端中运行:
# wihotspot
启用/启动 create_ap.service 以在启动时使用 /etc/create_ap.conf 中指定的配置运行脚本。
有关更多信息,请参阅 GitHub 上的 linux-wifi-hotspot。
RADIUS
有关说明,请参阅 FreeRADIUS wiki。
nm-connection-editor
安装 dnsmasq 包才能实际共享连接。请注意,NetworkManager 会启动自己的 dnsmasq 实例作为 DHCP 服务器,独立于 dnsmasq.service。
无法使用 network-manager-applet 创建热点。
- 打开 nm-connection-editor (在 network-manager-applet 的应用程序菜单中,“编辑连接”将从中打开它)。
- 单击右下角的 "+" 按钮,然后选择“Wi-Fi”作为连接类型,然后按“创建...”按钮。
- 在 Wi-Fi 选项卡中,将模式更改为“热点”并填写其余选项。
故障排除
WLAN 速度非常慢
预期吞吐量较低的常见原因包括:
- 不恰当地选择操作模式,其
hw_mode低于支持的模式,可能会人为地限制路由器。检查是否选择了现代操作模式。 - 拥挤或受噪声干扰的
channel会严重降低性能,尤其是在人口稠密地区。尝试切换到不同的信道,甚至切换频段。 - 未设置或不恰当地设置了 监管域。
NetworkManager 干扰
如果设备由 NetworkManager 管理,hostapd 可能无法正常工作。您可以使用 MAC 地址来屏蔽该设备:
/etc/NetworkManager/conf.d/unmanaged.conf
[keyfile] unmanaged-devices=mac:hwaddr
或接口名称:
/etc/NetworkManager/conf.d/unmanaged.conf
[keyfile] unmanaged-devices=interface-name:ifname
无法在 5 GHz 频段启动 AP 模式
显然,使用特殊的国家代码 00(全球)时,5GHz 频段中的所有可用频率都会设置“no-ir”(不启动辐射)标志,这将阻止 hostapd 使用它们。您需要安装 wireless-regdb 并设置您的国家代码,才能使您所在国家/地区允许的频率可用于 hostapd。
请注意,最近的 Intel 设备具有位置感知监管 (LAR) 功能,该功能会忽略用户空间监管数据库,而是通过监听附近的其他接入点来推断监管区域。这意味着设备在看到 5 GHz 频段上的其他接入点之前不会在任何 5 GHz 频率上进行传输,在许多情况下会完全阻止任何 5 GHz 传输。旧内核有一个禁用此功能的选项,该选项在 2019 年被移除,因为它会导致固件崩溃。自从移除该选项以来,支持 LAR 的 Intel 网卡已无法在 5 GHz 频段上用作接入点。
Windows 10+ 拒绝使用 WPA3 连接 hostapd
Windows 似乎拒绝使用 hostapd 连接到 WPA3 接入点。使用 wpa=2 而不是 wpa=3 可能会解决此问题。
接入点不支持 40MHz 模式 (HT) 运行
您可能会收到以下消息:
20/40 MHz operation not permitted on channel pri=13 sec=9 based on overlapping BSSes
这意味着您的 Wi-Fi 设备检测到附近有太多接入点。 然后它拒绝使用超过 20MHz 的信道宽度,以便更公平地共享无线频谱。您可能可以通过 noscan=1 来禁用它,但这可能很可能违反当地监管要求。