软件接入点
软件接入点,也称为虚拟路由器或虚拟 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
。 可以为最新的 WiFi5 和 WiFi6 适配器启用 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#忽略特定设备。
hostapd.conf
文件中将 driver=nl80211
替换为 driver=rtl871xdrv
。网络配置
有两种基本方法可以实现这一点
- 桥接:在您的计算机上创建一个网络桥接,无线客户端将显示为访问与您的计算机使用的相同的网络接口和相同的子网。
- NAT:通过 IP 转发/伪装和 DHCP 服务,无线客户端将使用专用子网,来自/到该子网的数据将被 NAT 处理。 这类似于连接到互联网的普通 Wi-Fi 路由器。
桥接方法更简单,但它要求无线客户端所需的任何服务,特别是 DHCP,在计算机的外部接口上可用。 这意味着如果分配 IP 地址的外部调制解调器为不同的客户端提供相同的 IP 地址,则它将不起作用。
NAT 方法更通用,因为它清楚地将 Wi-Fi 客户端与您的计算机分开,并且对外部世界完全透明。 它适用于任何类型的网络连接,并且(如果需要)可以使用常用的 iptables 方法引入流量策略。
可以将这两种方法结合起来:例如,拥有一个桥接,其中包含以太网设备和具有静态 IP 的无线设备,提供 DHCP 并设置 NAT 以将流量中继到连接到 WAN 的附加网络设备。
桥接设置
您需要创建一个网络桥接并将您的网络接口(例如 eth0
)添加到其中。 您不应将无线设备(例如 wlan0
)添加到桥接; hostapd 会自行添加它。
请参阅 网络桥接。
NAT 设置
有关配置详细信息,请参阅 互联网共享#配置。
在该文章中,连接到 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 实例,独立于 dnsmasq.service
,作为 DHCP 服务器。
无法使用 network-manager-applet 创建 热点。
- 打开 nm-connection-editor (从 network-manager-applet 的 nm-applet 应用程序菜单中打开“编辑连接”)
- 单击右下角的“+”按钮,然后单击“WiFi”作为连接类型,然后按“创建...”按钮。
- 在 WiFi 选项卡中,将模式更改为“热点”,并填写其余选项。
故障排除
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
(no-initiating-radiation) 标志,这将阻止 hostapd 使用它们。 您将需要安装 wireless-regdb 并设置您的国家代码,以使您所在国家/地区允许的频率可用于 hostapd。
请注意,最近的英特尔设备具有位置感知监管 (LAR) 功能,该功能忽略用户空间监管数据库,而是通过监听附近的其他接入点来推断监管区域。 这意味着这些设备在首次看到 5 GHz 频段上的其他接入点之前,不会在任何 5 GHz 频率上进行传输,在许多情况下完全阻止了 5 GHz 传输。 较旧的内核有一个选项可以禁用此功能,但在 2019 年 由于导致固件崩溃而被删除。 自删除以来,支持 LAR 的英特尔网卡无法再用作 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
这意味着您的 WIFI 设备检测到太多附近的接入点。 然后,它拒绝使用超过 20Mhz 的信道宽度,以便更公平地共享无线频谱。 您也许可以使用 noscan=1
禁用它,但这可能可能违反当地法规要求。