拒绝万能钥匙!!教您用 hostapd 搭建一个企业级的 Wi-Fi !


一、前言 & 知识普及

  • 在日常生活中,我们最常使用的 Wi-Fi 安全方案叫做 WPA(2)-PSK,PSK 叫做预共享密钥。顾名思义,预共享的意思就是连接该 Wi-Fi 的用户都事先知道并使用同一个密码。虽然有 AES 加密,未知密码的用户也无法通过监听的方式(例如使用 airodump-ng 嗅探工具)窃取信息,但是密码可以通过多种渠道泄漏出去,最常见的就是万能钥匙。定期更换 Wi-Fi 密码虽然很容易,但是要求所有的用户都必须重新设置一遍 Wi-Fi 参数,非常麻烦。限制 MAC 地址的措施也只能防止非法用户接入网络,并不能防止已知密码的非法用户窃取信息。

  • 简单的说,企业级的 Wi-Fi 就是由专门的认证服务器负责用户的认证,无线接入点本身并不负责认证,只负责与认证服务器交换认证信息,并决定是否放行接入用户。而认证服务器的配置非常灵活,可以一个用户对应一个用户名密码,甚至还可以一个用户对应一个 VLAN !这样在认证信息遭到泄漏时,只需修改泄漏用户所对应的用户名和密码即可;由于不同用户对应不同密码,而且使用 AES 加密,数据自然就不会被监听到,既方便又安全!而且认证服务器上配置的证书还能有效防止假冒接入点。

  • 企业级的 Wi-Fi 认证一般叫做 802.1X EAP 认证,由 Radius 服务器负责认证。 EAP 又有很多种认证方式,例如 EAP-MD5 、EAP-PEAP 、EAP-TLS 等。目前为止,Wi-Fi 网络最高安全方案是 EAP-TLS 。但结合兼容性考虑,下面使用 EAP-PEAP 认证方式(强烈推荐使用复杂密码。如果想了解攻击 EAP-PEAP 的方法,可以去看一下这篇文章)。如果您对安全性有极高要求,请使用 EAP-TLS

  • 下面放一张 EAP-PEAP 流程图

  • hostapd 是 Linux 下面一个老牌“开热点”工具,很多人不知道这工具也可以搭建 Radius 服务器。这次我们不用 hostapd 的热点功能,只拿他搭建 Radius 服务器。

  • 最有名的 Radius 服务器要属 freeradius 了,但是 freeradius 配置非常麻烦,需要同时修改多个模块的配置文件,而且非常容易出错。我之前也是使用 freeradius ,记得花了四个小时才配置成功的……直到知道了 hostapd 。话不多说,开始教程吧!


二、软件 & 系统环境

  • 操作系统:CentOS 7.3.1611
  • 开发环境:Development Tools 套件
  • 软件:hostapd 2.6

三、编译 & 安装 hostapd

3.1 下载 hostapd 源码包并解压

wget https://w1.fi/releases/hostapd-2.6.tar.gz && \
tar -xf hostapd-2.6.tar.gz

3.2 修改编译配置文件

cd hostapd-2.6/hostapd/
cat << EOF > .config

以下内容直接粘贴到命令行窗口中按回车即可。

CONFIG_DRIVER_NONE=y 
CONFIG_EAP=y 
CONFIG_EAP_MSCHAPV2=y 
CONFIG_EAP_PEAP=y 
CONFIG_PKCS12=y 
CONFIG_RADIUS_SERVER=y 
CONFIG_IPV6=y 
EOF

本着够用就好的原则,我们只安装必须的模块。

3.3 编译 & 安装

默认安装在 /usr/local/bin

make && make install

⚠️ 注意
• 由于各人系统环境各不相同,编译极有可能出错。请根据提示安装必要的系统库。


四、服务器的配置

4.1 创建配置目录

mkdir /etc/hostapd && \
cd /etc/hostapd

4.2 生成自签名证书

openssl req -x509 -nodes -days 36500 -newkey rsa:4096 -keyout key.pem -out cert.pem -new -sha512 -subj "/O=hostapd/CN=hostapd/"

以上命令 -subj 后面的参数即为证书的字段,可自定义。

字段名 说明
O 组织名。
CN 公用名称。

4.3 创建路由器密码文件

格式

(一行对应一个路由器)

<路由器 IP> <路由器密码>

举例

cat << EOF > routers

请按实际情况修改以下内容,然后粘贴到命令行窗口中按回车即可。

192.168.1.1 passwordradius
EOF

4.4 创建 Wi-Fi 用户名密码文件

格式

*   PEAP 
"<用户名 1>" MSCHAPV2 "<密码 1>" [2]
"<用户名 2>" MSCHAPV2 "<密码 2>" [2]
...

以下举例说明:

cat << EOF > users

请按实际情况修改以下内容,然后粘贴到命令行窗口中按回车即可。

*   PEAP 
"zenandidi" MSCHAPV2 "1111111111" [2]
"yzn" MSCHAPV2 "3333333333" [2]
EOF

4.5 创建主配置文件

cat << EOF > hostapd.conf

请按实际情况以及注释提示修改以下内容,完成后去除 # 号和后面的注释,然后粘贴到命令行窗口中按回车即可。

driver=none
eap_server=1
eap_user_file=/etc/hostapd/users
server_cert=/etc/hostapd/cert.pem
private_key=/etc/hostapd/key.pem
radius_server_clients=/etc/hostapd/routers
radius_server_auth_port=1812 # 服务器端口
EOF

4.6 防火墙放行端口

iptables 为例,端口为默认的 1812

iptables -A INPUT -p udp --dport 1812 -j ACCEPT

然后根据需要自行保存防火墙的配置。

4.7 试运行

/usr/local/bin/hostapd -dd /etc/hostapd/hostapd.conf

如果没有报错,说明配置正确。按 Ctrl + C 退出。上面的命令后面加上 -B 可以后台运行。

4.8 创建系统服务文件

(仅限使用 systemd 的操作系统)

cat << EOF > /lib/systemd/system/hostapd.service 

以下内容直接粘贴到命令行窗口中按回车即可。

[Unit]
Description=hostapd
After=network.target 

[Service]
Type=forking
ExecStart=/usr/local/bin/hostapd -dd /etc/hostapd/hostapd.conf -B 
KillSignal=SIGTERM
KillMode=mixed

[Install]
WantedBy=multi-user.target
EOF

4.9 启动 hostapd

(仅限使用 systemd 的操作系统)

启动服务

systemctl start hostapd.service 

设置开机启动

systemctl enable hostapd.service 

五、路由器的配置

下面以 TP-Link TL-WR340G 为例。不同路由器有不同的设置方法,普通家用路由器也不一定可以支持。

保存,然后等待重启即可。


六、用户设备的配置

EAP-PEAP 的配置非常简单,一般只需要输入用户名和密码然后信任服务器身份即可,不需要额外设置。以下只以 iPhone 为例,其他设备的配置方法如果搞不懂请使用搜索引擎搜索 “连接 PEAP Wi-Fi”

找到要连接的 Wi-Fi 名称,点进去,输入上面步骤 4.4 所设置的用户名和密码。

弹出证书验证窗口,点击信任

不出意外的话,Wi-Fi 已经连上了!


七、注意事项

  1. 用户设备的时间都要设置在证书生效的时间点(执行生成自签名证书命令那个时间点)之后,也就是说要确保服务器和用户设备的时间都是正确的,否则可能会导致无法验证证书而无法连接。一般来说都不要担心这个问题,但是我的 Apple TV 居然遇到了这个问题!结果自己瞎折腾了半天才想到的!所以请大家注意下。
  2. 如果有 macOS 设备,请避免多个 BSSID 共用一个 ESSID 。例如双频路由器两个频段的 SSID 不要设置一样。否则,可能会出现短时间内频繁断网的情况(如下图)。通过抓包发现原来系统刚在这个基站认证完就马上跑到另外一个同名基站去认证了,另一个没连接当然无法通过认证。 Google 了一下发现也有类似问题…… ??


八、参考文献

  1. 802.1x 概述和 EAP 类型
  2. WLAN 认证和加密技术白皮书
  3. draft-josefsson-pppext-eap-tls-eap-06

发表评论