Newifi OpenWrt 下 EAP-PEAP,EAP-TLS 企業級無線認證及 FreeRadius3

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 重啓後生效。



個人最終的配置文件,參考一下。 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
}

相關連接,

轉載註明來源: 本文連接 來自osnosn的博客.

相關文章
相關標籤/搜索