نيٽ ورڪ سيٽنگون FreeRadius کان DHCP ذريعي

نيٽ ورڪ سيٽنگون FreeRadius کان DHCP ذريعي
ڪم اچي ويو ته رڪنيت وارن کي IP پتي جاري ڪرڻ جو بندوبست ڪيو وڃي. مسئلو جون حالتون:

  • اسان توهان کي اجازت ڏيڻ لاءِ الڳ سرور نه ڏينداسين - توهان ڪندا 😉
  • رڪنيت حاصل ڪرڻ لازمي آهي نيٽ ورڪ سيٽنگون DHCP ذريعي
  • نيٽ ورڪ heterogeneous آهي. ھن ۾ شامل آھن PON سامان ۽ باقاعده سوئچز سان ترتيب ڏنل آپشن 82 ۽ وائي فائي بيسز سان ھٽ اسپاٽ
  • جيڪڏهن ڊيٽا IP جاري ڪرڻ جي ڪنهن به شرط هيٺ نه اچي، توهان کي "مهمان" نيٽ ورڪ مان هڪ IP جاري ڪرڻ گهرجي.

سٺي پاسي تي: اڃا تائين هڪ سرور آهي FreeBSD تي جيڪو "ڪم" ڪري سگهي ٿو، پر اهو آهي "پري"؛)، نه "هن نيٽ ورڪ تي صحيح".

Mikrotik نالي هڪ شاندار ڊوائيس پڻ آهي. عام نيٽ ورڪ ڊاگرام هن طرح آهي:

نيٽ ورڪ سيٽنگون FreeRadius کان DHCP ذريعي

ڪجهه سوچڻ کان پوء، اهو فيصلو ڪيو ويو ته FreeRadius استعمال ڪرڻ لاء نيٽ ورڪ سيٽنگون جاري ڪرڻ لاء رڪنيت حاصل ڪرڻ لاء. اصول ۾، اسڪيم معمول آهي: اسان مائڪروٽيڪڪ تي DHCP سرور کي فعال ڪريون ٿا، ۽ ان تي ريڊيس ڪلائنٽ. اسان ترتيب ڏيون ٿا DHCP سرور -> ريڊيس ڪلائنٽ -> ريڊيس سرور ڪنيڪشن.

اهو ڏکيو نٿو لڳي. پر! شيطان تفصيل ۾ آهي. يعني:

  • جڏهن هن اسڪيم کي استعمال ڪندي هڪ PON OLT کي اختيار ڏيو ٿا، هڪ درخواست موڪلي وئي آهي FreeRadius هڪ صارف-نالو جي برابر آهي هيڊ اينڊ جي MAC پتي جي برابر، هڪ Agent-Circuit-Id برابر MAC PON Onu ۽ هڪ خالي پاسورڊ.
  • جڏهن اختيار 82 سان سوئچز مان اختيار ڪيو وڃي ٿو، FreeRadius هڪ درخواست وصول ڪري ٿو هڪ خالي يوزر-نالو سان گڏ سبسڪرائبر جي ڊيوائس جي MAC جي برابر ۽ اضافي خاصيتن سان ڀريل آهي Agent-Circuit-Id ۽ Agent-Remote-Id جنهن ۾ شامل آهن، ترتيب سان، ٻيهر MAC جو. رلي سوئچ ۽ بندرگاهه جنهن سان سبسڪرائبر ڳنڍيل آهي.
  • وائي فائي پوائنٽن سان گڏ ڪجھ رڪنن کي PAP-CHAP پروٽوڪول ذريعي اجازت ڏني وئي آھي
  • WIFI پوائنٽس مان ڪجھ رڪنيت رکندڙ صارف جي نالي سان WIFI پوائنٽ جي MAC پتي جي برابر آھي، بغير پاسورڊ جي.

تاريخي پس منظر: DHCP ۾ "آپشن 82" ڇا آهي

اهي اضافي اختيار آهن DHCP پروٽوڪول لاءِ جيڪي توهان کي اضافي معلومات منتقل ڪرڻ جي اجازت ڏين ٿا، مثال طور Agent-Circuit-Id ۽ Agent-Remote-Id فيلڊز ۾. عام طور تي ريل سوئچ جي MAC پتي کي منتقل ڪرڻ لاءِ استعمال ڪيو ويندو آهي ۽ بندرگاهه جنهن سان سبسڪرائبر ڳنڍيل آهي. PON سامان يا WIFI بيس اسٽيشنن جي صورت ۾، ايجنٽ-سرڪٽ-Id فيلڊ مفيد معلومات تي مشتمل نه آھي (اتي ڪو به رڪنيت وارو پورٽ نه آھي). هن معاملي ۾ DHCP آپريشن جي عام رٿ هن ريت آهي:

نيٽ ورڪ سيٽنگون FreeRadius کان DHCP ذريعي

قدم بہ قدم ھي اسڪيم ھن طرح ڪم ڪري ٿو:

  1. صارف جو سامان نيٽ ورڪ سيٽنگون حاصل ڪرڻ لاءِ DHCP نشريات جي درخواست ڪري ٿو
  2. ڊوائيس (مثال طور، هڪ سوئچ، وائي فائي يا PON بيس اسٽيشن) جنهن سان سبسڪرائبر جو سامان سڌو سنئون ڳنڍيل آهي "انٽرسيپٽس" هن پيڪٽ کي ۽ ان کي تبديل ڪري ٿو، اضافي اختيارن کي متعارف ڪرايو آهي آپشن 82 ۽ ريلي ايجنٽ IP پتو ان ۾، ۽ ان کي وڌيڪ منتقل ڪري ٿو. نيٽ ورڪ.
  3. DHCP سرور درخواست قبول ڪري ٿو، جواب پيدا ڪري ٿو ۽ ان کي ريلي ڊيوائس ڏانهن موڪلي ٿو
  4. رلي ڊوائيس جوابي پيڪٽ کي سبسڪرائبر ڊوائيس ڏانهن موڪلي ٿو

يقينا، اهو سڀ ڪجهه آساني سان ڪم نٿو ڪري؛ توهان کي پنهنجي نيٽ ورڪ جي سامان جي مطابق ترتيب ڏيڻ جي ضرورت آهي.

FreeRadius انسٽال ڪرڻ

يقينا، اهو حاصل ڪري سگهجي ٿو FreeRadius ترتيب جي سيٽنگن سان، پر اهو ڏکيو ۽ غير واضح آهي ... خاص طور تي جڏهن توهان اتي وڃون ٿا N مهينن کان پوء ۽ "هر شي ڪم ڪري ٿو." تنهن ڪري، اسان Python ۾ FreeRadius لاءِ پنهنجو اختيار ڪرڻ وارو ماڊل لکڻ جو فيصلو ڪيو. اسان MySQL ڊيٽابيس مان اختياري ڊيٽا کڻنداسين. ان جي جوڙجڪ کي بيان ڪرڻ ۾ ڪو به مقصد ناهي؛ بهرحال، هرڪو اهو ٺاهيندو "پنهنجي لاء." خاص طور تي، مون اهو ڍانچو ورتو آهي جيڪو پيش ڪيو ويو آهي sql ماڊل سان FreeRadius لاءِ، ۽ ان کي ٿورو تبديل ڪيو ان کي شامل ڪري ميڪ ۽ پورٽ فيلڊ هر رڪن لاءِ، اضافي سان لاگ ان-پاسورڊ.

تنهن ڪري، پهريون، FreeRadius انسٽال ڪريو:

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

سيٽنگون ۾، انسٽال ڪرڻ لاء چونڊيو:

نيٽ ورڪ سيٽنگون FreeRadius کان DHCP ذريعي

اسان python module لاءِ هڪ Symlink ٺاهيندا آهيون (يعني ”ان کي آن“ ڪريو):

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

اچو ته python لاءِ اضافي ماڊل انسٽال ڪريون:

pip install mysql-connector

FreeRadius لاءِ python module سيٽنگون ۾، توھان کي python_path variable ۾ ماڊل ڳولا جا رستا بيان ڪرڻ جي ضرورت آھي. مثال طور مون وٽ هي آهي:

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"

توھان ڳولي سگھوٿا python interpreter کي لانچ ڪندي ۽ حڪم داخل ڪندي رستا:

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

جيڪڏهن توهان هي قدم نه کڻندا، ته پوءِ python ۾ لکيل ۽ 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

تبصرو شامل ڪريو