เชธเชฌเซเชธเซเชเซเชฐเชพเชเชฌเชฐเซเชธเชจเซ IP เชเชกเซเชฐเซเชธ เชเชพเชฐเซ เชเชฐเชตเชพเชจเซ เชตเซเชฏเชตเชธเซเชฅเชพ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชพเชฐเซเชฏ เชชเชนเซเชเชเซเชฏเซเช. เชธเชฎเชธเซเชฏเชพเชจเซ เชถเชฐเชคเซ:
- เช เชฎเซ เชคเชฎเชจเซ เช เชงเชฟเชเซเชคเชคเชพ เชฎเชพเชเซ เช เชฒเช เชธเชฐเซเชตเชฐ เชเชชเซเชถเซเช เชจเชนเซเช - เชคเชฎเซ เชเชฐเซ เชถเชเชถเซ ๐
- เชธเชฌเซเชธเซเชเซเชฐเชพเชเชฌเชฐเซเช DHCP เชฆเซเชตเชพเชฐเชพ เชจเซเชเชตเชฐเซเช เชธเซเชเชฟเชเชเซเชธ เชชเซเชฐเชพเชชเซเชค เชเชฐเชตเซ เชเชตเชถเซเชฏเช เชเซ
- เชจเซเชเชตเชฐเซเช เชตเชฟเชเชพเชคเซเชฏ เชเซ. เชเชฎเชพเช PON เชธเชพเชงเชจเซ เช เชจเซ เชฐเซเชชเชฐเซเชเชพเชเชเชฟเชค เชตเชฟเชเชฒเซเชช 82 เชธเชพเชฅเซ เชจเชฟเชฏเชฎเชฟเชค เชธเซเชตเซเชเซ เช เชจเซ เชนเซเชเชธเซเชชเซเชเซเชธ เชธเชพเชฅเซ WiFi เชฌเซเชเชจเซ เชธเชฎเชพเชตเซเชถ เชฅเชพเชฏ เชเซ.
- เชเซ เชกเซเชเชพ เชเชเชชเซ เชเชพเชฐเซ เชเชฐเชตเชพ เชฎเชพเชเซเชจเซ เชเซเชเชชเชฃ เชถเชฐเชคเซ เชนเซเช เชณ เชเชตเชคเซ เชจเชฅเซ, เชคเซ เชคเชฎเชพเชฐเซ "เชเซเชธเซเช" เชจเซเชเชตเชฐเซเชเชฎเชพเชเชฅเซ เชเชเชชเซ เชเชพเชฐเซ เชเชฐเชตเซ เชเชตเชถเซเชฏเช เชเซ.
เชธเชพเชฐเซ เชฌเชพเชเซเช: เชซเซเชฐเซเชฌเซเชเชธเชกเซ เชชเชฐ เชนเชเซ เชชเชฃ เชเช เชธเชฐเซเชตเชฐ เชเซ เชเซ "เชเชพเชฐเซเชฏ" เชเชฐเซ เชถเชเซ เชเซ, เชชเชฐเชเชคเซ เชคเซ "เชฆเซเชฐ" เชเซ;), "เช เชจเซเชเชตเชฐเซเช เชชเชฐ" เชจเชฅเซ.
เชฎเชฟเชเซเชฐเซเชเชฟเช เชจเชพเชฎเชจเซเช เชเช เช
เชฆเซเชญเซเชค เชเชชเชเชฐเชฃ เชชเชฃ เชเซ. เชธเชพเชฎเชพเชจเซเชฏ เชจเซเชเชตเชฐเซเช เชกเชพเชฏเชพเชเซเชฐเชพเชฎ เชเชเชเช เชเชจเชพ เชเซเชตเซเช เชเซ:
เชฅเซเชกเซ เชตเชฟเชเชพเชฐ เชเชฐเซเชฏเชพ เชชเชเซ, เชธเชฌเซเชธเซเชเซเชฐเชพเชเชฌเชฐเซเชธเชจเซ เชจเซเชเชตเชฐเซเช เชธเซเชเชฟเชเชเซเชธ เชเชชเชตเชพ เชฎเชพเชเซ เชซเซเชฐเซเชฐเซเชกเชฟเชฏเชธเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช. เชธเซเชฆเซเชงเชพเชเชคเชฟเช เชฐเซเชคเซ, เชฏเซเชเชจเชพ เชธเชพเชฎเชพเชจเซเชฏ เชเซ: เช
เชฎเซ เชฎเชพเชเชเซเชฐเซเชเชฟเช เชชเชฐ DHCP เชธเชฐเซเชตเชฐเชจเซ เชธเชเซเชทเชฎ เชเชฐเซเช เชเซเช, เช
เชจเซ เชคเซเชจเชพ เชชเชฐ เชคเซเชฐเชฟเชเซเชฏเชพ เชเซเชฒเชพเชฏเชเช. เช
เชฎเซ DHCP เชธเชฐเซเชตเชฐ -> เชฐเซเชกเชฟเชฏเชธ เชเซเชฒเชพเชฏเชเช -> เชฐเซเชกเชฟเชฏเชธ เชธเชฐเซเชตเชฐ เชเชจเซเชเซเชถเชจเชจเซ เชเซเช เชตเซเช เชเซเช.
เชคเซ เชฎเซเชถเซเชเซเชฒ เชจเชฅเซ เชฒเชพเชเชคเซเช. เชชเชฃ! เชถเซเชคเชพเชจ เชตเชฟเชเชคเซเชฎเชพเช เชเซ. เชเซเชฎ เชเซ:
- เช เชธเซเชเซเชฎเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ PON OLT เชจเซ เช เชงเชฟเชเซเชค เชเชฐเชคเซ เชตเชเชคเซ, เชซเซเชฐเซเชฐเซเชกเชฟเชฏเชธเชจเซ เชนเซเชกเชเชจเซเชกเชจเชพ MAC เชเชกเซเชฐเซเชธเชจเซ เชธเชฎเชพเชจ เชฏเซเชเชฐ-เชจเชพเชฎ, MAC PON Onu เชจเซ เชฌเชฐเชพเชฌเชฐ Agent-Circuit-Id เช เชจเซ เชเชพเชฒเซ เชชเชพเชธเชตเชฐเซเชก เชธเชพเชฅเซ เชตเชฟเชจเชเชคเซ เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
- เชตเชฟเชเชฒเซเชช 82 เชธเชพเชฅเซ เชธเซเชตเชฟเชเชฎเชพเชเชฅเซ เช เชงเชฟเชเซเชค เชเชฐเชคเซ เชตเชเชคเซ, เชซเซเชฐเซเชฐเซเชกเชฟเชฏเชธเชจเซ เชธเชฌเชธเซเชเซเชฐเชพเชเชฌเชฐเชจเชพ เชเชชเชเชฐเชฃเชจเชพ MAC เชธเชฎเชพเชจ เชเชพเชฒเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ-เชจเชพเชฎ เชธเชพเชฅเซเชจเซ เชตเชฟเชจเชเชคเซ เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ เชเซ เช เชจเซ เช เชจเซเชเซเชฐเชฎเซ เชเชเชจเซเช-เชธเชฐเซเชเชฟเช-เชเชเชกเซ เช เชจเซ เชเชเชจเซเช-เชฐเชฟเชฎเซเช-เชเชเชกเซ เชงเชฐเชพเชตเชคเชพ เชตเชงเชพเชฐเชพเชจเชพ เชฒเชเซเชทเชฃเซเชฅเซ เชญเชฐเซเชฒเซ เชนเซเชฏ เชเซ. เชฐเชฟเชฒเซ เชธเซเชตเซเช เช เชจเซ เชชเซเชฐเซเช เชเซ เชเซเชจเซ เชธเชพเชฅเซ เชธเชฌเซเชธเซเชเซเชฐเชพเชเชฌเชฐ เชเซเชกเชพเชฏเซเชฒ เชเซ.
- WiFI เชชเซเชเชจเซเช เชงเชฐเชพเชตเชคเชพ เชเซเชเชฒเชพเช เชธเชฌเซเชธเซเชเซเชฐเชพเชเชฌเชฐเซเชธ PAP-CHAP เชชเซเชฐเซเชเซเชเซเชฒ เชฆเซเชตเชพเชฐเชพ เช เชงเชฟเชเซเชค เชเซ
- WIFI เชชเซเชเชจเซเชเชจเชพ เชเซเชเชฒเชพเช เชธเชฌเซเชธเซเชเซเชฐเชพเชเชฌเชฐเซเชธ เชชเชพเชธเชตเชฐเซเชก เชตเชฟเชจเชพ, WIFI เชชเซเชเชจเซเชเชจเชพ MAC เชเชกเซเชฐเซเชธเชจเชพ เชธเชฎเชพเชจ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ-เชจเชพเชฎ เชธเชพเชฅเซ เช เชงเชฟเชเซเชค เชเซ.
เชเชคเชฟเชนเชพเชธเชฟเช เชชเซเชทเซเช เชญเซเชฎเชฟ: DHCP เชฎเชพเช "เชตเชฟเชเชฒเซเชช 82" เชถเซเช เชเซ
เช DHCP เชชเซเชฐเซเชเซเชเซเชฒ เชฎเชพเชเซ เชตเชงเชพเชฐเชพเชจเชพ เชตเชฟเชเชฒเซเชชเซ เชเซ เชเซ เชคเชฎเชจเซ เชตเชงเชพเชฐเชพเชจเซ เชฎเชพเชนเชฟเชคเซ เชเซเชฐเชพเชจเซเชธเชซเชฐ เชเชฐเชตเชพเชจเซ เชชเชฐเชตเชพเชจเชเซ เชเชชเซ เชเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ เชเชเชจเซเช-เชธเชฐเซเชเชฟเช-เชเชเชกเซ เช เชจเซ เชเชเชจเซเช-เชฐเชฟเชฎเซเช-เชเชเชกเซ เชซเซเชฒเซเชกเซเชธเชฎเชพเช. เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชฐเชฟเชฒเซ เชธเซเชตเซเชเชจเซเช MAC เชธเชฐเชจเชพเชฎเซเช เชชเซเชฐเชธเชพเชฐเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชตเชชเชฐเชพเชฏ เชเซ เช เชจเซ เชชเซเชฐเซเช เชเซ เชเซเชจเซ เชธเชพเชฅเซ เชธเชฌเซเชธเซเชเซเชฐเชพเชเชฌเชฐ เชเซเชกเชพเชฏเซเชฒ เชเซ. PON เชธเชพเชงเชจเซ เช เชฅเชตเชพ WIFI เชฌเซเช เชธเซเชเซเชถเชจเชจเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เชเชเชจเซเช-เชธเชฐเซเชเชฟเช-เชเชเชกเซ เชซเซเชฒเซเชกเชฎเชพเช เชเชชเชฏเซเชเซ เชฎเชพเชนเชฟเชคเซ เชนเซเชคเซ เชจเชฅเซ (เชคเซเชฏเชพเช เชเซเช เชธเชฌเซเชธเซเชเซเชฐเชพเชเชฌเชฐ เชชเซเชฐเซเช เชจเชฅเซ). เช เชเชฟเชธเซเชธเชพเชฎเชพเช DHCP เชเชชเชฐเซเชถเชจเชจเซ เชธเชพเชฎเชพเชจเซเชฏ เชฏเซเชเชจเชพ เชจเซเชเซ เชฎเซเชเชฌ เชเซ:
เชธเซเชเซเชช เชฌเชพเชฏ เชธเซเชเซเชช เช เชธเซเชเซเชฎ เช เชฐเซเชคเซ เชเชพเชฎ เชเชฐเซ เชเซ:
- เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชธเชพเชงเชจเซ เชจเซเชเชตเชฐเซเช เชธเซเชเชฟเชเชเซเชธ เชฎเซเชณเชตเชตเชพ เชฎเชพเชเซ DHCP เชฌเซเชฐเซเชกเชเชพเชธเซเช เชตเชฟเชจเชเชคเซ เชเชฐเซ เชเซ
- เชเชชเชเชฐเชฃ (เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเช เชธเซเชตเซเช, เชตเชพเชเชซเชพเช เช เชฅเชตเชพ PON เชฌเซเช เชธเซเชเซเชถเชจ) เชเซ เชเซเชจเซ เชธเชพเชฅเซ เชธเชฌเซเชธเซเชเซเชฐเชพเชเชฌเชฐเชจเซเช เชธเชพเชงเชจ เชธเซเชงเซเช เชเซเชกเชพเชฏเซเชฒ เชเซ เชคเซ เช เชชเซเชเซเชเชจเซ "เชเชจเซเชเชฐเชธเซเชชเซเช" เชเชฐเซ เชเซ เช เชจเซ เชคเซเชฎเชพเช เชซเซเชฐเชซเชพเชฐ เชเชฐเซ เชเซ, เชคเซเชฎเชพเช เชตเชงเชพเชฐเชพเชจเชพ เชตเชฟเชเชฒเซเชชเซ เชตเชฟเชเชฒเซเชช 82 เช เชจเซ เชฐเชฟเชฒเซ เชเชเชจเซเช IP เชธเชฐเชจเชพเชฎเซเช เชฐเชเซ เชเชฐเซ เชเซ เช เชจเซ เชคเซเชจเซ เชเชเชณ เชเซเชฐเชพเชจเซเชธเชฎเชฟเช เชเชฐเซ เชเซ. เชจเซเชเชตเชฐเซเช.
- DHCP เชธเชฐเซเชตเชฐ เชตเชฟเชจเชเชคเซ เชธเซเชตเซเชเชพเชฐเซ เชเซ, เชชเซเชฐเชคเชฟเชญเชพเชต เชเชจเชฐเซเช เชเชฐเซ เชเซ เช เชจเซ เชคเซเชจเซ เชฐเชฟเชฒเซ เชเชชเชเชฐเชฃ เชชเชฐ เชฎเซเชเชฒเซ เชเซ
- เชฐเชฟเชฒเซ เชเชชเชเชฐเชฃ เชชเซเชฐเชคเชฟเชญเชพเชต เชชเซเชเซเชเชจเซ เชธเชฌเซเชธเซเชเซเชฐเชพเชเชฌเชฐ เชเชชเชเชฐเชฃ เชชเชฐ เชซเซเชฐเชตเชฐเซเชก เชเชฐเซ เชเซ
เช เชฒเชฌเชคเซเชค, เชคเซ เชฌเชงเซเช เชเชเชฒเซเช เชธเชฐเชณเชคเชพเชฅเซ เชเชพเชฎ เชเชฐเชคเซเช เชจเชฅเซ; เชคเชฎเชพเชฐเซ เชคเซ เชฎเซเชเชฌ เชคเชฎเชพเชฐเชพ เชจเซเชเชตเชฐเซเช เชธเชพเชงเชจเซเชจเซ เชเซเช เชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
เชซเซเชฐเซเชฐเซเชกเชฟเชฏเชธ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ
เช เชฒเชฌเชคเซเชค, เชซเซเชฐเซเชฐเซเชกเชฟเชฏเชธ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชธเซเชเชฟเชเชเซเชธ เชธเชพเชฅเซ เช เชชเซเชฐเชพเชชเซเชค เชเชฐเซ เชถเชเชพเชฏ เชเซ, เชชเชฐเชเชคเซ เชคเซ เชฎเซเชถเซเชเซเชฒ เช เชจเซ เช เชธเซเชชเชทเซเช เชเซ... เชเชพเชธ เชเชฐเซเชจเซ เชเซเชฏเชพเชฐเซ เชคเชฎเซ N เชฎเชนเชฟเชจเชพ เชชเชเซ เชคเซเชฏเชพเช เชเชพเช เชเซ เช เชจเซ "เชฌเชงเซเช เชเชพเชฎ เชเชฐเซ เชเซ." เชคเซเชฅเซ, เช เชฎเซ Python เชฎเชพเช FreeRadius เชฎเชพเชเซ เช เชฎเชพเชฐเซเช เชชเซเชคเชพเชจเซเช เช เชงเชฟเชเซเชค เชฎเซเชกเซเชฏเซเชฒ เชฒเชเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช เชเซ. เช เชฎเซ MySQL เชกเซเชเชพเชฌเซเชเชฎเชพเชเชฅเซ เช เชงเชฟเชเซเชคเชคเชพ เชกเซเชเชพ เชฒเชเชถเซเช. เชคเซเชจเซ เชฐเชเชจเชพเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเชตเชพเชจเซ เชเซเช เช เชฐเซเชฅ เชจเชฅเซ; เชเซเชเชชเชฃ เชฐเซเชคเซ, เชฆเชฐเซเช เชคเซเชจเซ "เชชเซเชคเชพเชจเชพ เชฎเชพเชเซ" เชฌเชจเชพเชตเชถเซ. เชเชพเชธ เชเชฐเซเชจเซ, เชฎเซเช เชซเซเชฐเซเชฐเซเชกเชฟเชฏเชธ เชฎเชพเชเซ sql เชฎเซเชกเซเชฏเซเชฒ เชธเชพเชฅเซ เชเชซเชฐ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชคเซ เชฎเชพเชณเชเซเช เชฒเซเชงเซเช เชเซ, เช เชจเซ เชฒเซเชเชฟเชจ-เชชเชพเชธเชตเชฐเซเชก เชเชชเชฐเชพเชเชค, เชฆเชฐเซเช เชธเชฌเซเชธเซเชเซเชฐเชพเชเชฌเชฐ เชฎเชพเชเซ เชฎเซเช เช เชจเซ เชชเซเชฐเซเช เชซเซเชฒเซเชก เชเชฎเซเชฐเซเชจเซ เชคเซเชฎเชพเช เชฅเซเชกเซ เชซเซเชฐเชซเชพเชฐ เชเชฐเซเชฏเซ เชเซ.
เชคเซเชฅเซ, เชชเซเชฐเชฅเชฎ, เชซเซเชฐเซเชฐเซเชกเชฟเชฏเชธ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ:
cd /usr/ports/net/freeradius3
make config
make
install clean
เชธเซเชเชฟเชเชเซเชธเชฎเชพเช, เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพ เชฎเชพเชเซ เชชเชธเชเชฆ เชเชฐเซ:
เช
เชฎเซ เชชเชพเชฏเชฅเซเชจ เชฎเซเชกเซเชฏเซเชฒ เชฎเชพเชเซ เชธเชฟเชฎเชฒเชฟเชเช เชฌเชจเชพเชตเซเช เชเซเช (เชเชเชฒเซ โโโโเชเซ เชคเซเชจเซ "เชเชพเชฒเซ เชเชฐเซ"):
ln -s /usr/local/etc/raddb/mods-available/python /usr/local/etc/raddb/mods-enabled
เชเชพเชฒเซ python เชฎเชพเชเซ เชตเชงเชพเชฐเชพเชจเซเช เชฎเซเชกเซเชฏเซเชฒ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซเช:
pip install mysql-connector
เชซเซเชฐเซเชฐเซเชกเชฟเชฏเชธ เชฎเชพเชเซ เชชเชพเชฏเชฅเซเชจ เชฎเซเชกเซเชฏเซเชฒ เชธเซเชเชฟเชเชเซเชธเชฎเชพเช, เชคเชฎเชพเชฐเซ python_path เชตเซเชฐเซเชเชฌเชฒเชฎเชพเช เชฎเซเชกเซเชฏเซเชฒ เชถเซเชง เชชเชพเชฅเชจเซ เชเชฒเซเชฒเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ เชฎเชพเชฐเซ เชชเชพเชธเซ เช เชเซ:
python_path="/usr/local/etc/raddb/mods-config/python:/usr/local/lib/python2.7:/usr/local/lib/python27.zip:/usr/local/lib/python2.7:/usr/local/lib/python2.7/plat-freebsd12:/usr/local/lib/python2.7/lib-tk:/usr/local/lib/python2.7/lib-old:/usr/local/lib/python2.7/lib-dynload:/usr/local/lib/python2.7/site-packages"
เชคเชฎเซ python interpreter เชจเซ เชฒเซเชเช เชเชฐเซเชจเซ เช เชจเซ เชเชฆเซเชถเซ เชฆเชพเชเชฒ เชเชฐเซเชจเซ เชชเชพเชฅ เชถเซเชงเซ เชถเชเซ เชเซ:
root@phaeton:/usr/local/etc/raddb/mods-enabled# python
Python 2.7.15 (default, Dec 8 2018, 01:22:25)
[GCC 4.2.1 Compatible FreeBSD Clang 6.0.1 (tags/RELEASE_601/final 335540)] on freebsd12
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/local/lib/python27.zip', '/usr/local/lib/python2.7', '/usr/local/lib/python2.7/plat-freebsd12', '/usr/local/lib/python2.7/lib-tk', '/usr/local/lib/python2.7/lib-old', '/usr/local/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/site-packages']
>
เชเซ เชคเชฎเซ เช เชชเชเชฒเซเช เชจเชนเซเช เชญเชฐเซ, เชคเซ เชชเชเซ python เชฎเชพเช เชฒเชเซเชฒเซ เช เชจเซ FreeRadius เชฆเซเชตเชพเชฐเชพ เชฒเซเชจเซเช เชเชฐเชพเชฏเซเชฒเซ เชธเซเชเซเชฐเชฟเชชเซเชเซ เชเชฏเชพเชคเชฎเชพเช เชธเซเชเชฟเชฌเชฆเซเชง เชฎเซเชกเซเชฏเซเชฒเซเชจเซ เชถเซเชงเซ เชถเชเชถเซ เชจเชนเซเช. เชตเชงเซเชฎเชพเช, เชคเชฎเชพเชฐเซ เชฎเซเชกเซเชฏเซเชฒ เชธเซเชเชฟเชเชเซเชธเชฎเชพเช เชเซเชฒเชฟเชเช เช เชงเชฟเชเซเชคเชคเชพ เช เชจเซ เชเชเชพเชเชจเซเชเชฟเชเช เชฎเชพเชเซเชจเชพ เชเชพเชฐเซเชฏเซเชจเซ เช เชจเชเซเชฎเซเชจเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เช เชฎเซเชกเซเชฏเซเชฒ เชเชจเชพ เชเซเชตเซ เชฆเซเชเชพเชฏ เชเซ:
python {
python_path="/usr/local/etc/raddb/mods-config/python:/usr/local/lib/python2.7:/usr/local/lib/python2.7/site-packages:/usr/local/lib/python27.zip:/usr/local/lib/python2.7:/usr/local/lib/python2.7/plat-freebsd12:/usr/local/lib/python2.7/lib-tk:/usr/local/lib/python2.7/lib-old:/usr/local/lib/python2.7/lib-dynload:/usr/local/lib/python2.7/site-packages"
module = work
mod_instantiate = ${.module}
mod_detach = ${.module}
mod_authorize = ${.module}
func_authorize = authorize
mod_authenticate = ${.module}
func_authenticate = authenticate
mod_preacct = ${.module}
func_preacct = preacct
mod_accounting = ${.module}
func_accounting = accounting
mod_checksimul = ${.module}
mod_pre_proxy = ${.module}
mod_post_proxy = ${.module}
mod_post_auth = ${.module}
mod_recv_coa = ${.module}
mod_send_coa = ${.module}
}
work.py เชธเซเชเซเชฐเชฟเชชเซเช (เช เชจเซ เช เชจเซเชฏ เชคเชฎเชพเชฎ) /usr/local/etc/raddb/mods-config/python เชฎเชพเช เชฎเซเชเชตเซ เชเชตเชถเซเชฏเช เชเซ เชฎเชพเชฐเซ เชชเชพเชธเซ เชเซเชฒ เชคเซเชฐเชฃ เชธเซเชเซเชฐเชฟเชชเซเช เชเซ.
work.py:
#!/usr/local/bin/python
# coding=utf-8
import radiusd
import func
import sys
from pprint import pprint
mysql_host="localhost"
mysql_username="ัะบะฐััะบ"
mysql_password="ััะบะฐััะบะฐััะบ"
mysql_base="ััะบะฐัะบัะฐัั"
def instantiate(p):
print ("*** instantiate ***")
print (p)
# return 0 for success or -1 for failure
def authenticate(p):
print ("*** ะััะตะฝัะธะบะฐัะธั!!***")
print (p)
def authorize(p):
radiusd.radlog(radiusd.L_INFO, '*** radlog call in authorize ***')
conn=func.GetConnectionMysql(mysql_host, mysql_username, mysql_password, mysql_base);
param=func.ConvertArrayToNames(p);
pprint(param)
print ("*** ะะฒัะพัะธะทะฐัะธั ***")
reply = ()
conf = ()
cnt=0
username="";mac="";
# ัะฝะฐัะฐะปะฐ ะฟัะพะฒะตััะตะผ "ะบะฐะบ ะฟะพะปะพะถะตะฝะพ", ะฟะพ ัะฒัะทะบะต ะปะพะณะธะฝ/ะฟะฐัะพะปั
if ("User-Name" in param) and ("User-Password" in param) :
print ("ะะฐัะธะฐะฝั ะฐะฒัะพัะธะทะฐัะธะธ (1): ะตััั ะปะพะณะธะฝ-ะฟะฐัะพะปั")
pprint(param["User-Name"])
pprint(param["User-Password"])
pprint(conn)
print(sys.version_info)
print (radiusd.config)
sql="select radreply.attribute,radreply.value from radcheck inner join radreply on radreply.username=radcheck.username where radcheck.username=%s and radcheck.value=%s"
print(sql)
cursor = conn.cursor(dictionary=True,buffered=True)
cursor.execute(sql,[param["User-Name"], param["User-Password"]]);
row = cursor.fetchone()
while row is not None:
cnt=cnt+1
username=row["username"]
reply = reply+((str(row["attribute"]),str(row["value"])), )
row = cursor.fetchone()
# ะฒะฐัะธะฐะฝั, ััะพ User-Name - ััะพ ะะะก ะฐะดัะตั ะะก,ะฟะฐัะพะปั ะธ ะฟะพััะฐ ะฝะตั
if ("User-Name" in param) and ("User-Password" in param) and (cnt==0):
if param["User-Password"] =='':
if ":" in param["User-Name"]:
pprint(param["User-Name"])
print ("ะะฐัะธะฐะฝั ะฐะฒัะพัะธะทะฐัะธะธ (2): User-Name - ััะพ MAC ะฐะดัะตั ะฑะฐะทะพะฒะพะน ััะฐะฝัะธะธ, ะฟะพััะฐ ะธ ะฟะฐัะพะปั ะฝะตั")
sql="select radreply.username,radreply.attribute,radreply.value from radcheck inner join radreply on radreply.username=radcheck.username where REPLACE(radcheck.mac,':','') = REPLACE(REPLACE('"+str(param["User-Name"])+"','0x',''),':','') and radcheck.sw_port=''"
print (sql)
cursor = conn.cursor(dictionary=True,buffered=True)
cursor.execute(sql);
row = cursor.fetchone()
while row is not None:
cnt=cnt+1
username=row["username"]
mac=param["User-Name"]
reply = reply+((str(row["attribute"]),str(row["value"])), )
row = cursor.fetchone()
if ("Agent-Remote-Id" in param) and ("User-Password" in param) and (cnt==0):
if param["User-Password"] =='':
pprint(param["Agent-Remote-Id"])
print ("ะะฐัะธะฐะฝั ะฐะฒัะพัะธะทะฐัะธะธ (2.5): Agent-Remote-Id - ััะพ MAC ะฐะดัะตั PON ะพะฑะพััะดะพะฒะฐะฝะธั")
sql="select radreply.username,radreply.attribute,radreply.value from radcheck inner join radreply on radreply.username=radcheck.username where REPLACE(radcheck.mac,':','') = REPLACE(REPLACE('"+str(param["Agent-Remote-Id"])+"','0x',''),':','') and radcheck.sw_port=''"
print (sql)
cursor = conn.cursor(dictionary=True,buffered=True)
cursor.execute(sql);
row = cursor.fetchone()
while row is not None:
cnt=cnt+1
username=row["username"]
mac=param["User-Name"]
reply = reply+((str(row["attribute"]),str(row["value"])), )
row = cursor.fetchone()
#ะะฐัะธะฐะฝั, ััะพ Agent-Remote-Id - ััะพ ะะะก ะฐะดัะตั ะะก,ะฟะฐัะพะปั ะธ ะฟะพััะฐ ะฝะตั ะธ ะฟัะตะดัะดััะธะต ะฒะฐัะธะฐะฝัั ะฟะพะธัะบะฐ IP ัะตะทัะปััะฐัะฐ ะฝะต ะดะฐะปะธ
if ("Agent-Remote-Id" in param) and ("User-Password" not in param) and (cnt==0):
pprint(param["Agent-Remote-Id"])
print ("ะะฐัะธะฐะฝั ะฐะฒัะพัะธะทะฐัะธะธ (3): Agent-Remote-Id - ะะะก ะฑะฐะทะพะฒะพะน ััะฐะฝัะธะธ/ะฟะพะฝ. ะะพััะฐ ะฒ ะฑะธะปะปะธะฝะณะต ะฝะตั")
sql="select radreply.username,radreply.attribute,radreply.value from radcheck inner join radreply on radreply.username=radcheck.username where REPLACE(radcheck.mac,':','') = REPLACE(REPLACE('"+str(param["Agent-Remote-Id"])+"','0x',''),':','') and radcheck.sw_port=''"
print(sql)
cursor = conn.cursor(dictionary=True,buffered=True)
cursor.execute(sql);
row = cursor.fetchone()
while row is not None:
cnt=cnt+1
mac=param["Agent-Remote-Id"]
username=row["username"]
reply = reply+((str(row["attribute"]),str(row["value"])), )
row = cursor.fetchone()
#ะะฐัะธะฐะฝั, ััะพ ะฟัะตะดัะดััะธะต ะฟะพะฟััะบะธ ัะตะทัะปััะฐัะฐ ะฝะต ะดะฐะปะธ, ะฝะพ ะตััั Agent-Remote-Id ะธ Agent-Circuit-Id
if ("Agent-Remote-Id" in param) and ("Agent-Circuit-Id" in param) and (cnt==0):
pprint(param["Agent-Remote-Id"])
pprint(param["Agent-Circuit-Id"])
print ("ะะฐัะธะฐะฝั ะฐะฒัะพัะธะทะฐัะธะธ (4): ะฐะฒัะพัะธะทะฐัะธั ะฟะพ Agent-Remote-Id ะธ Agent-Circuit-Id, ะฒ ะฑะธะปะปะธะฝะณะต ะตััั ะฟะพัั/ะผะฐะบ")
sql="select radreply.username,radreply.attribute,radreply.value from radcheck inner join radreply on radreply.username=radcheck.username where upper(radcheck.sw_mac)=upper(REPLACE('"+str(param["Agent-Remote-Id"])+"','0x','')) and upper(radcheck.sw_port)=upper(RIGHT('"+str(param["Agent-Circuit-Id"])+"',2)) and radcheck.sw_port<>''"
print(sql)
cursor = conn.cursor(dictionary=True,buffered=True)
cursor.execute(sql);
row = cursor.fetchone()
while row is not None:
cnt=cnt+1
mac=param["Agent-Remote-Id"]
username=row["username"]
reply = reply+((str(row["attribute"]),str(row["value"])), )
row = cursor.fetchone()
# ะตัะปะธ ัะฐะบ ะดะพ ัะธั
ะฟะพั IP ะฝะต ะฟะพะปััะตะฝ, ัะพ ะฒัะดะฐั ะธะตะณะพ ะธะท ะณะพััะตะฒะพะน ัะตัะธ..
if cnt==0:
print ("ะะธ ะพะดะธะฝ ะธะท ะฒะฐัะธะฐะฝัะพะฒ ะฐะฒัะพัะธะทะฐัะธะธ ะฝะต ััะฐะฑะพัะฐะป, ะฟะพะปััะฐั IP ะธะท ะณะพััะตะฒะพะน ัะตัะธ..")
ip=func.GetGuestNet(conn)
if ip!="":
cnt=cnt+1;
reply = reply+(("Framed-IP-Address",str(ip)), )
# ะตัะปะธ ัะพะฒัะตะผ ะฒัั ะฟะปะพั
ะพ, ัะพ Reject
if cnt==0:
conf = ( ("Auth-Type", "Reject"), )
else:
#ะตัะปะธ ะฐะฒัะพัะธะทะฐัะธั ััะฟะตัะฝะฐั (ะตััั ัะฐะบะพะน ะฐะฑะพะฝะตะฝั), ัะพ ะทะฐะฟะธัะตะผ ะธััะพัะธั ะฐะฒัะพัะธะทะฐัะธะธ
if username!="":
func.InsertToHistory(conn,username,mac, reply);
conf = ( ("Auth-Type", "Accept"), )
pprint (reply)
conn=None;
return radiusd.RLM_MODULE_OK, reply, conf
def preacct(p):
print ("*** preacct ***")
print (p)
return radiusd.RLM_MODULE_OK
def accounting(p):
print ("*** ะะบะบะฐัะฝัะธะฝะณ ***")
radiusd.radlog(radiusd.L_INFO, '*** radlog call in accounting (0) ***')
print (p)
conn=func.GetConnectionMysql(mysql_host, mysql_username, mysql_password, mysql_base);
param=func.ConvertArrayToNames(p);
pprint(param)
print("ะฃะดะฐะปะธะผ ััะฐััะต ัะตััะธะธ (ะฑะพะปะตะต 20 ะผะธะฝัั ะฝะตั ะฐะบะบะฐัะฝัะธะฝะณะฐ)");
sql="delete from radacct where TIMESTAMPDIFF(minute,acctupdatetime,now())>20"
cursor = conn.cursor(dictionary=True,buffered=True)
cursor.execute(sql);
conn.commit()
print("ะะฑะฝะพะฒะธะผ/ะดะพะฑะฐะฒะธะผ ะธะฝัะพัะผะฐัะธั ะพ ัะตััะธะธ")
if (("Acct-Unique-Session-Id" in param) and ("User-Name" in param) and ("Framed-IP-Address" in param)):
sql='insert into radacct (radacctid,acctuniqueid,username,framedipaddress,acctstarttime) values (null,"'+str(param['Acct-Unique-Session-Id'])+'","'+str(param['User-Name'])+'","'+str(param['Framed-IP-Address'])+'",now()) ON DUPLICATE KEY update acctupdatetime=now()'
print(sql)
cursor = conn.cursor(dictionary=True,buffered=True)
cursor.execute(sql)
conn.commit()
conn=None;
return radiusd.RLM_MODULE_OK
def pre_proxy(p):
print ("*** pre_proxy ***")
print (p)
return radiusd.RLM_MODULE_OK
def post_proxy(p):
print ("*** post_proxy ***")
print (p)
return radiusd.RLM_MODULE_OK
def post_auth(p):
print ("*** post_auth ***")
print (p)
return radiusd.RLM_MODULE_OK
def recv_coa(p):
print ("*** recv_coa ***")
print (p)
return radiusd.RLM_MODULE_OK
def send_coa(p):
print ("*** send_coa ***")
print (p)
return radiusd.RLM_MODULE_OK
def detach():
print ("*** ะะฐ ััะพะผ ะฒัั ะดะตัะธัะตัะบะธ ***")
return radiusd.RLM_MODULE_OK
func.py:
#!/usr/bin/python2.7
# coding=utf-8
import mysql.connector
from mysql.connector import Error
# ะคัะฝะบัะธั ะฒะพะทะฒัะฐัะฐะตั ัะพะตะดะธะฝะตะฝะธะต ั MySQL
def GetConnectionMysql(mysql_host, mysql_username, mysql_password, mysql_base):
try:
conn = mysql.connector.connect(host=mysql_host,database=mysql_base,user=mysql_username,password=mysql_password)
if conn.is_connected(): print('---cะพะตะดะธะฝะตะฝะธะต ั ะะ '+mysql_base+' ัััะฐะฝะพะฒะปะตะฝะพ')
except Error as e:
print("ะัะธะฑะบะฐ: ",e);
exit(1);
return conn
def ConvertArrayToNames(p):
mass={};
for z in p:
mass[z[0]]=z[1]
return mass
# ะคัะฝะบัะธั ะทะฐะฟะธััะฒะฐะตั ะธััะพัะธั ัะพะตะดะธะฝะตะฝะธั ะฟะพ ะธะทะฒะตััะฝัะผ ะดะฐะฝะฝัะผ
def InsertToHistory(conn,username,mac, reply):
print("--ะทะฐะฟะธััะฒะฐั ะดะปั ะธััะพัะธะธ")
repl=ConvertArrayToNames(reply)
if "Framed-IP-Address" in repl:
sql='insert into radpostauth (username,reply,authdate,ip,mac,session_id,comment) values ("'+username+'","Access-Accept",now(),"'+str(repl["Framed-IP-Address"])+'","'+str(mac)+'","","")'
print(sql)
cursor = conn.cursor(dictionary=True,buffered=True)
cursor.execute(sql);
conn.commit()
# ะคัะฝะบัะธั ะฒัะดะฐะตั ะฟะพัะปะตะดะฝะธะน ะฟะพ ะดะฐัะต ะฒัะดะฐัะธ IP ะฐะดัะตั ะธะท ะณะพััะตะฒะพะน ัะตัะธ
def GetGuestNet(conn):
ip="";id=0
sql="select * from guestnet order by dt limit 1"
print (sql)
cursor = conn.cursor(dictionary=True,buffered=True)
cursor.execute(sql);
row = cursor.fetchone()
while row is not None:
ip=row["ip"]
id=row["id"]
row = cursor.fetchone()
if id>0:
sql="update guestnet set dt=now() where id="+str(id)
print (sql)
cursor = conn.cursor(dictionary=True,buffered=True)
cursor.execute(sql);
conn.commit()
return ip
radiusd.py:
#!/usr/bin/python2.7
# coding=utf-8
# from modules.h
RLM_MODULE_REJECT = 0
RLM_MODULE_FAIL = 1
RLM_MODULE_OK = 2
RLM_MODULE_HANDLED = 3
RLM_MODULE_INVALID = 4
RLM_MODULE_USERLOCK = 5
RLM_MODULE_NOTFOUND = 6
RLM_MODULE_NOOP = 7
RLM_MODULE_UPDATED = 8
RLM_MODULE_NUMCODES = 9
# from log.h
L_AUTH = 2
L_INFO = 3
L_ERR = 4
L_WARN = 5
L_PROXY = 6
L_ACCT = 7
L_DBG = 16
L_DBG_WARN = 17
L_DBG_ERR = 18
L_DBG_WARN_REQ = 19
L_DBG_ERR_REQ = 20
# log function
def radlog(level, msg):
import sys
sys.stdout.write(msg + 'n')
level = level
เชเซเชฎ เชคเชฎเซ เชเซเชกเชฎเชพเชเชฅเซ เชเซเช เชถเชเซ เชเซ, เช เชฎเซ เชธเชฌเชธเซเชเซเชฐเชพเชเชฌเชฐเชจเซ เชคเซเชจเชพ เชเชพเชฃเซเชคเชพ เชธเชฌเซเชธเซเชเซเชฐเชพเชเชฌเชฐ MAC เชเชกเซเชฐเซเชธ เช เชฅเชตเชพ เชตเชฟเชเชฒเซเชช 82 เชเซเชฎเซเชฌเชฟเชจเซเชถเชจ เชฆเซเชตเชพเชฐเชพ เชเชชเชฒเชฌเซเชง เชคเชฎเชพเชฎ เชชเชฆเซเชงเชคเชฟเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชณเชเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช, เช เชจเซ เชเซ เช เชเชพเชฎ เชเชฐเชคเซเช เชจเชฅเซ, เชคเซ เช เชฎเซ โเช เชคเชฟเชฅเชฟโ เชฆเซเชตเชพเชฐเชพ เชเชชเชฏเซเชเชฎเชพเช เชฒเซเชตเชพเชฏเซเชฒ เชธเซเชฅเซ เชเซเชจเซเช IP เชธเชฐเชจเชพเชฎเซเช เชเชพเชฐเซ เชเชฐเซเช เชเซเช. " เชจเซเชเชตเชฐเซเช. เชเซ เชฌเชพเชเซ เชฐเชนเซ เชเซ เชคเซ เชธเชพเชเชเซเชธ-เชธเชเซเชทเชฎ เชซเซเชฒเซเชกเชฐเชฎเชพเช เชกเชฟเชซเซเชฒเซเช เชธเซเชเซเชฐเชฟเชชเซเชเชจเซ เชฐเซเชชเชฐเซเชเชพเชเชเชฟเชค เชเชฐเชตเชพเชจเซเช เชเซ, เชเซเชฅเซ เชชเชพเชฏเชฅเซเชจ เชธเซเชเซเชฐเชฟเชชเซเชเชฎเชพเชเชฅเซ เชเชฐเซเชฐเซ เชเชพเชฐเซเชฏเซ เชจเชฟเชฏเซเชเซเชค เชเซเชทเชฃเซ เชชเชฐ เชเซเชตเซเช เชฅเชพเชฏ. เชนเชเซเชเชคเชฎเชพเช, เชซเชพเชเชฒเชจเซ เชซเซเชฐเซเชฎเชฎเชพเช เชฒเชพเชตเชตเชพ เชฎเชพเชเซ เชคเซ เชชเซเชฐเชคเซเช เชเซ:
เชฎเซเชณเชญเซเชค
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 = 1600
lifetime = 0
idle_timeout = 30
}
}
listen {
ipv6addr = ::
port = 0
type = acct
limit {
}
}
authorize {
python
filter_username
preprocess
expiration
logintime
}
authenticate {
Auth-Type PAP {
pap
python
}
Auth-Type CHAP {
chap
python
}
Auth-Type MS-CHAP {
mschap
python
}
eap
}
preacct {
preprocess
acct_unique
suffix
files
}
accounting {
python
exec
attr_filter.accounting_response
}
session {
}
post-auth {
update {
&reply: += &session-state:
}
exec
remove_reply_message_if_eap
Post-Auth-Type REJECT {
attr_filter.access_reject
eap
remove_reply_message_if_eap
}
Post-Auth-Type Challenge {
}
}
pre-proxy {
}
post-proxy {
eap
}
}
เชเชพเชฒเซ เชคเซเชจเซ เชเชฒเชพเชตเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเช เช เชจเซ เชกเซเชฌเช เชฒเซเชเชฎเชพเช เชถเซเช เชเชตเซ เชเซ เชคเซ เชเซเชเช:
/usr/local/etc/rc.d/radiusd debug
เชฌเซเชเซเช เชถเซเช. FreeRadius เชธเซเช เชเชฐเชคเซ เชตเชเชคเซ, radclient เชฏเซเชเชฟเชฒเชฟเชเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชคเซเชจเซ เชเชพเชฎเชเซเชฐเซเชจเซเช เชชเชฐเซเชเซเชทเชฃ เชเชฐเชตเซเช เช เชจเซเชเซเชณ เชเซ. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ เช เชงเชฟเชเซเชคเชคเชพ:
echo "User-Name=4C:5E:0C:2E:7F:15,Agent-Remote-Id=0x9845623a8c98,Agent-Circuit-Id=0x00010006" | radclient -x 127.0.0.1:1812 auth testing123
เช เชฅเชตเชพ เชเชเชพเชเชจเซเช:
echo "User-Name=4C:5E:0C:2E:7F:15,Agent-Remote-Id=0x00030f26054a,Agent-Circuit-Id=0x00010002" | radclient -x 127.0.0.1:1813 acct testing123
เชนเซเช เชคเชฎเชจเซ เชเซเชคเชตเชฃเซ เชเชชเชตเชพ เชฎเชพเชเชเซ เชเซเช เชเซ "เชเชฆเซเชฏเซเชเชฟเช" เชธเซเชเซเชฒ เชชเชฐ "เชซเซเชฐเชซเชพเชฐ เชเชฐเซเชฏเชพ เชตเชฟเชจเชพ" เชเชตเซ เชฏเซเชเชจเชพ เช เชจเซ เชธเซเชเซเชฐเชฟเชชเซเชเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชเชเชฆเชฎ เช เชถเชเซเชฏ เชเซ. เชเชเชพเชฎเชพเช เชเชเซเช เชงเซเชฏเชพเชจเชชเชพเชคเซเชฐ:
- MAC เชธเชฐเชจเชพเชฎเซเช "เชฌเชจเชพเชตเชเซ" เชเชฐเชตเซเช เชถเชเซเชฏ เชเซ. เชธเชฌเซเชธเซเชเซเชฐเชพเชเชฌเชฐ เชฎเชพเชเซ เชเซเช เชฌเซเชเชพเชจเชพ MAC เชจเซ เชจเซเชเชงเชฃเซ เชเชฐเชตเชพ เชฎเชพเชเซ เชคเซ เชชเซเชฐเชคเซเช เชเซ เช เชจเซ เชคเซเชฏเชพเช เชธเชฎเชธเซเชฏเชพเช เชนเชถเซ
- เชเซเชธเซเช เชจเซเชเชตเชฐเซเชเซเชธ เชเชพเชฐเซ เชเชฐเชตเชพเชจเซ เชคเชฐเซเช เชเซเชเชพเชจเซ เชฌเชนเชพเชฐ เชเซ. เชคเซเชฏเชพเช เชเซเช เชเซเช เชชเชฃ เชจเชฅเซ "เชเชฆเชพเช เชคเซเชฏเชพเช เชชเชนเซเชฒเชพเชฅเซ เช เชธเชฎเชพเชจ IP เชธเชฐเชจเชพเชฎเชพเชเชตเชพเชณเชพ เชเซเชฐเชพเชนเชเซ เชเซ?"
เช เชซเชเซเชค เชฎเชพเชฐเซ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเชเชฎเชพเช เชเชพเชธ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ เชฐเชเชพเชฏเซเชฒ "เชเซเชเซ-เชเชเชฐ เชธเซเชฒเซเชฏเซเชถเชจ" เชเซ, เชตเชงเซ เชเชเช เชจเชฅเซ. เชเชกเช เชจเชฟเชฐเซเชฃเชฏ เชเชฐเชถเซ เชจเชนเซเช ๐
เชธเซเชฐเซเชธ: www.habr.com