树莓派创建 WiFi 热点
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 连接。
hostapd 使用
- 安装
$ sudo apt install hostapd
- 打开树莓派无线设备
rfkill list all
rfkill unblock wifi
- 修改配置文件
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
- 启动热点
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
- 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 交叉编译
- hostapd-2.9.tar.gz, wpa_supplicant-2.9.tar.gz, http://w1.fi/hostapd/
- libnl-3.2.25.tar.gz, http://www.infradead.org/~tgr/libnl/
- openssl-1.1.1a, https://ftp.openssl.org/source/old/1.1.1/
参考:
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
driver=nl80211 ,nl80211 是驱动吗?
CFG80211_SUPPORT 支持的前提是需要在安装驱动之前,insmod cfg80211.ko
依赖 cfg80211.ko 和 mac80211.ko
参考
从零开始:树莓派共享 WiFi 秒变无线热点(树莓派路由器 - 知乎 (zhihu.com) 对 实践
配置树莓派为wifi热点(AP模式) - 知乎 (zhihu.com)
hostapd wpa_supplicant madwifi详细分析(一)——hostapd是干嘛的
hostapd源代码分析 netlink nl80211
如何查看linux是否支持cfg80211 cfg80211 mac80211 nl80211 概念讲解
hostapd 和 wap_supplicant 和 wpad