by Devin Yang

建立于: 3年前 ( 更新: 3年前 )

AP提供了WPA2/EAP功能,但不会用吗?
本文介绍我如何透过docker的ubuntu:21.04 image,极速创建Radius伺服器,
与Wifi的WPA2/EAP等相关运用。

先来看看我的试用结果吧:


GitHub放於此处下载:
https://github.com/DevinY/radius

原则上请依README.md进行即可,这里我会解做更详细的操作说明:
在开始前,首先我们需要有docker。

一、下载下来后,进入radius目录中,请透过docker-compose的build功能来创建image。
在目录不改变的情况下,会生成radius_radius的image。
docker-compose build --no-cache

如果您不想使用此image的名称,docker-compose.yml内的radius服务记得指定您自己build的image名称。

二、生成自签证书,在radius目录中运行,会生成两个文件server.crt及server.key。
您是可以自行调整subj的内容的,我不想一天到晚改证书,这里设置了3650天,
另外在这里的密钥是没密码的,我想如果您需有有密码,容器启动后可到容器中去make,再拷出来用。
openssl req -x509 \
-subj '/C=TW/ST=Taiwan/L=Panchiao/CN=ccc.tc' \
-nodes -newkey rsa:2048 -keyout server.key -out server.crt -days 3650

如果到容器中make,您至少需改三个文件ca.cnf、client.cnf及server.cnf。
目录为/etc/freeradius/3.0/certs

三、取得radius设置档,radius注解很多修改及观看不容易,在这里我提了一只bash可以把设置档拷出来。
并且移除掉所有的注解,在后面的radius_radius为image的名称。
./getconfig.sh radius_radius

换句语说,如果您想了解所有的内容或注解说明,您可以进入容器上观看哦。
docker run --rm -ti radius_radius bash

主要的设置档放那里,可以透过cat查看bash内容,应该不难发现。
cat getconfig.sh

另外,在这个repo中,我也方了一个diff.html,可透用浏览器开启,
可以看到我对原始设置档做了那些变更。:)

四、启动容器
docker-compose up -d

五、我们可以透过ps来查看是否有正确启动。
docker-compose ps
Name                   Command             State                       Ports
------------------------------------------------------------------------------------------------------
radius_db_1       docker-entrypoint.sh mysqld   Up      0.0.0.0:33060->3306/tcp
radius_radius_1   /usr/sbin/freeradius -X       Up      0.0.0.0:1812->1812/udp, 0.0.0.0:1813->1813/udp

六、确认db是up的情况,就能来创建DB了。
-h db为数据库容器的服务名称,有些环境下需要,有些环境下不需要,必免不必要的问题,就打上吧。
docker-compose exec db mysql -h db -e "create database radius"
docker-compose exec db mysql -h db -e "grant all on radius.* to 'radius'@'%' identified by 'hlOTg2ZmNk'"

第一行命令,创建了radius数据库,第二行则是授权radius使用者,有完整的权限可访问radius数据库。
数据库的密码,请自行调整。

七、进入radius容器内,创建schema
完成上方的数据库创建,我们就能来创建radius伺服器后端数据库mysql的schema啦,运行下方进入
radius的容器服务。
docker-compose exec radius bash

八、可以先来测看看,连db服务是否有问题。
mysql -uradius -phlOTg2ZmNk -h db

密码与参数可以不需空格,所以上方命令没打错喔,「hlOTg2ZmNk」为密码,正常进入后,
我们能用control+d跳离。


粘贴下方命令,就能创建所有需要的table到radius数据库罗,如果您在第六步中使用了自定义的密码
,记得要调整下方命令,密码的部份。
mysql -uradius -phlOTg2ZmNk -h db radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql

九、创建帐号
回到host端,我这个repo,我提供一个简单的命令,来生成radius的帐号及密码。
第一个参数是帐号及第二个参数是密码。
./adduser.php devin test

radius提供了相当多的attribute类型,如下表:
       Header	    Attribute		Description
------	    ---------		-----------
{clear}	    Cleartext-Password	Clear-text passwords
{cleartext}  Cleartext-Password	Clear-text passwords
{crypt}	    Crypt-Password	Unix-style "crypt"ed passwords
{md5}	    MD5-Password	MD5 hashed passwords
{base64_md5} MD5-Password	MD5 hashed passwords
{smd5}	    SMD5-Password	MD5 hashed passwords, with a salt
{sha}	    SHA-Password	SHA1 hashed passwords
SHA1-Password	SHA1 hashed passwords
{ssha}	    SSHA-Password	SHA1 hashed passwords, with a salt
{sha2}	    SHA2-Password	SHA2 hashed passwords
{sha224}     SHA2-Password	SHA2 hashed passwords
{sha256}     SHA2-Password	SHA2 hashed passwords
{sha384}     SHA2-Password	SHA2 hashed passwords
{sha512}     SHA2-Password	SHA2 hashed passwords
{ssha224}    SSHA2-224-Password	SHA2 hashed passwords, with a salt
{ssha256}    SSHA2-256-Password	SHA2 hashed passwords, with a salt
{ssha384}    SSHA2-384-Password	SHA2 hashed passwords, with a salt
{ssha512}    SSHA2-512-Password	SHA2 hashed passwords, with a salt
{nt}	    NT-Password 	Windows NT hashed passwords
{nthash}     NT-Password 	Windows NT hashed passwords
{md4}	    NT-Password 	Windows NT hashed passwords
{x-nthash}   NT-Password 	Windows NT hashed passwords
{ns-mta-md5} NS-MTA-MD5-Password Netscape MTA MD5 hashed passwords
{x- orcllmv} LM-Password 	Windows LANMAN hashed passwords
{X- orclntv} NT-Password 	Windows NT hashed passwords

我选择后端采用mysql就是因为这我觉的要更新比较方便,至少我自己觉的会比ldap来的容易..:p
当然在Radius的环境下,后端数据库是有多种平台可以选择的。

十、修改clients.conf
您可以变更您想用的secret。
由於在容器中ip是随机,所以我用*。如果您想使用一个特定IP,需视您运行的环境而定。
如果您对docker有一定的了解,我想绝对不难才是,当您的host在Linux环境下,
可透过network_mode: host进行,当然您是需要自行调整docker-compose.yml,
如果您不了解相关,那别浪费时间了,让他是ipaddr = *号就没错了。
client wifi {
ipaddr = *
secret = testing123
}

十一、修改sql档
dialect及driver删掉,粘贴下面五行。
原内容
dialect = "sqlite"
driver = "rlm_sql_null"

变更为(数据库密码於第六步若有变更,请自行调整)
dialect = "mysql"
driver = "rlm_sql_${dialect}"
server = "db"
port = 3306
login = "radius"
password = "hlOTg2ZmNk"

十二、重启测试罗
重启容器使用参数--remove-orphans在启动时看起来较没问题。
有时会启动失败,不太清楚为何。
docker-compose down --remove-orphans
docker-compose up -d

十三、检视服务功能
我们能用下方命令查看状态,看到两个Up,我想大概没啥问题了。
docker-compose ps
Name                   Command             State                       Ports
------------------------------------------------------------------------------------------------------
radius_db_1       docker-entrypoint.sh mysqld   Up      0.0.0.0:33060->3306/tcp
radius_radius_1   /usr/sbin/freeradius -X       Up      0.0.0.0:1812->1812/udp, 0.0.0.0:1813->1813/udp

如果radius,没启动成功,可以重新运行第十二部看看,或是先看一下log,命令如下:
docker-compose logs -f radius

例如,我碰过在我家的Synology NAS上安装,文件权限太开放启动失败,这时可以透过
「chmod 750 档名」调整,特别是eap、clients.conf、default等文件。

最后,我们可以透过上方的logs模式,观察Client的连线结果是否正常,在AP的设置如下,示意图:


在MacOS及iOS环境会需要有Apple Configurator2的描速档才能正常连线。
大至内容如下:


额外测试EAP-TTLS功能
一、进入radius容器内
docker-compose exec radius bash
二、安装需要的文件
apt install -y build-essential pkg-config libnl-3-dev libssl-dev libnl-genl-3-dev
三、取得测试的souce,并依次贴下命令
#下载souce
wget https://w1.fi/releases/wpa_supplicant-2.7.tar.gz

#解压缩并进入目录中
tar zxvf wpa_supplicant-2.7.tar.gz&&cd wpa_supplicant-2.7/wpa_supplicant

#创建并变更.config启动CONFIG_EAPOL_TEST=y
sed 's/#CONFIG_EAPOL_TEST=y/CONFIG_EAPOL_TEST=y/g' defconfig > .config

#编译及安装eapol_test
make eapol_test;cp eapol_test /usr/local/bin

四、创建test.conf测试档。内容请使用自己创建的帐号及密码。
network={
     ssid="SSID_OF_THE_WIFI_NETWORK"
     key_mgmt=WPA-EAP
     eap=TTLS
     identity="devin"
     anonymous_identity="anonymous"
     password="test"
     phase2="auth=PAP"
     eapol_flags=3
}
五、运行命令测试
eapol_test -c test.conf -a 127.0.0.1 -p 1812 -s testing123
运行结果,看到SUCCESS,代表测试成功:)


 

Tags: linux docker wifi

Devin Yang

文章内容无法一一说明,如果您有什么不了解处,欢印提问哦:)

No Comment

Post your comment

需要登入才可留言!

类似文章


docker

如何更新或重建D-Laravel的FPM Image

有时,docker的Image会进行一些修正或添加更多的外挂,我们要如何来更新电脑中的image呢? 非常简单,使用docker pull [使用的image即可],如果想创建自己的image也是可行的...

linux, python, colab

如何从我们的Server透过ssh连线到colab?

介绍我写的一支bash,用来透过ssh连线到colab vm内。 一行命令,搞定colab OpenSSH Server。

docker

Docker image的封存及取回

如何封存docker的image成为tar档,并且载回docker image。 我们可以用docker save及docker load进行。