DHCP เจฐเจพเจนเฉ€เจ‚ FreeRadius เจคเฉ‹เจ‚ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚

DHCP เจฐเจพเจนเฉ€เจ‚ FreeRadius เจคเฉ‹เจ‚ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚
เจ•เฉฐเจฎ เจ—เจพเจนเจ•เจพเจ‚ เจจเฉ‚เฉฐ IP เจเจกเจฐเฉˆเฉฑเจธ เจœเจพเจฐเฉ€ เจ•เจฐเจจ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจง เจ•เจฐเจจ เจฒเจˆ เจชเจนเฉเฉฐเจšเจฟเจ†เฅค เจธเจฎเฉฑเจธเจฟเจ† เจฆเฉ€เจ†เจ‚ เจธเจผเจฐเจคเจพเจ‚:

  • เจ…เจธเฉ€เจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจชเฉเจฐเจฎเจพเจฃเจฟเจ•เจคเจพ เจฒเจˆ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเจพ เจธเจฐเจตเจฐ เจจเจนเฉ€เจ‚ เจฆเฉ‡เจตเจพเจ‚เจ—เฉ‡ - เจคเฉเจธเฉ€เจ‚ เจ‡เจน เจ•เจฐเฉ‹เจ—เฉ‡ ๐Ÿ˜‰
  • เจ—เจพเจนเจ•เจพเจ‚ เจจเฉ‚เฉฐ DHCP เจฐเจพเจนเฉ€เจ‚ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเฉ€เจ†เจ‚ เจšเจพเจนเฉ€เจฆเฉ€เจ†เจ‚ เจนเจจ
  • เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจตเจฟเจชเจฐเฉ€เจค เจนเฉˆเฅค เจ‡เจธ เจตเจฟเฉฑเจš PON เจธเจพเจœเจผเฉ‹-เจธเจพเจฎเจพเจจ เจ…เจคเฉ‡ เจธเฉฐเจฐเจšเจฟเจค เจตเจฟเจ•เจฒเจช 82 เจฆเฉ‡ เจจเจพเจฒ เจจเจฟเจฏเจฎเจค เจธเจตเจฟเฉฑเจš เจ…เจคเฉ‡ เจนเฉŒเจŸเจธเจชเฉŒเจŸเจธ เจตเจพเจฒเฉ‡ WiFi เจฌเฉ‡เจธ เจธเจผเจพเจฎเจฒ เจนเจจ
  • เจœเฉ‡เจ•เจฐ เจกเฉ‡เจŸเจพ เจ†เจˆเจชเฉ€ เจœเจพเจฐเฉ€ เจ•เจฐเจจ เจฒเจˆ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจ†เจ‰เจ‚เจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ "เจฎเจนเจฟเจฎเจพเจจ" เจจเฉˆเจŸเจตเจฐเจ• เจคเฉ‹เจ‚ เจ‡เฉฑเจ• IP เจœเจพเจฐเฉ€ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค

เจšเฉฐเจ—เฉ‡ เจชเจพเจธเฉ‡: เจซเฉเจฐเฉ€เจฌเฉ€เจเจธเจกเฉ€ 'เจคเฉ‡ เจ…เจœเฉ‡ เจตเฉ€ เจ‡เฉฑเจ• เจธเจฐเจตเจฐ เจนเฉˆ เจœเฉ‹ "เจ•เฉฐเจฎ" เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ, เจชเจฐ เจ‡เจน "เจฆเฉ‚เจฐ" เจนเฉˆ;), "เจ‡เจธ เจจเฉˆเฉฑเจŸเจตเจฐเจ• 'เจคเฉ‡ เจธเจนเฉ€ เจจเจนเฉ€เจ‚"เฅค

เจฎเจฟเจ•เจฐเฉ‹เจŸเจฟเจ• เจจเจพเจฎเจ• เจ‡เฉฑเจ• เจธเจผเจพเจจเจฆเจพเจฐ เจฏเฉฐเจคเจฐ เจตเฉ€ เจนเฉˆเฅค เจ†เจฎ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจšเจฟเฉฑเจคเจฐ เจ•เฉเจ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจนเฉˆ:

DHCP เจฐเจพเจนเฉ€เจ‚ FreeRadius เจคเฉ‹เจ‚ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚

เจ•เฉเจ เจธเฉ‹เจšเจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ—เจพเจนเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ เจœเจพเจฐเฉ€ เจ•เจฐเจจ เจฒเจˆ 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 เจฐเจพเจนเฉ€เจ‚ FreeRadius เจคเฉ‹เจ‚ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚

เจ•เจฆเจฎ เจฆเจฐ เจ•เจฆเจฎ เจ‡เจน เจธเจ•เฉ€เจฎ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ€ เจนเฉˆ:

  1. เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ‰เจชเจ•เจฐเจฃ เจจเฉˆเจŸเจตเจฐเจ• เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• DHCP เจชเฉเจฐเจธเจพเจฐเจฃ เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเจฆเจพ เจนเฉˆ
  2. เจกเจฟเจตเจพเจˆเจธ (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• เจธเจตเจฟเฉฑเจš, เจตเจพเจˆเจซเจพเจˆ เจœเจพเจ‚ PON เจฌเฉ‡เจธ เจธเจŸเฉ‡เจธเจผเจจ) เจœเจฟเจธ เจจเจพเจฒ เจ—เจพเจนเจ• เจ‰เจชเจ•เจฐเจจ เจธเจฟเฉฑเจงเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจœเฉเฉœเจฟเจ† เจนเฉ‹เจ‡เจ† เจนเฉˆ, เจ‡เจธ เจชเฉˆเจ•เฉ‡เจŸ เจจเฉ‚เฉฐ "เจ‡เฉฐเจŸเจฐเจธเฉˆเจชเจŸ" เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจฌเจฆเจฒเจฆเจพ เจนเฉˆ, เจ‡เจธ เจตเจฟเฉฑเจš เจตเจพเจงเฉ‚ เจตเจฟเจ•เจฒเจช เจตเจฟเจ•เจฒเจช 82 เจ…เจคเฉ‡ เจฐเฉ€เจฒเฉ‡เจ… เจเจœเฉฐเจŸ IP เจเจกเจฐเฉˆเฉฑเจธ เจจเฉ‚เฉฐ เจชเฉ‡เจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ…เฉฑเจ—เฉ‡ เจชเฉเจฐเจธเจพเจฐเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจจเฉˆเฉฑเจŸเจตเจฐเจ•.
  3. DHCP เจธเจฐเจตเจฐ เจฌเฉ‡เจจเจคเฉ€ เจจเฉ‚เฉฐ เจธเจตเฉ€เจ•เจพเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ‡เฉฑเจ• เจœเจตเจพเจฌ เจคเจฟเจ†เจฐ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจฐเฉ€เจฒเฉ‡เจ… เจกเจฟเจตเจพเจˆเจธ เจคเฉ‡ เจญเฉ‡เจœเจฆเจพ เจนเฉˆ
  4. เจฐเฉ€เจฒเฉ‡เจ… เจกเจฟเจตเจพเจˆเจธ เจฐเจฟเจธเจชเจพเจ‚เจธ เจชเฉˆเจ•เฉ‡เจŸ เจจเฉ‚เฉฐ เจธเจฌเจธเจ•เฉเจฐเจพเจˆเจฌเจฐ เจกเจฟเจตเจพเจˆเจธ เจจเฉ‚เฉฐ เจ…เฉฑเจ—เฉ‡ เจญเฉ‡เจœเจฆเฉ€ เจนเฉˆ

เจฌเฉ‡เจธเจผเฉฑเจ•, เจ‡เจน เจธเจญ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจ•เฉฐเจฎ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ; เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‰เจธ เจ…เจจเฉเจธเจพเจฐ เจ†เจชเจฃเฉ‡ เจจเฉˆเจŸเจตเจฐเจ• เจธเจพเจœเจผเฉ‹-เจธเจพเจฎเจพเจจ เจจเฉ‚เฉฐ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค

FreeRadius เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจจเจพ

เจฌเฉ‡เจธเจผเฉฑเจ•, เจ‡เจน FreeRadius เจ•เฉŒเจ‚เจซเจฟเจ—เจฐเฉ‡เจธเจผเจจ เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ เจจเจพเจฒ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจชเจฐ เจ‡เจน เจฎเฉเจธเจผเจ•เจฒ เจ…เจคเฉ‡ เจ…เจธเจชเจธเจผเจŸ เจนเฉˆ... เจ–เจพเจธ เจ•เจฐเจ•เฉ‡ เจœเจฆเฉ‹เจ‚ เจคเฉเจธเฉ€เจ‚ N เจฎเจนเฉ€เจจเจฟเจ†เจ‚ เจฌเจพเจ…เจฆ เจ‰เฉฑเจฅเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ "เจธเจญ เจ•เฉเจ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค" เจ‡เจธเจฒเจˆ, เจ…เจธเฉ€เจ‚ เจชเจพเจˆเจฅเจจ เจตเจฟเฉฑเจš เจซเฉเจฐเฉ€เจฐเฉ‡เจกเฉ€เจ…เจธ เจฒเจˆ เจ†เจชเจฃเจพ เจ–เฉเจฆ เจฆเจพ เจชเฉเจฐเจฎเจพเจฃเฉ€เจ•เจฐเจจ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจฒเจฟเจ–เจฃ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ MySQL เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจคเฉ‹เจ‚ เจชเฉเจฐเจฎเจพเจฃเจฟเจ•เจคเจพ เจกเฉ‡เจŸเจพ เจฒเจตเจพเจ‚เจ—เฉ‡เฅค เจ‡เจธเจฆเฉ€ เจฌเจฃเจคเจฐ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจจ เจฆเจพ เจ•เฉ‹เจˆ เจฎเจคเจฒเจฌ เจจเจนเฉ€เจ‚ เจนเฉˆ; เจตเฉˆเจธเฉ‡ เจตเฉ€, เจนเจฐ เจ•เฉ‹เจˆ เจ‡เจธเจจเฉ‚เฉฐ "เจ†เจชเจฃเฉ‡ เจฒเจˆ" เจฌเจฃเจพเจตเฉ‡เจ—เจพเฅค เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡, เจฎเฉˆเจ‚ เจซเจฐเฉ€เจฐเฉ‡เจกเฉ€เจ…เจธ เจฒเจˆ sql เจฎเฉ‹เจกเฉ€เจŠเจฒ เจฆเฉ‡ เจจเจพเจฒ เจชเฉ‡เจธเจผ เจ•เฉ€เจคเฉ‡ เจ—เจ เจขเจพเจ‚เจšเฉ‡ เจจเฉ‚เฉฐ เจฒเจฟเจ†, เจ…เจคเฉ‡ เจฒเฉŒเจ—เจ‡เจจ-เจชเจพเจธเจตเจฐเจก เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจนเจฐเฉ‡เจ• เจ—เจพเจนเจ• เจฒเจˆ เจ‡เฉฑเจ• เจฎเฉˆเจ• เจ…เจคเฉ‡ เจชเฉ‹เจฐเจŸ เจซเฉ€เจฒเจก เจœเฉ‹เฉœ เจ•เฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจฅเฉ‹เฉœเฉเจนเจพ เจฌเจฆเจฒเจฟเจ† เจนเฉˆเฅค

เจ‡เจธ เจฒเจˆ, เจชเจนเจฟเจฒเจพเจ‚, FreeRadius เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเฉ‹:

cd /usr/ports/net/freeradius3
make config
make
install clean

เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ เจตเจฟเฉฑเจš, เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจจ เจฒเจˆ เจšเฉเจฃเฉ‹:

DHCP เจฐเจพเจนเฉ€เจ‚ FreeRadius เจคเฉ‹เจ‚ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚

เจ…เจธเฉ€เจ‚ 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹