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 }
相關連接,