DHCP کے ذریعے FreeRadius سے نیٹ ورک کی ترتیبات

DHCP کے ذریعے FreeRadius سے نیٹ ورک کی ترتیبات
کام سبسکرائبرز کو آئی پی ایڈریس جاری کرنے کا بندوبست کرنے کے لیے پہنچا۔ مسئلہ کی شرائط:

  • ہم آپ کو اجازت کے لیے الگ سرور نہیں دیں گے - آپ کر لیں گے 😉
  • سبسکرائبرز کو DHCP کے ذریعے نیٹ ورک سیٹنگز موصول کرنا ضروری ہیں۔
  • نیٹ ورک متفاوت ہے۔ اس میں PON آلات اور ترتیب شدہ آپشن 82 کے ساتھ ریگولر سوئچز اور ہاٹ سپاٹ کے ساتھ وائی فائی بیسز شامل ہیں۔
  • اگر ڈیٹا آئی پی جاری کرنے کی کسی بھی شرط کے تحت نہیں آتا ہے، تو آپ کو "گیسٹ" نیٹ ورک سے آئی پی جاری کرنا ہوگا۔

اچھی طرف: فری بی ایس ڈی پر اب بھی ایک سرور موجود ہے جو "کام" کر سکتا ہے، لیکن یہ "بہت دور" ہے؛) نہیں "اس نیٹ ورک پر"۔

Mikrotik نامی ایک شاندار ڈیوائس بھی ہے۔ نیٹ ورک کا عمومی خاکہ کچھ اس طرح ہے:

DHCP کے ذریعے FreeRadius سے نیٹ ورک کی ترتیبات

کچھ سوچ بچار کے بعد، صارفین کو نیٹ ورک کی ترتیبات جاری کرنے کے لیے FreeRadius استعمال کرنے کا فیصلہ کیا گیا۔ اصولی طور پر، اسکیم معمول کی ہے: ہم DHCP سرور کو Microtick پر فعال کرتے ہیں، اور Radius Client اس پر۔ ہم DHCP سرور -> Radius Client -> Radius سرور کنکشن کو ترتیب دیتے ہیں۔

یہ مشکل نہیں لگتا۔ لیکن! شیطان تفصیلات میں ہے۔ یعنی:

  • اس اسکیم کا استعمال کرتے ہوئے PON OLT کی اجازت دیتے وقت، فریریڈیس کو ایک درخواست بھیجی جاتی ہے جس میں ہیڈ اینڈ کے MAC ایڈریس کے برابر صارف نام، MAC PON Onu کے برابر Agent-Circuit-Id اور ایک خالی پاس ورڈ ہوتا ہے۔
  • اختیار 82 کے ساتھ سوئچز سے اجازت دیتے وقت، FreeRadius کو ایک درخواست موصول ہوتی ہے جس میں سبسکرائبر کے آلے کے MAC کے برابر خالی صارف نام ہوتا ہے اور بالترتیب Agent-Circuit-Id اور Agent-remote-Id پر مشتمل اضافی صفات سے بھرا ہوتا ہے، پھر سے MAC ریلے سوئچ اور وہ بندرگاہ جس سے سبسکرائبر جڑا ہوا ہے۔
  • وائی ​​فائی پوائنٹس والے کچھ سبسکرائبرز PAP-CHAP پروٹوکول کے ذریعے مجاز ہیں۔
  • WIFI پوائنٹس کے کچھ سبسکرائبرز کو بغیر پاس ورڈ کے WIFI پوائنٹ کے MAC ایڈریس کے برابر یوزر نام کے ساتھ اجازت دی جاتی ہے۔

تاریخی پس منظر: DHCP میں "آپشن 82" کیا ہے؟

یہ DHCP پروٹوکول کے اضافی اختیارات ہیں جو آپ کو اضافی معلومات کی منتقلی کی اجازت دیتے ہیں، مثال کے طور پر ایجنٹ-سرکٹ-Id اور ایجنٹ-ریموٹ-Id فیلڈز میں۔ عام طور پر ریلے سوئچ کے میک ایڈریس اور اس پورٹ کو منتقل کرنے کے لیے استعمال کیا جاتا ہے جس سے سبسکرائبر جڑا ہوا ہے۔ PON آلات یا WIFI بیس اسٹیشنوں کے معاملے میں، Agent-Circuit-Id فیلڈ میں مفید معلومات نہیں ہوتی ہیں (کوئی سبسکرائبر پورٹ نہیں ہے)۔ اس معاملے میں DHCP آپریشن کی عمومی اسکیم مندرجہ ذیل ہے:

DHCP کے ذریعے FreeRadius سے نیٹ ورک کی ترتیبات

مرحلہ وار یہ اسکیم اس طرح کام کرتی ہے:

  1. صارف کا سامان نیٹ ورک کی ترتیبات حاصل کرنے کے لیے DHCP براڈکاسٹ کی درخواست کرتا ہے۔
  2. ڈیوائس (مثال کے طور پر، ایک سوئچ، وائی فائی یا PON بیس اسٹیشن) جس سے سبسکرائبر کا سامان براہ راست جڑا ہوا ہے اس پیکٹ کو "انٹرسیپٹ" کرتا ہے اور اسے تبدیل کرتا ہے، اس میں اضافی اختیارات آپشن 82 اور ریلے ایجنٹ کا IP ایڈریس متعارف کرواتا ہے، اور اسے مزید منتقل کرتا ہے۔ نیٹ ورک.
  3. DHCP سرور درخواست کو قبول کرتا ہے، جواب تیار کرتا ہے اور اسے ریلے ڈیوائس پر بھیجتا ہے۔
  4. ریلے ڈیوائس رسپانس پیکٹ کو سبسکرائبر ڈیوائس کو بھیجتا ہے۔

یقیناً، یہ سب اتنی آسانی سے کام نہیں کرتا؛ آپ کو اس کے مطابق اپنے نیٹ ورک کا سامان ترتیب دینے کی ضرورت ہے۔

FreeRadius انسٹال کرنا

بلاشبہ، یہ FreeRadius کنفیگریشن سیٹنگز کے ساتھ حاصل کیا جا سکتا ہے، لیکن یہ مشکل اور غیر واضح ہے... خاص طور پر جب آپ وہاں N مہینوں کے بعد جاتے ہیں اور "سب کچھ کام کرتا ہے۔" لہذا، ہم نے Python میں FreeRadius کے لیے اپنا اختیار کرنے کا ماڈیول لکھنے کا فیصلہ کیا۔ ہم MySQL ڈیٹا بیس سے اجازت کا ڈیٹا لیں گے۔ اس کی ساخت کو بیان کرنے کا کوئی فائدہ نہیں؛ بہرحال، ہر کوئی اسے اپنے لیے بنائے گا۔ خاص طور پر، میں نے وہ ڈھانچہ لیا جو FreeRadius کے لیے sql ماڈیول کے ساتھ پیش کیا جاتا ہے، اور لاگ ان پاس ورڈ کے علاوہ، ہر سبسکرائبر کے لیے ایک میک اور پورٹ فیلڈ شامل کرکے اسے تھوڑا سا تبدیل کیا۔

تو، پہلے، FreeRadius انسٹال کریں:

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

ترتیبات میں، انسٹال کرنے کے لیے منتخب کریں:

DHCP کے ذریعے FreeRadius سے نیٹ ورک کی ترتیبات

ہم python ماڈیول کے لیے ایک سملنک بناتے ہیں (یعنی اسے "آن" کریں):

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

آئیے python کے لیے ایک اضافی ماڈیول انسٹال کریں:

pip install mysql-connector

FreeRadius کے لیے python ماڈیول کی ترتیبات میں، آپ کو 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"

آپ 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

جیسا کہ آپ کوڈ سے دیکھ سکتے ہیں، ہم سبسکرائبر کو اس کے معلوم سبسکرائبر میک ایڈریسز یا آپشن 82 کے امتزاج سے تمام دستیاب طریقے استعمال کرتے ہوئے شناخت کرنے کی کوشش کر رہے ہیں، اور اگر یہ کام نہیں کرتا ہے، تو ہم سب سے پرانا IP ایڈریس جاری کرتے ہیں جو "مہمان" سے استعمال کیا گیا ہے۔ نیٹ ورک جو کچھ باقی ہے وہ سائٹس سے چلنے والے فولڈر میں ڈیفالٹ اسکرپٹ کو کنفیگر کرنا ہے، تاکہ python اسکرپٹ کے ضروری فنکشنز مقررہ لمحات میں مروڑ جائیں۔ درحقیقت، فائل کو فارم میں لانے کے لیے کافی ہے:

پہلے سے طے شدہ

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 ایڈریس کو "جعلی" بنانا ممکن ہے۔ سبسکرائبر کے لیے یہ کافی ہے کہ وہ کسی اور کے میک کو رجسٹر کرائیں اور مسائل ہوں گے۔
  • مہمانوں کے نیٹ ورک جاری کرنے کی منطق تنقید سے بالاتر ہے۔ یہاں تک کہ کوئی چیک بھی نہیں ہے "ہو سکتا ہے کہ پہلے ہی ایک ہی IP ایڈریس والے کلائنٹ موجود ہوں؟"

یہ صرف ایک "کوکی کٹر حل" ہے جو خاص طور پر میرے حالات میں کام کرنے کے لیے ڈیزائن کیا گیا ہے، اس سے زیادہ کچھ نہیں۔ سختی سے فیصلہ نہ کریں 😉

ماخذ: www.habr.com

نیا تبصرہ شامل کریں