hostapd 简介

hostapd 能够使得无线网卡切换为 master 模式,模拟 AP 功能,也就是我们说的软 AP(Soft AP)。

hostapd 的功能就是作为 AP 的认证服务器,负责控制管理 stations 的接入和认证。

通过 hostapd 可以将无线网卡切换为 AP/Master 模式,通过修改配置文件,可以建立一个 OPEN、WEP、WPA、WPA2 的无线网络。并且通过修改配置文件可以设置无线网卡的各种参数,包括信道、beacon 包时间间隔,是否发送 beacon 包等。

作为 station 时,工作在 managed 模式,由后台进程 wpa_supplicant 做认证管理。

作为 AP 时,工作在 master 模式,由后台进程 hostapd 进做认证处理。

作为 station,工作流程:加载 WiFi 驱动、加载 firmware、启动 wpa_supplicant、设置 mac 地址、设置为 managed 模式、通过 ioctl 命令启动 scan、链接到对应 AP、启动 dhcpd 获取 IP 地址、socket 通信。

作为 softap 时,工作流程:加载 WiFi 驱动、加载 firmware、启动 hostapd、设置 mac 地址、设置为 master 模式、设置 BSSID、启动 dhcpd、等待 station 连接。

img

WiFi配置架构图

hostapd 使用

  1. 安装
$ sudo apt install hostapd
  1. 打开树莓派无线设备
rfkill list all
rfkill unblock wifi
  1. 修改配置文件
pi@raspberrypi:~ $ cat /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=pi
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=zaqwsxcde
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
  1. 启动热点
pi@raspberrypi:~ $ sudo hostapd /etc/hostapd/hostapd.conf
Configuration file: /etc/hostapd/hostapd.conf
wlan0: Could not connect to kernel driver
Using interface wlan0 with hwaddr b8:27:eb:df:e9:a1 and ssid "pi"
wlan0: interface state UNINITIALIZED->ENABLED
wlan0: AP-ENABLED

  1. STA 连接成功
wlan0: STA 22:86:8e:d6:50:e4 IEEE 802.11: associated
wlan0: AP-STA-CONNECTED 22:86:8e:d6:50:e4
wlan0: STA 22:86:8e:d6:50:e4 RADIUS: starting accounting session BCCECBB5B328E3C4
wlan0: STA 22:86:8e:d6:50:e4 WPA: pairwise key handshake completed (RSN)

hostapd && wpa_supplicant 交叉编译

参考:

libnl,openssl,hostapd 交叉编译

交叉编译hostapd-2.8

wpa_supplicant交叉编译 , wpa_supplicant 需要注释掉 DBUS 选项

hostapd 代码分析(v0.1.0)

per-interface	// 网卡
    Per-radio	// 2.4G
    Per-radio	// 5G
    	per-BSS	// 5G-1
    	per-BSS	// 5G-2
    	per-BSS
    	per-BSS
    	per-BSS
    	per-BSS
    	per-BSS
    	per-BSS
/* per-interface */
struct hostapd_iface {
	struct hapd_interfaces *interfaces;
	void *owner;
	int (*reload_config)(struct hostapd_iface *iface);
	struct hostapd_config * (*config_read_cb)(const char *config_fname);
	char *config_fname;
	struct hostapd_config *conf;	// Per-radio

	size_t num_bss;	// 此接口下的 BSS 个数
	struct hostapd_data **bss;	// BSS 列表,描述各 BSS 的配置

	int num_ap; /* number of entries in ap_list */
	struct ap_info *ap_list; /* AP info list head */
	struct ap_info *ap_hash[STA_HASH_SIZE];
	struct ap_info *ap_iter_list;

...

	u16 ht_op_mode;	// 成员变量(类比 C++)
	void (*scan_cb)(struct hostapd_iface *iface);	// 成员函数(类比 C++)

	int (*ctrl_iface_init)(struct hostapd_data *hapd);
	void (*ctrl_iface_deinit)(struct hostapd_data *hapd);

	int (*for_each_interface)(struct hapd_interfaces *interfaces,
				  int (*cb)(struct hostapd_iface *iface,
					    void *ctx), void *ctx);
};

/* Per-radio */
struct hostapd_config {
	struct hostapd_bss_config *bss, *last_bss;	// per-BSS
	size_t num_bss;
...
};


/* per-BSS */
struct hostapd_data {
	struct hostapd_iface *iface;
	struct hostapd_config *iconf;
	struct hostapd_bss_config *conf;	// 保存BSS 的配置信息(从配置文件hostapd.conf 中加载)
	int interface_added; /* virtual interface added for this BSS */

	u8 own_addr[ETH_ALEN];	// BSSID

	int num_sta; /* number of entries in sta_list */
...
	const struct wpa_driver_ops *driver;	// 指向一组驱动程序接口,用来和驱动交互(这里用的是 nl80211)
	void *drv_priv;
...
};

DHCP

$ sudo apt install dnsmasq

dnsmasq 是一个小型的用于配置 DNS 和 DHCP 的工具,适用于小型网络,它提供了 DNS 和 DHCP 功能。

sudo vim /etc/dnsmasq.conf
interface=wlan0
dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
sudo systemctl reload dnsmasq

疑问

nl80211 新版配置方式,老的为 WExt

Linux wext和nl80211接口简介

driver=nl80211 ,nl80211 是驱动吗?

CFG80211_SUPPORT 支持的前提是需要在安装驱动之前,insmod cfg80211.ko

依赖 cfg80211.ko 和 mac80211.ko

先注册前3个模块,之后的8812au.ko

参考

Hostapd简介

hostapd的分析

从零开始:树莓派共享 WiFi 秒变无线热点(树莓派路由器 - 知乎 (zhihu.com) 对 实践

配置树莓派为wifi热点(AP模式) - 知乎 (zhihu.com)

hostapd wpa_supplicant madwifi详细分析(一)——hostapd是干嘛的

hostapd源代码分析(一):网络接口和BSS的初始化

hostapd源代码分析 netlink nl80211

如何查看linux是否支持cfg80211 cfg80211 mac80211 nl80211 概念讲解

hostapd 和 wap_supplicant 和 wpad