kusintha kwa seva Chithunzi cha DB2DHCP (mphanda wanga), choyambirira apa, zomwe zikukhala zovuta kusonkhanitsa OS yatsopano. Ndipo sindimakonda kuti ndi binary kuti palibe njira "yosinthira pompano"
kupeza seva yogwira ntchito ya DHCP yokhala ndi mwayi wosankha adilesi ya IP ya olembetsa pogwiritsa ntchito mac kapena kusinthana kwa ma mac + doko (Njira 82)
kulemba njinga ina (O! iyi ndi ntchito yomwe ndimakonda)
kulandira ndemanga pazamasewera anu pa Habrahabr (kapena kuposa apo, kuyitanidwa) 😉
Zotsatira: imagwira ntchito 😉 Kuyesedwa pa FreeBSD ndi Ubuntu OS. Mwachidziwitso, code ikhoza kufunsidwa kuti igwire ntchito pansi pa OS iliyonse, chifukwa Zikuwoneka kuti palibe zomangira zenizeni mu code.
Mosamala! Pali zambiri zomwe zikubwera.
Lumikizani kunkhokwe kwa amateurs "khudzani moyo".
Njira yoyika, kukonza ndi kugwiritsa ntchito zotsatira za "kuphunzira hardware" ndi yotsika kwambiri, ndiyeno lingaliro laling'ono la DHCP protocol. Kwa ine ndekha. Ndipo kwa history 😉
Chiphunzitso chaching'ono
DHCP ndi chiyani
Iyi ndi protocol ya netiweki yomwe imalola chipangizo kudziwa adilesi yake ya IP (ndi magawo ena monga gateway, DNS, etc.) kuchokera pa seva ya DHCP. Mapaketi amasinthidwa pogwiritsa ntchito protocol ya UDP. Mfundo yaikulu yogwiritsira ntchito chipangizochi popempha magawo a intaneti ndi awa:
Chipangizocho (kasitomala) chimatumiza pempho la UDP pawailesi (DHCPDISCOVER) pa netiweki yonse ndi pempho "chabwino, wina andipatse adilesi ya IP." Komanso, kawirikawiri (koma osati nthawi zonse) pempho limapezeka pa doko 68 (gwero), ndipo kopita ndi doko 67 (kopita). Zida zina zimatumizanso mapaketi kuchokera ku port 67. Adilesi ya MAC ya chipangizo cha kasitomala ikuphatikizidwa mkati mwa phukusi la DHCPDISCOVER.
Ma seva onse a DHCP omwe ali pa netiweki (ndipo pakhoza kukhala angapo a iwo) amapanga chopereka cha DHCPOFFER chokhala ndi zoikamo za netiweki pa chipangizo chomwe chinatumiza DHCPDISCOVER, ndikuwulutsanso pa netiweki. Kuzindikirika kwa paketiyi kutengera adilesi ya MAC ya kasitomala yomwe yaperekedwa poyambirira pa pempho la DHCPDISCOVER.
Makasitomala amavomereza mapaketi okhala ndi malingaliro pazosintha zapaintaneti, amasankha chowoneka bwino kwambiri (zoyenera kukhala zosiyana, mwachitsanzo, nthawi yoperekera paketi, kuchuluka kwa njira zapakatikati), ndikupanga "pempho lovomerezeka" DHCPREQUEST ndi zosintha zapaintaneti. kuchokera pa seva ya DHCP yomwe imakonda. Pankhaniyi, paketi imapita ku seva inayake ya DHCP.
Seva yomwe idalandira DHCPREQUEST imatumiza paketi yamtundu wa DHCPACK, momwe imalembanso zokonda za netiweki zomwe zimapangidwira kasitomala uyu.
Kuonjezera apo, pali mapaketi a DHCPINFORM omwe amachokera kwa kasitomala, ndipo cholinga chake ndikudziwitsa seva ya DHCP kuti "kasitomala ali moyo" ndipo akugwiritsa ntchito zoikamo zoperekedwa. Pokhazikitsa seva iyi, mapaketi awa sanyalanyazidwa.
Mtundu wa paketi
Nthawi zambiri, chimango cha paketi ya Ethernet chimawoneka motere:
Kwa ife, tidzangoganizira zokhazokha zomwe zili mu paketi ya UDP, popanda mitu ya protocol ya OSI, yomwe ndi DHCP:
ZOCHITIKA
Chifukwa chake, njira yopezera adilesi ya IP ya chipangizo imayamba ndi kasitomala wa DHCP kutumiza pempho lowulutsa kuchokera ku doko 68 kupita ku 255.255.255.255:67. Mu phukusili, kasitomala amaphatikiza adilesi yake ya MAC, komanso zomwe akufuna kulandira kuchokera ku seva ya DHCP. Mapangidwe a phukusi akufotokozedwa mu tebulo ili m'munsimu.
DHCPDISCOVER Packet Structure Table
Malo mu phukusi
Dzina la mtengo
Chitsanzo:
Mau oyamba
Byte
Kufotokozera
1
Kufunsira kwa Boot
1
Hex
1
Mtundu wa uthenga. 1 - pempho kuchokera kwa kasitomala kupita ku seva, 2 - kuyankha kuchokera ku seva kupita kwa kasitomala
2
Mtundu wa Hardware
1
Hex
1
Mtundu wa adilesi ya hardware, mu protocol iyi 1 - MAC
3
Kutalika kwa ma adilesi a Hardware
6
Hex
1
Kutalika kwa adilesi ya MAC
4
Mphuno
1
Hex
1
Chiwerengero cha njira zapakatikati
5
ID Yogulitsa
23:cf:de:1d
Hex
4
Chizindikiritso cha zochitika zapadera. Wopangidwa ndi kasitomala kumayambiriro kwa ntchito yopempha
1
Netiweki magawo ofunsidwa ndi kasitomala. Mapangidwe angasiyane
01 - Network mask
03 - Njira
06 - DNS
oc - Dzina la alendo
0f - dzina la domain domain
1c - adilesi yofunsira kuwulutsa (kuwulutsa)
42 - Dzina la seva ya TFTP
79 - Njira Yopanda Makhalidwe
Njira kutalika
8
1
Mtengo wosankha
01:03:06:0c:0f:1c:42:79
8
Nambala yosankha
82
Dis
Njira 82, yomwe imatumiza adilesi ya MAC ya chipangizo chobwereza ndi zina zowonjezera.
Nthawi zambiri, ili ndi doko la switch pomwe kasitomala wa DHCP amathamangira. Njirayi ili ndi magawo owonjezera. Yoyamba ndi nambala ya "suboption", yachiwiri ndi kutalika kwake, ndiye mtengo wake.
Pankhaniyi, muzosankha 82, zosankha zazing'ono zimayikidwa:
Agent Circuit ID = 00:04:00:01:00:04, pomwe ma byte awiri omaliza ndi doko la kasitomala la DHCP komwe pempholo linachokera.
Agent Remote ID = 00:06:c8:be:19:93:11:48 - Adilesi ya MAC ya chipangizo chobwereza DHCP
Kutha kwa phukusi
255
Dis
1
255 ikuyimira kutha kwa paketi
CHITSANZO
Seva ikangolandira paketi ya DHCPDISCOVER ndipo ngati iwona kuti ingapatse kasitomala kena kake kuchokera pa yomwe wapemphedwa, ndiye kuti imapanga yankho - DHCPDISCOVER. Yankho limatumizidwa ku doko "kuchokera kumene linachokera", pofalitsa, chifukwa pakadali pano, kasitomala alibe adilesi ya IP, chifukwa chake amatha kungovomereza paketiyo ngati itumizidwa ndi wailesi. Wogulayo amazindikira kuti iyi ndi phukusi lake ndi adilesi yake ya MAC mkati mwa phukusi, komanso nambala yamalonda yomwe amapanga panthawi yomwe phukusi loyamba limapangidwa.
DHCPOFFER Packet Structure Table
Malo mu phukusi
Dzina la mtengo (wamba)
Chitsanzo:
Mau oyamba
Byte
Kufotokozera
1
Kufunsira kwa Boot
1
Hex
1
Mtundu wa uthenga. 1 - pempho kuchokera kwa kasitomala kupita ku seva, 2 - kuyankha kuchokera ku seva kupita kwa kasitomala
2
Mtundu wa Hardware
1
Hex
1
Mtundu wa adilesi ya hardware, mu protocol iyi 1 - MAC
3
Kutalika kwa ma adilesi a Hardware
6
Hex
1
Kutalika kwa adilesi ya MAC
4
Mphuno
1
Hex
1
Chiwerengero cha njira zapakatikati
5
ID Yogulitsa
23:cf:de:1d
Hex
4
Chizindikiritso cha zochitika zapadera. Wopangidwa ndi kasitomala kumayambiriro kwa ntchito yopempha
Kutha kwa phukusi
255
Dis
1
255 ikuyimira kutha kwa paketi
KUDZIWA
Wogula akalandira DHCPOFFER, amapanga paketi yopempha magawo a netiweki osati ku ma seva onse a DHCP pa netiweki, koma kwa imodzi yokha, yomwe DHCPOFFER imamupatsa "adakonda" kwambiri. Njira za "monga" zimatha kukhala zosiyana ndipo zimadalira kukhazikitsidwa kwa DHCP kwa kasitomala. Wolandira pempho amatchulidwa pogwiritsa ntchito adilesi ya MAC ya seva ya DHCP. Komanso, paketi ya DHCPREQUEST ikhoza kutumizidwa ndi kasitomala popanda kupanga DHCPDISCOVER, ngati adilesi ya IP ya seva idapezedwa kale.
DHCPREQUEST Packet Structure Table
Malo mu phukusi
Dzina la mtengo (wamba)
Chitsanzo:
Mau oyamba
Byte
Kufotokozera
1
Kufunsira kwa Boot
1
Hex
1
Mtundu wa uthenga. 1 - pempho kuchokera kwa kasitomala kupita ku seva, 2 - kuyankha kuchokera ku seva kupita kwa kasitomala
2
Mtundu wa Hardware
1
Hex
1
Mtundu wa adilesi ya hardware, mu protocol iyi 1 - MAC
3
Kutalika kwa ma adilesi a Hardware
6
Hex
1
Kutalika kwa adilesi ya MAC
4
Mphuno
1
Hex
1
Chiwerengero cha njira zapakatikati
5
ID Yogulitsa
23:cf:de:1d
Hex
4
Chizindikiritso cha zochitika zapadera. Wopangidwa ndi kasitomala kumayambiriro kwa ntchito yopempha
11
Adilesi ya IP ya kasitomala
0.0.0.0
Mzere
4
Adilesi ya IP ya kasitomala (ngati ilipo)
15
Adilesi ya IP ya kasitomala wanu
172.16.134.61
Mzere
4
Adilesi ya IP yoperekedwa ndi seva (ngati ilipo)
19
Kenako adilesi ya IP ya seva
0.0.0.0
Mzere
4
Adilesi ya IP ya seva (ngati imadziwika)
23
Adilesi ya IP ya wothandizira
172.16.114.41
Mzere
4
Adilesi ya IP ya wothandizira wotumizira (mwachitsanzo, chosinthira)
27
Adilesi ya Client MAC
14:d6:4d:a7:c9:55
Hex
6
Adilesi ya MAC ya wotumiza paketi (kasitomala)
31
Client hardware address padding
Hex
10
Mpando wosungidwa. Nthawi zambiri amadzazidwa ndi ziro
41
Dzina la seva
Mzere
64
Dzina la seva ya DHCP. Nthawi zambiri samafalitsidwa
105
Dzina la fayilo
Mzere
128
Dzina lafayilo pa seva yogwiritsidwa ntchito ndi ma diskless stations poyambira
235
Ma cookies amatsenga
63: 82: 53: 63
Hex
4
Nambala ya "Magic", malinga ndi zomwe, incl. mutha kudziwa kuti paketi iyi ndi ya protocol ya DHCP
Zosankha za DHCP. Ikhoza kupita mu dongosolo lililonse
236
Nambala yosankha
53
Dis
3
Njira 53, yomwe imatanthawuza mtundu wa paketi ya DHCP 3 - DHCPREQUEST
Njira kutalika
1
Dis
1
Mtengo wosankha
3
Dis
1
Nambala yosankha
61
Dis
1
ID ya kasitomala: 01 (ya Ehernet) + adilesi ya MAC ya kasitomala
Njira kutalika
7
Dis
1
Mtengo wosankha
01:2c:ab:25:ff:72:a6
Hex
7
Nambala yosankha
60
Dis
"Chizindikiritso cha kalasi ya Vendor". Kwa ine, imafotokoza mtundu wa kasitomala wa DHCP. Mwina zida zina zimabweretsa china chake. Windows mwachitsanzo ikuti MSFT 5.0
Njira kutalika
11
Dis
Mtengo wosankha
ddcp 0.9.8
Mzere
Nambala yosankha
55
1
Netiweki magawo ofunsidwa ndi kasitomala. Mapangidwe angasiyane
01 - Network mask
03 - Njira
06 - DNS
oc - Dzina la alendo
0f - dzina la domain domain
1c - adilesi yofunsira kuwulutsa (kuwulutsa)
42 - Dzina la seva ya TFTP
79 - Njira Yopanda Makhalidwe
Kutha kwa phukusi
255
Dis
1
255 ikuyimira kutha kwa paketi
ZOCHITIKA
Monga chitsimikizo chakuti "inde, ndiko kulondola, iyi ndi adilesi yanu ya IP, ndipo sindidzapereka kwa wina aliyense" kuchokera ku seva ya DHCP, paketi mumtundu wa DHCPACK kuchokera ku seva kupita kwa kasitomala. Imatumizidwa ngati mapaketi ena. Ngakhale, mu code ili m'munsiyi ya seva ya DHCP yomwe yakhazikitsidwa ku Python, ngati ndingathe kubwereza pempho lililonse lofalitsa potumiza paketi ku IP yamakasitomala, ngati ikudziwika kale. Komanso, seva ya DHCP sisamala konse ngati paketi ya DHCPACK yafika kwa kasitomala. Ngati kasitomala salandira DHCPACK, ndiye pakapita nthawi amangobwereza DHCPREQUEST
DHCPACK Packet Structure Table
Malo mu phukusi
Dzina la mtengo (wamba)
Chitsanzo:
Mau oyamba
Byte
Kufotokozera
1
Kufunsira kwa Boot
2
Hex
1
Mtundu wa uthenga. 1 - pempho kuchokera kwa kasitomala kupita ku seva, 2 - kuyankha kuchokera ku seva kupita kwa kasitomala
2
Mtundu wa Hardware
1
Hex
1
Mtundu wa adilesi ya hardware, mu protocol iyi 1 - MAC
3
Kutalika kwa ma adilesi a Hardware
6
Hex
1
Kutalika kwa adilesi ya MAC
4
Mphuno
1
Hex
1
Chiwerengero cha njira zapakatikati
5
ID Yogulitsa
23:cf:de:1d
Hex
4
Chizindikiritso cha zochitika zapadera. Wopangidwa ndi kasitomala kumayambiriro kwa ntchito yopempha
Zokonda zonse za seva zili mu fayilo ya xml. Fayilo yolozera:
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 mayeso mayeso pydhcp option_8.8.8.8_hex:sw_port82:1:20 option_22_hex:sw_port82:2:16 option_18_hex:sw_mac:82:26 40 sankhani ip, chigoba, rauta, dns kuchokera kwa ogwiritsa pomwe upper(mac)=upper('{option_3_AgentRemoteId_hex}') ndi upper(port)=upper('{option_1_AgentCircuitId_port_hex}') sankhani ip, chigoba, rauta, dns kuchokera kwa ogwiritsa pomwe upper(mac)=upper('{sw_mac}') ndi upper(port)=upper('{sw_port82}') sankhani ip, chigoba, rauta, dns kuchokera kwa ogwiritsa pomwe upper(mac)=upper('{ClientMacAddress}') lowetsani m'mbiri (id,dt,mac,ip,comment) values (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')
Tsopano mwatsatanetsatane pa ma tag:
Gawo la dhcpserver limafotokoza zoyambira zoyambira seva, zomwe ndi:
host - ndi adilesi yanji ya IP yomwe seva imamvera padoko 67
kuwulutsa - komwe ip ndikuwulutsa kwa DHCPOFFER ndi DHCPACK
DHCPServer - kodi ip ya seva ya DHCP ndi chiyani
LeaseTime nthawi yobwereketsa ya adilesi ya IP yoperekedwa
ThreadLimit - ndi ulusi ungati womwe ukuyenda nthawi imodzi kuti ukonze mapaketi a UDP omwe akubwera padoko 67. Iyenera kuthandiza pama projekiti olemetsa kwambiri 😉
defaultMask,defaultRouter,defaultDNS - zomwe zimaperekedwa kwa olembetsa mwachisawawa ngati IP ipezeka mu database, koma magawo owonjezera sanatchulidwe.
Chifukwa chake, titha kukulunga chilichonse mu {} ndipo chidzagwiritsidwa ntchito pafunso la SQL.
Tiyeni tilembe mbiri yakale kuti kasitomala adalandira adilesi ya IP:
Chiyambi cha seva
./pydhcpdb.py -d -c config.xml
- d console linanena bungwe mode DEBUG
- c <filename> fayilo yosintha
Kufotokozera
Ndipo tsopano zambiri pakukhazikitsa seva ku Python. Ndi ululu. Python anaphunziridwa pa ntchentche. Nthawi zambiri zimapangidwa mwanjira ya "wow, mwanjira ina ndidazipanga kuti zigwire ntchito." Osakometsedwa konse, ndikusiyidwa mwanjira iyi makamaka chifukwa chosadziwa pang'ono pakukula kwa Python. Ndikhala pazinthu zosangalatsa kwambiri za kukhazikitsa seva mu "code".
XML configuration file parser
The standard Python module xml.dom imagwiritsidwa ntchito. Zikuwoneka zophweka, koma pakukhazikitsa panali kusowa kowonekera kwa zolemba zomveka bwino ndi zitsanzo pa intaneti pogwiritsa ntchito gawoli.
tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") ya elem mu mconfig: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["mysql_username"]=elem.getElementsByTagName("username")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("password")[0].firstChild.data gconfig["mysql_base) =elem.getElementsByTagName("dzina")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") ya elem mu dconfig: gconfig["broadcast"]=elem.getElementsByTagName("kuwulutsa")[0]. firstChild.data gconfig["dhcp_host"]=elem.getElementsByTagName("host")[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_config["dhcp_Server"] =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultDNS"]=elem. defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query") ya elem mu qconfig: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild.data ya nambala mu range(int(gconfig["offer_count"])): gconfig["offer_"+str(num+1)]=elem.getElementsByTagName("offer_"+str(nambala+1))[0].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[0].firstChild.data options=tree.getElementsByTagName("options") kwa maelem mu options: node=elem.getElementsByTagName("option") pazosankha mu node : optionsMod.append(options.firstChild.data)
Multithreading
Zodabwitsa ndizakuti, multithreading mu Python imayendetsedwa momveka bwino komanso mophweka.
def PacketWork(deta,addr): ... # kukhazikitsa kugawa paketi yomwe ikubwera ndikuyankha ... target=PacketWork , args=(data,addr,)).start() # monga idabwera - timayambitsa ntchito ya PacketWork yomwe idafotokozedwa kale kumbuyo ndi magawo pomwe threading.active_count() >gconfig["dhcp_ThreadLimit"]: nthawi. kugona(1024) # ngati nambala Pali ulusi wambiri womwe ukuyamba kale kuposa zoikamo, timadikirira mpaka pakhale ochepa.
Landirani/tumizani paketi ya DHCP
Kuti muchepetse mapaketi a UDP akubwera kudzera pa netiweki khadi, muyenera "kukweza" socket:
, SO_BROADCAST njira yoti phukusi la chisoti ndi "kuwulutsa"
,SO_REUSEADDR njira imasintha socket kukhala "omvera ambiri". Mwachidziwitso, sizofunikira pankhaniyi, koma pa seva imodzi ya FreeBSD yomwe ndidayesa, codeyo sinagwire ntchito popanda izi.
Kujambula paketi ya DHCP
Apa ndipamene ndinkakonda kwambiri Python. Zikuoneka kuti kunja kwa bokosi kumakupatsani mwayi wosinthika ndi bytecode. Kulola kuti limasuliridwe mosavuta kumitengo ya decimal, zingwe ndi hex - i.e. Izi ndi zomwe timafunikira kuti timvetsetse kapangidwe ka phukusi. Chifukwa chake, mwachitsanzo, mutha kupeza ma byte angapo mu HEX ndi ma byte okha: