DHCP เดตเดดเดฟ FreeRadius-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ

DHCP เดตเดดเดฟ FreeRadius-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ
เดธเดฌเตโ€Œเดธเตโ€Œเด•เตเดฐเตˆเดฌเตผเดฎเดพเตผเด•เตเด•เต เดเดชเดฟ เดตเดฟเดฒเดพเดธเด™เตเด™เตพ เดจเตฝเด•เตเดจเตเดจเดคเต เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดŸเดพเดธเตโ€Œเด•เต เดŽเดคเตเดคเดฟ. เดชเตเดฐเดถเตเดจเดคเตเดคเดฟเดจเตเดฑเต† เดตเตเดฏเดตเดธเตเดฅเด•เตพ:

  • เด…เด‚เด—เต€เด•เดพเดฐเดคเตเดคเดฟเดจเดพเดฏเดฟ เดžเด™เตเด™เตพ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดธเต†เตผเดตเตผ เดจเตฝเด•เดฟเดฒเตเดฒ - เดจเดฟเด™เตเด™เตพ เด…เดคเต เดšเต†เดฏเตเดฏเตเด‚ ๐Ÿ˜‰
  • เดตเดฐเดฟเด•เตเด•เดพเตผเด•เตเด•เต DHCP เดตเดดเดฟ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ เดฒเดญเดฟเด•เตเด•เดฃเด‚
  • เดถเตƒเด‚เด–เดฒ เดตเตˆเดตเดฟเดงเตเดฏเดชเต‚เตผเดฃเตเดฃเดฎเดพเดฃเต. เด‡เดคเดฟเตฝ PON เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเตเด‚ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตโ€Œเดค เด“เดชเตโ€Œเดทเตป 82 เด‰เดณเตเดณ เดธเดพเดงเดพเดฐเดฃ เดธเตเดตเดฟเดšเตเดšเตเด•เดณเตเด‚ เดนเต‹เดŸเตเดŸเตโ€Œเดธเตโ€Œเดชเต‹เดŸเตเดŸเตเด•เดณเตเดณเตเดณ เดตเตˆเดซเตˆ เดฌเต‡เดธเตเด•เดณเตเด‚ เด‰เตพเดชเตเดชเต†เดŸเตเดจเตเดจเต.
  • เด’เดฐเต เดเดชเดฟ เดจเตฝเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดตเตเดฏเดตเดธเตเดฅเด•เตพเด•เตเด•เต เด•เต€เดดเดฟเตฝ เดกเดพเดฑเตเดฑ เดตเดฐเตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพ "เด…เดคเดฟเดฅเดฟ" เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เดเดชเดฟ เดจเตฝเด•เดฃเด‚.

เดจเดฒเตเดฒ เดตเดถเด‚: "เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป" เด•เดดเดฟเดฏเตเดจเตเดจ เด’เดฐเต เดธเต†เตผเดตเตผ เดซเตเดฐเต€เดฌเดฟเดŽเดธเตเดกเดฟเดฏเดฟเตฝ เด‡เดชเตเดชเต‹เดดเตเด‚ เด‰เดฃเตเดŸเต, เดชเด•เตเดทเต‡ เด…เดคเต "เดฆเต‚เดฐเต†เดฏเดพเดฃเต" ;), "เดˆ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดฟเตฝ เดคเดจเตเดจเต†" เด…เดฒเตเดฒ.

Mikrotik เดŽเดจเตเดจ เด…เดคเตเดญเตเดคเด•เดฐเดฎเดพเดฏ เด‰เดชเด•เดฐเดฃเดตเตเดฎเตเดฃเตเดŸเต. เดชเตŠเดคเตเดตเดพเดฏ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เดกเดฏเด—เตเดฐเด‚ เด‡เดคเตเดชเต‹เดฒเต†เดฏเดพเดฃเต:

DHCP เดตเดดเดฟ FreeRadius-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ

เด•เตเดฑเดšเตเดšเต เด†เดฒเต‹เดšเดฟเดšเตเดš เดถเต‡เดทเด‚, เดธเดฌเตโ€Œเดธเตโ€Œเด•เตเดฐเตˆเดฌเตผเดฎเดพเตผเด•เตเด•เต เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ เดจเตฝเด•เตเดจเตเดจเดคเดฟเดจเต FreeRadius เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต. เดคเดคเตเดตเดคเตเดคเดฟเตฝ, เดธเตเด•เต€เด‚ เดธเดพเดงเดพเดฐเดฃเดฎเดพเดฃเต: เดžเด™เตเด™เตพ เดฎเตˆเด•เตเดฐเต‹เดŸเดฟเด•เตเด•เดฟเตฝ DHCP เดธเต†เตผเดตเดฑเตเด‚ เด…เดคเดฟเตฝ เดฑเต‡เดกเดฟเดฏเดธเต เด•เตเดฒเดฏเดจเตเดฑเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เตเดจเตเดจเต. เดžเด™เตเด™เตพ DHCP เดธเต†เตผเดตเตผ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเต -> เดฑเต‡เดกเดฟเดฏเดธเต เด•เตเดฒเดฏเดจเตเดฑเต -> เดฑเต‡เดกเดฟเดฏเดธเต เดธเต†เตผเดตเตผ เด•เดฃเด•เตเดทเตป.

เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเดณเตเดณเดคเดพเดฏเดฟ เดคเต‹เดจเตเดจเตเดจเตเดจเดฟเดฒเตเดฒ. เดชเด•เตเดทเต‡! เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เดณเดฟเตฝ เดชเดฟเดถเดพเดšเต เด‰เดฃเตเดŸเต. เด…เดคเดพเดฏเดคเต:

  • เดˆ เดธเตโ€Œเด•เต€เด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต PON OLT-เดจเต เด…เด‚เด—เต€เด•เดพเดฐเด‚ เดจเตฝเด•เตเดฎเตเดชเต‹เตพ, เดนเต†เดกเตโ€Œเดกเต†เตปเดกเดฟเดจเตเดฑเต† MAC เดตเดฟเดฒเดพเดธเดคเตเดคเดฟเดจเต เดคเตเดฒเตเดฏเดฎเดพเดฏ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดจเดพเดฎเดตเตเด‚ MAC PON Onu-เดจเต เดคเตเดฒเตเดฏเดฎเดพเดฏ เด’เดฐเต เดเดœเดจเตเดฑเต-เดธเตผเด•เตเดฏเต‚เดŸเตเดŸเต-เดเดกเดฟเดฏเตเด‚ เด’เดฐเต เดถเต‚เดจเตเดฏเดฎเดพเดฏ เดชเดพเดธเตโ€Œเดตเต‡เดกเตเด‚ เด‰เดณเตเดณ เด’เดฐเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ FreeRadius-เดฒเต‡เด•เตเด•เต เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต.
  • เด“เดชเตเดทเตป 82 เด‰เดณเตเดณ เดธเตเดตเดฟเดšเตเดšเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด…เดงเดฟเด•เดพเดฐเดชเตเดชเต†เดŸเตเดคเตเดคเตเดฎเตเดชเต‹เตพ, FreeRadius-เดจเต เดตเดฐเดฟเด•เตเด•เดพเดฐเดจเตเดฑเต† เด‰เดชเด•เดฐเดฃเดคเตเดคเดฟเดจเตเดฑเต† MAC-เดจเต เดคเตเดฒเตเดฏเดฎเดพเดฏ เด’เดฐเต เดถเต‚เดจเตเดฏเดฎเดพเดฏ เด‰เดชเดฏเต‹เด•เตเดคเตƒ-เดจเดพเดฎเด‚ เด‰เดณเตเดณ เด’เดฐเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดฏเดฅเดพเด•เตเดฐเดฎเด‚ Agent-Circuit-Id, Agent-Remote-Id เดŽเดจเตเดจเดฟเดต เด…เดŸเด™เตเด™เตเดจเตเดจ เด…เดงเดฟเด• เด†เดŸเตเดฐเดฟเดฌเตเดฏเต‚เดŸเตเดŸเตเด•เตพ เดจเดฟเดฑเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เดตเต€เดฃเตเดŸเตเด‚ MAC-เดจเตเดฑเต† MAC เดฑเดฟเดฒเต‡ เดธเตเดตเดฟเดšเตเดšเต, เดตเดฐเดฟเด•เตเด•เดพเดฐเดจเต† เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดชเต‹เตผเดŸเตเดŸเต.
  • เดตเตˆเดซเตˆ เดชเต‹เดฏเดฟเดจเตเดฑเตเด•เดณเตเดณเตเดณ เดšเดฟเดฒ เดธเดฌเตโ€Œเดธเตโ€Œเด•เตเดฐเตˆเดฌเตผเดฎเดพเตผ PAP-CHAP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเตเด•เตพ เดตเดดเดฟ เด…เด‚เด—เต€เด•เดฐเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต
  • WIFI เดชเต‹เดฏเดฟเดจเตเดฑเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดšเดฟเดฒ เดธเดฌเตโ€Œเดธเตโ€Œเด•เตเดฐเตˆเดฌเตผเดฎเดพเตผ เดชเดพเดธเตโ€Œเดตเต‡เดกเต เด‡เดฒเตเดฒเดพเดคเต†, WIFI เดชเต‹เดฏเดฟเดจเตเดฑเดฟเดจเตเดฑเต† MAC เดตเดฟเดฒเดพเดธเดคเตเดคเดฟเดจเต เดคเตเดฒเตเดฏเดฎเดพเดฏ เด’เดฐเต เด‰เดชเดฏเต‹เด•เตเดคเตƒ-เดจเดพเดฎเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เด‚เด—เต€เด•เดฐเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เดšเดฐเดฟเดคเตเดฐ เดชเดถเตเดšเดพเดคเตเดคเดฒเด‚: เดŽเดจเตเดคเดพเดฃเต เดกเดฟเดŽเดšเตเดšเตเดธเดฟเดชเดฟเดฏเดฟเดฒเต† "เด“เดชเตเดทเตป 82"

เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดตเดฐเด™เตเด™เตพ เด•เตˆเดฎเดพเดฑเดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ DHCP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเดจเดพเดฏเตเดณเตเดณ เด…เดงเดฟเด• เด“เดชเตเดทเดจเตเด•เดณเดพเดฃเดฟเดคเต, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดเดœเดจเตเดฑเต-เดธเตผเด•เตเดฏเต‚เดŸเตเดŸเต-เดเดกเดฟ, เดเดœเดจเตเดฑเต-เดฑเดฟเดฎเต‹เดŸเตเดŸเต-เดเดกเดฟ เดซเต€เตฝเดกเตเด•เดณเดฟเตฝ. เดฑเดฟเดฒเต‡ เดธเตเดตเดฟเดšเตเดšเดฟเดจเตเดฑเต† MAC เดตเดฟเดฒเดพเดธเดตเตเด‚ เดธเดฌเตโ€Œเดธเตโ€Œเด•เตเดฐเตˆเดฌเตผ เด•เดฃเด•เตเดฑเตเดฑเตเดšเต†เดฏเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดชเต‹เตผเดŸเตเดŸเตเด‚ เด•เตˆเดฎเดพเดฑเดพเตป เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. PON เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเตเดŸเต†เดฏเต‹ เดตเตˆเดซเตˆ เดฌเต‡เดธเต เดธเตเดฑเตเดฑเต‡เดทเดจเตเด•เดณเตเดŸเต†เดฏเต‹ เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดเดœเดจเตเดฑเต-เดธเตผเด•เตเดฏเต‚เดŸเตเดŸเต-เดเดกเดฟ เดซเต€เตฝเดกเดฟเตฝ เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเดฏ เดตเดฟเดตเดฐเด™เตเด™เตพ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒ (เดธเดฌเตโ€Œเดธเตโ€Œเด•เตเดฐเตˆเดฌเตผ เดชเต‹เตผเดŸเตเดŸเต เด‡เดฒเตเดฒ). เดˆ เด•เต‡เดธเดฟเตฝ DHCP เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเตเดฑเต† เดชเตŠเดคเต เดธเตเด•เต€เด‚ เด‡เดชเตเดฐเด•เดพเดฐเดฎเดพเดฃเต:

DHCP เดตเดดเดฟ FreeRadius-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ

เด˜เดŸเตเดŸเด‚ เด˜เดŸเตเดŸเดฎเดพเดฏเดฟ เดˆ เดธเตเด•เต€เด‚ เด‡เดคเตเดชเต‹เดฒเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต:

  1. เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด‰เดชเดฏเต‹เด•เตเดคเตƒ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เด’เดฐเต DHCP เดชเตเดฐเด•เตเดทเต‡เดชเดฃ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดจเดŸเดคเตเดคเตเดจเตเดจเต
  2. เดธเดฌเตโ€Œเดธเตโ€Œเด•เตเดฐเตˆเดฌเตผ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดจเต‡เดฐเดฟเดŸเตเดŸเต เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด‰เดชเด•เดฐเดฃเด‚ (เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด’เดฐเต เดธเตเดตเดฟเดšเตเดšเต, เดตเตˆเดซเตˆ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ PON เดฌเต‡เดธเต เดธเตเดฑเตเดฑเต‡เดทเตป) เดˆ เดชเดพเด•เตเด•เดฑเตเดฑเดฟเดจเต† "เดคเดŸเดžเตเดžเต" เดฎเดพเดฑเตเดฑเตเด•เดฏเตเด‚, เด…เดงเดฟเด• เด“เดชเตเดทเดจเตเด•เตพ เด“เดชเตโ€Œเดทเตป 82, เดฑเดฟเดฒเต‡ เดเดœเดจเตเดฑเต เดเดชเดฟ เดตเดฟเดฒเดพเดธเด‚ เดŽเดจเตเดจเดฟเดต เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด…เดคเต เด•เต‚เดŸเตเดคเตฝ เด•เตˆเดฎเดพเดฑเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดถเตƒเด‚เด–เดฒ.
  3. DHCP เดธเต†เตผเดตเตผ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด’เดฐเต เดชเตเดฐเดคเดฟเด•เดฐเดฃเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดฑเดฟเดฒเต‡ เด‰เดชเด•เดฐเดฃเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เด…เดฏเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต
  4. เดฑเดฟเดฒเต‡ เด‰เดชเด•เดฐเดฃเด‚ เดชเตเดฐเดคเดฟเด•เดฐเดฃ เดชเดพเด•เตเด•เดฑเตเดฑเต เดธเดฌเตโ€Œเดธเตโ€Œเด•เตเดฐเตˆเดฌเตผ เด‰เดชเด•เดฐเดฃเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เด•เตˆเดฎเดพเดฑเตเดจเตเดจเต

เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เดŽเดฒเตเดฒเดพเด‚ เด…เดคเตเดฐ เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดฟเดฒเตเดฒ; เด…เดคเดฟเดจเดจเตเดธเดฐเดฟเดšเตเดšเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

FreeRadius เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เดซเตเดฐเต€เดฑเต‡เดกเดฟเดฏเดธเต เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด‡เดคเต เดจเต‡เดŸเดพเดจเดพเด•เตเด‚, เดชเด•เตเดทเต‡ เด‡เดคเต เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเดณเตเดณเดคเตเด‚ เด…เดตเตเดฏเด•เตเดคเดตเตเดฎเดพเดฃเต... เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเตเด‚ เดจเดฟเด™เตเด™เตพ N เดฎเดพเดธเด™เตเด™เตพเด•เตเด•เต เดถเต‡เดทเด‚ เด…เดตเดฟเดŸเต† เดชเต‹เด•เตเดฎเตเดชเต‹เตพ "เดŽเดฒเตเดฒเดพเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต." เด…เดคเดฟเดจเดพเตฝ, เดชเตˆเดคเตเดคเดฃเดฟเตฝ FreeRadius-เดจเดพเดฏเดฟ เดžเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เด…เด‚เด—เต€เด•เดพเดฐ เดฎเตŠเดกเตเดฏเต‚เตพ เดŽเดดเตเดคเดพเตป เดžเด™เตเด™เตพ เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต. MySQL เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดจเดฟเดจเตเดจเต เดžเด™เตเด™เตพ เด…เด‚เด—เต€เด•เดพเดฐ เดกเดพเดฑเตเดฑ เดŽเดŸเตเด•เตเด•เตเด‚. เด…เดคเดฟเดจเตเดฑเต† เด˜เดŸเดจ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เด…เตผเดคเตเดฅเดฎเดฟเดฒเตเดฒ; เดŽเดจเตเดคเดพเดฏเดพเดฒเตเด‚, เดŽเดฒเตเดฒเดพเดตเดฐเตเด‚ เด…เดคเต "เดคเด™เตเด™เตพเด•เตเด•เตเดตเต‡เดฃเตเดŸเดฟ" เด‰เดฃเตเดŸเดพเด•เตเด•เตเด‚. เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเตเด‚, เดซเตเดฐเต€เดฑเต‡เดกเดฟเดฏเดธเดฟเดจเดพเดฏเดฟ sql เดฎเตŠเดกเตเดฏเต‚เดณเดฟเดจเตŠเดชเตเดชเด‚ เดตเดพเด—เตเดฆเดพเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจ เด˜เดŸเดจ เดžเดพเตป เดŽเดŸเตเดคเตเดคเต, เดฒเต‹เด—เดฟเตป-เดชเดพเดธเตโ€Œเดตเต‡เดกเดฟเดจเต เดชเตเดฑเดฎเต† เด“เดฐเต‹ เดตเดฐเดฟเด•เตเด•เดพเดฐเดจเตเด‚ เด’เดฐเต เดฎเดพเด•เต, เดชเต‹เตผเดŸเตเดŸเต เดซเต€เตฝเดกเต เดŽเดจเตเดจเดฟเดต เดšเต‡เตผเดคเตเดคเต เดšเต†เดฑเตเดคเดพเดฏเดฟ เดฎเดพเดฑเตเดฑเดฟ.

เด…เดคเดฟเดจเดพเตฝ, เด†เดฆเตเดฏเด‚ FreeRadius เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด•:

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

เดชเตˆเดคเตเดคเดฃเดฟเดจเดพเดฏเดฟ เดจเดฎเตเด•เตเด•เต เด’เดฐเต เด…เดงเดฟเด• เดฎเตŠเดกเตเดฏเต‚เตพ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเด‚:

pip install mysql-connector

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"

เดชเตˆเดคเตเดคเตบ เด‡เดจเตเดฑเตผเดชเตเดฐเต†เดฑเตเดฑเตผ เดธเดฎเดพเดฐเด‚เดญเดฟเดšเตเดšเต เด•เดฎเดพเตปเดกเตเด•เตพ เดจเตฝเด•เดฟ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเดพเดคเด•เตพ เด•เดฃเตเดŸเต†เดคเตเดคเดพเดจเดพเด•เตเด‚:

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

เดจเดฟเด™เตเด™เตพ เดˆ เดจเดŸเดชเดŸเดฟ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดชเตˆเดคเตเดคเดฃเดฟเตฝ เดŽเดดเตเดคเดฟเดฏเดคเตเด‚ 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 เด•เต‹เดฎเตเดชเดฟเดจเต‡เดทเตป เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดžเด™เตเด™เตพ เดตเดฐเดฟเด•เตเด•เดพเดฐเดจเต† เดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดฏเดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, โ€œเด…เดคเดฟเดฅเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เด‡เดคเตเดตเดฐเต† เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดคเดฟเตฝ เดตเดšเตเดšเต เดเดฑเตเดฑเดตเตเด‚ เดชเดดเดฏ เดเดชเดฟ เดตเดฟเดฒเดพเดธเด‚ เดžเด™เตเด™เตพ เดจเตฝเด•เตเด‚. โ€ เดถเตƒเด‚เด–เดฒ. เดธเตˆเดฑเตเดฑเตเด•เตพ เดชเตเดฐเดพเดชเตโ€Œเดคเดฎเดพเด•เตเด•เดฟเดฏ เดซเต‹เตพเดกเดฑเดฟเตฝ เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟ เดธเตโ€Œเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเด• เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเดคเต, เด…เด™เตเด™เดจเต† เดชเตˆเดคเตเดคเตบ เดธเตโ€Œเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด†เดตเดถเตเดฏเดฎเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดจเดฟเดฏเตเด•เตเดค เดจเดฟเดฎเดฟเดทเด™เตเด™เดณเดฟเตฝ เดŸเตเดตเดฟเดšเตเดšเต เดšเต†เดฏเตเดฏเตเด‚. เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เดซเดฏเตฝ เดซเต‹เดฎเดฟเดฒเต‡เด•เตเด•เต เด•เตŠเดฃเตเดŸเตเดตเดจเตเดจเดพเตฝ เดฎเดคเดฟ:

เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟ

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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•