పైథాన్ నేర్చుకోవడం (మొదటి నుండి కంటే కొంచెం ఎక్కువ 😉)
సర్వర్ భర్తీ DB2DHCP (నా ఫోర్క్), అసలు ఇక్కడ, కొత్త OS కోసం సమీకరించడం మరింత కష్టతరంగా మారుతోంది. మరియు "ప్రస్తుతం మార్చడానికి" మార్గం లేని బైనరీ అని నాకు ఇష్టం లేదు
సబ్స్క్రైబర్ యొక్క మ్యాక్ లేదా స్విచ్ Mac+పోర్ట్ కాంబినేషన్ని ఉపయోగించి సబ్స్క్రైబర్ యొక్క IP చిరునామాను ఎంచుకునే సామర్థ్యంతో పని చేస్తున్న DHCP సర్వర్ను పొందడం (ఆప్షన్ 82)
మరొక బైక్ రాయడం (ఓహ్! ఇది నాకు ఇష్టమైన కార్యకలాపం)
హబ్రహబ్ర్పై మీ క్లబ్ హ్యాండ్నెస్ గురించి వ్యాఖ్యలను స్వీకరించడం (లేదా ఇంకా మంచిది, ఆహ్వానం) 😉
ఫలితం: ఇది పనిచేస్తుంది 😉 FreeBSD మరియు Ubuntu OSలో పరీక్షించబడింది. సిద్ధాంతపరంగా, కోడ్ ఏదైనా OS కింద పని చేయమని అడగవచ్చు, ఎందుకంటే కోడ్లో నిర్దిష్ట బైండింగ్లు లేవు.
జాగ్రత్తగా! ఇంకా చాలా ఉన్నాయి.
ఔత్సాహికుల కోసం రిపోజిటరీకి లింక్ "సజీవంగా తాకండి".
"హార్డ్వేర్ను అధ్యయనం చేయడం" ఫలితాన్ని ఇన్స్టాల్ చేయడం, కాన్ఫిగర్ చేయడం మరియు ఉపయోగించడం చాలా తక్కువ, ఆపై DHCP ప్రోటోకాల్ గురించి కొద్దిగా సిద్ధాంతం. నా కొరకు. మరియు చరిత్ర కోసం 😉
ఒక చిన్న సిద్ధాంతం
DHCP అంటే ఏమిటి
ఇది DHCP సర్వర్ నుండి పరికరాన్ని దాని IP చిరునామా (మరియు గేట్వే, DNS మొదలైన ఇతర పారామితులు) కనుగొనడానికి అనుమతించే నెట్వర్క్ ప్రోటోకాల్. UDP ప్రోటోకాల్ ఉపయోగించి ప్యాకెట్లు మార్పిడి చేయబడతాయి. నెట్వర్క్ పారామితులను అభ్యర్థించేటప్పుడు పరికరం యొక్క ఆపరేషన్ యొక్క సాధారణ సూత్రం క్రింది విధంగా ఉంటుంది:
పరికరం (క్లయింట్) నెట్వర్క్ అంతటా UDP ప్రసార అభ్యర్థనను (DHCPDISCOVER) "అలాగే, ఎవరైనా నాకు IP చిరునామా ఇవ్వండి" అనే అభ్యర్థనతో పంపుతుంది. అంతేకాకుండా, సాధారణంగా (కానీ ఎల్లప్పుడూ కాదు) అభ్యర్థన పోర్ట్ 68 (మూలం) నుండి జరుగుతుంది మరియు గమ్యం పోర్ట్ 67 (గమ్యం). కొన్ని పరికరాలు పోర్ట్ 67 నుండి ప్యాకెట్లను కూడా పంపుతాయి. క్లయింట్ పరికరం యొక్క MAC చిరునామా DHCPDISCOVER ప్యాకెట్లో చేర్చబడింది.
నెట్వర్క్లో ఉన్న అన్ని DHCP సర్వర్లు (మరియు వాటిలో అనేకం ఉండవచ్చు) DHCPDISCOVERని పంపిన పరికరం కోసం నెట్వర్క్ సెట్టింగ్లతో DHCPOFFER ఆఫర్ను ఏర్పరుస్తుంది మరియు దానిని నెట్వర్క్ ద్వారా ప్రసారం చేస్తుంది. ఈ ప్యాకెట్ ఎవరి కోసం ఉద్దేశించబడిందో గుర్తించడం DHCPDISCOVER అభ్యర్థనలో ముందుగా అందించిన క్లయింట్ యొక్క MAC చిరునామాపై ఆధారపడి ఉంటుంది.
క్లయింట్ నెట్వర్క్ సెట్టింగ్ల కోసం ప్రతిపాదనలతో ప్యాకెట్లను అంగీకరిస్తుంది, అత్యంత ఆకర్షణీయమైనదాన్ని ఎంచుకుంటుంది (ప్రమాణాలు భిన్నంగా ఉండవచ్చు, ఉదాహరణకు, ప్యాకెట్ డెలివరీ సమయం, ఇంటర్మీడియట్ మార్గాల సంఖ్య), మరియు నెట్వర్క్ సెట్టింగ్లతో “అధికారిక అభ్యర్థన” DHCPREQUEST చేస్తుంది. అది ఇష్టపడే DHCP సర్వర్ నుండి. ఈ సందర్భంలో, ప్యాకెట్ నిర్దిష్ట DHCP సర్వర్కు వెళుతుంది.
DHCPREQUEST అందుకున్న సర్వర్ DHCPACK ఫార్మాట్ ప్యాకెట్ను పంపుతుంది, దీనిలో ఈ క్లయింట్ కోసం ఉద్దేశించిన నెట్వర్క్ సెట్టింగ్లను మరోసారి జాబితా చేస్తుంది
అదనంగా, క్లయింట్ నుండి వచ్చే DHCPINFORM ప్యాకెట్లు ఉన్నాయి మరియు "క్లయింట్ సజీవంగా ఉన్నారు" మరియు జారీ చేయబడిన నెట్వర్క్ సెట్టింగ్లను ఉపయోగిస్తున్నారని DHCP సర్వర్కు తెలియజేయడం దీని ఉద్దేశ్యం. ఈ సర్వర్ అమలులో, ఈ ప్యాకెట్లు విస్మరించబడ్డాయి.
ప్యాకేజీ ఫార్మాట్
సాధారణంగా, ఈథర్నెట్ ప్యాకెట్ ఫ్రేమ్ ఇలా కనిపిస్తుంది:
మా విషయంలో, మేము OSI లేయర్ ప్రోటోకాల్ హెడర్లు లేకుండా UDP ప్యాకెట్లోని కంటెంట్ల నుండి నేరుగా డేటాను మాత్రమే పరిశీలిస్తాము, అవి DHCP నిర్మాణం:
DHCP డిస్కవర్
కాబట్టి, పరికరం కోసం IP చిరునామాను పొందే ప్రక్రియ DHCP క్లయింట్ పోర్ట్ 68 నుండి 255.255.255.255:67కి ప్రసార అభ్యర్థనను పంపడంతో ప్రారంభమవుతుంది. ఈ ప్యాకేజీలో, క్లయింట్ దాని MAC చిరునామాను అలాగే DHCP సర్వర్ నుండి పొందాలనుకునే దాన్ని ఖచ్చితంగా కలిగి ఉంటుంది. ప్యాకేజీ నిర్మాణం క్రింది పట్టికలో వివరించబడింది.
DHCPDISCOVER ప్యాకెట్ స్ట్రక్చర్ టేబుల్
ప్యాకేజీలో స్థానం
విలువ పేరు
ఉదాహరణకు
ఆలోచన
బైట్
స్పష్టీకరణ
1
బూట్ అభ్యర్థన
1
Hex
1
సందేశ రకం. 1 - క్లయింట్ నుండి సర్వర్కు అభ్యర్థన, 2 - సర్వర్ నుండి క్లయింట్కు ప్రతిస్పందన
2
హార్డ్వేర్ రకం
1
Hex
1
హార్డ్వేర్ చిరునామా రకం, ఈ ప్రోటోకాల్ 1లో - MAC
3
హార్డ్వేర్ పొడవును సూచిస్తుంది
6
Hex
1
పరికరం MAC చిరునామా పొడవు
4
హోప్స్
1
Hex
1
ఇంటర్మీడియట్ మార్గాల సంఖ్య
5
లావాదేవి ఐడి
23:cf:de:1d
Hex
4
ప్రత్యేక లావాదేవీ ఐడెంటిఫైయర్. అభ్యర్థన ఆపరేషన్ ప్రారంభంలో క్లయింట్ ద్వారా రూపొందించబడింది
7
రెండవది గడిచిపోయింది
0
Hex
4
చిరునామాను పొందే ప్రక్రియ ప్రారంభం నుండి సెకన్లలో సమయం
9
బూట్ జెండాలు
0
Hex
2
ప్రోటోకాల్ పారామితులను సూచించడానికి సెట్ చేయగల కొన్ని ఫ్లాగ్లు
11
క్లయింట్ IP చిరునామా
0.0.0.0
వరుసగా
4
క్లయింట్ IP చిరునామా (ఏదైనా ఉంటే)
15
మీ క్లయింట్ IP చిరునామా
0.0.0.0
వరుసగా
4
సర్వర్ అందించే IP చిరునామా (అందుబాటులో ఉంటే)
19
తదుపరి సర్వర్ IP చిరునామా
0.0.0.0
వరుసగా
4
సర్వర్ IP చిరునామా (తెలిసి ఉంటే)
23
రిలే ఏజెంట్ IP చిరునామా
172.16.114.41
వరుసగా
4
రిలే ఏజెంట్ యొక్క IP చిరునామా (ఉదాహరణకు, ఒక స్విచ్)
27
క్లయింట్ MAC చిరునామా
14:d6:4d:a7:c9:55
Hex
6
ప్యాకెట్ పంపినవారి MAC చిరునామా (క్లయింట్)
31
క్లయింట్ హార్డ్వేర్ చిరునామా పాడింగ్
Hex
10
రిజర్వ్ చేయబడిన సీటు. సాధారణంగా సున్నాలతో నిండి ఉంటుంది
41
సర్వర్ హోస్ట్ పేరు
వరుసగా
64
DHCP సర్వర్ పేరు. సాధారణంగా ప్రసారం చేయబడదు
105
బూట్ ఫైల్ పేరు
వరుసగా
128
బూట్ చేస్తున్నప్పుడు డిస్క్లెస్ స్టేషన్లు ఉపయోగించే సర్వర్లో ఫైల్ పేరు
235
మేజిక్ కుకీలు
63: 82: 53: 63
Hex
4
"మ్యాజిక్" సంఖ్య, దీని ప్రకారం, incl. మీరు ఈ ప్యాకెట్ DHCP ప్రోటోకాల్కు చెందినదని నిర్ధారించవచ్చు
DHCP ఎంపికలు. ఏ క్రమంలోనైనా వెళ్లవచ్చు
236
ఎంపిక సంఖ్య
53
Dec
1
ఎంపిక 53, ఇది DHCP ప్యాకెట్ రకాన్ని నిర్దేశిస్తుంది
ఎంపిక సంఖ్య
50
Dec
1
క్లయింట్ ఏ IP చిరునామాను స్వీకరించాలనుకుంటున్నారు?
ఎంపిక పొడవు
4
Dec
1
ఎంపిక విలువ
172.16.134.61
వరుసగా
4
ఎంపిక సంఖ్య
55
1
క్లయింట్ అభ్యర్థించిన నెట్వర్క్ పారామితులు. కూర్పు మారవచ్చు
01 — నెట్వర్క్ మాస్క్
03 - గేట్వే
06 - DNS
oc — హోస్ట్ పేరు
0f - నెట్వర్క్ డొమైన్ పేరు
1c - ప్రసార అభ్యర్థన చిరునామా (ప్రసారం)
42 - TFTP సర్వర్ పేరు
79 - క్లాస్లెస్ స్టాటిక్ రూట్
ఎంపిక పొడవు
8
1
ఎంపిక విలువ
01:03:06:0c:0f:1c:42:79
8
ఎంపిక సంఖ్య
82
Dec
ఎంపిక 82, ఇది రిపీటర్ పరికరం యొక్క MAC చిరునామా మరియు కొన్ని అదనపు విలువలను ప్రసారం చేస్తుంది.
చాలా తరచుగా, ఇది ముగింపు DHCP క్లయింట్ రన్ అయ్యే స్విచ్ యొక్క పోర్ట్. ఈ ఐచ్ఛికం అదనపు పారామితులను కలిగి ఉంటుంది. మొదటి బైట్ "సబ్ ఆప్షన్" యొక్క సంఖ్య, రెండవది దాని పొడవు, ఆపై దాని విలువ.
ఈ సందర్భంలో, ఎంపిక 82లో, ఉప-ఐచ్ఛికాలు గూడులో ఉంటాయి:
ఏజెంట్ సర్క్యూట్ ID = 00:04:00:01:00:04, ఇక్కడ చివరి రెండు బైట్లు అభ్యర్థన వచ్చిన DHCP క్లయింట్ పోర్ట్
ఏజెంట్ రిమోట్ ID = 00:06:c8:be:19:93:11:48 - DHCP రిపీటర్ పరికరం యొక్క MAC చిరునామా
ఎంపిక పొడవు
18
Dec
ఎంపిక విలువ
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
ప్యాకేజీ ముగింపు
255
Dec
1
255 ప్యాకెట్ ముగింపును సూచిస్తుంది
DHCPOFER
సర్వర్ DHCPDISCOVER ప్యాకెట్ను స్వీకరించిన వెంటనే మరియు అది అభ్యర్థించిన దాని నుండి క్లయింట్కు ఏదైనా అందించగలదని చూస్తే, అది దాని కోసం ప్రతిస్పందనను రూపొందిస్తుంది - DHCPDISCOVER. ప్రతిస్పందన ప్రసారం ద్వారా "అది ఎక్కడ నుండి వచ్చింది" అనే పోర్ట్కు పంపబడుతుంది, ఎందుకంటే ఈ సమయంలో, క్లయింట్కు ఇంకా IP చిరునామా లేదు, కాబట్టి అది ప్రసారం ద్వారా పంపబడినట్లయితే మాత్రమే ప్యాకెట్ను ఆమోదించగలదు. క్లయింట్ ప్యాకేజీ లోపల అతని MAC చిరునామాతో పాటు మొదటి ప్యాకేజీని సృష్టించిన సమయంలో అతను రూపొందించే లావాదేవీ సంఖ్య ద్వారా ఇది అతనికి ప్యాకేజీ అని గుర్తిస్తుంది.
DHCPOFFER ప్యాకెట్ స్ట్రక్చర్ టేబుల్
ప్యాకేజీలో స్థానం
విలువ పేరు (సాధారణ)
ఉదాహరణకు
ఆలోచన
బైట్
స్పష్టీకరణ
1
బూట్ అభ్యర్థన
1
Hex
1
సందేశ రకం. 1 - క్లయింట్ నుండి సర్వర్కు అభ్యర్థన, 2 - సర్వర్ నుండి క్లయింట్కు ప్రతిస్పందన
2
హార్డ్వేర్ రకం
1
Hex
1
హార్డ్వేర్ చిరునామా రకం, ఈ ప్రోటోకాల్ 1లో - MAC
3
హార్డ్వేర్ పొడవును సూచిస్తుంది
6
Hex
1
పరికరం MAC చిరునామా పొడవు
4
హోప్స్
1
Hex
1
ఇంటర్మీడియట్ మార్గాల సంఖ్య
5
లావాదేవి ఐడి
23:cf:de:1d
Hex
4
ప్రత్యేక లావాదేవీ ఐడెంటిఫైయర్. అభ్యర్థన ఆపరేషన్ ప్రారంభంలో క్లయింట్ ద్వారా రూపొందించబడింది
7
రెండవది గడిచిపోయింది
0
Hex
4
చిరునామాను పొందే ప్రక్రియ ప్రారంభం నుండి సెకన్లలో సమయం
9
బూట్ జెండాలు
0
Hex
2
ప్రోటోకాల్ పారామితులను సూచించడానికి సెట్ చేయగల కొన్ని ఫ్లాగ్లు. ఈ సందర్భంలో, 0 అంటే యూనికాస్ట్ అభ్యర్థన రకం
11
క్లయింట్ IP చిరునామా
0.0.0.0
వరుసగా
4
క్లయింట్ IP చిరునామా (ఏదైనా ఉంటే)
15
మీ క్లయింట్ IP చిరునామా
172.16.134.61
వరుసగా
4
సర్వర్ అందించే IP చిరునామా (అందుబాటులో ఉంటే)
19
తదుపరి సర్వర్ IP చిరునామా
0.0.0.0
వరుసగా
4
సర్వర్ IP చిరునామా (తెలిసి ఉంటే)
23
రిలే ఏజెంట్ IP చిరునామా
172.16.114.41
వరుసగా
4
రిలే ఏజెంట్ యొక్క IP చిరునామా (ఉదాహరణకు, ఒక స్విచ్)
27
క్లయింట్ MAC చిరునామా
14:d6:4d:a7:c9:55
Hex
6
ప్యాకెట్ పంపినవారి MAC చిరునామా (క్లయింట్)
31
క్లయింట్ హార్డ్వేర్ చిరునామా పాడింగ్
Hex
10
రిజర్వ్ చేయబడిన సీటు. సాధారణంగా సున్నాలతో నిండి ఉంటుంది
41
సర్వర్ హోస్ట్ పేరు
వరుసగా
64
DHCP సర్వర్ పేరు. సాధారణంగా ప్రసారం చేయబడదు
105
బూట్ ఫైల్ పేరు
వరుసగా
128
బూట్ చేస్తున్నప్పుడు డిస్క్లెస్ స్టేషన్లు ఉపయోగించే సర్వర్లో ఫైల్ పేరు
235
మేజిక్ కుకీలు
63: 82: 53: 63
Hex
4
"మ్యాజిక్" సంఖ్య, దీని ప్రకారం, incl. మీరు ఈ ప్యాకెట్ DHCP ప్రోటోకాల్కు చెందినదని నిర్ధారించవచ్చు
DHCP ఎంపికలు. ఏ క్రమంలోనైనా వెళ్లవచ్చు
236
ఎంపిక సంఖ్య
53
Dec
1
ఎంపిక 53, ఇది DHCP 2 ప్యాకెట్ రకాన్ని నిర్వచిస్తుంది - DHCPOFFER
ఎంపిక పొడవు
1
Dec
1
ఎంపిక విలువ
2
Dec
1
ఎంపిక సంఖ్య
1
Dec
1
DHCP క్లయింట్కు నెట్వర్క్ మాస్క్ను అందించే ఎంపిక
ఎంపిక పొడవు
4
Dec
1
ఎంపిక విలువ
255.255.224.0
వరుసగా
4
ఎంపిక సంఖ్య
3
Dec
1
DHCP క్లయింట్కు డిఫాల్ట్ గేట్వేని అందించే ఎంపిక
ఎంపిక పొడవు
4
Dec
1
ఎంపిక విలువ
172.16.12.1
వరుసగా
4
ఎంపిక సంఖ్య
6
Dec
1
DNS క్లయింట్కి DHCPని అందించే ఎంపిక
ఎంపిక పొడవు
4
Dec
1
ఎంపిక విలువ
8.8.8.8
వరుసగా
4
ఎంపిక సంఖ్య
51
Dec
1
జారీ చేయబడిన నెట్వర్క్ పారామితుల జీవితకాలం సెకన్లలో, ఆ తర్వాత DHCP క్లయింట్ వాటిని మళ్లీ అభ్యర్థించాలి
ఎంపిక పొడవు
4
Dec
1
ఎంపిక విలువ
86400
Dec
4
ఎంపిక సంఖ్య
82
Dec
1
ఎంపిక 82, DHCPDISCOVERలో వచ్చిన వాటిని పునరావృతం చేస్తుంది
ఎంపిక పొడవు
18
Dec
1
ఎంపిక విలువ
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Dec
18
ప్యాకేజీ ముగింపు
255
Dec
1
255 ప్యాకెట్ ముగింపును సూచిస్తుంది
DHCPREQUEST
క్లయింట్ DHCPOFFERని స్వీకరించిన తర్వాత, అతను నెట్వర్క్లోని అన్ని DHCP సర్వర్లకు కాకుండా నెట్వర్క్ పారామితులను అభ్యర్థిస్తూ ఒక ప్యాకెట్ను ఏర్పరుస్తాడు, కానీ DHCPOFFER ఆఫర్ను అతను ఎక్కువగా ఇష్టపడిన ఒక నిర్దిష్ట దానికి మాత్రమే. "వంటి" ప్రమాణాలు భిన్నంగా ఉండవచ్చు మరియు క్లయింట్ యొక్క DHCP అమలుపై ఆధారపడి ఉంటుంది. అభ్యర్థన గ్రహీత DHCP సర్వర్ యొక్క MAC చిరునామాను ఉపయోగించి పేర్కొనబడింది. అలాగే, సర్వర్ యొక్క IP చిరునామా ఇప్పటికే పొందబడి ఉంటే, ముందుగా DHCPDISCOVERని రూపొందించకుండానే క్లయింట్ ద్వారా DHCPREQUEST ప్యాకెట్ను పంపవచ్చు.
DHCPREQUEST ప్యాకెట్ స్ట్రక్చర్ టేబుల్
ప్యాకేజీలో స్థానం
విలువ పేరు (సాధారణ)
ఉదాహరణకు
ఆలోచన
బైట్
స్పష్టీకరణ
1
బూట్ అభ్యర్థన
1
Hex
1
సందేశ రకం. 1 - క్లయింట్ నుండి సర్వర్కు అభ్యర్థన, 2 - సర్వర్ నుండి క్లయింట్కు ప్రతిస్పందన
2
హార్డ్వేర్ రకం
1
Hex
1
హార్డ్వేర్ చిరునామా రకం, ఈ ప్రోటోకాల్ 1లో - MAC
3
హార్డ్వేర్ పొడవును సూచిస్తుంది
6
Hex
1
పరికరం MAC చిరునామా పొడవు
4
హోప్స్
1
Hex
1
ఇంటర్మీడియట్ మార్గాల సంఖ్య
5
లావాదేవి ఐడి
23:cf:de:1d
Hex
4
ప్రత్యేక లావాదేవీ ఐడెంటిఫైయర్. అభ్యర్థన ఆపరేషన్ ప్రారంభంలో క్లయింట్ ద్వారా రూపొందించబడింది
7
రెండవది గడిచిపోయింది
0
Hex
4
చిరునామాను పొందే ప్రక్రియ ప్రారంభం నుండి సెకన్లలో సమయం
9
బూట్ జెండాలు
8000
Hex
2
ప్రోటోకాల్ పారామితులను సూచించడానికి సెట్ చేయగల కొన్ని ఫ్లాగ్లు. ఈ సందర్భంలో, "ప్రసారం" సెట్ చేయబడింది
11
క్లయింట్ IP చిరునామా
0.0.0.0
వరుసగా
4
క్లయింట్ IP చిరునామా (ఏదైనా ఉంటే)
15
మీ క్లయింట్ IP చిరునామా
172.16.134.61
వరుసగా
4
సర్వర్ అందించే IP చిరునామా (అందుబాటులో ఉంటే)
19
తదుపరి సర్వర్ IP చిరునామా
0.0.0.0
వరుసగా
4
సర్వర్ IP చిరునామా (తెలిసి ఉంటే)
23
రిలే ఏజెంట్ IP చిరునామా
172.16.114.41
వరుసగా
4
రిలే ఏజెంట్ యొక్క IP చిరునామా (ఉదాహరణకు, ఒక స్విచ్)
27
క్లయింట్ MAC చిరునామా
14:d6:4d:a7:c9:55
Hex
6
ప్యాకెట్ పంపినవారి MAC చిరునామా (క్లయింట్)
31
క్లయింట్ హార్డ్వేర్ చిరునామా పాడింగ్
Hex
10
రిజర్వ్ చేయబడిన సీటు. సాధారణంగా సున్నాలతో నిండి ఉంటుంది
41
సర్వర్ హోస్ట్ పేరు
వరుసగా
64
DHCP సర్వర్ పేరు. సాధారణంగా ప్రసారం చేయబడదు
105
బూట్ ఫైల్ పేరు
వరుసగా
128
బూట్ చేస్తున్నప్పుడు డిస్క్లెస్ స్టేషన్లు ఉపయోగించే సర్వర్లో ఫైల్ పేరు
235
మేజిక్ కుకీలు
63: 82: 53: 63
Hex
4
"మ్యాజిక్" సంఖ్య, దీని ప్రకారం, incl. మీరు ఈ ప్యాకెట్ DHCP ప్రోటోకాల్కు చెందినదని నిర్ధారించవచ్చు
DHCP ఎంపికలు. ఏ క్రమంలోనైనా వెళ్లవచ్చు
236
ఎంపిక సంఖ్య
53
Dec
3
ఎంపిక 53, ఇది DHCP ప్యాకెట్ రకం 3ని నిర్వచిస్తుంది - DHCPREQUEST
ఎంపిక పొడవు
1
Dec
1
ఎంపిక విలువ
3
Dec
1
ఎంపిక సంఖ్య
61
Dec
1
క్లయింట్ ID: 01 (Ehernet కోసం) + క్లయింట్ MAC చిరునామా
ఎంపిక పొడవు
7
Dec
1
ఎంపిక విలువ
01:2c:ab:25:ff:72:a6
Hex
7
ఎంపిక సంఖ్య
60
Dec
"వెండర్ క్లాస్ ఐడెంటిఫైయర్". నా విషయంలో, ఇది DHCP క్లయింట్ సంస్కరణను నివేదిస్తుంది. బహుశా ఇతర పరికరాలు వేరొక దానిని తిరిగి ఇవ్వవచ్చు. ఉదాహరణకు Windows MSFT 5.0ని నివేదిస్తుంది
ఎంపిక పొడవు
11
Dec
ఎంపిక విలువ
udhcp 0.9.8
వరుసగా
ఎంపిక సంఖ్య
55
1
క్లయింట్ అభ్యర్థించిన నెట్వర్క్ పారామితులు. కూర్పు మారవచ్చు
01 — నెట్వర్క్ మాస్క్
03 - గేట్వే
06 - DNS
oc — హోస్ట్ పేరు
0f - నెట్వర్క్ డొమైన్ పేరు
1c - ప్రసార అభ్యర్థన చిరునామా (ప్రసారం)
42 - TFTP సర్వర్ పేరు
79 - క్లాస్లెస్ స్టాటిక్ రూట్
ఎంపిక పొడవు
8
1
ఎంపిక విలువ
01:03:06:0c:0f:1c:42:79
8
ఎంపిక సంఖ్య
82
Dec
1
ఎంపిక 82, DHCPDISCOVERలో వచ్చిన వాటిని పునరావృతం చేస్తుంది
ఎంపిక పొడవు
18
Dec
1
ఎంపిక విలువ
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Dec
18
ప్యాకేజీ ముగింపు
255
Dec
1
255 ప్యాకెట్ ముగింపును సూచిస్తుంది
DHCPACK
DHCP సర్వర్ నుండి "అవును, అది నిజమే, ఇది మీ IP చిరునామా మరియు నేను దీన్ని మరెవరికీ ఇవ్వను" అని నిర్ధారణగా, సర్వర్ నుండి క్లయింట్కు DHCPACK ఆకృతిలో ప్యాకెట్ సేవలు అందిస్తుంది. ఇది ఇతర ప్యాకెట్ల మాదిరిగానే ప్రసారం చేయబడుతుంది. అయినప్పటికీ, పైథాన్లో అమలు చేయబడిన DHCP సర్వర్ కోసం దిగువ కోడ్లో, నేను ఏదైనా ప్రసార అభ్యర్థనను ఒక నిర్దిష్ట క్లయింట్ IPకి పంపడం ద్వారా ఏదైనా ప్రసార అభ్యర్థనను నకిలీ చేస్తాను, అది ఇప్పటికే తెలిసి ఉంటే. అంతేకాకుండా, DHCPACK ప్యాకెట్ క్లయింట్కి చేరిందా లేదా అనే విషయాన్ని DHCP సర్వర్ అస్సలు పట్టించుకోదు. క్లయింట్ DHCPACKని అందుకోకపోతే, కొంత సమయం తర్వాత అది DHCPREQUESTని పునరావృతం చేస్తుంది.
DHCPACK ప్యాకెట్ స్ట్రక్చర్ టేబుల్
ప్యాకేజీలో స్థానం
విలువ పేరు (సాధారణ)
ఉదాహరణకు
ఆలోచన
బైట్
స్పష్టీకరణ
1
బూట్ అభ్యర్థన
2
Hex
1
సందేశ రకం. 1 - క్లయింట్ నుండి సర్వర్కు అభ్యర్థన, 2 - సర్వర్ నుండి క్లయింట్కు ప్రతిస్పందన
2
హార్డ్వేర్ రకం
1
Hex
1
హార్డ్వేర్ చిరునామా రకం, ఈ ప్రోటోకాల్ 1లో - MAC
3
హార్డ్వేర్ పొడవును సూచిస్తుంది
6
Hex
1
పరికరం MAC చిరునామా పొడవు
4
హోప్స్
1
Hex
1
ఇంటర్మీడియట్ మార్గాల సంఖ్య
5
లావాదేవి ఐడి
23:cf:de:1d
Hex
4
ప్రత్యేక లావాదేవీ ఐడెంటిఫైయర్. అభ్యర్థన ఆపరేషన్ ప్రారంభంలో క్లయింట్ ద్వారా రూపొందించబడింది
7
రెండవది గడిచిపోయింది
0
Hex
4
చిరునామాను పొందే ప్రక్రియ ప్రారంభం నుండి సెకన్లలో సమయం
9
బూట్ జెండాలు
8000
Hex
2
ప్రోటోకాల్ పారామితులను సూచించడానికి సెట్ చేయగల కొన్ని ఫ్లాగ్లు. ఈ సందర్భంలో, "ప్రసారం" సెట్ చేయబడింది
11
క్లయింట్ IP చిరునామా
0.0.0.0
వరుసగా
4
క్లయింట్ IP చిరునామా (ఏదైనా ఉంటే)
15
మీ క్లయింట్ IP చిరునామా
172.16.134.61
వరుసగా
4
సర్వర్ అందించే IP చిరునామా (అందుబాటులో ఉంటే)
19
తదుపరి సర్వర్ IP చిరునామా
0.0.0.0
వరుసగా
4
సర్వర్ IP చిరునామా (తెలిసి ఉంటే)
23
రిలే ఏజెంట్ IP చిరునామా
172.16.114.41
వరుసగా
4
రిలే ఏజెంట్ యొక్క IP చిరునామా (ఉదాహరణకు, ఒక స్విచ్)
27
క్లయింట్ MAC చిరునామా
14:d6:4d:a7:c9:55
Hex
6
ప్యాకెట్ పంపినవారి MAC చిరునామా (క్లయింట్)
31
క్లయింట్ హార్డ్వేర్ చిరునామా పాడింగ్
Hex
10
రిజర్వ్ చేయబడిన సీటు. సాధారణంగా సున్నాలతో నిండి ఉంటుంది
41
సర్వర్ హోస్ట్ పేరు
వరుసగా
64
DHCP సర్వర్ పేరు. సాధారణంగా ప్రసారం చేయబడదు
105
బూట్ ఫైల్ పేరు
వరుసగా
128
బూట్ చేస్తున్నప్పుడు డిస్క్లెస్ స్టేషన్లు ఉపయోగించే సర్వర్లో ఫైల్ పేరు
235
మేజిక్ కుకీలు
63: 82: 53: 63
Hex
4
"మ్యాజిక్" సంఖ్య, దీని ప్రకారం, incl. మీరు ఈ ప్యాకెట్ DHCP ప్రోటోకాల్కు చెందినదని నిర్ధారించవచ్చు
DHCP ఎంపికలు. ఏ క్రమంలోనైనా వెళ్లవచ్చు
236
ఎంపిక సంఖ్య
53
Dec
3
ఎంపిక 53, ఇది DHCP ప్యాకెట్ రకం 5 - DHCPACKని నిర్వచిస్తుంది
ఎంపిక పొడవు
1
Dec
1
ఎంపిక విలువ
5
Dec
1
ఎంపిక సంఖ్య
1
Dec
1
DHCP క్లయింట్కు నెట్వర్క్ మాస్క్ను అందించే ఎంపిక
ఎంపిక పొడవు
4
Dec
1
ఎంపిక విలువ
255.255.224.0
వరుసగా
4
ఎంపిక సంఖ్య
3
Dec
1
DHCP క్లయింట్కు డిఫాల్ట్ గేట్వేని అందించే ఎంపిక
ఎంపిక పొడవు
4
Dec
1
ఎంపిక విలువ
172.16.12.1
వరుసగా
4
ఎంపిక సంఖ్య
6
Dec
1
DNS క్లయింట్కి DHCPని అందించే ఎంపిక
ఎంపిక పొడవు
4
Dec
1
ఎంపిక విలువ
8.8.8.8
వరుసగా
4
ఎంపిక సంఖ్య
51
Dec
1
జారీ చేయబడిన నెట్వర్క్ పారామితుల జీవితకాలం సెకన్లలో, ఆ తర్వాత DHCP క్లయింట్ వాటిని మళ్లీ అభ్యర్థించాలి
ఎంపిక పొడవు
4
Dec
1
ఎంపిక విలువ
86400
Dec
4
ఎంపిక సంఖ్య
82
Dec
1
ఎంపిక 82, DHCPDISCOVERలో వచ్చిన వాటిని పునరావృతం చేస్తుంది
ఎంపిక పొడవు
18
Dec
1
ఎంపిక విలువ
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Dec
18
ప్యాకేజీ ముగింపు
255
Dec
1
255 ప్యాకెట్ ముగింపును సూచిస్తుంది
సెట్టింగ్
ఇన్స్టాలేషన్ వాస్తవానికి పని కోసం అవసరమైన పైథాన్ మాడ్యూల్స్ను ఇన్స్టాల్ చేయడాన్ని కలిగి ఉంటుంది. MySQL ఇప్పటికే ఇన్స్టాల్ చేయబడి మరియు కాన్ఫిగర్ చేయబడిందని భావించబడుతుంది.
మేము MySQL డేటాబేస్ను సృష్టించి, దానిలో pydhcp.sql డంప్ను అప్లోడ్ చేస్తాము మరియు కాన్ఫిగరేషన్ ఫైల్ను కాన్ఫిగర్ చేస్తాము.
ఆకృతీకరణ
అన్ని సర్వర్ సెట్టింగ్లు xml ఫైల్లో ఉన్నాయి. సూచన ఫైల్:
1.0 0.0.0.0 255.255.255.255 192.168.0.71 8600 1 255.255.255.0 192.168.0.1 స్థానిక హోస్ట్ పరీక్ష పరీక్ష 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 ఎగువ(mac)=upper('{option_3_AgentRemoteId_hex}') మరియు ఎగువ(పోర్ట్)=upper('{option_1_AgentCircuitId_port_hex}') ఉన్న వినియోగదారుల నుండి ip,mask,router,dns ఎంచుకోండి ఎగువ(mac)=upper('{sw_mac}') మరియు అప్పర్(పోర్ట్)=అప్పర్('{sw_port82}') ఉన్న వినియోగదారుల నుండి ip,mask,router,dns ఎంచుకోండి ఎగువ(mac)=upper('{ClientMacAddress}') ఉన్న వినియోగదారుల నుండి ip,mask,router,dns ఎంచుకోండి చరిత్రలోకి (id,dt,mac,ip,comment) విలువలు (శూన్య,ఇప్పుడు(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/సమాచారం')
ఇప్పుడు ట్యాగ్లపై మరింత వివరంగా:
dhcpserver విభాగం సర్వర్ను ప్రారంభించడానికి ప్రాథమిక సెట్టింగ్లను వివరిస్తుంది, అవి:
హోస్ట్ - పోర్ట్ 67లో సర్వర్ ఏ IP చిరునామాను వింటుంది
ప్రసారం - ఇది DHCPOFFER మరియు DHCPACK కోసం ప్రసారం చేయబడిన ip
DHCPServer - DHCP సర్వర్ యొక్క ip అంటే ఏమిటి
జారీ చేయబడిన IP చిరునామా యొక్క లీజ్ టైమ్ లీజు సమయం
ThreadLimit - పోర్ట్ 67లో ఇన్కమింగ్ UDP ప్యాకెట్లను ప్రాసెస్ చేయడానికి ఏకకాలంలో ఎన్ని థ్రెడ్లు రన్ అవుతున్నాయి. ఇది అధిక-లోడ్ ప్రాజెక్ట్లకు సహాయం చేస్తుంది 😉
defaultMask,defaultRouter,defaultDNS - డేటాబేస్లో IP కనుగొనబడితే డిఫాల్ట్గా సబ్స్క్రైబర్కు ఏమి అందించబడుతుంది, కానీ దాని కోసం అదనపు పారామితులు పేర్కొనబడలేదు
mysql విభాగం:
హోస్ట్, వినియోగదారు పేరు, పాస్వర్డ్, బేస్ పేరు - ప్రతిదీ దాని కోసం మాట్లాడుతుంది. సుమారుగా డేటాబేస్ నిర్మాణం పోస్ట్ చేయబడింది గ్యాలరీలు
ప్రశ్న విభాగం: ఆఫర్/ACK స్వీకరించడానికి అభ్యర్థనలు ఇక్కడ వివరించబడ్డాయి:
offer_count — ip,mask,router,dns వంటి ఫలితాన్ని అందించే అభ్యర్థనలతో కూడిన లైన్ల సంఖ్య
offer_n — ప్రశ్న స్ట్రింగ్. వాపసు ఖాళీగా ఉంటే, కింది ఆఫర్ అభ్యర్థనను అమలు చేస్తుంది
history_sql - సబ్స్క్రైబర్ కోసం “అధీకృత చరిత్ర”కి వ్రాసే ప్రశ్న.
అభ్యర్థనలు ఎంపికల విభాగం నుండి ఏవైనా వేరియబుల్స్ లేదా DHCP ప్రోటోకాల్ నుండి ఎంపికలను కలిగి ఉంటాయి.
ఎంపికల విభాగం. ఇక్కడే ఇది మరింత ఆసక్తికరంగా ఉంటుంది. ఇక్కడ మనం ప్రశ్న విభాగంలో తర్వాత ఉపయోగించగల వేరియబుల్లను సృష్టించవచ్చు.
ఉదాహరణకు:
option_82_hex:sw_port1:20:22
, ఈ కమాండ్ లైన్ DHCP అభ్యర్థన ఎంపిక 82లో వచ్చిన మొత్తం లైన్ను హెక్స్ ఫార్మాట్లో 20 నుండి 22 బైట్లను కలుపుకొని కొత్త వేరియబుల్ sw_port1లో ఉంచుతుంది (అభ్యర్థన వచ్చిన పోర్ట్ నుండి మారండి)
option_82_hex:sw_mac:26:40
, sw_mac వేరియబుల్ను నిర్వచించండి, హెక్స్ను 26:40 పరిధి నుండి తీసుకుంటుంది
-d స్విచ్తో సర్వర్ను ప్రారంభించడం ద్వారా ప్రశ్నలలో ఉపయోగించగల అన్ని ఎంపికలను మీరు చూడవచ్చు. మేము ఈ లాగ్ వంటిదాన్ని చూస్తాము:
దీని ప్రకారం, మనం ఏదైనా వేరియబుల్ను {}లో చుట్టవచ్చు మరియు అది SQL ప్రశ్నలో ఉపయోగించబడుతుంది.
క్లయింట్ IP చిరునామాను అందుకున్నట్లు చరిత్ర కోసం రికార్డ్ చేద్దాం:
సర్వర్ ప్రారంభం
./pydhcpdb.py -d -c config.xml
— d కన్సోల్ అవుట్పుట్ మోడ్ డీబగ్
- c <filename> కాన్ఫిగరేషన్ ఫైల్
debriefing
మరియు ఇప్పుడు పైథాన్లో సర్వర్ని అమలు చేయడంపై మరిన్ని వివరాలు. ఇది ఒక నొప్పి. కొండచిలువ ఎగిరి నేర్చుకుంది. చాలా క్షణాలు "వావ్, ఎలాగోలా పని చేసాను" అనే శైలిలో రూపొందించబడ్డాయి. అస్సలు ఆప్టిమైజ్ చేయబడలేదు మరియు పైథాన్ అభివృద్ధిలో తక్కువ అనుభవం కారణంగా ఈ రూపంలో వదిలివేయబడింది. "కోడ్"లో సర్వర్ అమలు యొక్క అత్యంత ఆసక్తికరమైన అంశాలపై నేను నివసిస్తాను.
XML కాన్ఫిగరేషన్ ఫైల్ పార్సర్
ప్రామాణిక పైథాన్ మాడ్యూల్ xml.dom ఉపయోగించబడుతుంది. ఇది సరళంగా అనిపిస్తుంది, కానీ అమలు సమయంలో ఈ మాడ్యూల్ని ఉపయోగించి నెట్వర్క్లో స్పష్టమైన డాక్యుమెంటేషన్ మరియు ఉదాహరణలు లేకపోవడం గమనించదగినది.
విచిత్రమేమిటంటే, పైథాన్లో మల్టీథ్రెడింగ్ చాలా స్పష్టంగా మరియు సరళంగా అమలు చేయబడుతుంది.
def PacketWork(data,addr): ... # ఇన్కమింగ్ ప్యాకెట్ని అన్వయించడం మరియు దానికి ప్రతిస్పందించడం అమలు చేయడం ... అయితే నిజం: డేటా, addr = udp_socket.recvfrom(1024) # UDP ప్యాకెట్ థ్రెడ్ కోసం వేచి ఉంది = థ్రెడింగ్.థ్రెడ్( target=PacketWork , args=(data,addr,)).start() # వచ్చినట్లు - మేము మునుపు నిర్వచించిన PacketWork ఫంక్షన్ను పారామితులతో నేపథ్యంలో ప్రారంభించేటప్పుడు threading.active_count() >gconfig["dhcp_ThreadLimit"]: సమయం. నిద్ర(1) # సెట్టింగ్లలో కంటే ఇప్పటికే ఎక్కువ థ్రెడ్లు అమలవుతున్నట్లయితే, వాటిలో తక్కువ ఉండే వరకు మేము వేచి ఉంటాము
DHCP ప్యాకెట్ని స్వీకరించండి/పంపు చేయండి
నెట్వర్క్ కార్డ్ ద్వారా వచ్చే UDP ప్యాకెట్లను అడ్డగించడానికి, మీరు సాకెట్ను "పెంచాలి":
AF_INET - అంటే చిరునామా ఫార్మాట్ IP: పోర్ట్. AF_UNIX కూడా ఉండవచ్చు - ఇక్కడ ఫైల్ పేరు ద్వారా చిరునామా ఇవ్వబడుతుంది.
SOCK_DGRAM - అంటే మేము "ముడి ప్యాకెట్"ని అంగీకరించము, కానీ ఇది ఇప్పటికే ఫైర్వాల్ గుండా మరియు పాక్షికంగా కత్తిరించబడిన ప్యాకెట్తో ఉంటుంది. ఆ. మేము UDP ప్యాకెట్ రేపర్ యొక్క “భౌతిక” భాగం లేకుండా UDP ప్యాకెట్ను మాత్రమే స్వీకరిస్తాము. మీరు SOCK_RAW ఫ్లాగ్ని ఉపయోగిస్తుంటే, మీరు ఈ “ర్యాపర్”ని కూడా అన్వయించవలసి ఉంటుంది.
ప్యాకెట్ని పంపడం అనేది ప్రసారం లాగా ఉంటుంది:
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #సాకెట్ను ప్రసార మోడ్కి మార్చండి rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68))
, మరియు "ప్యాకేజీ ఎక్కడ నుండి వచ్చింది" అనే చిరునామాకు:
, ఇక్కడ SOL_SOCKET అంటే సెట్టింగ్ ఎంపికల కోసం “ప్రోటోకాల్ స్థాయి”,
, SO_BROADCAST ఎంపిక హెల్మెట్ ప్యాకేజీ “ప్రసారం”
,SO_REUSEADDR ఎంపిక సాకెట్ను "చాలా మంది శ్రోతలు" మోడ్కి మారుస్తుంది. సిద్ధాంతంలో, ఈ సందర్భంలో ఇది అనవసరం, కానీ నేను పరీక్షించిన FreeBSD సర్వర్లలో ఒకదానిలో, ఈ ఎంపిక లేకుండా కోడ్ పని చేయలేదు.
DHCP ప్యాకెట్ని అన్వయించడం
ఇక్కడే నేను పైథాన్ని నిజంగా ఇష్టపడ్డాను. ఇది బాక్స్ వెలుపల బైట్కోడ్తో చాలా సరళంగా ఉండటానికి మిమ్మల్ని అనుమతిస్తుంది. ఇది చాలా సులభంగా దశాంశ విలువలు, స్ట్రింగ్లు మరియు హెక్స్లోకి అనువదించడానికి అనుమతిస్తుంది - అనగా. ప్యాకేజీ యొక్క నిర్మాణాన్ని మనం అర్థం చేసుకోవాలి. కాబట్టి, ఉదాహరణకు, మీరు HEXలో బైట్ల శ్రేణిని మరియు కేవలం బైట్లను పొందవచ్చు: