Barashada Python (wax yar in ka badan meel xoqan 😉)
beddelka serverka DB2DHCP (fargeeto), asalka ah halkan, kaas oo noqonaaya mid aad iyo aad u adag in la isugu keeno OS-ka cusub. Anigu ma jecli inay tahay binary in aysan jirin si loo "beddelo hadda"
Helitaanka server-ka DHCP ee shaqeeya oo awood u leh inuu doorto ciwaanka IP-ga macmiilaha iyadoo la adeegsanayo mac-macmiilka ama beddelka isku-darka dekedda ee Mac+ (Doorashada 82)
qorista baaskiil kale (Oh! tani waa hawsha aan jeclahay)
Helitaanka faallooyin ku saabsan gacan-karnimadaada Habrahabr (ama ka sii fiican, martiqaad) 😉
Natiijadu: waxay ku shaqeysaa 😉 Waxaa lagu tijaabiyay FreeBSD iyo Ubuntu OS. Aragti ahaan, koodhka ayaa la waydiisan karaa inuu ka hoos shaqeeyo OS kasta, sababtoo ah Waxaad mooddaa in aanay jirin wax xidhidh gaar ah oo ku jira koodka.
Si taxadar leh! Wax badan oo kale ayaa soo socda.
Ku xidhka kaydka hiwaayadda "Nool taabo".
Habka rakibidda, habaynta iyo isticmaalka natiijada "barashada qalabka" aad ayuu u hooseeyaa, ka dibna aragti yar oo ku saabsan borotokoolka DHCP. Naftayda. Taariikhdana 😉
Aragti yar
Waa maxay DHCP
Kani waa hab-maamuus shabakadeed kaas oo u oggolaanaya qalabku inuu ka ogaado ciwaanka IP-ga (iyo xuduudaha kale sida albaabka, DNS, iwm.) ee server-ka DHCP. Xirmooyinka waxaa lagu kala beddelaa iyadoo la isticmaalayo nidaamka UDP. Mabda'a guud ee hawlgalka aaladda marka la codsanayo xuduudaha shabakada waa sida soo socota:
Qalabku (macmiil) wuxuu soo diraa codsiga baahinta UDP (DHCDISCOVER) ee shabakada oo dhan iyadoo codsiga "hagaag, qof i siiya ciwaanka IP." Waxaa intaa dheer, sida caadiga ah (laakiin had iyo jeer maaha) codsigu wuxuu ka yimaadaa dekedda 68 (source), halka loo socdona waa dekedda 67 (meesha). Qalabka qaar ayaa sidoo kale baakidhyo ka soo dira dekedda 67. Cinwaanka MAC ee aaladda macmiilku waxa uu ku jiraa xidhmada DHCPDISCOVER.
Dhammaan server-yada DHCP ee ku yaal shabakada (oo laga yaabo inay jiraan dhowr iyaga ka mid ah) waxay sameeyaan bixinta DHCPOFFER oo leh jaangooyooyin shabakadeed oo loogu talagalay qalabka soo diray DHCPDISCOVER, oo sidoo kale ku sii daaya shabakada. Aqoonsiga cidda baakaddan loogu talagalay waxay ku salaysan tahay ciwaanka MAC ee macmiilka oo hore loogu bixiyay codsiga DHCPDISCOVER.
Macmiilku waxa uu aqbalaa baakado ay ku jiraan soo jeedinta goobaha shabakada, waxa uu doortaa midka ugu soo jiidashada badan (shuruudaha way ka duwanaan karaan, tusaale ahaan, wakhtiga baakooyinka la keenayo, tirada dariiqyada dhexe), oo waxa uu sameeyaa "codsi rasmi ah" DHCPREQUEST oo leh goobaha shabakada Laga soo bilaabo server-ka DHCP ee ay jeceshahay. Xaaladdan oo kale, baakidhku waxa uu tagayaa server DHCP gaar ah.
Server-ka helay DHCPREQUEST waxa uu soo diraa baakidh qaabka DHCPACK, kaas oo uu marlabaad ku taxay goobaha shabakada ee loogu talagalay macmiilkan
Intaa waxaa dheer, waxaa jira baakado DHCPINFORM ah oo ka yimid macmiilka, iyo ujeedada taas oo ah in la ogeysiiyo server-ka DHCP in "macmiilku waa nool yahay" oo isticmaalaya goobaha shabakadaha la soo saaray. Hirgelinta serfarkan, xidhmooyinkan waa la iska indhatiray.
Qaab xirmo
Guud ahaan, xirmada xirmada Ethernet waxay u egtahay sidan:
Xaaladeena, waxaanu si toos ah uga fiirsan doonaa xogta waxa ku jira xidhmada UDP, iyada oo aan lahayn madax-dhaqameedka lakabka OSI, kuwaas oo ah qaab dhismeedka DHCP:
DHCPDIScover
Haddaba, habka helitaanka ciwaanka IP-ga ee aaladda waxa ay ka bilaabataa macmiilka DHCP oo codsi baahinta ka soo diraya dekedda 68 ilaa 255.255.255.255:67. Xirmadan, macmiilku waxa ku jira ciwaanka MAC, iyo sidoo kale waxa dhabta ah ee uu rabo in laga helo server-ka DHCP. Qaab dhismeedka xirmada waxaa lagu qeexay shaxda hoose.
Isla marka uu seerfarku helo xidhmada DHCPDISCOVER iyo haddii uu arko in uu macmiilka siin karo wax ka la codsaday, markaas waxa uu u soo saarayaa jawaab - DHCPDISCOVER. Jawaabta waxaa loo diraa dekedda "meeshii ay ka timid", iyada oo la sii daayo, sababtoo ah Waqtigan xaadirka ah, macmiilku weli ma haysto ciwaanka IP-ga, sidaas darteed wuxuu aqbali karaa oo keliya baakadda haddii loo diro baahinta. Macmiilku wuxuu aqoonsan yahay in tani ay u tahay xirmo isaga oo ciwaankiisa MAC ah oo ku dhex jira xirmada, iyo sidoo kale lambarka macaamilka ee uu soo saaro waqtiga xirmada ugu horreysa ee la abuurayo.
Lambarka doorashada
1
December
1
Ikhtiyaarka lagu siinayo macmiilka DHCP maaskaro shabakadeed
Dhererka doorashada
4
December
1
Qiimaha ikhtiyaarka
255.255.224.0
String
4
Lambarka doorashada
3
December
1
Ikhtiyaarka lagu siinayo macmiilka DHCP albaabka hore
Dhererka doorashada
4
December
1
Qiimaha ikhtiyaarka
172.16.12.1
String
4
Lambarka doorashada
6
December
1
Ikhtiyaarka lagu siinayo DHCP macmiilka DNS
Dhererka doorashada
4
December
1
Qiimaha ikhtiyaarka
8.8.8.8
String
4
Lambarka doorashada
51
December
1
Cimrada inta lagu jiro xaddidaadaha shabakadda ee la soo saaray ilbiriqsiyo gudahood, ka dib macmiilka DHCP waa inuu mar kale codsadaa
Dhererka doorashada
4
December
1
Qiimaha ikhtiyaarka
86400
December
4
Lambarka doorashada
82
December
1
Doorashada 82, waxay ku celisaa wixii ku soo galay DHCPDISCOVER
Dhererka doorashada
18
December
1
Qiimaha ikhtiyaarka
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
December
18
Ka dib marka macmiilku helo DHCPOFFER, wuxuu sameeyaa baakidh uu ku codsanayo cabirrada shabakadaha maaha dhammaan server-yada DHCP ee shabakada, laakiin kaliya mid gaar ah, kaas oo uu DHCPOFFER soo bandhigo uu "jeclaa" ugu badnaa. Shuruudaha "sida" way kala duwanaan karaan waxayna ku xiran yihiin hirgelinta DHCP ee macmiilka. Qofka helaya codsiga waxa lagu cayimay iyadoo la isticmaalayo ciwaanka MAC ee serfarka DHCP. Sidoo kale, xidhmada DHCPREQUEST waxaa soo diri kara macmiilka iyada oo aan marka hore soo saarin DHCPDISCOVER, haddii ciwaanka IP-ga serfarka mar hore la helay.
Lambarka doorashada
61
December
1
Aqoonsiga macmiilka: 01 (loogu talagalay Ehernet) + cinwaanka MAC macmiilka
Dhererka doorashada
7
December
1
Qiimaha ikhtiyaarka
01:2c:ab:25:ff:72:a6
hex
7
Lambarka doorashada
60
December
"Aqoonsiga fasalka iibiyaha". Xaaladeyda, waxay ka warbixisaa nooca macmiilka DHCP. Waxaa laga yaabaa in aaladaha kale ay soo celiyaan wax ka duwan. Windows tusaale ahaan waxay soo sheegaysaa MSFT 5.0
Dhererka doorashada
11
December
Qiimaha ikhtiyaarka
udhcp 0.9.8
String
Lambarka doorashada
55
1
Xuduudaha shabakadda ee uu codsaday macmiilku. Halabuurku wuu kala duwanaan karaa
01 - maaskaro shabakad
03 - Gateway
06 - DNS
oc - Magaca martida
0f - magaca shabakada shabakada
1c - ciwaanka codsiga baahinta (baahinta)
42 - Magaca server-ka TFTP
79 - Jidka Joogta ah ee aan fasalka lahayn
Dhererka doorashada
8
1
Qiimaha ikhtiyaarka
01:03:06:0c:0f:1c:42:79
8
Lambarka doorashada
82
December
1
Doorashada 82, waxay ku celisaa wixii ku soo galay DHCPDISCOVER
Dhererka doorashada
18
December
1
Qiimaha ikhtiyaarka
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
December
18
Sida xaqiijinta in "haa, taasi waa sax, kani waa cinwaankaaga IP-ga, mana siin doono qof kale" server-ka DHCP, xirmo qaab DHCPACK ah oo ka socda server-ka oo u adeega macmiilka. Waxaa loo diraa baahinta sida baakadaha kale. In kasta oo, koodka hoose ee server-ka DHCP ee lagu hirgeliyay Python, haddii ay dhacdo, waxaan nuqul ka dhigayaa codsi kasta oo baahin aniga oo u diraya baakidh IP macmiil gaar ah, haddii hore loo yaqaan. Waxaa intaa dheer, server-ka DHCP ma daneeyo haba yaraatee in xirmada DHCPACK ay gaartay macmiilka. Haddii macmiilku aanu helin DHCPACK, ka dib muddo ka dib waxay si fudud ku soo celinaysaa DHCPREQUEST
Lambarka doorashada
1
December
1
Ikhtiyaarka lagu siinayo macmiilka DHCP maaskaro shabakadeed
Dhererka doorashada
4
December
1
Qiimaha ikhtiyaarka
255.255.224.0
String
4
Lambarka doorashada
3
December
1
Ikhtiyaarka lagu siinayo macmiilka DHCP albaabka hore
Dhererka doorashada
4
December
1
Qiimaha ikhtiyaarka
172.16.12.1
String
4
Lambarka doorashada
6
December
1
Ikhtiyaarka lagu siinayo DHCP macmiilka DNS
Dhererka doorashada
4
December
1
Qiimaha ikhtiyaarka
8.8.8.8
String
4
Lambarka doorashada
51
December
1
Cimrada inta lagu jiro xaddidaadaha shabakadda ee la soo saaray ilbiriqsiyo gudahood, ka dib macmiilka DHCP waa inuu mar kale codsadaa
Dhererka doorashada
4
December
1
Qiimaha ikhtiyaarka
86400
December
4
Lambarka doorashada
82
December
1
Doorashada 82, waxay ku celisaa wixii ku soo galay DHCPDISCOVER
Dhererka doorashada
18
December
1
Qiimaha ikhtiyaarka
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
December
18
Rakibadu waxay dhab ahaantii ka kooban tahay rakibidda qaybaha Python ee lagama maarmaanka u ah shaqada. Waxaa loo maleynayaa in MySQL mar hore la rakibay oo la habeeyey.
FreeBSD
pkg ku rakib python3 python3 -m ensurepip pip3 rakib mysql-connector
Waxaan abuurnaa xog ururin MySQL ah, ku shubo pydhcp.sql daadinta, oo waxaan dejineynaa faylka qaabeynta.
Qaabeynta
Dhammaan dejinta server waxay ku jiraan faylka xml Faylka tixraaca:
1.0 0.0.0.0 255.255.255.255 192.168.0.71 8600 1 255.255.255.0 192.168.0.1 localhost imtixaan imtixaan pydhcp ikhtiyaar_8.8.8.8_hex:sw_port82:1:20 ikhtiyaar_22_hex:sw_port82:2:16 ikhtiyaar_18_hex:sw_mac:82:26 40 ka dooro ip,mask,router,dns isticmaalayaasha halka sare(mac)=sare('{option_3_AgentRemoteId_hex}') iyo top(port)=sare('{option_1_AgentCircuitId_port_hex}') ka dooro ip,mask,router,dns isticmaalayaasha halka sare(mac)=sare('{sw_mac}'))iyo sare(port)=sare('{sw_port82}') ka dooro ip,mask,router,dns isticmaalayaasha halka sare(mac)=sare('{ClientMacAddress}') geli taariikhda (id,dt,mac,ip,comment) qiyamka (null, now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')
Hadda si aad u faahfaahsan oo ku saabsan tags:
Qaybta dhcpserver waxay qeexaysaa habaynta aasaasiga ah ee lagu bilaabayo serverka, kuwaas oo ah:
martigeliyaha - waa maxay cinwaanka IP-ga ee server-ku ka dhegeysto dekedda 67
baahinta - kee ip ah baahinta DHCPOFFER iyo DHCPACK
DHCPServer - waa maxay ip server-ka DHCP
LeaseTime wakhtiga kirada ee ciwaanka IP-ga ee la soo saaray
Xadka xad-dhaafka ah - immisa xadhig ayaa isku mar wada socda si ay uga baaraandegaan baakadaha UDP ee soo galaya ee dekedda 67. Waxa loo malaynayaa inay ka caawiso mashaariicda raran 😉
DefaultMask,defaultRouter,defaultDNS - waxa la siiyo macaamiisha si toos ah haddii IP laga helo database-ka, laakiin xaddidaadyo dheeraad ah looma cayimin
mysql qaybta:
martigeliyaha, username, password, basename - wax walba laftiisa u hadla. Qaab dhismeed xog-ururin ah ayaa la dhejiyay GitHub
Qaybta weydiinta: codsiyada helitaanka OFFER/ACK ayaa lagu sifeeyay halkan:
offer_n - xadhig weydiin. Haddii soo celinta ay madhan tahay, ka dib waxay fulisaa codsiga soo-jeedinta soo socota
history_sql - weydiin u qorta, tusaale ahaan, "taariikhda ogolaanshaha" ee macaamiisha
Codsiyada waxaa ku jiri kara wax kasta oo doorsoomayaal ah oo ka socda qaybta ikhtiyaarka ama xulashooyinka borotokoolka DHCP.
Qaybta ikhtiyaariga ah. Tani waa halka ay ka sii xiiso badan tahay. Halkan waxaan ku abuuri karnaa doorsoomayaal aan ku isticmaali karno hadhow qaybta weydiinta.
Tusaale ahaan:
option_82_hex:sw_port1:20:22
, xariiqan talisku waxa uu qaadanayaa dhamaan xariiqda ku soo gashay codsiga DHCP ee 82, qaab hex ah, oo u dhexeeya 20 ilaa 22 bytes oo loo dhan yahay oo waxa uu dhigayaa doorsoomaha cusub sw_port1
option_82_hex:sw_mac:26:40
, qeex doorsoomaha sw_mac, adiga oo hex ka soo qaadaya inta u dhaxaysa 26:40
Waxaad arki kartaa dhammaan xulashooyinka suurtagalka ah ee loo isticmaali karo weydiimaha adoo ku bilaabaya server-ka beddelka -d. Waxaan arki doonaa wax u eg qoraalkan:
Sidaa darteed, waxaan ku duubi karnaa doorsoome kasta {} waxaana loo isticmaali doonaa weydiinta SQL.
Aan u diiwaan geliyo taariikhda in macmiilku helay cinwaanka IP:
Adeegaha bilawga
./pydhcpdb.py -d -c config.xml
- d qaabka wax soo saarka console DEBUG
- c <filename> faylka qaabeynta
Qaadashada
Oo hadda faahfaahin dheeraad ah oo ku saabsan hirgelinta server-ka Python. Waa xanuun. Python waxaa lagu bartay duullimaad. Daqiiqado badan ayaa lagu sameeyaa qaabka "wow, bartey aan ka dhigay inay shaqeyso." Sinaba looma hagaajin, waxaana looga tagay foomkan badi ahaan waayo-aragnimada yar ee horumarinta Python awgeed. Waxaan dul istaagi doonaa dhinacyada ugu xiisaha badan ee hirgelinta server-ka "code".
Faylka qaabeynta XML
Qaabka caadiga ah ee Python xml.dom ayaa la isticmaalaa. Waxay u muuqataa mid fudud, laakiin inta lagu guda jiro hirgelinta waxaa jiray la'aan la arki karo oo ah dukumeenti cad iyo tusaalooyin ku saabsan shabakadda iyadoo la adeegsanayo cutubkan.
geed = minidom.parse (gconfig ["config_file") mconfig = geed.getElementsByTagName ("mysql") ee elem ee mconfig: gconfig ["mysql_host"] = elem.getElementsByTagName (" martigeliyaha") [0].firstChild.data gconfig. =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") ee elem in dconfig: gconfig ["baahinta"]=elem.getElementsByTagName("baahinta")[0]. firstChild.data gconfig ["dhcp_host"]=elem.getElementsByTagName("martigeliyaha")[0].firstChild.data gconfig["dhcp_LeaseTime"]=elem.getElementsByTagName ("LeaseTime")[0].firstChild.data gconfig[" dhcp_ThreadLimit"]=int(elem.getElementsByTagName("ThreadLimit")[0].firstChild.data) gconfig ["dhcp_Server"]=elem.getElementsByTagName("DHCPServer")[0].firstChild.data gconfig_de =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultDNS"]=elem. defaultDNS") [0].firstChild.data qconfig=geed.getElementsByTagName("question") ee elem in qconfig: gconfig ["offer_count"]=elem.getElementsByTagName ("offer_count") [0] First Child.data ee nambarka gudaha kala duwan (int(gconfig ["offer_count")): gconfig["offer_"+str (nambar+0)]=elem.getElementsByTagName ["history_sql"]=elem.getElementsByTagName("history_sql")[0].firstChild.data optional=tree.getElementsByTagName("options") ee kala doorashada: node=elem.getElementsByTagName("ikhtiyaarka") ee ikhtiyaarada ku jira node : optionMod.append (options.firstChild.data)
Multithreading
Si cajiib ah oo ku filan, multithreading ee Python si cad oo fudud ayaa loo hirgeliyay.
def PacketWork(data,addr): ... # hirgalinta falanqaynta xirmada soo socota iyo ka jawaabista target=PacketWork , args=(xogta,addr,)))bilow() # sida ay ku timid - waxaanu bilawnay shaqada PacketWork ee hore loo qeexay ee gadaasha iyadoo la adeegsanayo threading.active_count()>gconfig["dhcp_ThreadLimit"]: wakhtiga. hurdo(1024) # haday nambarku jiraan Xadhigyo badan oo horeba u socday marka loo eego goobaha, waxaanu sugayna ilaa ay ka yaraadaan
Hel/dir xirmo DHCP
Si aad u dhexgasho baakadaha UDP ee kaadhka shabakadda, waxaad u baahan tahay inaad "kor u qaaddo" godka:
udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # u beddel godka qaabka dhegeystaha badan rz=udp_socket.sendto(packetack, addr)
, halka SOL_SOCKET macneheedu yahay "heerka borotokoolka" ee dejinta fursadaha,
, SO_BROADCAST ikhtiyaarka ah in xirmada koofiyadda ay tahay "baahinta"
,SO_REUSEADDR ikhtiyaarka u beddela godka "dhagaysteyaal badan" qaab. Fikrad ahaan, looma baahna kiiskan, laakiin mid ka mid ah adeegayaasha FreeBSD ee aan ku tijaabiyay, koodka ma shaqeynin ikhtiyaarkan la'aanteed.
Baarista xirmada DHCP
Tani waa meesha aan runtii ka helay Python. Waxaa soo baxday in sanduuqa ka baxsan ay kuu ogolaanayso inaad si fiican ugu beddesho bytecode. Oggolaanshaha in si fudud loogu tarjumo qiyamka tobanlaha, xargaha iyo hex - i.e. Tani waa waxa aan dhab ahaantii u baahanahay si aan u fahamno qaabka xirmada. Marka, tusaale ahaan, waxaad heli kartaa noocyo kala duwan oo bytes gudaha HEX iyo kaliya bytes: