เจเฉฐเจฎ เจเจพเจนเจเจพเจ เจจเฉเฉฐ IP เจเจกเจฐเฉเฉฑเจธ เจเจพเจฐเฉ เจเจฐเจจ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจง เจเจฐเจจ เจฒเจ เจชเจนเฉเฉฐเจเจฟเจเฅค เจธเจฎเฉฑเจธเจฟเจ เจฆเฉเจเจ เจธเจผเจฐเจคเจพเจ:
- เจ เจธเฉเจ เจคเฉเจนเจพเจจเฉเฉฐ เจชเฉเจฐเจฎเจพเจฃเจฟเจเจคเจพ เจฒเจ เจเฉฑเจ เจตเฉฑเจเจฐเจพ เจธเจฐเจตเจฐ เจจเจนเฉเจ เจฆเฉเจตเจพเจเจเฉ - เจคเฉเจธเฉเจ เจเจน เจเจฐเฉเจเฉ ๐
- เจเจพเจนเจเจพเจ เจจเฉเฉฐ DHCP เจฐเจพเจนเฉเจ เจจเฉเฉฑเจเจตเจฐเจ เจธเฉเจเจฟเฉฐเจเจพเจ เจชเฉเจฐเจพเจชเจค เจเจฐเจจเฉเจเจ เจเจพเจนเฉเจฆเฉเจเจ เจนเจจ
- เจจเฉเฉฑเจเจตเจฐเจ เจตเจฟเจชเจฐเฉเจค เจนเฉเฅค เจเจธ เจตเจฟเฉฑเจ PON เจธเจพเจเจผเฉ-เจธเจพเจฎเจพเจจ เจ เจคเฉ เจธเฉฐเจฐเจเจฟเจค เจตเจฟเจเจฒเจช 82 เจฆเฉ เจจเจพเจฒ เจจเจฟเจฏเจฎเจค เจธเจตเจฟเฉฑเจ เจ เจคเฉ เจนเฉเจเจธเจชเฉเจเจธ เจตเจพเจฒเฉ WiFi เจฌเฉเจธ เจธเจผเจพเจฎเจฒ เจนเจจ
- เจเฉเจเจฐ เจกเฉเจเจพ เจเจเจชเฉ เจเจพเจฐเฉ เจเจฐเจจ เจฒเจ เจเจฟเจธเฉ เจตเฉ เจธเจฅเจฟเจคเฉ เจตเจฟเฉฑเจ เจจเจนเฉเจ เจเจเจเจฆเจพ เจนเฉ, เจคเจพเจ เจคเฉเจนเจพเจจเฉเฉฐ "เจฎเจนเจฟเจฎเจพเจจ" เจจเฉเจเจตเจฐเจ เจคเฉเจ เจเฉฑเจ IP เจเจพเจฐเฉ เจเจฐเจจเจพ เจเจพเจนเฉเจฆเจพ เจนเฉเฅค
เจเฉฐเจเฉ เจชเจพเจธเฉ: เจซเฉเจฐเฉเจฌเฉเจเจธเจกเฉ 'เจคเฉ เจ
เจเฉ เจตเฉ เจเฉฑเจ เจธเจฐเจตเจฐ เจนเฉ เจเฉ "เจเฉฐเจฎ" เจเจฐ เจธเจเจฆเจพ เจนเฉ, เจชเจฐ เจเจน "เจฆเฉเจฐ" เจนเฉ;), "เจเจธ เจจเฉเฉฑเจเจตเจฐเจ 'เจคเฉ เจธเจนเฉ เจจเจนเฉเจ"เฅค
เจฎเจฟเจเจฐเฉเจเจฟเจ เจจเจพเจฎเจ เจเฉฑเจ เจธเจผเจพเจจเจฆเจพเจฐ เจฏเฉฐเจคเจฐ เจตเฉ เจนเฉเฅค เจเจฎ เจจเฉเฉฑเจเจตเจฐเจ เจเจฟเฉฑเจคเจฐ เจเฉเจ เจเจธ เจคเจฐเฉเจนเจพเจ เจนเฉ:
เจเฉเจ เจธเฉเจเจฃ เจคเฉเจ เจฌเจพเจ
เจฆ, เจเจพเจนเจเจพเจ เจจเฉเฉฐ เจจเฉเฉฑเจเจตเจฐเจ เจธเฉเจเจฟเฉฐเจเจพเจ เจเจพเจฐเฉ เจเจฐเจจ เจฒเจ FreeRadius เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเจพ เจซเฉเจธเจฒเจพ เจเฉเจคเจพ เจเจฟเจ เจธเฉเฅค เจธเจฟเจงเจพเจเจค เจตเจฟเฉฑเจ, เจธเจเฉเจฎ เจเจฎ เจนเฉ: เจ
เจธเฉเจ เจฎเจพเจเจเฉเจฐเฉเจเจฟเจ 'เจคเฉ DHCP เจธเจฐเจตเจฐ, เจ
เจคเฉ เจเจธ 'เจคเฉ เจฐเฉเจกเฉเจ
เจธ เจเจฒเจพเจเฉฐเจ เจจเฉเฉฐ เจธเจฎเจฐเฉฑเจฅ เจฌเจฃเจพเจเจเจฆเฉ เจนเจพเจเฅค เจ
เจธเฉเจ DHCP เจธเจฐเจตเจฐ -> เจฐเฉเจกเฉเจ
เจธ เจเจฒเจพเจเฉฐเจ -> เจฐเฉเจกเฉเจ
เจธ เจธเจฐเจตเจฐ เจเจจเฉเจเจธเจผเจจ เจฆเฉ เจธเฉฐเจฐเจเจจเจพ เจเจฐเจฆเฉ เจนเจพเจเฅค
เจเจน เจเจเจพ เจจเจนเฉเจ เจฒเฉฑเจเจฆเจพเฅค เจชเจฐ! เจธเจผเฉเจคเจพเจจ เจตเฉเจฐเจตเฉ เจตเจฟเฉฑเจ เจนเฉ. เจ เจฐเจฅเจพเจค:
- เจเจฆเฉเจ เจเจธ เจธเจเฉเจฎ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจเฉฑเจ PON OLT เจจเฉเฉฐ เจ เจงเจฟเจเจพเจฐเจค เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ, เจคเจพเจ เจนเฉเฉฑเจกเจเจเจก เจฆเฉ MAC เจชเจคเฉ เจฆเฉ เจฌเจฐเจพเจฌเจฐ เจเฉฑเจ เจเจชเจญเฉเจเจคเจพ-เจจเจพเจฎ, MAC PON Onu เจฆเฉ เจฌเจฐเจพเจฌเจฐ เจเฉฑเจ เจเจเฉฐเจ-เจธเจฐเจเจ-เจเจเจกเฉ เจ เจคเฉ เจเฉฑเจ เจเจพเจฒเฉ เจชเจพเจธเจตเจฐเจก เจฆเฉ เจจเจพเจฒ เจเฉฑเจ เจฌเฉเจจเจคเฉ FreeRadius เจจเฉเฉฐ เจญเฉเจเฉ เจเจพเจเจฆเฉ เจนเฉเฅค
- เจตเจฟเจเจฒเจช 82 เจฆเฉ เจจเจพเจฒ เจธเจตเจฟเฉฑเจเจพเจ เจคเฉเจ เจ เจงเจฟเจเจพเจฐเจค เจเจฐเจฆเฉ เจธเจฎเฉเจ, FreeRadius เจจเฉเฉฐ เจเจพเจนเจ เจฆเฉ เจกเจฟเจตเจพเจเจธ เจฆเฉ MAC เจฆเฉ เจฌเจฐเจพเจฌเจฐ เจเฉฑเจ เจเจพเจฒเฉ เจเจชเจญเฉเจเจคเจพ-เจจเจพเจฎ เจฆเฉ เจจเจพเจฒ เจเฉฑเจ เจฌเฉเจจเจคเฉ เจชเฉเจฐเจพเจชเจค เจนเฉเฉฐเจฆเฉ เจนเฉ เจ เจคเฉ เจเฉเจฐเจฎเจตเจพเจฐ เจเจเฉฐเจ-เจธเจฐเจเจ-เจเจเจกเฉ เจ เจคเฉ เจเจเฉฐเจ-เจฐเจฟเจฎเฉเจ-เจเจเจกเฉ เจตเจพเจฒเฉ เจตเจพเจงเฉ เจเฉเจฃเจพเจ เจจเจพเจฒ เจญเจฐเฉ เจเจพเจเจฆเฉ เจนเฉ, เจเฉเจฐเจฎเจตเจพเจฐ เจฆเฉเจฌเจพเจฐเจพ MAC เจฐเฉเจฒเฉเจ เจธเจตเจฟเฉฑเจ เจ เจคเฉ เจชเฉเจฐเจ เจเจฟเจธ เจจเจพเจฒ เจเจพเจนเจ เจเฉเฉเจฟเจ เจนเฉเจเจ เจนเฉเฅค
- WiFI เจชเฉเจเจเฉฐเจเจพเจ เจตเจพเจฒเฉ เจเฉเจ เจเจพเจนเจเจพเจ เจจเฉเฉฐ PAP-CHAP เจชเฉเจฐเฉเจเฉเจเฉเจฒ เจฆเฉเจเจฐเจพ เจ เจงเจฟเจเจพเจฐเจค เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ
- WIFI เจชเฉเจเจเฉฐเจเจพเจ เจฆเฉ เจเฉเจ เจเจพเจนเจเจพเจ เจจเฉเฉฐ เจฌเจฟเจจเจพเจ เจชเจพเจธเจตเจฐเจก เจฆเฉ, WIFI เจชเฉเจเจเฉฐเจ เจฆเฉ MAC เจชเจคเฉ เจฆเฉ เจฌเจฐเจพเจฌเจฐ เจเจชเจญเฉเจเจคเจพ-เจจเจพเจฎ เจจเจพเจฒ เจ เจงเจฟเจเจพเจฐเจค เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉเฅค
เจเจคเจฟเจนเจพเจธเจ เจชเจฟเจเฉเจเฉ: DHCP เจตเจฟเฉฑเจ "เจตเจฟเจเจฒเจช 82" เจเฉ เจนเฉ
เจเจน DHCP เจชเฉเจฐเฉเจเฉเจเฉเจฒ เจฒเจ เจตเจพเจงเฉ เจตเจฟเจเจฒเจช เจนเจจ เจเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจตเจพเจงเฉ เจเจพเจฃเจเจพเจฐเฉ เจเฉเจฐเจพเจเจธเจซเจฐ เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเฉ เจนเจจ, เจเจฆเจพเจนเจฐเจจ เจฒเจ เจเจเฉฐเจ-เจธเจฐเจเจ-เจเจเจกเฉ เจ เจคเฉ เจเจเฉฐเจ-เจฐเจฟเจฎเฉเจ-เจเจเจกเฉ เจเฉเจคเจฐเจพเจ เจตเจฟเฉฑเจเฅค เจเจฎ เจคเฉเจฐ 'เจคเฉ เจฐเฉเจฒเฉเจ เจธเจตเจฟเฉฑเจ เจฆเฉ MAC เจเจกเจฐเฉเฉฑเจธ เจ เจคเฉ เจชเฉเจฐเจ เจจเฉเฉฐ เจธเฉฐเจเจพเจฐเจฟเจค เจเจฐเจจ เจฒเจ เจตเจฐเจคเจฟเจ เจเจพเจเจฆเจพ เจนเฉ เจเจฟเจธ เจจเจพเจฒ เจเจพเจนเจ เจเจจเฉเจเจ เจนเฉเฉฐเจฆเจพ เจนเฉเฅค PON เจธเจพเจเจผเฉ-เจธเจพเจฎเจพเจจ เจเจพเจ WIFI เจฌเฉเจธ เจธเจเฉเจธเจผเจจเจพเจ เจฆเฉ เจฎเจพเจฎเจฒเฉ เจตเจฟเฉฑเจ, เจเจเฉฐเจ-เจธเจฐเจเจ-เจเจเจกเฉ เจเฉเจคเจฐ เจตเจฟเฉฑเจ เจเจชเจฏเฉเจเฉ เจเจพเจฃเจเจพเจฐเฉ เจจเจนเฉเจ เจนเฉเฉฐเจฆเฉ เจนเฉ (เจเฉเจ เจเจพเจนเจ เจชเฉเจฐเจ เจจเจนเฉเจ เจนเฉ)เฅค เจเจธ เจเฉเจธ เจตเจฟเฉฑเจ DHCP เจเจพเจฐเจตเจพเจ เจฆเฉ เจเจฎ เจธเจเฉเจฎ เจนเฉเจ เจฒเจฟเจเฉ เจ เจจเฉเจธเจพเจฐ เจนเฉ:
เจเจฆเจฎ เจฆเจฐ เจเจฆเจฎ เจเจน เจธเจเฉเจฎ เจเจธ เจคเจฐเฉเจนเจพเจ เจเฉฐเจฎ เจเจฐเจฆเฉ เจนเฉ:
- เจเจชเจญเฉเจเจคเจพ เจเจชเจเจฐเจฃ เจจเฉเจเจตเจฐเจ เจธเฉเจเจฟเฉฐเจเจพเจ เจชเฉเจฐเจพเจชเจค เจเจฐเจจ เจฒเจ เจเฉฑเจ DHCP เจชเฉเจฐเจธเจพเจฐเจฃ เจฌเฉเจจเจคเฉ เจเจฐเจฆเจพ เจนเฉ
- เจกเจฟเจตเจพเจเจธ (เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเฉฑเจ เจธเจตเจฟเฉฑเจ, เจตเจพเจเจซเจพเจ เจเจพเจ PON เจฌเฉเจธ เจธเจเฉเจธเจผเจจ) เจเจฟเจธ เจจเจพเจฒ เจเจพเจนเจ เจเจชเจเจฐเจจ เจธเจฟเฉฑเจงเฉ เจคเฉเจฐ 'เจคเฉ เจเฉเฉเจฟเจ เจนเฉเจเจ เจนเฉ, เจเจธ เจชเฉเจเฉเจ เจจเฉเฉฐ "เจเฉฐเจเจฐเจธเฉเจชเจ" เจเจฐเจฆเจพ เจนเฉ เจ เจคเฉ เจเจธเจจเฉเฉฐ เจฌเจฆเจฒเจฆเจพ เจนเฉ, เจเจธ เจตเจฟเฉฑเจ เจตเจพเจงเฉ เจตเจฟเจเจฒเจช เจตเจฟเจเจฒเจช 82 เจ เจคเฉ เจฐเฉเจฒเฉเจ เจเจเฉฐเจ IP เจเจกเจฐเฉเฉฑเจธ เจจเฉเฉฐ เจชเฉเจธเจผ เจเจฐเจฆเจพ เจนเฉ, เจ เจคเฉ เจเจธเจจเฉเฉฐ เจ เฉฑเจเฉ เจชเฉเจฐเจธเจพเจฐเจฟเจค เจเจฐเจฆเจพ เจนเฉเฅค เจจเฉเฉฑเจเจตเจฐเจ.
- DHCP เจธเจฐเจตเจฐ เจฌเฉเจจเจคเฉ เจจเฉเฉฐ เจธเจตเฉเจเจพเจฐ เจเจฐเจฆเจพ เจนเฉ, เจเฉฑเจ เจเจตเจพเจฌ เจคเจฟเจเจฐ เจเจฐเจฆเจพ เจนเฉ เจ เจคเฉ เจเจธเจจเฉเฉฐ เจฐเฉเจฒเฉเจ เจกเจฟเจตเจพเจเจธ เจคเฉ เจญเฉเจเจฆเจพ เจนเฉ
- เจฐเฉเจฒเฉเจ เจกเจฟเจตเจพเจเจธ เจฐเจฟเจธเจชเจพเจเจธ เจชเฉเจเฉเจ เจจเฉเฉฐ เจธเจฌเจธเจเฉเจฐเจพเจเจฌเจฐ เจกเจฟเจตเจพเจเจธ เจจเฉเฉฐ เจ เฉฑเจเฉ เจญเฉเจเจฆเฉ เจนเฉ
เจฌเฉเจธเจผเฉฑเจ, เจเจน เจธเจญ เจเจธเจพเจจเฉ เจจเจพเจฒ เจเฉฐเจฎ เจจเจนเฉเจ เจเจฐเจฆเจพ; เจคเฉเจนเจพเจจเฉเฉฐ เจเจธ เจ เจจเฉเจธเจพเจฐ เจเจชเจฃเฉ เจจเฉเจเจตเจฐเจ เจธเจพเจเจผเฉ-เจธเจพเจฎเจพเจจ เจจเฉเฉฐ เจเฉเจเจซเจฟเจเจฐ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค
FreeRadius เจเฉฐเจธเจเจพเจฒ เจเจฐเจจเจพ
เจฌเฉเจธเจผเฉฑเจ, เจเจน FreeRadius เจเฉเจเจซเจฟเจเจฐเฉเจธเจผเจจ เจธเฉเจเจฟเฉฐเจเจพเจ เจจเจพเจฒ เจชเฉเจฐเจพเจชเจค เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ เจนเฉ, เจชเจฐ เจเจน เจฎเฉเจธเจผเจเจฒ เจ เจคเฉ เจ เจธเจชเจธเจผเจ เจนเฉ... เจเจพเจธ เจเจฐเจเฉ เจเจฆเฉเจ เจคเฉเจธเฉเจ N เจฎเจนเฉเจจเจฟเจเจ เจฌเจพเจ เจฆ เจเฉฑเจฅเฉ เจเจพเจเจฆเฉ เจนเฉ เจ เจคเฉ "เจธเจญ เจเฉเจ เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉเฅค" เจเจธเจฒเจ, เจ เจธเฉเจ เจชเจพเจเจฅเจจ เจตเจฟเฉฑเจ เจซเฉเจฐเฉเจฐเฉเจกเฉเจ เจธ เจฒเจ เจเจชเจฃเจพ เจเฉเจฆ เจฆเจพ เจชเฉเจฐเจฎเจพเจฃเฉเจเจฐเจจ เจฎเฉเจกเฉเจเจฒ เจฒเจฟเจเจฃ เจฆเจพ เจซเฉเจธเจฒเจพ เจเฉเจคเจพ เจนเฉเฅค เจ เจธเฉเจ MySQL เจกเฉเจเจพเจฌเฉเจธ เจคเฉเจ เจชเฉเจฐเจฎเจพเจฃเจฟเจเจคเจพ เจกเฉเจเจพ เจฒเจตเจพเจเจเฉเฅค เจเจธเจฆเฉ เจฌเจฃเจคเจฐ เจฆเจพ เจตเจฐเจฃเจจ เจเจฐเจจ เจฆเจพ เจเฉเจ เจฎเจคเจฒเจฌ เจจเจนเฉเจ เจนเฉ; เจตเฉเจธเฉ เจตเฉ, เจนเจฐ เจเฉเจ เจเจธเจจเฉเฉฐ "เจเจชเจฃเฉ เจฒเจ" เจฌเจฃเจพเจตเฉเจเจพเฅค เจเจพเจธ เจคเฉเจฐ 'เจคเฉ, เจฎเฉเจ เจซเจฐเฉเจฐเฉเจกเฉเจ เจธ เจฒเจ sql เจฎเฉเจกเฉเจเจฒ เจฆเฉ เจจเจพเจฒ เจชเฉเจธเจผ เจเฉเจคเฉ เจเจ เจขเจพเจเจเฉ เจจเฉเฉฐ เจฒเจฟเจ, เจ เจคเฉ เจฒเฉเจเจเจจ-เจชเจพเจธเจตเจฐเจก เจคเฉเจ เจเจฒเจพเจตเจพ, เจนเจฐเฉเจ เจเจพเจนเจ เจฒเจ เจเฉฑเจ เจฎเฉเจ เจ เจคเฉ เจชเฉเจฐเจ เจซเฉเจฒเจก เจเฉเฉ เจเฉ เจเจธเจจเฉเฉฐ เจฅเฉเฉเฉเจนเจพ เจฌเจฆเจฒเจฟเจ เจนเฉเฅค
เจเจธ เจฒเจ, เจชเจนเจฟเจฒเจพเจ, FreeRadius เจเฉฐเจธเจเจพเจฒ เจเจฐเฉ:
cd /usr/ports/net/freeradius3
make config
make
install clean
เจธเฉเจเจฟเฉฐเจเจพเจ เจตเจฟเฉฑเจ, เจเฉฐเจธเจเจพเจฒ เจเจฐเจจ เจฒเจ เจเฉเจฃเฉ:
เจ
เจธเฉเจ python เจฎเฉเจกเฉเจเจฒ เจฒเจ เจเฉฑเจ เจธเจฟเจฎเจฒเจฟเฉฐเจ เจฌเจฃเจพเจเจเจฆเฉ เจนเจพเจ (เจเจฟเจตเฉเจ เจเจฟ เจเจธเจจเฉเฉฐ "เจเจพเจฒเฉ" เจเจฐเฉ):
ln -s /usr/local/etc/raddb/mods-available/python /usr/local/etc/raddb/mods-enabled
เจเจ python เจฒเจ เจเฉฑเจ เจตเจพเจงเฉ เจฎเฉเจกเฉเจเจฒ เจเฉฐเจธเจเจพเจฒ เจเจฐเฉเจ:
pip install mysql-connector
FreeRadius เจฒเจ python เจฎเฉเจกเฉเจเจฒ เจธเฉเจเจฟเฉฐเจเจพเจ เจตเจฟเฉฑเจ, เจคเฉเจนเจพเจจเฉเฉฐ 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"
เจคเฉเจธเฉเจ เจชเจพเจเจฅเจจ เจฆเฉเจญเจพเจธเจผเฉเจ เจจเฉเฉฐ เจฒเจพเจเจ เจเจฐเจเฉ เจ เจคเฉ เจเจฎเจพเจเจกเจพเจ เจฆเจพเจเจฒ เจเจฐเจเฉ เจฎเจพเจฐเจเจพเจ เจฆเจพ เจชเจคเจพ เจฒเจเจพ เจธเจเจฆเฉ เจนเฉ:
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