Newifi OpenWrt 下 EAP-PEAP,EAP-TLS 企业级无线认证及 FreeRadius3
转载注明来源: 本文连接 来自osnosn的博客,写于 2019-07-15.php
副标题:家用路由器,配置EAP-PEAP,EAP-TLS企业认证的无线接入服务。html
家里的WiFi通常是用WPA2认证,密码只有一个,泄漏了,家里全部设备都要换密码。 再加上如今密码共享软件的流行,如“wifi万能钥匙”,WPA2的密码也不安全了。 本文介绍如何搭建一个EAP的企业认证WiFi。支持N个帐号(N>=1),能够作到一人一个帐号。 一个帐号泄漏,改掉这个帐号的密码,或者删除这个帐号就行。 若是你不嫌麻烦,还能够发放一人一个证书认证上网。证书自己有过时时间的,还能吊销。 过时证书或被吊销证书,是不能登录WiFi的。node
若是你有一台Linux机器,能够看个人另外一篇: CentOS7用hostapd作radius服务器为WiFi提供802.1X企业认证linux
本文用的是Newifi-mini (Y1) 我使用的版本为: OpenWrt-18.06.4 个人刷机固件为 http://downloads.openwrt.org/releases/18.06.4/targets/ramips/mt7620/openwrt-18.06.4-ramips-mt7620-y1-squashfs-sysupgrade.bingit
个人另外一台Newifi D2, 也成功装上freeradius3,配好了wifi的企业认证。
固件用 http://downloads.openwrt.org/releases/18.06.4/targets/ramips/mt7621/openwrt-18.06.4-ramips-mt7621-d-team_newifi-d2-squashfs-sysupgrade.bingithub只要是基于OpenWRT,能用opkg安装额外包,剩余空间>3MB,应该均可以把freeradius3装好,并配置好。web
如下的操做都是ssh到路由器上,在终端中安装freeradius3,和修改freeradius3的配置文件。算法
## ssh到路由器上,执行指令 opkg update (获取最新的软件包列表) opkg remove wpad-mini opkg install wpad (让openwrt的wifi支持 WPA2-EAP,WPA2 802.1x认证)
路由器空间使用状况: overlay used:10%,free 10.9Msql
## ssh到路由器上,执行指令,安装freeradius3的支持包 opkg install freeradius3 freeradius3-mod-eap-peap freeradius3-mod-always freeradius3-mod-realm freeradius3-mod-expr freeradius3-mod-files freeradius3-mod-eap-mschapv2
路由器空间使用状况: overlay used:27%,free:8.8Mcentos
包的说明: freeradius3-mod-eap-peap (peap认证) freeradius3-mod-always (reject) freeradius3-mod-realm (suffix) freeradius3-mod-expr (表达式计算) freeradius3-mod-files (文件认证,帐号存放) freeradius3-mod-eap-mschapv2 (peap须要使用)
修改 /etc/freeradius3/mods-config/files/authorize
添加一行或多行(用户和密码),格式以下:
bob Cleartext-Password := "hello"
密码最好8个以上字符,由于密码过短,旧的安卓拒绝链接。好比安卓5。
修改 /etc/freeradius3/mods-enabled/eap
- default_eap_type = md5 + default_eap_type = peap 注释掉有关 md5 {..} leap {..} gtc {...} tls {..} ttls{...} 的行 。 - dh_file = ${certdir}/dh + #dh_file = ${certdir}/dh - #check_crl = yes + check_crl = yes
建立测试证书,正式使用能够参考这篇文章:"用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书)",建立漂亮的证书。
## ssh 终端中, 执行, 安装openssl命令行工具 opkg install openssl-util
路由器空间使用状况: overlay used:29%,free:8.6M
## ssh 终端中, 执行,若是没有对应目录,则本身建立目录。 cd /etc/freeradius3/certs/ ## 建立CA证书 openssl ecparam -name prime256v1 -out ec_param openssl req -nodes -newkey ec:ec_param -days 3650 -x509 -sha256 -keyout ecca.key -out ecca.crt ## 建立server证书 ## server证书必定要用RSA,不然链接radius是老是握手失败,致使认证失败。 ## 猜想: server证书如用ECC,可能要启用dh_file配置。没测试,不知道是否成功。 openssl req -nodes -newkey rsa:1024 -days 3650 -sha256 -keyout serverec.key -out serverec.csr ## commonName: 不能留空 mkdir ./demoCA/ mkdir ./demoCA/newcerts touch ./demoCA/index.txt echo 01 > ./demoCA/serial openssl ca -extensions v3_ca -days 3650 -out serverec.crt -in serverec.csr -cert ecca.crt -keyfile ecca.key ## 查看证书:openssl x509 -in serverec.crt -noout -text ## create crl.pem openssl ca -gencrl -keyfile ecca.key -cert ecca.cert -out crl.pem -config openssl.cnf cat serverec.key serverec.crt > server.pem cat ecca.crt crl.pem > ca.pem ## 若是仅配置EAP-PEAP,则不须要 "crl.pem",也不须要 "check_crl = yes" 。仅需 "cat ecca.crt > ca.pem" 便可。
执行radiusd -X
根据出错的最后三行(红字)显示的文件名和行号,注释掉。
<a target="_blank" href="https://img2018.cnblogs.com/blog/1641467/201907/1641467-20190715120201857-1466298874.png"><img src="https://img2018.cnblogs.com/blog/1641467/201907/1641467-20190715120201857-1466298874.png" style="width:500px;border:1px solid #000" /> </a>
根据radiusd -X
的出错信息,最终在如下两个文件中,注释掉许多行,如下给出我最终注释掉的东西。
修改 /etc/freeradius3/sites-enabled/default 注释掉如下行 (在 authenticate{..} ) Auth-Type PAP { pap } Auth-Type CHAP { chap } digest (在 authorize{..} ) preprocess chap digest expiration logintime pap (在 preacct {...} ) preprocess (在 accounting {...} ) detail unix exec attr_filter.accounting_response (在 post-auth {...} ) exec (在 post-auth {Post-Auth-Type REJECT{...}..} ) attr_filter.access_reject
修改 /etc/freeradius3/sites-enabled/inner-tunnel 注释掉如下行 (在 authenticate{..} ) Auth-Type PAP { pap } Auth-Type CHAP { chap } (在 authorize{..} ) chap expiration logintime pap (在 session{..} ) radutmp (在 post-auth {Post-Auth-Type REJECT{...}..} ) attr_filter.access_reject
路由器空间使用状况: overlay used:29%,free:8.5M
修改 /etc/freeradius3/clients.conf
修改 client localhost {...} 中,secret = testing123, 或者添加一个网段。 client localnet { ipaddr = 192.168.0.0/16 secret = testing123 (radius认证密钥) }
测试peap-mschapv2认证:
参考:freeradius测试
## ssh终端中,执行,安装命令行测试工具 opkg install eapol-test
路由器空间使用状况: overlay used:32%,free:8.2M
写文件 test-peap
network={ ssid="example" key_mgmt=WPA-EAP eap=PEAP identity="bob" anonymous_identity="anonymous" password="hello" phase2="autheap=MSCHAPV2" # 打开下面这行,在openwrt中测试不能经过。但在centos中测试就OK。 # 怀疑openwrt中的eapol_test是个简版。也许安装eapol-test-openssl能够,我没试。 # ca_cert="/etc/freeradius3/certs/ca.pem" }
## ssh终端(openwrt)中,执行 eapol_test -c test-peap -s testing123 ## 或 eapol_test -c test-peap -a127.0.0.1 -s testing123
其中 testing123 为 /etc/freeradius3/clients.conf 中的radius认证密钥。 看到最后一行为 SUCCESS 就测试成功。
退出ssh终端。freeradius3安装,配置完成。
配置WIFI,启动radiusd服务
在 openwrt 的 luci web 管理页面,激活并启动 radiusd 服务。
<a target="_blank" href="https://img2018.cnblogs.com/blog/1641467/201907/1641467-20190723193305505-102726506.png"><img src="https://img2018.cnblogs.com/blog/1641467/201907/1641467-20190723193305505-102726506.png" style="width:300px;border:1px solid #000" /></a>
见到绿色的 "Enabled" 就是已经启动了。
或者在 "/etc/rc.d" 目录中见到 "S50radiusd" 的链接文件,就是已经启动了。
<a target="_blank" href="https://img2018.cnblogs.com/blog/1641467/201907/1641467-20190723193337156-1579764994.png"><img src="https://img2018.cnblogs.com/blog/1641467/201907/1641467-20190723193337156-1579764994.png" style="width:300px;border:1px solid #000" /></a>
配置2.4G和5G的WiFi,在 "无线安全" 设置中,
"加密" = "WPA2-EAP","算法" = "AES"。
设置 "Radius认证服务器" = "127.0.0.1","Radius认证端口" = "1812",
"Radius认证密钥" = "testing123"。
<a target="_blank" href="https://img2018.cnblogs.com/blog/1641467/201907/1641467-20190723193326198-1777805820.png"><img src="https://img2018.cnblogs.com/blog/1641467/201907/1641467-20190723193326198-1777805820.png" style="width:300px;border:1px solid #000" /> </a>
提供给"手机","电脑",等支持企业认证的设备链接使用。 /etc/freeradius3/mods-config/files/authorize文件中的帐号多设置几个。 家里人用一个,或者用证书登录。其余人,用另外的帐号,万一泄露,修改密码不影响家人设备联网。
另外在2.4G WiFi中增长一个SSID,"加密" = "WPA2-PSK","算法" = "AES",并设置 "密钥"。 家里总有几个非智能设备不支持企业认证。这些设备通常只支持2.4G,不支持5G。 好比"远程遥控插座","扫地机器人",……
有大神说碰到以下状况,我没碰到。但也写在这留做参考。 我没修改这行,测试就经过了。 若是失败缘由是 “The users session was previously rejected” , 并且往上翻日志翻来覆去就是找不出缘由,请尝试: 在 /etc/freeradius3/sites-available/inner-tunnel 中,
MS-CHAP
改成MSCHAP
,第 220 行附近,有一段配置项:- Auth-Type MS-CHAP { mschap } + Auth-Type MSCHAP { mschap }
配置 EAP-TLS 支持
由于在openwrt中用eapol_test使用证书测试,没法经过。也许安装eapol-test-openssl能够,我没试。 我换用CentOS中的eapol_test 来测试。
## ssh终端中,执行 opkg update opkg install freeradius3-mod-eap-tls
修改 /etc/freeradius3/mods-enabled/eap
# 对以前注释掉的 tls {...} 打开注释。 - #tls { - # tls = tls-common - #} + tls { + tls = tls-common + } - #check_crl = yes + check_crl = yes
中止服务 /etc/init.d/radiusd stop
测试 radiusd -X
没有错误就按 CTRL-C
终止 启动服务 /etc/init.d/radiusd start
退出ssh终端,配置完成。
制做用户测试证书,正式使用能够参考这篇文章:"用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书)",建立漂亮的证书。
## ssh登录路由器, 执行 cd /etc/freeradius3/certs/ #建立用户证书 openssl req -nodes -newkey ec:ec_param -days 3650 -sha256 -keyout userec.key -out userec.csr ## commonName: 不能留空 openssl ca -extensions v3_ca -days 3650 -out userec.crt -in userec.csr -cert ecca.crt -keyfile ecca.key
路由器空间使用状况: overlay used:32%,free:8.2M <a target="_blank" href="https://img2018.cnblogs.com/blog/1641467/201907/1641467-20190715120216818-261902967.png"><img src="https://img2018.cnblogs.com/blog/1641467/201907/1641467-20190715120216818-261902967.png" style="width:500px;border:1px solid #000" />
</a>
正式使用还要生成crl.pem,
cat ecca.crt crl.pem > ca.pem
并打开 /etc/freeradius3/mods-enabled/eap 文件中 check_crl = yes 的注释
- #check_crl = yes + check_crl = yes
最终使用时,发现win10使用 EAP-TLS 证书认证会失败。 发现 radiusd 的错误信息显示,用户名中包含空格而拒绝认证。 发现 win10 强制使用用户证书的 "CN=" 的内容做为用户名。 两个办法解决:
- 制做用户证书时,
CN
值中不要包含空格。- 或安装
freeradius3-mod-attr-filter
包,在验证前过滤掉用户名中的空格。
eapol_test 测试
参考:freeradius测试
在CentOS中,
写文件 test-tls
network={ eap=TLS eapol_flags=0 key_mgmt=IEEE8021X identity="test" password="test123" ca_cert="/etc/freeradius3/certs/ca.pem" client_cert="/etc/freeradius3/certs/userec.crt" private_key="/etc/freeradius3/certs/userec.key" #private_key_passwd="whatever" }
在centos中执行 eapol_test -c test-tls -a<radius/路由的IP> -s 'testing123'
去CentOS,Debian 或者 Ubuntu 之类的Linux 中 用 eapol_test 命令测试。通常是OK的。 OpenWRT 中的 eapol_test 是怎么测试都通不过。大概是由于简化的太多了。也许安装eapol-test-openssl能够,我没试。
启用 mt7621的硬件nat (Newifi D1 或 D2)
newifi mini 用的是mt7620,也有硬件NAT,但不知道openwrt是否支持。
登录路由器的网页。 Network -> Firewall -> General Settings -> Software flow offloading(勾上) -> Hardware flow offloading(勾上) -> Save&Apply(提交)
<a target="_blank" href="https://img2018.cnblogs.com/blog/1641467/201909/1641467-20190927120829389-1173648656.png"><img src="https://img2018.cnblogs.com/blog/1641467/201909/1641467-20190927120829389-1173648656.png" style="width:100px;border:1px solid #000" /></a> <a target="_blank" href="https://img2018.cnblogs.com/blog/1641467/201909/1641467-20190927120846537-1099044749.png"><img src="https://img2018.cnblogs.com/blog/1641467/201909/1641467-20190927120846537-1099044749.png" style="width:100px;border:1px solid #000" /></a>
启用 TCP-BBR
您本身选择是否开启BBR,也能够不开启。
opkg install kmod-tcp-bbr
重启后生效。
- freeradius3的web luci配置页面,没搞。"能够参考这里"。
- 另有一篇讲openwrt上freeradius2的EAP-TLS配置,参考价值不高。他把全部radius包都装上了。
- 参考:FreeRadius EAP-TLS configuration
个人最终的配置文件,参考一下。 cat /etc/freeradius3/sites-enabled/default |sed '/^$/d'|sed '/[\t]*#/d'
server default { listen { type = auth ipaddr = * port = 0 limit { max_connections = 16 lifetime = 0 idle_timeout = 30 } } listen { ipaddr = * port = 0 type = acct limit { } } listen { type = auth port = 0 limit { max_connections = 16 lifetime = 0 idle_timeout = 30 } } listen { ipv6addr = :: port = 0 type = acct limit { } } authorize { filter_username mschap suffix eap { ok = return } files -sql -ldap } authenticate { Auth-Type MS-CHAP { mschap } eap } preacct { acct_unique suffix files } accounting { -sql } session { } post-auth { update { &reply: += &session-state: } -sql remove_reply_message_if_eap Post-Auth-Type REJECT { -sql eap remove_reply_message_if_eap } } pre-proxy { } post-proxy { eap } }
cat /etc/freeradius3/sites-enabled/inner-tunnel |sed '/^$/d'|sed '/[\t]*#/d'
server inner-tunnel { listen { ipaddr = 127.0.0.1 port = 18120 type = auth } authorize { filter_username mschap suffix update control { &Proxy-To-Realm := LOCAL } eap { ok = return } files -sql -ldap } authenticate { Auth-Type MS-CHAP { mschap } eap } session { } post-auth { -sql Post-Auth-Type REJECT { -sql update outer.session-state { &Module-Failure-Message := &request:Module-Failure-Message } } } pre-proxy { } post-proxy { eap }
cat /etc/freeradius3/mods-enabled/eap |sed '/^$/d'|sed '/[\t]*#/d'
eap { default_eap_type = peap timer_expire = 60 ignore_unknown_eap_types = no cisco_accounting_username_bug = no max_sessions = ${max_requests} tls-config tls-common { private_key_password = whatever private_key_file = ${certdir}/server.pem certificate_file = ${certdir}/server.pem ca_file = ${cadir}/ca.pem ca_path = ${cadir} cipher_list = "DEFAULT" ecdh_curve = "prime256v1" cache { enable = yes max_entries = 255 } verify { } ocsp { enable = no override_cert_url = yes url = "http://127.0.0.1/ocsp/" } } tls { tls = tls-common } peap { tls = tls-common default_eap_type = mschapv2 copy_request_to_tunnel = no use_tunneled_reply = no virtual_server = "inner-tunnel" } mschapv2 { } }
cat /etc/freeradius3/mods-config/files/authorize |sed '/^$/d'|sed '/[\t]*#/d'
bob Cleartext-Password := "hello" test Cleartext-Password := "test123" DEFAULT Framed-Protocol == PPP Framed-Protocol = PPP, Framed-Compression = Van-Jacobson-TCP-IP DEFAULT Hint == "CSLIP" Framed-Protocol = SLIP, Framed-Compression = Van-Jacobson-TCP-IP DEFAULT Hint == "SLIP" Framed-Protocol = SLIP
cat /etc/freeradius3/clients.conf |sed '/^$/d'|sed '/[\t]*#/d'
client localhost { ipaddr = 127.0.0.1 proto = * secret = testing123 require_message_authenticator = no limit { max_connections = 16 lifetime = 0 idle_timeout = 30 } } client localhost_ipv6 { ipv6addr = ::1 secret = testing123 } client 192.168.1.0/24 { ipaddr = 192.168.1.0/24 secret = testing123 }
相关连接,