FreeRadius рд╕реЗ рдбреАрдПрдЪрд╕реАрдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕


рдпрд╣ рдХрд╛рд░реНрдп рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░реЛрдВ рдХреЛ рдЖрдИрдкреА рдПрдбреНрд░реЗрд╕ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛ рд╣реИред рдХрд╛рд░реНрдп рдХреА рд╕реНрдерд┐рддрд┐:

  • рд╣рдо рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕рд░реНрд╡рд░ рдирд╣реАрдВ рджреЗрдВрдЧреЗ - рдЖрдк рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдВрдЧреЗ;)
  • рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░реНрд╕ рдХреЛ рдбреАрдПрдЪрд╕реАрдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП
  • рдиреЗрдЯрд╡рд░реНрдХ рд╡рд┐рд╡рд┐рдз рд╣реИред рдпрд╣ PON рдЙрдкрдХрд░рдг рд╣реИ, рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рд╡рд┐рдХрд▓реНрдк 82 рдХреЗ рд╕рд╛рде рд╕рд╛рдзрд╛рд░рдг рд╕реНрд╡рд┐рдЪ рдФрд░ рдЕрдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╛рдИрдлрд╛рдИ рдЖрдзрд╛рд░
  • рдпрджрд┐ рдЖрдИрдкреА рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рддреЛ рдЖрдИрдкреА рдХреЛ "рдЕрддрд┐рдерд┐" рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдЬрд╛рд░реА рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ

рдЕрдЪреНрдЫреЗ рд╕реЗ: рдлреНрд░реАрдмреАрдПрд╕рдбреА рдкрд░ рдПрдХ рд╕рд░реНрд╡рд░ рд╣реИ рдЬреЛ "рдХрд╛рдо" рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ "рдмрд╣реБрдд рджреВрд░";) рд╣реИ, "рд╕реАрдзреЗ рдЗрд╕ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдирд╣реАрдВред"

рдПрдХ рдЕрджреНрднреБрдд рдорд┐рдХрд░реЛрдЯрд┐рдХ рдЙрдкрдХрд░рдг рднреА рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдиреЗрдЯрд╡рд░реНрдХ рдЖрд░реЗрдЦ рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:



рдереЛрдбрд╝рд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП FreeRadius рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдпреЛрдЬрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ: рдорд╛рдЗрдХреНрд░реЛрдХреЙрдЯрд┐рдХ рдкрд░ рд╣рдо рдбреАрдПрдЪрд╕реАрдкреА рд╕рд░реНрд╡рд░ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕реА рдкрд░ рдпрд╣ рд░реЗрдбрд┐рдпрд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИред рд╣рдо рдбреАрдПрдЪрд╕реАрдкреА рд╕рд░реНрд╡рд░ -> рд░реЗрдбрд┐рдпрд╕ рдХреНрд▓рд╛рдЗрдВрдЯ -> рд░реЗрдбрд┐рдпрд╕ рд╕рд░реНрд╡рд░ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред

рд▓рдЧрддрд╛ рд╣реИ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди! рд╢реИрддрд╛рди рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╣реИред рдЕрд░реНрдерд╛рддреН:

  • рдЬрдм PON OLT рдХреЛ рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдзрд┐рдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрдиреБрд░реЛрдз FreeRadius рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреЗ рд╕рд╛рде рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╣реЗрдб рд╕реНрдЯреЗрд╢рди рдХреЗ рдореИрдХ рдкрддреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИ, рдПрдЬреЗрдВрдЯ-рд╕рд░реНрдХрд┐рдЯ-рдЖрдИрдбреА PON рдУрдиреВ рдореИрдХ рдХреЗ рдмрд░рд╛рдмрд░ рдФрд░ рдПрдХ рдЦрд╛рд▓реА рдкрд╛рд╕рд╡рд░реНрдбред
  • рдЬрдм рд╡рд┐рдХрд▓реНрдк 82 рдХреЗ рд╕рд╛рде рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрдиреБрд░реЛрдз FreeRadius рдХреЗ рдкрд╛рд╕ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рдореИрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдмрд░рд╛рдмрд░ рдЦрд╛рд▓реА рдпреВрдЬрд░-рдиреЗрдо рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдЬреЗрдВрдЯ-рд╕рд░реНрдХрд┐рдЯ-рдЖрдИрдбреА рдФрд░ рдПрдЬреЗрдВрдЯ-рд░рд┐рдореЛрдЯ-рдЖрдИрдбреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд░рд┐рд▓реЗ рд╕реНрд╡рд┐рдЪ рдореИрдХ рдФрд░ рдкреЛрд░реНрдЯ рдХреНрд░рдорд╢рдГ рдЧреНрд░рд╛рд╣рдХ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред
  • рд╡рд╛рдИрдПрдлрдЖрдИ рдмрд┐рдВрджреБрдУрдВ рд╡рд╛рд▓реЗ рдХреБрдЫ рдЧреНрд░рд╛рд╣рдХ рдкреАрдПрдкреА-рд╕реАрдПрдЪрдПрдкреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдзрд┐рдХреГрдд рд╣реЛрддреЗ рд╣реИрдВ
  • WIFI рдмрд┐рдВрджреБрдУрдВ рд╡рд╛рд▓реЗ рдХреБрдЫ рдЧреНрд░рд╛рд╣рдХ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдмрд┐рдирд╛, WIFI рдмрд┐рдВрджреБ рдХреЗ рдореИрдХ рдкрддреЗ рдХреЗ рдмрд░рд╛рдмрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдирд╛рдо рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХреГрдд рд╣реЛрддреЗ рд╣реИрдВред

рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдкреГрд╖реНрдарднреВрдорд┐: рдбреАрдПрдЪрд╕реАрдкреА рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк 82 рдХреНрдпрд╛ рд╣реИ

рдбреАрдПрдЪрд╕реАрдкреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдпреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдПрдЬреЗрдВрдЯ-рд╕рд░реНрдХрд┐рдЯ-рдЖрдИрдбреА рдФрд░ рдПрдЬреЗрдВрдЯ-рд░рд┐рдореЛрдЯ-рдЖрдИрдбреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд░рд┐рд▓реЗ рд╕реНрд╡рд┐рдЪ рдХреЗ рдореИрдХ рдкрддреЗ рдФрд░ рдЙрд╕ рдкреЛрд░реНрдЯ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЧреНрд░рд╛рд╣рдХ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдкреАрдУрдПрди рдЙрдкрдХрд░рдг рдпрд╛ рд╡рд╛рдИрдлрд╝рд╛рдИ рдмреЗрд╕ рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдЬреЗрдВрдЯ-рд╕рд░реНрдХрд┐рдЯ-рдЖрдИрдбреА рдХреНрд╖реЗрддреНрд░ рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ (рдХреЛрдИ рдЧреНрд░рд╛рд╣рдХ рдкреЛрд░реНрдЯ рдирд╣реАрдВ рд╣реИ)ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдбреАрдПрдЪрд╕реАрдкреА рдХреА рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:



рдХрджрдо рд╕реЗ рдХрджрдо, рдпрд╣ рдпреЛрдЬрдирд╛ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддреА рд╣реИ:

  1. рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдЙрдкрдХрд░рдг рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕рд╛рд░рдг рдбреАрдПрдЪрд╕реАрдкреА рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ
  2. рдбрд┐рд╡рд╛рдЗрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрд╡рд┐рдЪ, рдПрдХ рд╡рд╛рдИрдлрд╛рдИ рдпрд╛ рдкреАрдУрдПрди рдмреЗрд╕ рд╕реНрдЯреЗрд╢рди) рдЬрд┐рд╕рдореЗрдВ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдЙрдкрдХрд░рдг рд╕реАрдзреЗ "рдЗрдВрдЯрд░рдХреЗрдЯ" рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдк рд╡рд┐рдХрд▓реНрдк 82 рдФрд░ рд░рд┐рд▓реЗ рдПрдЬреЗрдВрдЯ рдЖрдИрдкреА рдПрдбреНрд░реЗрд╕ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
  3. рдбреАрдПрдЪрд╕реАрдкреА рд╕рд░реНрд╡рд░ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд░рд┐рд▓реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рднреЗрдЬрддрд╛ рд╣реИ
  4. рд░рд┐рд▓реЗ рдбрд┐рд╡рд╛рдЗрд╕ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреИрдХреЗрдЯ рдХреЛ рдлреЙрд░рд╡рд░реНрдб рдХрд░рддрд╛ рд╣реИ

рддреЛ рдпрд╣ рд╕рдм рдмрд╕ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдЙрдкрдХрд░рдг рдХреЗ рдЙрдкрдпреБрдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

FreeRadius рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


FreeRadius рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдк рдпрд╣ рд╕рдм рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ ... рдЦрд╛рд╕рдХрд░ рдЬрдм рдЖрдк рдПрди рдорд╣реАрдиреЛрдВ рдХреЗ рдмрд╛рдж "рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ" рдореЗрдВ рд╕реНрдиреВрдк рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдкрд╛рдпрдерди рдореЗрдВ FreeRadius рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рд╣рдо MySQL рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд▓реЗрдВрдЧреЗред рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рд╡реИрд╕реЗ рднреА, рд╣рд░ рдХреЛрдИ рдЗрд╕реЗ "рдЦреБрдж рдХреЗ рд▓рд┐рдП" рдХрд░реЗрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ рдЙрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд▓рд┐рдпрд╛ рдЬреЛ FreeRadius рдХреЗ рд▓рд┐рдП sql рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ, рдФрд░ рд▓реЙрдЧрд┐рди рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП рдореИрдХ рдФрд░ рдкреЛрд░реНрдЯ рдлрд╝реАрд▓реНрдб рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред

рддреЛ, рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, FreeRadius рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

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

рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ, рд╣рдо рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ:



рд╣рдо рдЕрдЬрдЧрд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд┐рд╖реНрдгреБ рдмрдирд╛рддреЗ рд╣реИрдВ (рдпрд╛рдиреА, рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░реЗрдВ):

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

рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

 pip install mysql-connector 

FreeRadius рдХреЗ рд▓рд┐рдП рдЕрдЬрдЧрд░ рдореЙрдбреНрдпреВрд▓ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ, рдЖрдкрдХреЛ python_nath рдЪрд░ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдЦреЛрдЬ рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реИ:

 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} } 

рд╡рд░реНрдХрдлреНрд░реЗрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдФрд░ рдмрд╛рдХреА рд╕рднреА) рдХреЛ / usr / рд▓реЛрдХрд▓ / 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 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╕рд╛рдзрдиреЛрдВ рд╕реЗ рд╣рдо рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдЙрд╕рдХреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬреНрдЮрд╛рдд рдЧреНрд░рд╛рд╣рдХ рдореИрдХ рдкрддреЗ рдпрд╛ рд╡рд┐рдХрд▓реНрдк 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 рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░рддреЗ рд╕рдордп, рд░реЗрдбрдХреНрд▓рд╛рдЗрдВрдЯ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдзрд┐рдХрд░рдг:

 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 

рдореИрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ "рдФрджреНрдпреЛрдЧрд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди" рдкреИрдорд╛рдиреЗ рдкрд░ "рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд┐рдирд╛" рд╕рдорд╛рди рдпреЛрдЬрдирд╛ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдХрдо рд╕реЗ рдХрдо рд╣рдбрд╝рддрд╛рд▓реА:

  • рд╕рдВрднрд╡ "рдирдХрд▓реА" рдореИрдХ рдкрддреЗред рдпрд╣ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рджреЗрд╢реА рдореИрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрдВрдЧреА
  • рдЕрддрд┐рдерд┐ рдиреЗрдЯрд╡рд░реНрдХ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рд╕рднреА рдЖрд▓реЛрдЪрдирд╛рдУрдВ рд╕реЗ рдХрдо рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЪреЗрдХ рднреА рдирд╣реАрдВ рд╣реИ "рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕реЗ рдЖрдИрдкреА рдкрддреЗ рд╡рд╛рд▓реЗ рдЧреНрд░рд╛рд╣рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ?"

рдореЗрд░реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ "рдШреБрдЯрдиреЗ рдкрд░ рдПрдХ рд╕рдорд╛рдзрд╛рди" рд╣реИ, рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВред рдХрдбрд╝рд╛рдИ рд╕реЗ рдиреНрдпрд╛рдп рдирд╣реАрдВ рдХрд░рддреЗ;)

Source: https://habr.com/ru/post/hi446586/


All Articles