DHCP เชฎเชพเชฐเชซเชคเซ‡ FreeRadius เชฅเซ€ เชจเซ‡เชŸเชตเชฐเซเช• เชธเซ‡เชŸเชฟเช‚เช—เซเชธ

DHCP เชฎเชพเชฐเชซเชคเซ‡ FreeRadius เชฅเซ€ เชจเซ‡เชŸเชตเชฐเซเช• เชธเซ‡เชŸเชฟเช‚เช—เซเชธ
เชธเชฌเซเชธเซเช•เซเชฐเชพเช‡เชฌเชฐเซเชธเชจเซ‡ IP เชเชกเซเชฐเซ‡เชธ เชœเชพเชฐเซ€ เช•เชฐเชตเชพเชจเซ€ เชตเซเชฏเชตเชธเซเชฅเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชพเชฐเซเชฏ เชชเชนเซ‹เช‚เชšเซเชฏเซเช‚. เชธเชฎเชธเซเชฏเชพเชจเซ€ เชถเชฐเชคเซ‹:

  • เช…เชฎเซ‡ เชคเชฎเชจเซ‡ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชฎเชพเชŸเซ‡ เช…เชฒเช— เชธเชฐเซเชตเชฐ เช†เชชเซ€เชถเซเช‚ เชจเชนเซ€เช‚ - เชคเชฎเซ‡ เช•เชฐเซ€ เชถเช•เชถเซ‹ ๐Ÿ˜‰
  • เชธเชฌเซเชธเซเช•เซเชฐเชพเช‡เชฌเชฐเซ‹เช DHCP เชฆเซเชตเชพเชฐเชพ เชจเซ‡เชŸเชตเชฐเซเช• เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเซ€ เช†เชตเชถเซเชฏเช• เช›เซ‡
  • เชจเซ‡เชŸเชตเชฐเซเช• เชตเชฟเชœเชพเชคเซ€เชฏ เช›เซ‡. เช†เชฎเชพเช‚ PON เชธเชพเชงเชจเซ‹ เช…เชจเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชฟเชค เชตเชฟเช•เชฒเซเชช 82 เชธเชพเชฅเซ‡ เชจเชฟเชฏเชฎเชฟเชค เชธเซเชตเซ€เชšเซ‹ เช…เชจเซ‡ เชนเซ‹เชŸเชธเซเชชเซ‹เชŸเซเชธ เชธเชพเชฅเซ‡ WiFi เชฌเซ‡เชเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡.
  • เชœเซ‹ เชกเซ‡เชŸเชพ เช†เชˆเชชเซ€ เชœเชพเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เช•เซ‹เชˆเชชเชฃ เชถเชฐเชคเซ‹ เชนเซ‡เช เชณ เช†เชตเชคเซ‹ เชจเชฅเซ€, เชคเซ‹ เชคเชฎเชพเชฐเซ‡ "เช—เซ‡เชธเซเชŸ" เชจเซ‡เชŸเชตเชฐเซเช•เชฎเชพเช‚เชฅเซ€ เช†เชˆเชชเซ€ เชœเชพเชฐเซ€ เช•เชฐเชตเซ‹ เช†เชตเชถเซเชฏเช• เช›เซ‡.

เชธเชพเชฐเซ€ เชฌเชพเชœเซเช: เชซเซเชฐเซ€เชฌเซ€เชเชธเชกเซ€ เชชเชฐ เชนเชœเซ€ เชชเชฃ เชเช• เชธเชฐเซเชตเชฐ เช›เซ‡ เชœเซ‡ "เช•เชพเชฐเซเชฏ" เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡ "เชฆเซ‚เชฐ" เช›เซ‡;), "เช† เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ" เชจเชฅเซ€.

เชฎเชฟเช•เซเชฐเซ‹เชŸเชฟเช• เชจเชพเชฎเชจเซเช‚ เชเช• เช…เชฆเซเชญเซเชค เช‰เชชเช•เชฐเชฃ เชชเชฃ เช›เซ‡. เชธเชพเชฎเชพเชจเซเชฏ เชจเซ‡เชŸเชตเชฐเซเช• เชกเชพเชฏเชพเช—เซเชฐเชพเชฎ เช•เช‚เชˆเช• เช†เชจเชพ เชœเซ‡เชตเซเช‚ เช›เซ‡:

DHCP เชฎเชพเชฐเชซเชคเซ‡ FreeRadius เชฅเซ€ เชจเซ‡เชŸเชตเชฐเซเช• เชธเซ‡เชŸเชฟเช‚เช—เซเชธ

เชฅเซ‹เชกเซ‹ เชตเชฟเชšเชพเชฐ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชธเชฌเซเชธเซเช•เซเชฐเชพเช‡เชฌเชฐเซเชธเชจเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เช†เชชเชตเชพ เชฎเชพเชŸเซ‡ เชซเซเชฐเซ€เชฐเซ‡เชกเชฟเชฏเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚. เชธเซˆเชฆเซเชงเชพเช‚เชคเชฟเช• เชฐเซ€เชคเซ‡, เชฏเซ‹เชœเชจเชพ เชธเชพเชฎเชพเชจเซเชฏ เช›เซ‡: เช…เชฎเซ‡ เชฎเชพเช‡เช•เซเชฐเซ‹เชŸเชฟเช• เชชเชฐ 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 เชฎเชพเชฐเชซเชคเซ‡ FreeRadius เชฅเซ€ เชจเซ‡เชŸเชตเชฐเซเช• เชธเซ‡เชŸเชฟเช‚เช—เซเชธ

เชธเซเชŸเซ‡เชช เชฌเชพเชฏ เชธเซเชŸเซ‡เชช เช† เชธเซเช•เซ€เชฎ เช† เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡:

  1. เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชธเชพเชงเชจเซ‹ เชจเซ‡เชŸเชตเชฐเซเช• เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡ DHCP เชฌเซเชฐเซ‹เชกเช•เชพเชธเซเชŸ เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเซ‡ เช›เซ‡
  2. เช‰เชชเช•เชฐเชฃ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชเช• เชธเซเชตเซ€เชš, เชตเชพเช‡เชซเชพเช‡ เช…เชฅเชตเชพ PON เชฌเซ‡เช เชธเซเชŸเซ‡เชถเชจ) เช•เซ‡ เชœเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชธเชฌเซเชธเซเช•เซเชฐเชพเช‡เชฌเชฐเชจเซเช‚ เชธเชพเชงเชจ เชธเซ€เชงเซเช‚ เชœเซ‹เชกเชพเชฏเซ‡เชฒ เช›เซ‡ เชคเซ‡ เช† เชชเซ‡เช•เซ‡เชŸเชจเซ‡ "เช‡เชจเซเชŸเชฐเชธเซ‡เชชเซเชŸ" เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐ เช•เชฐเซ‡ เช›เซ‡, เชคเซ‡เชฎเชพเช‚ เชตเชงเชพเชฐเชพเชจเชพ เชตเชฟเช•เชฒเซเชชเซ‹ เชตเชฟเช•เชฒเซเชช 82 เช…เชจเซ‡ เชฐเชฟเชฒเซ‡ เชเชœเชจเซเชŸ IP เชธเชฐเชจเชพเชฎเซเช‚ เชฐเชœเซ‚ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เช†เช—เชณ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸ เช•เชฐเซ‡ เช›เซ‡. เชจเซ‡เชŸเชตเชฐเซเช•.
  3. DHCP เชธเชฐเซเชตเชฐ เชตเชฟเชจเช‚เชคเซ€ เชธเซเชตเซ€เช•เชพเชฐเซ‡ เช›เซ‡, เชชเซเชฐเชคเชฟเชญเชพเชต เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฐเชฟเชฒเซ‡ เช‰เชชเช•เชฐเชฃ เชชเชฐ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡
  4. เชฐเชฟเชฒเซ‡ เช‰เชชเช•เชฐเชฃ เชชเซเชฐเชคเชฟเชญเชพเชต เชชเซ‡เช•เซ‡เชŸเชจเซ‡ เชธเชฌเซเชธเซเช•เซเชฐเชพเช‡เชฌเชฐ เช‰เชชเช•เชฐเชฃ เชชเชฐ เชซเซ‹เชฐเชตเชฐเซเชก เช•เชฐเซ‡ เช›เซ‡

เช…เชฒเชฌเชคเซเชค, เชคเซ‡ เชฌเชงเซเช‚ เชเชŸเชฒเซเช‚ เชธเชฐเชณเชคเชพเชฅเซ€ เช•เชพเชฎ เช•เชฐเชคเซเช‚ เชจเชฅเซ€; เชคเชฎเชพเชฐเซ‡ เชคเซ‡ เชฎเซเชœเชฌ เชคเชฎเชพเชฐเชพ เชจเซ‡เชŸเชตเชฐเซเช• เชธเชพเชงเชจเซ‹เชจเซ‡ เช—เซ‹เช เชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชซเซเชฐเซ€เชฐเซ‡เชกเชฟเชฏเชธ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เช…เชฒเชฌเชคเซเชค, เชซเซเชฐเซ€เชฐเซ‡เชกเชฟเชฏเชธ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เชธเชพเชฅเซ‡ เช† เชชเซเชฐเชพเชชเซเชค เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡ เชฎเซเชถเซเช•เซ‡เชฒ เช…เชจเซ‡ เช…เชธเซเชชเชทเซเชŸ เช›เซ‡... เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ N เชฎเชนเชฟเชจเชพ เชชเช›เซ€ เชคเซเชฏเชพเช‚ เชœเชพเช“ เช›เซ‹ เช…เชจเซ‡ "เชฌเชงเซเช‚ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡." เชคเซ‡เชฅเซ€, เช…เชฎเซ‡ Python เชฎเชพเช‚ FreeRadius เชฎเชพเชŸเซ‡ เช…เชฎเชพเชฐเซเช‚ เชชเซ‹เชคเชพเชจเซเช‚ เช…เชงเชฟเช•เซƒเชค เชฎเซ‹เชกเซเชฏเซเชฒ เชฒเช–เชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ เช›เซ‡. เช…เชฎเซ‡ MySQL เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚เชฅเซ€ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชกเซ‡เชŸเชพ เชฒเชˆเชถเซเช‚. เชคเซ‡เชจเซ€ เชฐเชšเชจเชพเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเชตเชพเชจเซ‹ เช•เซ‹เชˆ เช…เชฐเซเชฅ เชจเชฅเซ€; เช•เซ‹เชˆเชชเชฃ เชฐเซ€เชคเซ‡, เชฆเชฐเซ‡เช• เชคเซ‡เชจเซ‡ "เชชเซ‹เชคเชพเชจเชพ เชฎเชพเชŸเซ‡" เชฌเชจเชพเชตเชถเซ‡. เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เชฎเซ‡เช‚ เชซเซเชฐเซ€เชฐเซ‡เชกเชฟเชฏเชธ เชฎเชพเชŸเซ‡ sql เชฎเซ‹เชกเซเชฏเซเชฒ เชธเชพเชฅเซ‡ เช“เชซเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชคเซ‡ เชฎเชพเชณเช–เซเช‚ เชฒเซ€เชงเซเช‚ เช›เซ‡, เช…เชจเซ‡ เชฒเซ‰เช—เชฟเชจ-เชชเชพเชธเชตเชฐเซเชก เช‰เชชเชฐเชพเช‚เชค, เชฆเชฐเซ‡เช• เชธเชฌเซเชธเซเช•เซเชฐเชพเช‡เชฌเชฐ เชฎเชพเชŸเซ‡ เชฎเซ‡เช• เช…เชจเซ‡ เชชเซ‹เชฐเซเชŸ เชซเซ€เชฒเซเชก เช‰เชฎเซ‡เชฐเซ€เชจเซ‡ เชคเซ‡เชฎเชพเช‚ เชฅเซ‹เชกเซ‹ เชซเซ‡เชฐเชซเชพเชฐ เช•เชฐเซเชฏเซ‹ เช›เซ‡.

เชคเซ‡เชฅเซ€, เชชเซเชฐเชฅเชฎ, เชซเซเชฐเซ€เชฐเซ‡เชกเชฟเชฏเชธ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹:

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

เชธเซ‡เชŸเชฟเช‚เช—เซเชธเชฎเชพเช‚, เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเชธเช‚เชฆ เช•เชฐเซ‹:

DHCP เชฎเชพเชฐเชซเชคเซ‡ FreeRadius เชฅเซ€ เชจเซ‡เชŸเชตเชฐเซเช• เชธเซ‡เชŸเชฟเช‚เช—เซเชธ

เช…เชฎเซ‡ เชชเชพเชฏเชฅเซ‹เชจ เชฎเซ‹เชกเซเชฏเซเชฒ เชฎเชพเชŸเซ‡ เชธเชฟเชฎเชฒเชฟเช‚เช• เชฌเชจเชพเชตเซ€เช เช›เซ€เช (เชเชŸเชฒเซ‡ โ€‹โ€‹โ€‹โ€‹เช•เซ‡ เชคเซ‡เชจเซ‡ "เชšเชพเชฒเซ เช•เชฐเซ‹"):

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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹