เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบˆเบฒเบ FreeRadius เบœเปˆเบฒเบ™ DHCP

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบˆเบฒเบ FreeRadius เบœเปˆเบฒเบ™ DHCP
เบงเบฝเบเบ‡เบฒเบ™เบกเบฒเบฎเบญเบ”เป€เบžเบทเปˆเบญเบˆเบฑเบ”เปเบˆเบ‡เบเบฒเบ™เบญเบญเบเบ—เบตเปˆเบขเบนเปˆ IP เปƒเบซเป‰เบเบฑเบšเบœเบนเป‰เบˆเบญเบ‡. เป€เบ‡เบทเปˆเบญเบ™โ€‹เป„เบ‚โ€‹เบ‚เบญเบ‡โ€‹เบšเบฑเบ™โ€‹เบซเบฒโ€‹:

  • เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเปƒเบซเป‰เบ—เปˆเบฒเบ™เบกเบตเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ” - เป€เบˆเบปเป‰เบฒเบˆเบฐเป€เบฎเบฑเบ”เป„เบ”เป‰ ๐Ÿ˜‰
  • เบœเบนเป‰เบชเบฐเปเบฑเบเปƒเบŠเป‰เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบœเปˆเบฒเบ™ DHCP
  • เป€เบ„เบทเบญเบ‚เปˆเบฒเบเปเบกเปˆเบ™เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบ™เบตเป‰เบ›เบฐเบเบญเบšเบกเบตเบญเบธเบ›เบฐเบเบญเบ™ PON เปเบฅเบฐเบชเบฐเบงเบดเบ”เบ›เบปเบเบเบฐเบ•เบดเบ—เบตเปˆเบกเบต Option 82 เบ—เบตเปˆเบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปเบฅเบฐเบ–เบฒเบ™ WiFi เบ—เบตเปˆเบกเบตเบˆเบธเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ.
  • เบ–เป‰เบฒเบ‚เปเป‰เบกเบนเบ™เบšเปเปˆเบ•เบปเบเบขเบนเปˆเบžเบฒเบเปƒเบ•เป‰เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เปƒเบ”เป†เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเบญเบ IP, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบญเบญเบ IP เบˆเบฒเบเป€เบ„เบทเบญเบ‚เปˆเบฒเบ "เปเบ‚เบ"

เปƒเบ™เบ”เป‰เบฒเบ™เบ”เบต: เบเบฑเบ‡เบกเบตเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบขเบนเปˆเปƒเบ™ FreeBSD เบ—เบตเปˆเบชเบฒเบกเบฒเบ” "เป€เบฎเบฑเบ”เบงเบฝเบ", เปเบ•เปˆเบงเปˆเบฒเบกเบฑเบ™ "เบขเบนเปˆเป„เบ" ;), เบšเปเปˆเปเบกเปˆเบ™ "เบขเบนเปˆเปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ™เบตเป‰".

เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰เบเบฑเบ‡เบกเบตเบญเบธเบ›เบฐเบเบญเบ™เบ—เบตเปˆเบ›เบฐเป€เบชเบตเบ”เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ Mikrotik. เปเบœเบ™เบงเบฒเบ”เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ—เบปเปˆเบงเป„เบ›เปเบกเปˆเบ™เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบˆเบฒเบ FreeRadius เบœเปˆเบฒเบ™ DHCP

เบซเบผเบฑเบ‡เบˆเบฒเบเบ„เบงเบฒเบกเบ„เบดเบ”เบšเบฒเบ‡เบขเปˆเบฒเบ‡, เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰ FreeRadius เป€เบžเบทเปˆเบญเบญเบญเบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบ„เบทเบญเบ‚เปˆเบฒเบเปƒเบซเป‰เบเบฑเบšเบœเบนเป‰เบˆเบญเบ‡. เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™, เป‚เบ„เบ‡เบเบฒเบ™เปเบกเปˆเบ™เบ›เบปเบเบเบฐเบ•เบด: เบžเบงเบเป€เบฎเบปเบฒเป€เบ›เบตเบ”เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ DHCP เปƒเบ™ Microtick, เปเบฅเบฐ Radius Client เปƒเบ™เบกเบฑเบ™. เบžเบงเบเป€เบฎเบปเบฒเบเบณเบ™เบปเบ”เบ„เปˆเบฒเป€เบŠเบตเบšเป€เบงเบต DHCP -> Radius Client -> Radius server connection.

เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบšเปเปˆเบเบฒเบ. เปเบ•เปˆ! เบกเบฒเบ™เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”. เบ„เบท:

  • เป€เบกเบทเปˆเบญเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰ PON OLT เป‚เบ”เบเปƒเบŠเป‰เป‚เบ„เบ‡เบเบฒเบ™เบ™เบตเป‰, เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เบซเบฒ FreeRadius เบ—เบตเปˆเบกเบตเบŠเบทเปˆเบœเบนเป‰เปƒเบŠเป‰เป€เบ—เบปเปˆเบฒเบเบฑเบšเบ—เบตเปˆเบขเบนเปˆ MAC เบ‚เบญเบ‡ headend, Agent-Circuit-Id เป€เบ—เบปเปˆเบฒเบเบฑเบš MAC PON Onu เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ.
  • เป€เบกเบทเปˆเบญเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เบˆเบฒเบเบชเบฐเบงเบดเบ”เบ—เบตเปˆเบกเบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบ 82, FreeRadius เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ—เบตเปˆเบกเบตเบŠเบทเปˆเบœเบนเป‰เปƒเบŠเป‰เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒเป€เบ—เบปเปˆเบฒเบเบฑเบš MAC เบ‚เบญเบ‡เบญเบธเบ›เบฐเบเบญเบ™เบ‚เบญเบ‡เบœเบนเป‰เบˆเบญเบ‡เปเบฅเบฐเป€เบ•เบฑเบกเป„เบ›เบ”เป‰เบงเบเบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเป€เบžเบตเปˆเบกเป€เบ•เบตเบก Agent-Circuit-Id เปเบฅเบฐ Agent-Remote-Id, เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš, เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡ MAC เบ‚เบญเบ‡ เบชเบฐเบงเบดเบ” Relay เปเบฅเบฐเบžเบญเบ”เบ—เบตเปˆเบœเบนเป‰เบˆเบญเบ‡เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ.
  • เบœเบนเป‰เบˆเบญเบ‡เบšเบฒเบ‡เบ„เบปเบ™เบ—เบตเปˆเบกเบตเบˆเบธเบ” WiFI เป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เบœเปˆเบฒเบ™เป‚เบ›เป‚เบ•เบ„เบญเบ™ PAP-CHAP
  • เบœเบนเป‰เบˆเบญเบ‡เบšเบฒเบ‡เบ„เบปเบ™เบˆเบฒเบเบˆเบธเบ” WIFI เป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เบ”เป‰เบงเบเบŠเบทเปˆเบœเบนเป‰เปƒเบŠเป‰เป€เบ—เบปเปˆเบฒเบเบฑเบšเบ—เบตเปˆเบขเบนเปˆ MAC เบ‚เบญเบ‡เบˆเบธเบ” WIFI, เป‚เบ”เบเบšเปเปˆเบกเบตเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™.

เบ›เบฐเบซเบงเบฑเบ”เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบกเบฒ: "เบ—เบฒเบ‡เป€เบฅเบทเบญเบ 82" เปƒเบ™ DHCP เปเบกเปˆเบ™เบซเบเบฑเบ‡

เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบชเปเบฒเบฅเบฑเบšเป‚เบ›เป‚เบ•เบ„เบญเบ™ DHCP เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เบ•เบปเบงเบขเปˆเบฒเบ‡เปƒเบ™เบŠเปˆเบญเบ‡ Agent-Circuit-Id เปเบฅเบฐ Agent-Remote-Id. เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบชเบปเปˆเบ‡เบ—เบตเปˆเบขเบนเปˆ MAC เบ‚เบญเบ‡เบชเบฐเบงเบดเบ” Relay เปเบฅเบฐเบžเบญเบ”เบ—เบตเปˆเบœเบนเป‰เบˆเบญเบ‡เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบญเบธเบ›เบฐเบเบญเบ™ PON เบซเบผเบทเบชเบฐเบ–เบฒเบ™เบตเบžเบทเป‰เบ™เบ–เบฒเบ™ WIFI, เบžเบฒเบเบชเบฐเบซเบ™เบฒเบก Agent-Circuit-Id เบšเปเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ” (เบšเปเปˆเบกเบตเบžเบญเบ”เบˆเบญเบ‡). เป‚เบ„เบ‡เบเบฒเบ™เบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™ DHCP เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบกเบตเบ”เบฑเปˆเบ‡เบ™เบตเป‰:

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบˆเบฒเบ FreeRadius เบœเปˆเบฒเบ™ DHCP

เบ‚เบฑเป‰เบ™โ€‹เบ•เบญเบ™โ€‹เบ—เบตโ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เบ™เบตเป‰โ€‹เป€เบฎเบฑเบ”โ€‹เบงเบฝเบโ€‹เบ„เบทโ€‹เบ™เบตเป‰โ€‹:

  1. เบญเบธเบ›เบฐเบเบญเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบญเบญเบเบญเบฒเบเบฒเบ” DHCP เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบ„เบทเบญเบ‚เปˆเบฒเบ
  2. เบญเบธเบ›เบฐเบเบญเบ™ (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบชเบฐเบงเบดเบ”, WiFi เบซเบผเบทเบชเบฐเบ–เบฒเบ™เบตเบ–เบฒเบ™ PON) เบ—เบตเปˆเบญเบธเบ›เบฐเบเบญเบ™เบœเบนเป‰เบˆเบญเบ‡เปเบกเปˆเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเบเบปเบ‡ "เบชเบฐเบเบฑเบ”" เบŠเบธเบ”เบ™เบตเป‰เปเบฅเบฐเบ›เปˆเบฝเบ™เบกเบฑเบ™, เปเบ™เบฐเบ™เปเบฒเบ—เบฒเบ‡เป€เบฅเบทเบญเบเป€เบžเบตเปˆเบกเป€เบ•เบตเบก Option 82 เปเบฅเบฐ Relay เบ•เบปเบงเปเบ—เบ™เบ—เบตเปˆเบขเบนเปˆ IP เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบกเบฑเบ™, เปเบฅเบฐเบชเบปเปˆเบ‡เบกเบฑเบ™เบ•เบทเปˆเบกเบญเบตเบ. เป€เบ„เบทเบญโ€‹เบ‚เปˆเบฒเบโ€‹.
  3. เป€เบŠเบตเบšเป€เบงเบต DHCP เบเบญเบกเบฎเบฑเบšเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป, เบชเป‰เบฒเบ‡เบ„เปเบฒเบ•เบญเบšเปเบฅเบฐเบชเบปเปˆเบ‡เบกเบฑเบ™เป„เบ›เบซเบฒเบญเบธเบ›เบฐเบเบญเบ™ relay
  4. เบญเบธเบ›เบฐเบเบญเบ™ relay เบชเบปเปˆเบ‡เบ•เปเปˆเบŠเบธเบ”เบเบฒเบ™เบ•เบญเบšเบชเบฐ เปœเบญเบ‡ เป„เบ›เบซเบฒเบญเบธเบ›เบฐเบเบญเบ™เบœเบนเป‰เบˆเบญเบ‡

เปเบ™เปˆเบ™เบญเบ™, เบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰เบ‡เปˆเบฒเบ; เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบญเบธเบ›เบฐเบเบญเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ•เบฒเบกเบ„เบงเบฒเบกเป€เบซเบกเบฒเบฐเบชเบปเบก.

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ FreeRadius

เปเบ™เปˆเบ™เบญเบ™, เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ FreeRadius, เปเบ•เปˆเบกเบฑเบ™เบเบฒเบเปเบฅเบฐเบšเปเปˆเบŠเบฑเบ”เป€เบˆเบ™ ... เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เป„เบ›เบšเปˆเบญเบ™เบ™เบฑเป‰เบ™เบซเบผเบฑเบ‡เบˆเบฒเบเป€เบ”เบทเบญเบ™ N เปเบฅเบฐ "เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบ." เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ‚เบฝเบ™เป‚เบกเบ”เบนเบ™เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบ‡เบชเปเบฒเบฅเบฑเบš FreeRadius เปƒเบ™ Python. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบญเบปเบฒเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เบˆเบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ MySQL. เบกเบฑเบ™เบšเปเปˆเบกเบตเบˆเบธเบ”เปƒเบ”เบ—เบตเปˆเบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เบกเบฑเบ™; เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ—เบธเบเบ„เบปเบ™เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™ "เบชเปเบฒเบฅเบฑเบšเบ•เบปเบ™เป€เบญเบ‡." เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบญเบปเบฒเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เบเบฑเบšเป‚เบกเบ”เบนเบ™ sql เบชเปเบฒเบฅเบฑเบš FreeRadius, เปเบฅเบฐเบ›เปˆเบฝเบ™เบกเบฑเบ™เป€เบฅเบฑเบเบ™เป‰เบญเบเป‚เบ”เบเบเบฒเบ™เป€เบžเบตเปˆเบกเบŠเปˆเบญเบ‡เปƒเบชเปˆ mac เปเบฅเบฐ port เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบˆเบญเบ‡เปเบ•เปˆเบฅเบฐเบ„เบปเบ™, เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ—เปเบฒเบญเบดเบ”, เบ•เบดเบ”เบ•เบฑเป‰เบ‡ FreeRadius:

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

เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ, เป€เบฅเบทเบญเบเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡:

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบˆเบฒเบ FreeRadius เบœเปˆเบฒเบ™ DHCP

เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเป‚เบกเบ”เบนเบ™ python (i.e. "เป€เบ›เบตเบ”" เบกเบฑเบ™):

ln -s /usr/local/etc/raddb/mods-available/python /usr/local/etc/raddb/mods-enabled

เปƒเบซเป‰เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบกเบ”เบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบชเปเบฒเบฅเบฑเบš python:

pip install mysql-connector

เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบกเบ”เบนเบ™ python เบชเปเบฒเบฅเบฑเบš FreeRadius, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฅเบฐเบšเบธเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบเบฒเบ™เบŠเบญเบเบซเบฒเป‚เบกเบ”เบนเบ™เปƒเบ™เบ•เบปเบงเปเบ› 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 เปเบฅเบฐเปƒเบชเปˆเบ„เปเบฒเบชเบฑเปˆเบ‡:

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']
>

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ™เบตเป‰, scripts เบ—เบตเปˆเบ‚เบฝเบ™เปƒเบ™ 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 เบ—เบตเปˆเป€เบเบปเปˆเบฒเปเบเปˆเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเป€เบ„เบตเบเปƒเบŠเป‰เบˆเบฒเบ "เปเบ‚เบ. "เป€เบ„เบทเบญเบ‚เปˆเบฒเบ. เบชเบดเปˆเบ‡เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเปเบกเปˆเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ script เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบ™เป‚เบŸเบ™เป€เบ”เบตเบ—เบตเปˆเป€เบ›เบตเบ”เปƒเบŠเป‰เป€เบงเบฑเบšเป„เบŠเบ—เปŒ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบˆเบฒเบ python script เบˆเบฐเบšเบดเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰. เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบกเบฑเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเป€เบญเบปเบฒเป„เบŸเบฅเปŒเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เปเบšเบšเบŸเบญเบก:

Default

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 utility. เบ•เบปเบงเบขเปˆเบฒเบ‡เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”:

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

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™