DHCP рдорд╛рд░реНрдлрдд FreeRadius рдмрд╛рдЯ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯрд┐рдЩрд╣рд░реВ

DHCP рдорд╛рд░реНрдлрдд FreeRadius рдмрд╛рдЯ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯрд┐рдЩрд╣рд░реВ
рдЧреНрд░рд╛рд╣рдХрд╣рд░реВрд▓рд╛рдИ рдЖрдИрдкреА рдареЗрдЧрд╛рдирд╛рд╣рд░реВ рдЬрд╛рд░реА рдЧрд░реНрдиреЗ рд╡реНрдпрд╡рд╕реНрдерд╛ рдЧрд░реНрди рдХрд╛рд░реНрдп рдЖрдЗрдкреБрдЧреНрдпреЛред рд╕рдорд╕реНрдпрд╛рдХреЛ рдЕрд╡рд╕реНрдерд╛:

  • рд╣рд╛рдореА рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкреНрд░рд╛рдзрд┐рдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рдЫреБрдЯреНрдЯреИ рд╕рд░реНрднрд░ рджрд┐рдиреЗрдЫреИрдиреМрдВ - рддрдкрд╛рдИрдВрд▓реЗ рдЧрд░реНрдиреБрд╣реБрдиреЗрдЫ ЁЯШЙ
  • рд╕рджрд╕реНрдпрд╣рд░реВрд▓реЗ DHCP рдорд╛рд░реНрдлрдд рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯрд┐рдЩрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрдкрд░реНрдЫ
  • рдиреЗрдЯрд╡рд░реНрдХ рд╡рд┐рд╖рдо рдЫред рдпрд╕рдорд╛ PON рдЙрдкрдХрд░рдгрд╣рд░реВ рд░ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рд╡рд┐рдХрд▓реНрдк 82 рд╕рдБрдЧ рдирд┐рдпрдорд┐рдд рд╕реНрд╡рд┐рдЪрд╣рд░реВ рд░ рд╣рдЯрд╕реНрдкрдЯрд╣рд░реВ рднрдПрдХрд╛ WiFi рдЖрдзрд╛рд░рд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЫрдиреНред
  • рдпрджрд┐ рдбрд╛рдЯрд╛ рдЖрдИрдкреА рдЬрд╛рд░реА рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдХреБрдиреИ рдкрдирд┐ рд╕рд░реНрддрд╣рд░реВрдорд╛ рдкрд░реНрджреИрди рднрдиреЗ, рддрдкрд╛рдИрдВрд▓реЗ "рдЕрддрд┐рдерд┐" рдиреЗрдЯрд╡рд░реНрдХрдмрд╛рдЯ рдЖрдИрдкреА рдЬрд╛рд░реА рдЧрд░реНрдиреБрдкрд░реНрдЫред

рд░рд╛рдореНрд░реЛ рдкрдХреНрд╖рдорд╛: рддреНрдпрд╣рд╛рдБ рдЕрдЭреИ рдкрдирд┐ FreeBSD рдорд╛ рдПрдХ рд╕рд░реНрднрд░ рдЫ рдЬрд╕рд▓реЗ "рдХрд╛рдо" рдЧрд░реНрди рд╕рдХреНрдЫ, рддрд░ рдпреЛ "рдзреЗрд░реИ рдЯрд╛рдврд╛" рдЫ;), "рдпрд╕ рдиреЗрдЯрд╡рд░реНрдХрдорд╛ рд╕рд╣реА" рд╣реЛрдЗрдиред

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

DHCP рдорд╛рд░реНрдлрдд FreeRadius рдмрд╛рдЯ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯрд┐рдЩрд╣рд░реВ

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

рдЧрд╛рд╣реНрд░реЛ рд▓рд╛рдЧреНрджреИрдиред рддрд░! рд╢реИрддрд╛рди рд╡рд┐рд╡рд░рдгрдорд╛ рдЫред рдЕрд░реНрдерд╛рддреН:

  • рдпреЛ рдпреЛрдЬрдирд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ PON OLT рд▓рд╛рдИ рдЕрдзрд┐рдХрд╛рд░ рджрд┐рдВрджрд╛, рд╣реЗрдбрдПрдиреНрдбрдХреЛ MAC рдареЗрдЧрд╛рдирд╛ рдмрд░рд╛рдмрд░рдХреЛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛-рдирд╛рдо, MAC PON Onu рдмрд░рд╛рдмрд░рдХреЛ Agent-Circuit-Id рд░ рдПрдЙрдЯрд╛ рдЦрд╛рд▓реА рдкрд╛рд╕рд╡рд░реНрдб рд╕рд╣рд┐рдд FreeRadius рдорд╛ рдЕрдиреБрд░реЛрдз рдкрдард╛рдЗрдиреНрдЫред
  • рд╡рд┐рдХрд▓реНрдк 82 рдХреЛ рд╕рд╛рде рд╕реНрд╡рд┐рдЪрд╣рд░реВрдмрд╛рдЯ рдЕрдзрд┐рдХрд╛рд░ рджрд┐рдВрджрд╛, FreeRadius рд▓реЗ рдЧреНрд░рд╛рд╣рдХрдХреЛ рдпрдиреНрддреНрд░рдХреЛ MAC рдмрд░рд╛рдмрд░рдХреЛ рдЦрд╛рд▓реА рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛-рдирд╛рдордХреЛ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджрдЫ рд░ рдердк рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВ Agent-Circuit-Id рд░ Agent-Remote-Id рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ, рдХреНрд░рдорд╢рдГ рдлреЗрд░рд┐ MAC рдХреЛред рд░рд┐рд▓реЗ рд╕реНрд╡рд┐рдЪ рд░ рдкреЛрд░реНрдЯ рдЬрд╕рдорд╛ рдЧреНрд░рд╛рд╣рдХ рдЬреЛрдбрд┐рдПрдХреЛ рдЫред
  • рд╡рд╛рдЗрдлрд╛рдЗ рдкреЛрдЗрдиреНрдЯ рднрдПрдХрд╛ рдХреЗрд╣реА рд╕рджрд╕реНрдпрд╣рд░реВ PAP-CHAP рдкреНрд░реЛрдЯреЛрдХрд▓рд╣рд░реВ рдорд╛рд░реНрдлрдд рдЕрдзрд┐рдХреГрдд рд╣реБрдиреНрдЫрдиреН
  • WIFI рдкреЛрдЗрдиреНрдЯрд╣рд░реВрдХрд╛ рдХреЗрд╣реА рд╕рджрд╕реНрдпрд╣рд░реВрд▓рд╛рдИ рдкрд╛рд╕рд╡рд░реНрдб рдмрд┐рдирд╛ WIFI рдкреЛрдЗрдиреНрдЯрдХреЛ MAC рдареЗрдЧрд╛рдирд╛ рдмрд░рд╛рдмрд░рдХреЛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛-рдирд╛рдордХреЛ рд╕рд╛рде рдЕрдзрд┐рдХреГрдд рдЧрд░рд┐рдиреНрдЫред

рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдкреГрд╖реНрдарднреВрдорд┐: DHCP рдорд╛ "рд╡рд┐рдХрд▓реНрдк 82" рдХреЗ рд╣реЛ

рдпреА DHCP рдкреНрд░реЛрдЯреЛрдХрд▓рдХрд╛ рд▓рд╛рдЧрд┐ рдердк рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рд╣реБрдиреН рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдердк рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ рдПрдЬреЗрдиреНрдЯ-рд╕рд░реНрдХрд┐рдЯ-рдЖрдИрдбреА рд░ рдПрдЬреЗрдиреНрдЯ-рд░рд┐рдореЛрдЯ-рдЖрдИрдбреА рдлрд┐рд▓реНрдбрд╣рд░реВрдорд╛ред рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рд░рд┐рд▓реЗ рд╕реНрд╡рд┐рдЪрдХреЛ MAC рдареЗрдЧрд╛рдирд╛ рд░ рдЧреНрд░рд╛рд╣рдХ рдЬрдбрд╛рди рднрдПрдХреЛ рдкреЛрд░реНрдЯ рдкреНрд░рд╕рд╛рд░рдг рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред PON рдЙрдкрдХрд░рдг рд╡рд╛ WIFI рдЖрдзрд╛рд░ рд╕реНрдЯреЗрд╢рдирд╣рд░реВрдХреЛ рдорд╛рдорд▓рд╛рдорд╛, Agent-Circuit-Id рдлрд┐рд▓реНрдбрд▓реЗ рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджреИрди (рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдЧреНрд░рд╛рд╣рдХ рдкреЛрд░реНрдЯ рдЫреИрди)ред рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ DHCP рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЫ:

DHCP рдорд╛рд░реНрдлрдд FreeRadius рдмрд╛рдЯ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯрд┐рдЩрд╣рд░реВ

рдЪрд░рдг-рджрд░-рдЪрд░рдг рдпреЛ рдпреЛрдЬрдирд╛ рдпрд╕рд░реА рдХрд╛рдо рдЧрд░реНрджрдЫ:

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

рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рдпреЛ рд╕рдмреИ рд╕рдЬрд┐рд▓реИ рдХрд╛рдо рдЧрд░реНрджреИрди; рддрдкрд╛рдИрдВрд▓реЗ рдЖрдлреНрдиреЛ рдиреЗрдЯрд╡рд░реНрдХ рдЙрдкрдХрд░рдг рддрджрдиреБрд╕рд╛рд░ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

FreeRadius рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджреИ

рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рдпреЛ FreeRadius рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╕реЗрдЯрд┐рдЩрд╣рд░реВрд╕рдБрдЧ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рддрд░ рдпреЛ рдЧрд╛рд╣реНрд░реЛ рд░ рдЕрд╕реНрдкрд╖реНрдЯ рдЫ... рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдЬрдм рддрдкрд╛рдИрдВ N рдорд╣рд┐рдирд╛ рдкрдЫрд┐ рддреНрдпрд╣рд╛рдБ рдЬрд╛рдиреБрд╣реБрдиреНрдЫ рд░ "рд╕рдмреИ рдХрд╛рдо рдЧрд░реНрджрдЫред" рддрд╕рд░реНрде, рд╣рд╛рдореАрд▓реЗ Python рдорд╛ FreeRadius рдХреЛ рд▓рд╛рдЧреА рд╣рд╛рдореНрд░реЛ рдЖрдлреНрдиреИ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдореЛрдбреНрдпреБрд▓ рд▓реЗрдЦреНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдпреМрдВред рд╣рд╛рдореА MySQL рдбрд╛рдЯрд╛рдмреЗрд╕рдмрд╛рдЯ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдбрд╛рдЯрд╛ рд▓рд┐рдиреЗрдЫреМрдВред рдпрд╕рдХреЛ рд╕рдВрд░рдЪрдирд╛ рд╡рд░реНрдгрди рдЧрд░реНрдиреБрдХреЛ рдХреБрдиреИ рдЕрд░реНрде рдЫреИрди; рдЬреЗ рд╣реЛрд╕реН, рд╕рдмреИрд▓реЗ рдпрд╕рд▓рд╛рдИ "рдЖрдлреНрдиреЛ рд▓рд╛рдЧрд┐" рдмрдирд╛рдЙрдиреЗрдЫрдиреНред рд╡рд┐рд╢реЗрд╖ рдЧрд░реА, рдореИрд▓реЗ FreeRadius рдХреЛ рд▓рд╛рдЧрд┐ 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 рджрд░реНрддрд╛ рдЧрд░реНрди рдкрд░реНрдпрд╛рдкреНрдд рдЫ рд░ рддреНрдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рд╣реБрдиреЗрдЫ
  • рдЕрддрд┐рдерд┐ рдиреЗрдЯрд╡рд░реНрдХ рдЬрд╛рд░реА рдЧрд░реНрдиреЗ рддрд░реНрдХ рдЖрд▓реЛрдЪрдирд╛ рдмрд╛рд╣рд┐рд░ рдЫред рддреНрдпрд╣рд╛рдБ рдЬрд╛рдБрдЪ рдкрдирд┐ рдЫреИрди "рд╣реБрдирд╕рдХреНрдЫ рддреНрдпрд╣рд╛рдБ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕рдорд╛рди рдЖрдИрдкреА рдареЗрдЧрд╛рдирд╛ рднрдПрдХрд╛ рдЧреНрд░рд╛рд╣рдХрд╣рд░реВ рдЫрдиреН?"

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

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди