问题描述
本文将介绍,在linux下使用hostapd及dnsmasq来创建无线热点
环境概述
系统环境:Kali GNU/Linux Rolling
前提条件
需要一张无线网卡。
第一步、准备无线网卡,并确认是否支持AP模式
检查无线网卡是否支持AP模式
你需要一块nl80211兼容的网卡设备,并支持AP模式(当然你可以直接问商家)。
可以通过iw list命令进行查看是否支持AP模式,在输出的Supported interface modes部分下,查看有没有一个* AP,命令如下:
#!/bin/bash iw list | grep 'Supported interface modes' -A 10
输出如下图,如果有AP列出,则该网卡就支持搭建无线热点:
单设备的无线客户端与软AP
(注意:该步骤与搭建无线热点并无关系)
创建软AP独立于你自己的网络连接(以太网,无线…)。许多无线设备甚至支持同时做为软AP和无线客户端的simultaneous操作。如果要使用该功能,可以使用单个无线设备创建一个充当现有网络的“无线中继器”的软AP。该功能列在iw list输出的以下部分中:
如果你的#channels <= 1意味着你的软AP必须在与你的Wi-Fi客户端连接在相同的信道上运行;请参阅下面的hostapd.conf中的通道设置。
如果要使用这个功能,可能是因为以太网连接不可用,则需要创建两个独立的虚拟接口来使用它。如下所示,可以创建物理设备wlan1的虚拟接口:为网络连接(wlan1_sta)本身和软件AP/hostapd“无线中继器”创建具有各自唯一MAC地址的虚拟接口:
#!/bin/bash iw dev wlan1 interface add wlan1_sta type managed addr 12:34:56:78:ab:cd iw dev wlan1 interface add wlan1_ap type managed addr 12:34:56:78:ab:ce
第二步、设置Wi-Fi链路层(配置「HOSTAPD」服务)
这一步骤是设置Wi-Fi链路层(Wi-Fi link layer)、创建无线热点。在创建无线热点后,客户端就可以通过无线名及密码连接到该热点并发送数据包。
该Wi-Fi链路层部分由+hostapd实现。
安装「hostapd」包
关于hostapd的安装及配置的介绍参考另外一篇文章: 在Linux下,hostpad的安装及配置
配置/etc/hostapd/hostpad.conf配置文件
如果文件不存在则进行创建,配置文件内容如下:
# 指定无线网卡 interface=wlan1 # 无线网络名 ssid=d3rm.org # 无线密码 wpa_passphrase=12345678 # 指定驱动 driver=nl80211 # 配置一个WPA-PSK/WPA2-PSK无线热点 wpa=2 # 指定信道 channel=7
注意:这里只给出了一些必要的选项,有关更多的配置选项请参考hostapd文档,或者「+hostapd」部分的介绍。
启动「hostapd」服务
#!/bin/bash # 注意:启动hostapd之前,确保网卡已经启动,否则会由错误产生: ip link set dev wlan1 up # 启动HOSTAPD服务: # 对于直接从发行版的源中安装hostpad的情况,在Debian中,可能需要修改/etc/default/hostapd配置 # 文件,来指定hostapd.conf的加载路径。否则hostapd会启动失败。 systemctl start hostapd # 或者手动启动 /usr/sbin/hostapd -P /run/hostapd.pid -B /etc/hostpad/hostapd.conf
至此,已经可以看到一个名为d3rm.org的无线热点了。
网络配置(配置「DNSMASQ」服务)
该步骤的作用的配置网络层。包括:使用DHCP为客户端分配IP地址,并对客户端发来的数据包进行路由。
网络配置有两种方式:一种是桥接模式(通过桥接上网);一种使NAT模式(通过NAT上网)。二选一即可。
配置「桥接」模式
brctl addbr br0 # 创建网桥 brctl addif br0 eth0 # 将网卡加入网桥 dhclient -v br0 # 分配IP地址给网桥接口 # 将无线网卡加入网桥;更具Arch中的描述:不应将无线设备(例如wlan0)添加到网桥;hostapd将自行添加,我反正没明白; brctl addif br0 wlan1 # eth0是连接有线的、可访问外部网络的接口; # wlan1是无线AP; # 通过将wlan1桥接到eth0,使wlan1可以访问网络。
至此,通过桥接模式,无线就可以访问网络了。
注意,已经做为无线客户端的无线网卡(即,该网卡已经做为一个客户端连接一个无线热点)是不能加入桥接的,原因参考Error List中的:「can’t add wlan0 to bridge br0: Operation not supported」。
配置「NAT」模式
使用NAT模式可以构建自己的小型局域网。
配置作为AP的无线网卡
# 这里我们使用172.16.0.0/8网段 ifconfig wlan1 172.16.0.1 netmask 255.255.255.0 up
配置dnsmasq服务
在这里使用Dnsmasq,主要提供DHCP服务的。所以如果没有Dnsmasq也是可以的,但连接到无线之后就要手动配置设备的网络。
关于Dnsmasq的安装参考另外一篇文章: 在Linux下,Dnsmasq的安装
# 创建/etc/dnsmasq.conf配置文件,写入如下内容 interface=wlan1 listen-address=172.16.0.1 no-dhcp-interface= dhcp-range=172.16.0.2,172.16.0.20,12h
运行dnsmasq服务
systemctl start dnsmasq # 或者手动启动 dnsmasq -C /etc/dnsmasq.conf
开启内核「ip_forward」功能
echo 1 > /proc/sys/net/ipv4/ip_forward # 写入/etc/sysctl.conf中持久化配置 echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
配置「NAT」功能
# 172.16.0.0/8:DHCP所使用的网段 # eth1:是连接到外部网络的接口 iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o eth1 -j MASQUERADE
至此,NAT模式下,你的无线热点已经已经可以访问网络了。
错误列表(Error List)
#1 WPA: Not enough entropy in random pool for secure operations
random: Only 15/20 bytes of strong random data available from /dev/random
random: Not enough entropy pool available for secure operations
WPA: Not enough entropy in random pool for secure operations – update keys later when the first station connects
原因:熵池大小不足;
解决:使用 rngd 工具补充熵池:
#!/bin/sh rngd -r /dev/urandom -o /dev/random
#2 wlan1: AP-DISABLED
Configuration file: /etc/hostapd.conf nl80211: Could not configure driver mode nl80211: deinit ifname=wlan1 disabled_11b_rates=0 nl80211 driver initialization failed. wlan1: interface state UNINITIALIZED->DISABLED wlan1: AP-DISABLED hostapd_free_hapd_data: Interface wlan1 wasn't started
原因分析:Linux下的NetworkManager接管了这张网卡;
解决方案:
1)可以暂时停用NetworkManager:
systemctl stop network-manager.service
(2). 或者,让NetworkManager不要管这张网卡。在/etc/NetworkManager/NetworkManager.conf中加入:
[keyfile] unmanaged-devices=mac:<hwaddr>
#3 can’t add wlan0 to bridge br0: Operation not supported
现在已经不可能将一个在管理模式下的无线接口添加到网桥中了,即无法桥接一个无线客户端的连接,否则就不需要什么WDS了。原因很简单:Wi-Fi规范禁止AP通过Wi-Fi网络广播流量,除非传输获得了授权。这在很大程度上是WiFi网络非常缓慢并且安全性差的时代的遗留问题。由于802.11报头有三个地址(除了使用WDS外)省略了Station代表另一个系统发送或接收数据包所需的地址,因此桥接在Station端无法正常工作。
解决:你应该先运行hostapd,使接口进入纯主模式。或者配置WDS。
相关原因参考地址:
https://serverfault.com/questions/152363/bridging-wlan0-to-eth0
http://web.archive.org/web/20110925231256/http://kerneltrap.org/mailarchive/linux-ath5k-devel/2010/3/21/6871733
参考文献
Software access point
hostapd实现WIFI 热点(AP)