ื ืขืฅ ืกืขื˜ื˜ื™ื ื’ืก ืคึฟื•ืŸ FreeRadius ื“ื•ืจืš DHCP

ื ืขืฅ ืกืขื˜ื˜ื™ื ื’ืก ืคึฟื•ืŸ FreeRadius ื“ื•ืจืš DHCP
ื“ื™ ืึทืจื‘ืขื˜ ืื™ื– ืื ื’ืขืงื•ืžืขืŸ ืฆื• ืฆื•ืœื™ื™ื’ืŸ ื“ื™ ืึทืจื•ื™ืกื’ืขื‘ืŸ ืคื•ืŸ IP ืึทื“ืจืขืกืขืก ืฆื• ืื‘ืื ืขื ื˜ืŸ. ื‘ืื“ื™ื ื’ื•ื ื’ืขืŸ ืคื•ืŸ ื“ื™ ืคึผืจืึธื‘ืœืขื:

  • ืžื™ืจ ื•ื•ืขืœืŸ ื ื™ืฉื˜ ื’ืขื‘ืŸ ืื™ืจ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืกืขืจื•ื•ืขืจ ืคึฟืึทืจ ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ - ืื™ืจ ื•ื•ืขื˜ ืžืึทื›ืŸ ืขืก ๐Ÿ˜‰
  • ืื‘ืื ืขื ื˜ืŸ ืžื•ื–ืŸ ื‘ืึทืงื•ืžืขืŸ ื ืขืฅ ืกืขื˜ื˜ื™ื ื’ืก ื“ื•ืจืš DHCP
  • ื“ื™ ื ืขืฅ ืื™ื– ื›ืขื˜ืขืจืึทื“ื–ืฉื™ื ื™ืึทืก. ื“ืึธืก ื›ื•ืœืœ PON ื•ื™ืกืจื™ื›ื˜ ืื•ืŸ ืจืขื’ื•ืœืขืจ ืกื•ื•ื™ื˜ืฉื™ื– ืžื™ื˜ ืงืึทื ืคื™ื’ื™ืขืจื“ ืึธืคึผืฆื™ืข 82 ืื•ืŸ WiFi ื‘ืึทืกืขืก ืžื™ื˜ ื”ืึธืฆืคึผืึธืฅ
  • ืื•ื™ื‘ ื“ื™ ื“ืึทื˜ืŸ ื–ืขื ืขืŸ ื ื™ืฉื˜ ืื•ื ื˜ืขืจ ืงื™ื™ืŸ ืคื•ืŸ ื“ื™ ื‘ืื“ื™ื ื’ื•ื ื’ืขืŸ ืคึฟืึทืจ ืึทืจื•ื™ืกื’ืขื‘ืŸ ืึทืŸ IP, ืื™ืจ ืžื•ื–ืŸ ืึทืจื•ื™ืกื’ืขื‘ืŸ ืึทืŸ IP ืคึฟื•ืŸ ื“ื™ "ื’ืึทืกื˜" ื ืขืฅ

ืื•ื™ืฃ ื“ื™ ื’ื•ื˜ืข ื–ื™ื™ึทื˜: ืขืก ืื™ื– ื ืึธืš ืึท ืกืขืจื•ื•ืขืจ ืื•ื™ืฃ FreeBSD ื•ื•ืึธืก ืงืขืŸ "ืึทืจื‘ืขื˜", ืึธื‘ืขืจ ืขืก ืื™ื– "ื•ื•ื™ื™ึทื˜ ืึทื•ื•ืขืง" ;), ื ื™ืฉื˜ "ืจืขื›ื˜ ืื•ื™ืฃ ื“ืขื ื ืขืฅ".

ืขืก ืื™ื– ืื•ื™ืš ืึท ื•ื•ื•ื ื“ืขืจืœืขืš ืžื™ื˜ืœ ื’ืขืจื•ืคืŸ ืžื™ืงืจืึธื˜ื™ืง. ื“ืขืจ ื’ืขื ืขืจืึทืœ ื ืขืฅ ื“ื™ืึทื’ืจืึทืžืข ืื™ื– ืขืคึผืขืก ื•ื•ื™ ื“ืึธืก:

ื ืขืฅ ืกืขื˜ื˜ื™ื ื’ืก ืคึฟื•ืŸ FreeRadius ื“ื•ืจืš DHCP

ื ืึธืš ืขื˜ืœืขื›ืข ื’ืขื“ืึทื ืง, ืขืก ืื™ื– ื‘ืึทืฉืœืึธืกืŸ ืฆื• ื ื•ืฆืŸ FreeRadius ืฆื• ืึทืจื•ื™ืกื’ืขื‘ืŸ ื ืขืฅ ืกืขื˜ื˜ื™ื ื’ืก ืฆื• ืื‘ืื ืขื ื˜ืŸ. ืื™ืŸ ืคึผืจื™ื ืฆื™ืคึผ, ื“ื™ ืกื›ืขืžืข ืื™ื– ื’ืขื•ื•ื™ื™ื ื˜ืœืขืš: ืžื™ืจ ื’ืขื‘ืŸ ื“ื™ DHCP ืกืขืจื•ื•ืขืจ ืื•ื™ืฃ ืžื™ืงืจืึธื˜ื™ืงืง ืื•ืŸ ืจืึทื“ื™ื•ืก ืงืœื™ืขื ื˜ ืื•ื™ืฃ ืขืก. ืžื™ืจ ืงืึทื ืคื™ื’ื™ืขืจ ื“ื™ DHCP ืกืขืจื•ื•ืขืจ -> ืจืึทื“ื™ื•ืก ืงืœื™ืขื ื˜ -> ืจืึทื“ื™ื•ืก ืกืขืจื•ื•ืขืจ ืงืฉืจ.

ืขืก ืžื™ื™ื ื˜ ื ื™ืฉื˜ ืฉื•ื•ืขืจ. ืึธื‘ืขืจ! ื“ืขืจ ืฉื˜ืŸ ืื™ื– ืื™ืŸ ื“ื™ ืคืจื˜ื™ื. ื ืขืžืœื™ืš:

  • ื•ื•ืขืŸ ืึธื˜ืขืจื™ื™ื–ื™ื ื’ ืึท PON OLT ื ื™ืฆืŸ ื“ืขื ืกื›ืขืžืข, ืึท ื‘ืงืฉื” ืื™ื– ื’ืขืฉื™ืงื˜ ืฆื• FreeRadius ืžื™ื˜ ืึท ื‘ืึทื ื™ืฆืขืจ ื ืึธืžืขืŸ ื’ืœื™ื™ืš ืฆื• ื“ื™ MAC ืึทื“ืจืขืก ืคื•ืŸ ื“ื™ ื”ืขืึทื“ืขื ื“, ืึทืŸ ืึทื’ืขื ื˜-ืงืจื™ื™ึทื–-ื™ื“ ื’ืœื™ื™ืš ืฆื• ื“ื™ MAC PON Onu ืื•ืŸ ืึท ืœื™ื™ื“ื™ืง ืคึผืึทืจืึธืœ.
  • ื•ื•ืขืŸ ื“ืขืจ ืึธื˜ืขืจื™ื™ื–ื™ื ื’ ืคึฟื•ืŸ ืกื•ื•ื™ื˜ืฉื™ื– ืžื™ื˜ ืึธืคึผืฆื™ืข 82, FreeRadius ื‘ืืงื•ืžื˜ ืึท ื‘ืงืฉื” ืžื™ื˜ ืึท ืœื™ื™ื“ื™ืง ื‘ืึทื ื™ืฆืขืจ ื ืึธืžืขืŸ ื’ืœื™ื™ืš ืฆื• ื“ื™ MAC ืคื•ืŸ ื“ื™ ืึทื‘ืึธื ืขื ื˜ ืžื™ื˜ืœ ืื•ืŸ ืึธื ื’ืขืคื™ืœื˜ ืžื™ื˜ ื ืึธืš ืึทื˜ืจื™ื‘ื™ื•ืฅ ืึทื’ืขื ื˜-ืงืจื™ื™ึทื–-ื™ื“ ืื•ืŸ ืึทื’ืขื ื˜-ืจื™ืžืึธื•ื˜-ืฉื™ื™ึทืŸ ืžื™ื˜ ืจื™ืกืคึผืขืงื˜ื™ื•ื•ืœื™ ื•ื•ื™ื“ืขืจ ื“ื™ MAC ืคื•ืŸ ื“ื™ ืจืขืœืข ื‘ืึทืฉื˜ื™ืžืขืŸ ืื•ืŸ ื“ื™ ืคึผืึธืจื˜ ืฆื• ื•ื•ืึธืก ื“ืขืจ ืึทื‘ืึธื ืขื ื˜ ืื™ื– ืงืึธื ื ืขืงื˜ืขื“.
  • ืขื˜ืœืขื›ืข ืื‘ืื ืขื ื˜ืŸ ืžื™ื˜ WiFI ืคื•ื ืงื˜ืŸ ื–ืขื ืขืŸ ืึธื˜ืขืจื™ื™ื–ื“ ื“ื•ืจืš PAP-CHAP ืคึผืจืึธื˜ืึธืงืึธืœืก
  • ืขื˜ืœืขื›ืข ืื‘ืื ืขื ื˜ืŸ ืคึฟื•ืŸ WIFI ืคื•ื ืงื˜ืŸ ื–ืขื ืขืŸ ืึธื˜ืขืจื™ื™ื–ื“ ืžื™ื˜ ืึท ื‘ืึทื ื™ืฆืขืจ ื ืึธืžืขืŸ ื’ืœื™ื™ืš ืฆื• ื“ื™ MAC ืึทื“ืจืขืก ืคื•ืŸ ื“ื™ WIFI ืคื•ื ื˜, ืึธืŸ ืึท ืคึผืึทืจืึธืœ.

ื”ื™ืกื˜ืึธืจื™ืฉ ื”ื™ื ื˜ืขืจื’ืจื•ื ื˜: ื•ื•ืึธืก ืื™ื– "ืึธืคึผืฆื™ืข 82" ืื™ืŸ DHCP

ื“ืึธืก ื–ืขื ืขืŸ ื ืึธืš ืึธืคึผืฆื™ืขืก ืคึฟืึทืจ ื“ื™ DHCP ืคึผืจืึธื˜ืึธืงืึธืœ ื•ื•ืึธืก ืœืึธื–ืŸ ืื™ืจ ืฆื• ืึทืจื™ื‘ืขืจืคื™ืจืŸ ื ืึธืš ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข, ืœืžืฉืœ ืื™ืŸ ื“ื™ ืึทื’ืขื ื˜-ืงืจื™ื™ึทื–-ืฉื™ื™ึทืŸ ืื•ืŸ ืึทื’ืขื ื˜-ืจื™ืžืึธื•ื˜-ืฉื™ื™ึทืŸ ืคืขืœื“ืขืจ. ื˜ื™ืคึผื™ืงืึทืœืœื™ ื’ืขื ื™ืฆื˜ ืฆื• ืึทืจื™ื‘ืขืจืคื™ืจืŸ ื“ื™ MAC ืึทื“ืจืขืก ืคื•ืŸ ื“ื™ ืจืขืœืข ื‘ืึทืฉื˜ื™ืžืขืŸ ืื•ืŸ ื“ื™ ืคึผืึธืจื˜ ืฆื• ื•ื•ืึธืก ื“ืขืจ ืึทื‘ืึธื ืขื ื˜ ืื™ื– ืงืึธื ื ืขืงื˜ืขื“. ืื™ืŸ ื“ื™ ืคืึทืœ ืคื•ืŸ PON ื•ื™ืกืจื™ื›ื˜ ืึธื“ืขืจ WIFI ื‘ืึทื–ืข ืกื˜ื™ื™ืฉืึทื ื–, ื“ื™ ืึทื’ืขื ื˜-ืงืจื™ื™ึทื–-ืฉื™ื™ึทืŸ ืคืขืœื“ ื˜ื•ื˜ ื ื™ืฉื˜ ืึทื ื˜ื”ืึทืœื˜ืŸ ื ื•ืฆื™ืง ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข (ืขืก ืื™ื– ืงื™ื™ืŸ ืึทื‘ืึธื ืขื ื˜ ืคึผืึธืจื˜). ื“ืขืจ ื’ืขื ืขืจืึทืœ ืกื›ืขืžืข ืคื•ืŸ โ€‹โ€‹DHCP ืึธืคึผืขืจืึทืฆื™ืข ืื™ืŸ ื“ืขื ืคืึทืœ ืื™ื– ื•ื•ื™ ื’ื™ื™ื˜:

ื ืขืฅ ืกืขื˜ื˜ื™ื ื’ืก ืคึฟื•ืŸ FreeRadius ื“ื•ืจืš DHCP

ืฉืจื™ื˜ ื“ื•ืจืš ืฉืจื™ื˜ ื“ืขื ืกื›ืขืžืข ืึทืจื‘ืขื˜ ื•ื•ื™ ื“ืึธืก:

  1. ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ื•ื™ืกืจื™ื›ื˜ ืžืื›ื˜ ืึท DHCP ื‘ืจืึธื“ืงืึทืกื˜ ื‘ืขื˜ืŸ ืฆื• ื‘ืึทืงื•ืžืขืŸ ื ืขืฅ ืกืขื˜ื˜ื™ื ื’ืก
  2. ื“ืขืจ ืžื™ื˜ืœ (ืœืžืฉืœ, ืึท ื‘ืึทืฉื˜ื™ืžืขืŸ, WiFi ืึธื“ืขืจ PON ื‘ืึทื–ืข ืกื˜ืึทื ืฆื™ืข) ืฆื• ื•ื•ืึธืก ื“ื™ ืึทื‘ืึธื ืขื ื˜ ื•ื™ืกืจื™ื›ื˜ ืื™ื– ื’ืœื™ื™ึทืš ืงืึธื ื ืขืงื˜ืขื“ "ื™ื ื˜ืขืจืกืขืคึผื˜ื™ื–" ื“ืขื ืคึผืึทืงืึทื˜ ืื•ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืขืก, ื™ื ื˜ืจืึธื•ื“ื•ืกื™ื ื’ ื ืึธืš ืึธืคึผืฆื™ืขืก ืึธืคึผืฆื™ืข 82 ืื•ืŸ ืจื™ืœื™ื™ ืึทื’ืขื ื˜ IP ืึทื“ืจืขืก ืื™ืŸ ืขืก, ืื•ืŸ ื˜ืจืึทื ืกืžื™ื˜ื˜ ืขืก ื•ื•ื™ื™ึทื˜ืขืจ ืื™ื‘ืขืจ. ื“ื™ ื ืขืฅ.
  3. ื“ืขืจ DHCP ืกืขืจื•ื•ืขืจ ืึทืงืกืขืคึผืฅ ื“ื™ ื‘ืงืฉื”, ื“ื–ืฉืขื ืขืจื™ื™ืฅ ืึท ืขื ื˜ืคืขืจ ืื•ืŸ ืกืขื ื“ื– ืขืก ืฆื• ื“ื™ ืจืขืœืข ืžื™ื˜ืœ
  4. ื“ื™ ืจืขืœืข ืžื™ื˜ืœ ืคืึธืจื•ื•ืขืจื“ื– ื“ื™ ืขื ื˜ืคืขืจ ืคึผืึทืงืึทื˜ ืฆื• ื“ื™ ืึทื‘ืึธื ืขื ื˜ ืžื™ื˜ืœ

ื“ืึธืš, ื“ืึธืก ืึทืœืฅ ืึทืจื‘ืขื˜ ื ื™ืฉื˜ ืึทื–ื•ื™ ืœื™ื™ื›ื˜; ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืงืึทื ืคื™ื’ื™ืขืจ ื“ื™ื™ืŸ ื ืขืฅ ืขืงื•ื•ื™ืคึผืžืขื ื˜ ืึทืงืึธืจื“ื™ื ื’ืœื™.

ื™ื ืกื˜ืึทืœื™ืจืŸ FreeRadius

ื“ืึธืš, ื“ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืึทื˜ืฉื™ื•ื•ื“ ืžื™ื˜ ื“ื™ FreeRadius ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืกืขื˜ื˜ื™ื ื’ืก, ืึธื‘ืขืจ ืขืก ืื™ื– ืฉื•ื•ืขืจ ืื•ืŸ ื•ืžืงืœืึธืจ ... ืกืคึผืขืฆื™ืขืœ ื•ื•ืขืŸ ืื™ืจ ื’ื™ื™ืŸ ื“ืึธืจื˜ ื ืึธืš N ื—ื“ืฉื™ื ืื•ืŸ "ืึทืœืฅ ืึทืจื‘ืขื˜." ื“ืขืจื™ื‘ืขืจ, ืžื™ืจ ื‘ืึทืฉืœืึธืกืŸ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ืื•ื ื“ื–ืขืจ ืื™ื™ื’ืขื ืข ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ืžืึธื“ื•ืœืข ืคึฟืึทืจ FreeRadius ืื™ืŸ ืคึผื™ื˜ื”ืึธืŸ. ืžื™ืจ ื•ื•ืขืœืŸ ื ืขืžืขืŸ ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ื“ืึทื˜ืŸ ืคื•ืŸ ื“ื™ MySQL ื“ืึทื˜ืึทื‘ื™ื™ืก. ืขืก ืื™ื– ืงื™ื™ืŸ ืคื•ื ื˜ ืื™ืŸ ื“ื™ืกืงืจื™ื™ื‘ื™ื ื’ ื–ื™ื™ึทืŸ ืกื˜ืจื•ืงื˜ื•ืจ; ืกื™ื™ึท ื•ื•ื™ ืกื™ื™ึท, ืึทืœืขืžืขืŸ ื•ื•ืขื˜ ืžืึทื›ืŸ ืขืก "ืคึฟืึทืจ ื–ื™ืš." ืื™ืŸ ื‘ืึทื–ื•ื ื“ืขืจ, ืื™ืš ื’ืขื ื•ืžืขืŸ ื“ื™ ืกื˜ืจื•ืงื˜ื•ืจ ื•ื•ืึธืก ืื™ื– ื’ืขืคึฟื™ื ื˜ ืžื™ื˜ ื“ื™ sql ืžืึธื“ื•ืœืข ืคึฟืึทืจ FreeRadius, ืื•ืŸ ืึท ื‘ื™ืกืœ ื˜ืฉื™ื™ื ื“ื–ืฉื“ ืขืก ื“ื•ืจืš ืึทื“ื™ื ื’ ืึท ืžืขืง ืื•ืŸ ืคึผืึธืจื˜ ืคืขืœื“ ืคึฟืึทืจ ื™ืขื“ืขืจ ืึทื‘ืึธื ืขื ื˜, ืื™ืŸ ืึทื“ื™ืฉืึทืŸ ืฆื• ื“ื™ ืœืึธื’ื™ืŸ ืคึผืึทืจืึธืœ.

ืึทื–ื•ื™, ืขืจืฉื˜ืขืจ, ื™ื ืกื˜ืึทืœื™ืจืŸ FreeRadius:

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

ืื™ืŸ ื“ื™ ืกืขื˜ื˜ื™ื ื’ืก, ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ ืฆื• ื™ื ืกื˜ืึทืœื™ืจืŸ:

ื ืขืฅ ืกืขื˜ื˜ื™ื ื’ืก ืคึฟื•ืŸ FreeRadius ื“ื•ืจืš DHCP

ืžื™ืจ ืžืึทื›ืŸ ืึท ืกื™ืžืœื™ื ืง ืฆื• ื“ื™ ืคึผื™ื˜ื”ืึธืŸ ืžืึธื“ื•ืœืข (ื“"ื” "ืงืขืจ ืื•ื™ืฃ" ืขืก):

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

ืœืึธืžื™ืจ ื™ื ืกื˜ืึทืœื™ืจืŸ ืึทืŸ ื ืึธืš ืžืึธื“ื•ืœืข ืคึฟืึทืจ ืคึผื™ื˜ื”ืึธืŸ:

pip install mysql-connector

ืื™ืŸ ื“ื™ ืคึผื™ื˜ื”ืึธืŸ ืžืึธื“ื•ืœืข ืกืขื˜ื˜ื™ื ื’ืก ืคึฟืึทืจ FreeRadius, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ื“ื™ ืžืึธื“ื•ืœืข ื–ื•ื›ืŸ ืคึผืึทื˜ืก ืื™ืŸ ื“ื™ ืคึผื™ื˜ื”ืึธืŸ_ืคึผืึทื˜ื” ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง. ืื™ืš ื”ืื‘ ืœืžืฉืœ ื“ืืก:

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 ืงืึธืžื‘ื™ื ืึทืฆื™ืข, ืื•ืŸ ืื•ื™ื‘ ื“ืึธืก ืงืขืŸ ื ื™ืฉื˜ ืึทืจื‘ืขื˜ืŸ, ืžื™ืจ ืึทืจื•ื™ืกื’ืขื‘ืŸ ื“ื™ ืึธื•ืœื“ืึทืกื˜ IP ืึทื“ืจืขืก ื•ื•ืึธืก ืื™ื– ื’ืขื•ื•ืขืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืคึฟื•ืŸ ื“ื™ "ื’ืึทืกื˜". " ื ืขืฅ. ืึทืœืข ื•ื•ืึธืก ื‘ืœื™ื™ื‘ื˜ ืื™ื– ืฆื• ืงืึทื ืคื™ื’ื™ืขืจ ื“ื™ ืคืขืœื™ืงื™ื™ึทื˜ ืฉืจื™ืคื˜ ืื™ืŸ ื“ื™ ื–ื™ื™ื˜ืœืขืš-ืขื ื™ื™ื‘ืึทืœื“ ื˜ืขืงืข, ืึทื–ื•ื™ ืึทื– ื“ื™ ื ื•ื™ื˜ื™ืง ืคืึทื ื’ืงืฉืึทื ื– ืคื•ืŸ ื“ื™ ืคึผื™ื˜ื”ืึธืŸ ืฉืจื™ืคื˜ ื•ื•ืขื˜ ื˜ื•ื•ื™ื˜ืฉ ืื™ืŸ ื“ื™ ื“ืขื–ื™ื’ื ื™ื™ื˜ื™ื“ ืžืึธื•ืžืึทื ืฅ. ืื™ืŸ ืคืึทืงื˜, ืขืก ืื™ื– ื’ืขื ื•ื’ ืฆื• ื‘ืจืขื ื’ืขืŸ ื“ื™ ื˜ืขืงืข ืฆื• ื“ื™ ืคืึธืจืขื:

ื ื™ื˜ ื•ื™ืกืฆืึธืœืŸ

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

ืื™ืš ื•ื•ื™ืœืŸ ืฆื• ื•ื•ืึธืจืขื ืขืŸ ืื™ืจ ืึทื– ืขืก ืื™ื– ืœืขื’ืึทืžืจืข ืื•ืžืžืขื’ืœืขืš ืฆื• ื ื•ืฆืŸ ืึทื–ืึท ืึท ืกื›ืขืžืข ืื•ืŸ ืกืงืจื™ืคึผืก "ืึธืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ" ืื•ื™ืฃ ืึทืŸ "ืื™ื ื“ื•ืกื˜ืจื™ืขืœืข" ื•ื•ืึธื’. ืื™ืŸ ืžื™ื ื“ืกื˜ืขืจ ื‘ืืžืขืจืงื˜:

  • ืขืก ืื™ื– ืžืขื’ืœืขืš ืฆื• "ืฉื•ื•ื™ื ื“ืœ" ื“ื™ MAC ืึทื“ืจืขืก. ืขืก ืื™ื– ื’ืขื ื•ื’ ืคึฟืึทืจ ื“ื™ ืึทื‘ืึธื ืขื ื˜ ืฆื• ืคืึทืจืฉืจื™ื™ึทื‘ืŸ ืขืžืขืฆืขืจ ืึทื ื“ืขืจืฉ ืก MAC ืื•ืŸ ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืคึผืจืึธื‘ืœืขืžืก
  • ื“ื™ ืœืึธื’ื™ืง ืคื•ืŸ ืึทืจื•ื™ืกื’ืขื‘ืŸ ื’ืึทืกื˜ ื ืขื˜ื•ื•ืึธืจืงืก ืื™ื– ื•ื•ื™ื™ึทื˜ืขืจ ืคื•ืŸ ืงืจื™ื˜ื™ืง. ืขืก ืื™ื– ื ื™ืฉื˜ ืืคื™ืœื• ืึท ื˜ืฉืขืง "ืืคึฟืฉืจ ืขืก ื–ืขื ืขืŸ ืฉื•ื™ืŸ ืงืœื™ื™ืึทื ืฅ ืžื™ื˜ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ IP ืึทื“ืจืขืก?"

ื“ืึธืก ืื™ื– ื ืึธืจ ืึท "ืงื™ื›ืœ ืงืึทื˜ืขืจ ืœื™ื™ื–ื•ื ื’" ื“ื™ื–ื™ื™ื ื“ ืฆื• ืึทืจื‘ืขื˜ืŸ ืกืคึผืึทืกื™ืคื™ืงืœื™ ืื™ืŸ ืžื™ื™ืŸ ื˜ื ืึธื™ื, ื’ืึธืจื ื™ืฉื˜ ืžืขืจ. ื“ื• ื–ืืœืกื˜ ื ื™ืฉื˜ ืจื™ื›ื˜ืขืจ ืฉื˜ืจืขื ื’ ๐Ÿ˜‰

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’