在 CentOS 7 上交叉编译适用于 ASUS RT-AC68U 的 hostapd(仅 Radius 服务器)


一、前言

自从去年学会了用 hostapd 搭建 Radius 服务器之后,我就一直在使用 802.1X 的 Wi-Fi。

说明
• 如需了解如何使用 hostapd 搭建 Radius 服务器,可以看一下我写的两篇文章:
拒绝万能钥匙!!教您用 hostapd 搭建一个企业级的 Wi-Fi !
搭建一个「最安全」的 Wi-Fi 网络

我的路由器是刷了 Asuswrt-Merlin 系统的 ASUS RT-AC68U。Asuswrt-Merlin 可以算是一个完整的 Linux 操作系统。

按理来说,hostapd 是可以直接跑在这台路由器上面的。

但这台路由器使用的是 32 位 ARM 架构的 CPU(BCM4708A0),现有 x86 平台上的 hostapd 不能在路由器上运行;并且路由器的存储空间又十分有限,无法在路由器上搭建软件开发环境。

所以,要想在这台路由器上使用 hostapd 的话,就必须进行交叉编译。

交叉编译一般指在一台 x86 主机上编译另一种处理器架构(例如 ARM 或 MIPS 架构)的软件的过程。交叉编译需要用到的一系列工具称为交叉编译工具链。

本文将介绍如何在 x86 CentOS 系统上交叉编译一个仅有 Radius 服务器功能的 hostapd 给 ASUS RT-AC68U 使用。

说明
• 交叉编译的排错需要有一定的 Linux 开发经验,而我对 Linux 开发可以说是一无所知。建议各位在遇到错误的时候尽量自行借助搜索引擎解决,本文对我来说其实只是一个记录作用而已哈~


二、软件环境

  • x86 主机操作系统:CentOS 7.6.1810(基于 Docker)
  • ASUS RT-AC68U 操作系统:Asuswrt-Merlin 384.8-2(内核版本为 2.6.36.4
  • hostapd 版本:2.7
  • hostapd 依赖的库:libnl-3.2.25openssl-1.0.2q

三、搭建交叉编译环境

3.1 安装各种必备软件

执行以下命令:

yum -y update \ &&
yum -y groupinstall "Development Tools" \ &&
yum -y install autoconf autogen automake bison bzip2 cmake compat-libmpc compat-libmpc.i686 cvs diffutils elfutils-libelf elfutils-libelf.i686 file flex gawk gcc gconf-editor gettext git git-core gitk glibc glibc-devel glibc-devel.i686 glibc.i686 glibc-static glibc-static.i686 gperf groff-base intltool kernel-devel libmpc libmpc.i686 libproxy-devel libstdc++ libstdc++-devel libstdc++-devel.i686 libstdc++.i686 libstdc++.so.6 libstdc++-static libstdc++-static.i686 libtool lzo-devel m4 make patch perl python sed subversion tar texinfo unzip uuid-devel wget zlib zlib.i686

3.2 安装交叉编译工具链

说明
• 该工具链是我基于 Asuswrt-Merlin 官方的 GitHub 项目整理而成。
• GitHub 项目链接:RMerl/asuswrt-merlin
• 由于 Broadcom 没有开源相关驱动,所以路由器的内核无法自行更新。如果使用较新版本的交叉编译工具链,编译之后的程序很可能不能在路由器上运行(运行时提示内核版本过低)。所以为了确保程序可以正常在路由器上运行,请使用该交叉编译工具链进行编译。

执行以下命令:

cd /opt && \
wget -ct0 https://cloud.zenandidi.com/s/YD4R7bxZVWvYetr/download -O brcm-arm-toolchain.tar.gz && \
tar -xf brcm-arm-toolchain.tar.gz && \
echo 'export PATH=$PATH:/opt/brcm-arm/bin' >> ~/.bash_profile && \
source ~/.bash_profile

3.3 创建临时目录并进入

说明
• 该目录用于暂时存放交叉编译所需的各种文件及源码,在编译完成后可自行删除。

执行以下命令:

mkdir /tmp/cross-comp && cd /tmp/cross-comp

四、下载 & 编译相关软件

4.1 libnl

执行以下命令:

wget https://www.infradead.org/~tgr/libnl/files/libnl-3.2.25.tar.gz && \
tar -xf libnl-3.2.25.tar.gz && \
cd libnl-3.2.25/ && \
./configure --prefix=/tmp/cross-comp --host=arm-linux --enable-shared=no && \
CC=arm-linux-gcc LD=arm-linux-ld make && \
make install && \
cd /tmp/cross-comp

如果没有提示错误,说明编译成功。

4.2 openssl

执行以下命令:

wget https://www.openssl.org/source/openssl-1.0.2q.tar.gz && \
tar -xf openssl-1.0.2q.tar.gz && \
cd openssl-1.0.2q && \
CC=arm-linux-gcc LD=arm-linux-ld ./Configure linux-armv4 no-shared --prefix=/tmp/cross-comp && \
CC=arm-linux-gcc LD=arm-linux-ld make && \
make install INSTALLTOP=/tmp/cross-comp OPENSSLDIR=/tmp/cross-comp/ssl && \
cd /tmp/cross-comp

如果没有提示错误,说明编译成功。

4.3 hostapd

说明
• 编译之后的 hostapd 支持 EAP-PEAP 以及 EAP-TLS。

执行以下命令:

wget https://w1.fi/releases/hostapd-2.7.tar.gz && \
tar -xf hostapd-2.7.tar.gz && \
cd hostapd-2.7/hostapd/ && \
cat << EOF > .config
CONFIG_DRIVER_NONE=y 
CONFIG_EAP=y 
CONFIG_EAP_MSCHAPV2=y 
CONFIG_EAP_PEAP=y 
CONFIG_EAP_TLS=y 
CONFIG_PKCS12=y 
CONFIG_RADIUS_SERVER=y 
CONFIG_IPV6=y 
EOF
CC=arm-linux-gcc LD=arm-linux-ld LIBS="-lssl -lcrypto -ldl" LDFLAGS="-static -L/tmp/cross-comp/lib" CFLAGS="-static -I/tmp/cross-comp/include" make && \
mkdir ~/hostapd_bin && \
mv hostapd hostapd_cli ~/hostapd_bin/

如果没有提示错误,说明编译成功。


五、检查文件 & 运行

hostapd 编译完成后,会在 ~/hostapd_bin/ 中生成 hostapdhostapd_cli 这两个二进制文件。

下面看一下这两个文件的信息。

执行以下命令:

file ~/hostapd_bin/*

运行结果:

/root/hostapd_bin/hostapd:     ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
/root/hostapd_bin/hostapd_cli: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped

可以看出,这两个文件是静态链接的 32 位 ARM 可执行文件。现在把这两个文件用 SCP 之类的文件传输协议上传到路由器的 JFFS 分区上就可以运行了!

这里再说一下运行命令吧。假如 hostapd 二进制文件是 /jffs/hostapd,配置文件是 /jffs/hostapd.conf,那么运行命令为:

/jffs/hostapd -dd /jffs/hostapd.conf -B

发表评论