
āĻāĻžāĻāĻāĻŋ āĻā§āϰāĻžāĻšāĻāĻĻā§āϰ āĻāĻāĻĒāĻŋ āĻ āĻŋāĻāĻžāύāĻž āĻĒā§āϰāĻĻāĻžāύā§āϰ āĻŦā§āϝāĻŦāϏā§āĻĨāĻž āĻāϰāĻžāϰ āĻāύā§āϝ āĻĒā§āĻāĻā§āĻā§āĨ¤ āϏāĻŽāϏā§āϝāĻžāϰ āĻļāϰā§āϤ:
- āĻ āύā§āĻŽā§āĻĻāύā§āϰ āĻāύā§āϝ āĻāĻŽāϰāĻž āĻāĻĒāύāĻžāĻā§ āĻāϞāĻžāĻĻāĻž āϏāĻžāϰā§āĻāĻžāϰ āĻĻā§āĻŦ āύāĻž - āĻāĻĒāύāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύ đ
- āĻā§āϰāĻžāĻšāĻāĻĻā§āϰ āĻ āĻŦāĻļā§āϝāĻ DHCP āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āϏā§āĻāĻŋāĻāϏ āĻā§āϰāĻšāĻŖ āĻāϰāϤ⧠āĻšāĻŦā§
- āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻāĻāĻŋ āĻāĻŋāύā§āύāϧāϰā§āĻŽā§āĨ¤ āĻāϰ āĻŽāϧā§āϝ⧠āϰāϝāĻŧā§āĻā§ PON āϏāϰāĻā§āĻāĻžāĻŽ āĻāĻŦāĻ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰāĻž āĻŦāĻŋāĻāϞā§āĻĒ 82 āϏāĻš āύāĻŋāϝāĻŧāĻŽāĻŋāϤ āϏā§āĻāĻ āĻāĻŦāĻ āĻšāĻāϏā§āĻĒāĻ āϏāĻš āĻāϝāĻŧāĻžāĻāĻĢāĻžāĻ āĻŦā§āϏ
- āϝāĻĻāĻŋ āĻĄā§āĻāĻž āĻāĻāĻĒāĻŋ āĻāϏā§āϝ⧠āĻāϰāĻžāϰ āĻāύā§āϝ āĻā§āύāĻ āĻļāϰā§āϤā§āϰ āĻ āϧā§āύ⧠āύāĻž āĻĒāĻĄāĻŧā§ āϤāĻŦā§ āĻāĻĒāύāĻžāĻā§ āĻ āĻŦāĻļā§āϝāĻ "āĻ āϤāĻŋāĻĨāĻŋ" āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻāĻāĻĒāĻŋ āĻāϏā§āϝ⧠āĻāϰāϤ⧠āĻšāĻŦā§
āĻāϤāĻŋāĻŦāĻžāĻāĻ āĻĻāĻŋāĻ āĻšāϞā§: āĻāĻŋāĻā§ āĻāĻā§ āϏāĻžāϰā§āĻāĻžāϰ FreeBSD-āϤā§, āϝā§āĻāĻž âāĻāĻžāĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§â, āĻāĻŋāύā§āϤ⧠āϏā§āĻāĻž âāĻ
āύā§āĻ āĻĻā§āϰā§â ;), âāĻ āĻŋāĻ āĻāĻ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻā§â āύāϝāĻŧāĨ¤
Mikrotik āύāĻžāĻŽā§ āĻāĻāĻāĻŋ āĻŦāĻŋāϏā§āĻŽāϝāĻŧāĻāϰ āϝāύā§āϤā§āϰāĻ āϰāϝāĻŧā§āĻā§āĨ¤ āϏāĻžāϧāĻžāϰāĻŖ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻāĻŋāϤā§āϰāĻāĻŋ āĻāϰāĻāĻŽ āĻāĻŋāĻā§:

āĻāĻŋāĻā§ āĻāĻŋāύā§āϤāĻž āĻāϰāĻžāϰ āĻĒāϰā§, āĻā§āϰāĻžāĻšāĻāĻĻā§āϰ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āϏā§āĻāĻŋāĻāϏ āĻāϏā§āϝ⧠āĻāϰāϤ⧠FreeRadius āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύā§āĻāϝāĻŧāĻž āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤ āύā§āϤāĻŋāĻāϤāĻāĻžāĻŦā§, āϏā§āĻāĻŋāĻŽāĻāĻŋ āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ: āĻāĻŽāϰāĻž āĻŽāĻžāĻāĻā§āϰā§āĻāĻŋāĻā§ DHCP āϏāĻžāϰā§āĻāĻžāϰ āĻāĻŦāĻ āĻāĻāĻŋāϤ⧠āĻŦā§āϝāĻžāϏāĻžāϰā§āϧ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āϏāĻā§āώāĻŽ āĻāϰāĻŋāĨ¤ āĻāĻŽāϰāĻž DHCP āϏāĻžāϰā§āĻāĻžāϰ -> āĻŦā§āϝāĻžāϏāĻžāϰā§āϧ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ -> āĻŦā§āϝāĻžāϏāĻžāϰā§āϧ āϏāĻžāϰā§āĻāĻžāϰ āϏāĻāϝā§āĻ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰāĻŋāĨ¤
āĻāĻāĻž āĻāĻ āĻŋāύ āĻŽāύ⧠āĻšāϝāĻŧ āύāĻž. āĻāĻŋāύā§āϤā§! āĻļāϝāĻŧāϤāĻžāύ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻāĻā§. āϝāĻĨāĻž:
- āĻāĻ āϏā§āĻāĻŋāĻŽāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻāĻāĻŋ PON OLT āĻ āύā§āĻŽā§āĻĻāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻšā§āĻĄāĻāύā§āĻĄā§āϰ MAC āĻ āĻŋāĻāĻžāύāĻžāϰ āϏāĻŽāĻžāύ āĻāĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§-āύāĻžāĻŽ, MAC PON Onu-āĻāϰ āϏāĻŽāĻžāύ āĻāĻāĻāĻŋ Agent-Circuit-Id āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻāĻžāϞāĻŋ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ āϏāĻš FreeRadius-āĻ āĻāĻāĻāĻŋ āĻ āύā§āϰā§āϧ āĻĒāĻžāĻ āĻžāύ⧠āĻšāϝāĻŧāĨ¤
- āĻŦāĻŋāĻāϞā§āĻĒ 82 āϏāĻš āϏā§āĻāĻāĻā§āϞāĻŋ āĻĨā§āĻā§ āĻ āύā§āĻŽā§āĻĻāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, FreeRadius āĻā§āϰāĻžāĻšāĻā§āϰ āĻĄāĻŋāĻāĻžāĻāϏā§āϰ MAC-āĻāϰ āϏāĻŽāĻžāύ āĻāĻāĻāĻŋ āĻāĻžāϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§-āύāĻžāĻŽ āϏāĻš āĻāĻāĻāĻŋ āĻ āύā§āϰā§āϧ āĻā§āϰāĻšāĻŖ āĻāϰ⧠āĻāĻŦāĻ āϝāĻĨāĻžāĻā§āϰāĻŽā§ āĻāĻā§āύā§āĻ-āϏāĻžāϰā§āĻāĻŋāĻ-āĻāĻāĻĄāĻŋ āĻāĻŦāĻ āĻāĻā§āύā§āĻ-āϰāĻŋāĻŽā§āĻ-āĻāĻāĻĄāĻŋ āϧāĻžāϰāĻŖāĻāĻžāϰ⧠āĻ āϤāĻŋāϰāĻŋāĻā§āϤ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ⧠āĻĒā§āϰā§āĻŖ āĻšāϝāĻŧ, āĻāĻŦāĻžāϰ āĻāϰ MAC āϰāĻŋāϞ⧠āϏā§āĻāĻ āĻāĻŦāĻ āĻĒā§āϰā§āĻ āϝā§āĻāĻžāύ⧠āĻā§āϰāĻžāĻšāĻ āϏāĻāϝā§āĻā§āϤ āĻāĻā§āĨ¤
- āĻāϝāĻŧāĻžāĻāĻĢāĻžāĻ āĻĒāϝāĻŧā§āύā§āĻ āϏāĻš āĻāĻŋāĻā§ āĻā§āϰāĻžāĻšāĻ PAP-CHAP āĻĒā§āϰā§āĻā§āĻāϞā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻ āύā§āĻŽā§āĻĻāĻŋāϤ
- WIFI āĻĒāϝāĻŧā§āύā§āĻā§āϰ āĻāĻŋāĻā§ āĻā§āϰāĻžāĻšāĻāĻā§ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ āĻāĻžāĻĄāĻŧāĻžāĻ WIFI āĻĒāϝāĻŧā§āύā§āĻā§āϰ MAC āĻ āĻŋāĻāĻžāύāĻžāϰ āϏāĻŽāĻžāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§-āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧā§ āĻ āύā§āĻŽā§āĻĻāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧāĨ¤
āĻāϤāĻŋāĻšāĻžāϏāĻŋāĻ āĻĒāĻāĻā§āĻŽāĻŋ: DHCP-āĻ "āĻŦāĻŋāĻāϞā§āĻĒ 82" āĻāĻŋ
āĻāĻā§āϞāĻŋ DHCP āĻĒā§āϰā§āĻā§āĻāϞā§āϰ āĻāύā§āϝ āĻ āϤāĻŋāϰāĻŋāĻā§āϤ āĻŦāĻŋāĻāϞā§āĻĒ āϝāĻž āĻāĻĒāύāĻžāĻā§ āĻ āϤāĻŋāϰāĻŋāĻā§āϤ āϤāĻĨā§āϝ āϏā§āĻĨāĻžāύāĻžāύā§āϤāϰ āĻāϰāϤ⧠āĻĻā§āϝāĻŧ, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ āĻāĻā§āύā§āĻ-āϏāĻžāϰā§āĻāĻŋāĻ-āĻāĻāĻĄāĻŋ āĻāĻŦāĻ āĻāĻā§āύā§āĻ-āϰāĻŋāĻŽā§āĻ-āĻāĻāĻĄāĻŋ āĻā§āώā§āϤā§āϰā§āĨ¤ āϏāĻžāϧāĻžāϰāĻŖāϤ āϰāĻŋāϞ⧠āϏā§āĻāĻā§āϰ MAC āĻ āĻŋāĻāĻžāύāĻž āĻāĻŦāĻ āĻā§āϰāĻžāĻšāĻ āϝ⧠āĻĒā§āϰā§āĻā§ āϏāĻāϝā§āĻā§āϤ āĻĨāĻžāĻā§ āϤāĻž āĻĒā§āϰā§āϰāĻŖ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧāĨ¤ PON āϏāϰāĻā§āĻāĻžāĻŽ āĻŦāĻž WIFI āĻŦā§āϏ āϏā§āĻā§āĻļāύā§āϰ āĻā§āώā§āϤā§āϰā§, Agent-Circuit-Id āĻĢāĻŋāϞā§āĻĄā§ āĻĻāϰāĻāĻžāϰ⧠āϤāĻĨā§āϝ āĻĨāĻžāĻā§ āύāĻž (āĻā§āύ āĻā§āϰāĻžāĻšāĻ āĻĒā§āϰā§āĻ āύā§āĻ)āĨ¤ āĻāĻ āĻā§āώā§āϤā§āϰ⧠DHCP āĻ āĻĒāĻžāϰā§āĻļāύā§āϰ āϏāĻžāϧāĻžāϰāĻŖ āϏā§āĻāĻŋāĻŽāĻāĻŋ āύāĻŋāĻŽā§āύāϰā§āĻĒ:

āϧāĻžāĻĒā§ āϧāĻžāĻĒā§ āĻāĻ āϏā§āĻāĻŋāĻŽāĻāĻŋ āĻāĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§:
- āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏāϰāĻā§āĻāĻžāĻŽ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āϏā§āĻāĻŋāĻāϏ āĻĒā§āϰāĻžāĻĒā§āϤ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ DHCP āϏāĻŽā§āĻĒā§āϰāĻāĻžāϰ āĻ āύā§āϰā§āϧ āĻāϰā§
- āĻĄāĻŋāĻāĻžāĻāϏāĻāĻŋ (āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻāĻāĻŋ āϏā§āĻāĻ, āĻāϝāĻŧāĻžāĻāĻĢāĻžāĻ āĻŦāĻž PON āĻŦā§āϏ āϏā§āĻā§āĻļāύ) āϝā§āĻāĻŋāϰ āϏāĻžāĻĨā§ āĻā§āϰāĻžāĻšāĻ āϏāϰāĻā§āĻāĻžāĻŽ āϏāϰāĻžāϏāϰāĻŋ āϏāĻāϝā§āĻā§āϤ āĻĨāĻžāĻā§ āĻāĻ āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ "āĻāύā§āĻāĻžāϰāϏā§āĻĒā§āĻ" āĻāϰ⧠āĻāĻŦāĻ āĻāĻāĻŋāĻā§ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰā§, āĻāϤ⧠āĻ āϤāĻŋāϰāĻŋāĻā§āϤ āĻŦāĻŋāĻāϞā§āĻĒ āĻŦāĻŋāĻāϞā§āĻĒ 82 āĻāĻŦāĻ āϰāĻŋāϞ⧠āĻāĻā§āύā§āĻ āĻāĻāĻĒāĻŋ āĻ āĻŋāĻāĻžāύāĻž āĻĒā§āϰāĻŦāϰā§āϤāύ āĻāϰ⧠āĻāĻŦāĻ āĻāĻāĻŋāĻā§ āĻāϰāĻ āĻāĻĒāϰ⧠āĻĒā§āϰā§āϰāĻŖ āĻāϰā§āĨ¤ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ.
- DHCP āϏāĻžāϰā§āĻāĻžāϰ āĻ āύā§āϰā§āϧāĻāĻŋ āĻā§āϰāĻšāĻŖ āĻāϰā§, āĻāĻāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āϤā§āϰāĻŋ āĻāϰ⧠āĻāĻŦāĻ āϰāĻŋāϞ⧠āĻĄāĻŋāĻāĻžāĻāϏ⧠āĻĒāĻžāĻ āĻžāϝāĻŧ
- āϰāĻŋāϞ⧠āĻĄāĻŋāĻāĻžāĻāϏāĻāĻŋ āϏāĻžāĻŦāϏā§āĻā§āϰāĻžāĻāĻŦāĻžāϰ āĻĄāĻŋāĻāĻžāĻāϏ⧠āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻĒā§āϝāĻžāĻā§āĻ āĻĢāϰā§āϝāĻŧāĻžāϰā§āĻĄ āĻāϰā§
āĻ āĻŦāĻļā§āϝāĻ, āĻāĻāĻŋ āϏāĻŦ āϏāĻšāĻā§ āĻāĻžāĻ āĻāϰ⧠āύāĻž; āĻāĻĒāύāĻžāĻā§ āϏā§āĻ āĻ āύā§āϝāĻžāϝāĻŧā§ āĻāĻĒāύāĻžāϰ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āϏāϰāĻā§āĻāĻžāĻŽāĻā§āϞāĻŋ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤
FreeRadius āĻāύāϏā§āĻāϞ āĻāϰāĻž āĻšāĻā§āĻā§
āĻ āĻŦāĻļā§āϝāĻ, āĻāĻāĻŋ FreeRadius āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āϏā§āĻāĻŋāĻāϏā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻ āϰā§āĻāύ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§, āϤāĻŦā§ āĻāĻāĻŋ āĻāĻ āĻŋāύ āĻāĻŦāĻ āĻ āϏā§āĻĒāώā§āĻ... āĻŦāĻŋāĻļā§āώ āĻāϰ⧠āϝāĻāύ āĻāĻĒāύāĻŋ N āĻŽāĻžāϏ āĻĒāϰ⧠āϏā§āĻāĻžāύ⧠āϝāĻžāύ āĻāĻŦāĻ "āϏāĻŦāĻāĻŋāĻā§ āĻāĻžāĻ āĻāϰā§āĨ¤" āĻ āϤāĻāĻŦ, āĻāĻŽāϰāĻž āĻĒāĻžāĻāĻĨāύ⧠FreeRadius-āĻāϰ āĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ āύāĻŋāĻāϏā§āĻŦ āĻ āύā§āĻŽā§āĻĻāύ āĻŽāĻĄāĻŋāĻāϞ āϞā§āĻāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāϝāĻŧā§āĻāĻŋāĨ¤ āĻāĻŽāϰāĻž āĻŽāĻžāĻāĻāϏāĻāĻŋāĻāĻāϞ āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻĨā§āĻā§ āĻ āύā§āĻŽā§āĻĻāύā§āϰ āĻĄā§āĻāĻž āύā§āĻŦāĨ¤ āĻāϰ āĻāĻ āύ āĻŦāϰā§āĻŖāύāĻž āĻāϰāĻžāϰ āĻā§āύ āĻŽāĻžāύ⧠āύā§āĻ; āϝāĻžāĻāĻšā§āĻ, āĻĒā§āϰāϤā§āϝā§āĻā§ āĻāĻāĻŋ "āύāĻŋāĻā§āĻĻā§āϰ āĻāύā§āϝ" āϤā§āϰāĻŋ āĻāϰāĻŦā§āĨ¤ āĻŦāĻŋāĻļā§āώ āĻāϰā§, āĻāĻŽāĻŋ 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-connectorFreeRadius-āĻāϰ āĻāύā§āϝ āĻĒāĻžāĻāĻĨāύ āĻŽāĻĄāĻŋāĻāϞ āϏā§āĻāĻŋāĻāϏā§, āĻāĻĒāύāĻžāĻā§ 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
