「Linux」- 搭建无线热点(HOSTAPD and DNSMASQ)

问题描述

本文将介绍,在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)