ဤပရောဂျက်၏ရည်ရွယ်ချက်မှာ-
- IPv4 ကွန်ရက်တွင် DHCP အကြောင်း လေ့လာခြင်း။
- Python ကို သင်ယူခြင်း (အစမှ အစမှ အနည်းငယ်ပို၍ 😉)
- ဆာဗာအစားထိုးခြင်း။
DB2DHCP (ငါ့ခက်ရင်း) မူရင်းဒီမှာ OS အသစ်အတွက် စုစည်းရန် ပို၍ပို၍ခက်ခဲလာသည်။ ပြီးတော့ "အခုချက်ချင်းပြောင်းလဲ" ဖို့နည်းလမ်းမရှိသော binary တစ်ခုဖြစ်သည်ကိုကျွန်ုပ်မကြိုက်ပါ။ - စာရင်းသွင်းသူ၏ mac ကို အသုံးပြု၍ စာရင်းသွင်းသူ၏ mac ကို အသုံးပြု၍ စာရင်းသွင်းသူ၏ IP လိပ်စာကို ရွေးချယ်နိုင်သည့် စွမ်းရည်ဖြင့် အလုပ်လုပ်သော DHCP ဆာဗာကို ရယူခြင်း သို့မဟုတ် mac+port ပေါင်းစပ်မှုပြောင်းခြင်း (ရွေးချယ်မှု 82)
- စက်ဘီးနောက်တစ်လုံးရေးခြင်း (အိုး! ဒါ ကျွန်တော် အကြိုက်ဆုံး လုပ်ဆောင်ချက်ပါ)
- Habrahabr တွင် သင်၏ ကလပ်၏ သန်မာမှု နှင့် ပတ်သက်သော မှတ်ချက်များ လက်ခံရရှိခြင်း (သို့မဟုတ် ပိုကောင်းသေးသည်၊ ဖိတ်ခေါ်မှု) 😉
ရလဒ်- ၎င်းသည် အလုပ်လုပ်သည် 😉 FreeBSD နှင့် Ubuntu OS တွင် စမ်းသပ်ထားသည်။ သီအိုရီအရ၊ ကုဒ်သည် မည်သည့် OS အောက်တွင် အလုပ်လုပ်ရန် တောင်းဆိုနိုင်သည်။ ကုဒ်တွင် တိကျသော စည်းနှောင်မှု မရှိပုံရသည်။
ဂရုတစိုက်! နောက်ထပ်လာစရာတွေ အများကြီးရှိပါသေးတယ်။
အပျော်တမ်းများအတွက် သိုလှောင်ရုံသို့ လင့်ခ်ချိတ်ပါ။
"ဟာ့ဒ်ဝဲကိုလေ့လာခြင်း" ၏ရလဒ်ကိုထည့်သွင်းခြင်း၊ ပြင်ဆင်ခြင်းနှင့်အသုံးပြုခြင်းလုပ်ငန်းစဉ်သည်အလွန်နိမ့်ပါးပြီး DHCP ပရိုတိုကောနှင့်ပတ်သက်သောသီအိုရီအနည်းငယ်ရှိသည်။ ကိုယ့်အတွက်။ ပြီးတော့ သမိုင်းအတွက် 😉
သီအိုရီအနည်းငယ်
DHCP ဆိုတာဘာလဲ
၎င်းသည် စက်အား DHCP ဆာဗာမှ ၎င်း၏ IP လိပ်စာ (နှင့် ဂိတ်ဝေး၊ DNS စသည်ဖြင့်) ကို ရှာဖွေနိုင်စေမည့် ကွန်ရက်ပရိုတိုကောတစ်ခုဖြစ်သည်။ UDP ပရိုတိုကောကို အသုံးပြု၍ အထုပ်များကို လဲလှယ်သည်။ ကွန်ရက်ဘောင်ကန့်သတ်ချက်များကို တောင်းဆိုသည့်အခါ စက်ပစ္စည်း၏ ယေဘုယျသဘောတရားမှာ အောက်ပါအတိုင်းဖြစ်သည်။
- စက်ပစ္စည်း (ဖောက်သည်) သည် "ကောင်းပြီ၊ တစ်စုံတစ်ယောက်က ကျွန်ုပ်ကို IP လိပ်စာတစ်ခုပေး" ဟူသော တောင်းဆိုချက်ဖြင့် ကွန်ရက်တစ်လျှောက် UDP ထုတ်လွှင့်မှုတောင်းဆိုချက် (DHCPDISCOVER) ကို ပေးပို့သည်။ ထို့အပြင်၊ များသောအားဖြင့် (သို့သော်အမြဲမဟုတ်) တောင်းဆိုချက်သည် port 68 (အရင်းအမြစ်) မှဖြစ်ပေါ်ပြီး destination သည် port 67 (destination) ဖြစ်သည်။ အချို့သောစက်ပစ္စည်းများသည် port 67 မှ packet များကို ပေးပို့ပါသည်။ သုံးစွဲသူစက်ပစ္စည်း၏ MAC လိပ်စာကို DHCPDISCOVER ပက်ကေ့ခ်ျအတွင်း ထည့်သွင်းထားသည်။
- ကွန်ရက်ပေါ်တွင်ရှိသော DHCP ဆာဗာများအားလုံး (၎င်းတို့ထဲမှ အများအပြားရှိနိုင်သည်) DHCPDISCOVER ပေးပို့သည့်ကိရိယာအတွက် ကွန်ရက်ဆက်တင်များနှင့်အတူ DHCPOFFER ကမ်းလှမ်းချက်တစ်ခုကို ဖန်တီးကာ ကွန်ရက်ပေါ်တွင်လည်း ထုတ်လွှင့်သည်။ DHCPDISCOVER တောင်းဆိုမှုတွင် အစောပိုင်းက ပေးထားသော client ၏ MAC လိပ်စာပေါ်တွင် ဤပက်ကတ်ကို ရည်ရွယ်ထားသည့် မည်သူမည်ဝါဖြစ်ကြောင်း ဖော်ထုတ်ခြင်းဖြစ်ပါသည်။
- ဖောက်သည်သည် ကွန်ရက်ဆက်တင်များအတွက် အဆိုပြုချက်များပါသည့် အစုံလိုက်လက်ခံသည်၊ ဆွဲဆောင်မှုအရှိဆုံးတစ်ခုကို ရွေးသည် (သတ်မှတ်ချက်များသည် ကွဲပြားနိုင်သည်၊ ဥပမာ၊ ပက်ကတ်ပေးပို့သည့်အချိန်၊ အလယ်အလတ်လမ်းကြောင်းများအရေအတွက်)၊ ကွန်ရက်ဆက်တင်များနှင့်အတူ "တရားဝင်တောင်းဆိုမှု" DHCPREQUEST ကို ပြုလုပ်သည် DHCP ဆာဗာမှ ၎င်းနှစ်သက်သည်။ ဤကိစ္စတွင်၊ ပက်ကတ်သည် သတ်သတ်မှတ်မှတ် DHCP ဆာဗာသို့ သွားပါသည်။
- DHCPREQUEST ကို လက်ခံရရှိသော ဆာဗာသည် DHCPACK ဖော်မတ် ပက်ကတ်ကို ပေးပို့သည်၊ ၎င်းသည် ဤကလိုင်းယင့်အတွက် ရည်ရွယ်သည့် ကွန်ရက်ဆက်တင်များကို နောက်တစ်ကြိမ် စာရင်းပြုစုသည်။
ထို့အပြင်၊ client မှလာသော DHCPINFORM packet များ ရှိပြီး ရည်ရွယ်ချက်မှာ DHCP ဆာဗာအား "ဖောက်သည် အသက်ရှင်နေသေးသည်" နှင့် ထုတ်ပြန်ထားသော ကွန်ရက်ဆက်တင်များကို အသုံးပြုနေကြောင်း အသိပေးရန်ဖြစ်သည်။ ဤဆာဗာ၏ အကောင်အထည်ဖော်မှုတွင်၊ ဤပက်ကတ်များကို လျစ်လျူရှုထားသည်။
Package ဖော်မတ်
ယေဘူယျအားဖြင့်၊ Ethernet packet frame သည် ဤကဲ့သို့ ဖြစ်သည်-
ကျွန်ုပ်တို့၏ကိစ္စတွင်၊ OSI အလွှာပရိုတိုကော ခေါင်းစီးများမပါဘဲ UDP ပက်ကတ်၏ အကြောင်းအရာများမှ ဒေတာများကိုသာ တိုက်ရိုက်ထည့်သွင်းစဉ်းစားမည်ဖြစ်ပြီး၊ အမည်ရသည့် DHCP ဖွဲ့စည်းပုံ၊
DHCPDISCOVER
ထို့ကြောင့်၊ စက်ပစ္စည်းတစ်ခုအတွက် IP လိပ်စာတစ်ခုရယူခြင်းလုပ်ငန်းစဉ်သည် DHCP client မှ port 68 မှ 255.255.255.255:67 သို့ ထုတ်လွှင့်တောင်းဆိုမှုတစ်ခုပေးပို့ခြင်းဖြင့် စတင်သည်။ ဤပက်ကေ့ဂျ်တွင်၊ ကလိုင်းယင့်သည် ၎င်း၏ MAC လိပ်စာအပြင် DHCP ဆာဗာမှ ရရှိလိုသည့် အတိအကျ ပါဝင်သည်။ ပက်ကေ့ခ်ျဖွဲ့စည်းပုံအား အောက်ပါဇယားတွင် ဖော်ပြထားသည်။
DHCPDISCOVER Packet Structure Table
အထုပ်ထဲတွင် နေရာယူထားသည်။
တန်ဖိုးအမည်
နမူနာ
စိတ်ကူး
ဘိုက်
ကြည်လင်သန့်စေခြင်း
1
Boot Request
1
hex
1
မက်ဆေ့ခ်ျအမျိုးအစား။ 1 - client မှ server သို့ တောင်းဆိုမှု၊ 2 - server မှ client သို့ တုံ့ပြန်မှု
2
Hardware အမျိုးအစား
1
hex
1
ဤပရိုတိုကော 1 - MAC တွင် ဟာ့ဒ်ဝဲလိပ်စာအမျိုးအစား
3
Hardware လိပ်စာအရှည်
6
hex
1
စက်၏ MAC လိပ်စာ အရှည်
4
hops
1
hex
1
အလယ်အလတ်လမ်းကြောင်းများ အရေအတွက်
5
ငွေသွင်းငွေထုတ် ID
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
Relay အေးဂျင့် IP လိပ်စာ
172.16.114.41
အတန်း
4
relay အေးဂျင့်၏ IP လိပ်စာ (ဥပမာ၊ ခလုတ်တစ်ခု)
27
သုံးစွဲသူ MAC လိပ်စာ
14:d6:4d:a7:c9:55
hex
6
ထုပ်ပိုးပေးပို့သူ (ဖောက်သည်) ၏ MAC လိပ်စာ
31
ကလိုင်းယင့် ဟာ့ဒ်ဝဲ လိပ်စာ အကွက်များ
hex
10
သီးသန့်ထိုင်ခုံ။ သုညနှင့် ပြည့်တတ်သည်။
41
ဆာဗာ host အမည်
အတန်း
64
DHCP ဆာဗာအမည်။ အများအားဖြင့် မကူးစက်ပါ။
105
Boot ဖိုင်အမည်
အတန်း
128
စဖွင့်သည့်အခါ diskless station များအသုံးပြုသည့်ဆာဗာတွင် ဖိုင်အမည်
235
မျက်လှည့်ကွက်ကီးများ
63: 82: 53: 63
hex
4
“Magic” နံပါတ်၊ ဤပက်ကတ်သည် DHCP ပရိုတိုကောနှင့် သက်ဆိုင်ကြောင်း သင်ဆုံးဖြတ်နိုင်သည်။
DHCP ရွေးချယ်မှုများ။ ကြိုက်သလိုသွားလို့ရပါတယ်။
236
ရွေးချယ်စရာနံပါတ်
53
ဒီဇင်ဘာ
1
DHCP ပက်ကတ်အမျိုးအစားကို သတ်မှတ်ပေးသော ရွေးချယ်မှု 53
1 - DHCPDISCOVER
3 - DHCPREQUEST
2 - DHCPOFFER
5 - DHCPACK
8 - DHCPINFORM
ရွေးချယ်မှုအရှည်
1
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
1
ဒီဇင်ဘာ
1
ရွေးချယ်စရာနံပါတ်
50
ဒီဇင်ဘာ
1
ဘယ် IP လိပ်စာကို သုံးစွဲသူက လက်ခံချင်သလဲ။
ရွေးချယ်မှုအရှည်
4
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
172.16.134.61
အတန်း
4
ရွေးချယ်စရာနံပါတ်
55
1
client မှ တောင်းဆိုထားသော ကွန်ရက် ကန့်သတ်ချက်များ။ ဖွဲ့စည်းမှုကွဲပြားနိုင်သည်။
01 - ကွန်ရက်မျက်နှာဖုံး
၀၃ - မုခ်ဦး
06 - DNS
oc — လက်ခံသူအမည်
0f - ကွန်ရက်ဒိုမိန်းအမည်
1c - ထုတ်လွှင့်တောင်းဆိုမှု၏လိပ်စာ (ထုတ်လွှင့်မှု)
42 - TFTP ဆာဗာအမည်
79 - Classless Static လမ်းကြောင်း
ရွေးချယ်မှုအရှည်
8
1
ရွေးချယ်မှုတန်ဖိုး
01:03:06:0c:0f:1c:42:79
8
ရွေးချယ်စရာနံပါတ်
82
ဒီဇင်ဘာ
ထပ်လောင်းကိရိယာ၏ MAC လိပ်စာနှင့် အပိုတန်ဖိုးအချို့ကို ပို့လွှတ်သည့် ရွေးချယ်မှု 82။
အများစုမှာ၊ ဤအရာသည် အဆုံး DHCP ဖောက်သည်လည်ပတ်သည့် ခလုတ်၏ ပို့တ်ဖြစ်သည်။ ဤရွေးချယ်မှုတွင် အပိုဘောင်များပါရှိသည်။ ပထမဘိုက်သည် “suboption” ၏နံပါတ်ဖြစ်ပြီး၊ ဒုတိယသည် ၎င်း၏အရှည်ဖြစ်ပြီး၊ ထို့နောက် ၎င်း၏တန်ဖိုးဖြစ်သည်။
ဤကိစ္စတွင်၊ ရွေးချယ်မှု 82 တွင်၊ ရွေးစရာခွဲများကို nested သည်-
Agent Circuit ID = 00:04:00:01:00:04၊ နောက်ဆုံးနှစ် bytes သည် တောင်းဆိုချက်မှလာသော DHCP client port ဖြစ်သည်
Agent Remote ID = 00:06:c8:be:19:93:11:48 - DHCP ထပ်တူထပ်ကိရိယာ၏ MAC လိပ်စာ
ရွေးချယ်မှုအရှည်
18
ဒီဇင်ဘာ
ရွေးချယ်မှုတန်ဖိုး
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
hex
အထုပ် ပြီးပြီ။
255
ဒီဇင်ဘာ
1
255 သည် အထုပ်၏အဆုံးကို ကိုယ်စားပြုသည်။
DHCPOFFER
ဆာဗာသည် DHCPDISCOVER ပက်ကတ်ကို လက်ခံရရှိပြီးသည်နှင့် ၎င်းသည် ကလိုင်းယင့်အား တောင်းဆိုထားသည့်အရာမှ တစ်စုံတစ်ရာကို ပေးဆောင်နိုင်ကြောင်း တွေ့ရှိပါက၊ ၎င်းသည် ၎င်းအတွက် တုံ့ပြန်မှုတစ်ခုထုတ်ပေးသည် - DHCPDISCOVER။ တုံ့ပြန်မှုအား ထုတ်လွှင့်ခြင်းဖြင့် ဆိပ်ကမ်းသို့ ပေးပို့ရခြင်း ဖြစ်သည်။ ယခုအချိန်တွင်၊ client တွင် IP လိပ်စာတစ်ခုမရှိသေးသောကြောင့် ၎င်းသည် packet ကိုထုတ်လွှင့်မှသာ လက်ခံနိုင်မည်ဖြစ်သည်။ ဖောက်သည်သည် ၎င်းသည် ပက်ကေ့ခ်ျအတွင်းရှိ ၎င်း၏ MAC လိပ်စာဖြင့် သူ့အတွက် ပက်ကေ့ခ်ျတစ်ခုဖြစ်ပြီး ပထမပက်ကေ့ခ်ျကို ဖန်တီးချိန်တွင် သူထုတ်ပေးသည့် ငွေပေးငွေယူနံပါတ်ကို အသိအမှတ်ပြုပါသည်။
DHCPOFFER Packet Structure ဇယား
အထုပ်ထဲတွင် နေရာယူထားသည်။
တန်ဖိုးအမည် (ဘုံ)
နမူနာ
စိတ်ကူး
ဘိုက်
ကြည်လင်သန့်စေခြင်း
1
Boot Request
1
hex
1
မက်ဆေ့ခ်ျအမျိုးအစား။ 1 - client မှ server သို့ တောင်းဆိုမှု၊ 2 - server မှ client သို့ တုံ့ပြန်မှု
2
Hardware အမျိုးအစား
1
hex
1
ဤပရိုတိုကော 1 - MAC တွင် ဟာ့ဒ်ဝဲလိပ်စာအမျိုးအစား
3
Hardware လိပ်စာအရှည်
6
hex
1
စက်၏ MAC လိပ်စာ အရှည်
4
hops
1
hex
1
အလယ်အလတ်လမ်းကြောင်းများ အရေအတွက်
5
ငွေသွင်းငွေထုတ် ID
23:cf:de:1d
hex
4
ထူးခြားသော ငွေပေးငွေယူ သတ်မှတ်စနစ်။ တောင်းဆိုမှုလုပ်ဆောင်မှုအစတွင် သုံးစွဲသူမှထုတ်ပေးသည်။
7
ဒုတိယအချိ်န်
0
hex
4
လိပ်စာတစ်ခုရယူခြင်းလုပ်ငန်းစဉ်အစမှ စက္ကန့်ပိုင်းအတွင်း အချိန်
9
ဘွတ်အလံများ
0
hex
2
ပရိုတိုကော ဘောင်များကို ညွှန်ပြရန် သတ်မှတ်နိုင်သော အလံအချို့။ ဤကိစ္စတွင် 0 သည် Unicast တောင်းဆိုမှုအမျိုးအစားကို ဆိုလိုသည်။
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
Relay အေးဂျင့် IP လိပ်စာ
172.16.114.41
အတန်း
4
relay အေးဂျင့်၏ IP လိပ်စာ (ဥပမာ၊ ခလုတ်တစ်ခု)
27
သုံးစွဲသူ MAC လိပ်စာ
14:d6:4d:a7:c9:55
hex
6
ထုပ်ပိုးပေးပို့သူ (ဖောက်သည်) ၏ MAC လိပ်စာ
31
ကလိုင်းယင့် ဟာ့ဒ်ဝဲ လိပ်စာ အကွက်များ
hex
10
သီးသန့်ထိုင်ခုံ။ သုညနှင့် ပြည့်တတ်သည်။
41
ဆာဗာ host အမည်
အတန်း
64
DHCP ဆာဗာအမည်။ အများအားဖြင့် မကူးစက်ပါ။
105
Boot ဖိုင်အမည်
အတန်း
128
စဖွင့်သည့်အခါ diskless station များအသုံးပြုသည့်ဆာဗာတွင် ဖိုင်အမည်
235
မျက်လှည့်ကွက်ကီးများ
63: 82: 53: 63
hex
4
“Magic” နံပါတ်၊ ဤပက်ကတ်သည် DHCP ပရိုတိုကောနှင့် သက်ဆိုင်ကြောင်း သင်ဆုံးဖြတ်နိုင်သည်။
DHCP ရွေးချယ်မှုများ။ ကြိုက်သလိုသွားလို့ရပါတယ်။
236
ရွေးချယ်စရာနံပါတ်
53
ဒီဇင်ဘာ
1
DHCP 53 packet အမျိုးအစား - DHCPOFFER ကို သတ်မှတ်သည့် ရွေးချယ်မှု 2
ရွေးချယ်မှုအရှည်
1
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
2
ဒီဇင်ဘာ
1
ရွေးချယ်စရာနံပါတ်
1
ဒီဇင်ဘာ
1
DHCP သုံးစွဲသူအား ကွန်ရက်မျက်နှာဖုံးတစ်ခု ကမ်းလှမ်းရန် ရွေးချယ်မှု
ရွေးချယ်မှုအရှည်
4
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
255.255.224.0
အတန်း
4
ရွေးချယ်စရာနံပါတ်
3
ဒီဇင်ဘာ
1
DHCP သုံးစွဲသူအား ပုံသေတံခါးပေါက်တစ်ခု ကမ်းလှမ်းရန် ရွေးချယ်မှု
ရွေးချယ်မှုအရှည်
4
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
172.16.12.1
အတန်း
4
ရွေးချယ်စရာနံပါတ်
6
ဒီဇင်ဘာ
1
DNS client သို့ DHCP ကို ကမ်းလှမ်းရန် ရွေးချယ်မှု
ရွေးချယ်မှုအရှည်
4
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
8.8.8.8
အတန်း
4
ရွေးချယ်စရာနံပါတ်
51
ဒီဇင်ဘာ
1
ထုတ်ပေးထားသော ကွန်ရက်ဘောင်များ၏ သက်တမ်းသည် စက္ကန့်ပိုင်းအတွင်း၊ ထို့နောက် DHCP သုံးစွဲသူက ၎င်းတို့ကို ထပ်မံတောင်းဆိုရမည်ဖြစ်သည်။
ရွေးချယ်မှုအရှည်
4
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
86400
ဒီဇင်ဘာ
4
ရွေးချယ်စရာနံပါတ်
82
ဒီဇင်ဘာ
1
ရွေးချယ်မှု 82၊ DHCPDISCOVER တွင်ပါလာသောအရာကို ထပ်လုပ်သည်။
ရွေးချယ်မှုအရှည်
18
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
ဒီဇင်ဘာ
18
အထုပ် ပြီးပြီ။
255
ဒီဇင်ဘာ
1
255 သည် အထုပ်၏အဆုံးကို ကိုယ်စားပြုသည်။
DHCPREQUEST
ဖောက်သည်သည် DHCPOFFER ကိုလက်ခံရရှိပြီးနောက်၊ သူသည် ကွန်ရက်ပေါ်ရှိ DHCP ဆာဗာများအားလုံးအတွက်မဟုတ်ဘဲ ကွန်ရက်ဘောင်ကန့်သတ်ချက်များကို တောင်းဆိုသည့် ပက်ကတ်တစ်ခုကို ဖွဲ့ဆိုကာ DHCPOFFER သည် သူ “အနှစ်သက်ဆုံး” ပေးဆောင်သည့် သီးခြားတစ်ခုသာဖြစ်သည်။ "ကြိုက်" စံနှုန်းများသည် ကွဲပြားနိုင်ပြီး သုံးစွဲသူ၏ DHCP အကောင်အထည်ဖော်မှုအပေါ် မူတည်သည်။ တောင်းဆိုချက်ကို လက်ခံသူသည် DHCP ဆာဗာ၏ MAC လိပ်စာကို အသုံးပြု၍ သတ်မှတ်ထားသည်။ ဆာဗာ၏ IP လိပ်စာကို ယခင်က ရယူထားပြီးဖြစ်ပါက၊ အကယ်၍ ဆာဗာ၏ IP လိပ်စာကို ယခင်က ရယူထားပြီးဖြစ်ပါက၊ DHCPREQUEST ပက်ကတ်ကို ဖောက်သည်က DHCPDISCOVER ကို ဦးစွာမထုတ်ပေးဘဲ ဖောက်သည်မှ ပေးပို့နိုင်သည်။
DHCPREQUEST Packet Structure Table
အထုပ်ထဲတွင် နေရာယူထားသည်။
တန်ဖိုးအမည် (ဘုံ)
နမူနာ
စိတ်ကူး
ဘိုက်
ကြည်လင်သန့်စေခြင်း
1
Boot Request
1
hex
1
မက်ဆေ့ခ်ျအမျိုးအစား။ 1 - client မှ server သို့ တောင်းဆိုမှု၊ 2 - server မှ client သို့ တုံ့ပြန်မှု
2
Hardware အမျိုးအစား
1
hex
1
ဤပရိုတိုကော 1 - MAC တွင် ဟာ့ဒ်ဝဲလိပ်စာအမျိုးအစား
3
Hardware လိပ်စာအရှည်
6
hex
1
စက်၏ MAC လိပ်စာ အရှည်
4
hops
1
hex
1
အလယ်အလတ်လမ်းကြောင်းများ အရေအတွက်
5
ငွေသွင်းငွေထုတ် ID
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
Relay အေးဂျင့် IP လိပ်စာ
172.16.114.41
အတန်း
4
relay အေးဂျင့်၏ IP လိပ်စာ (ဥပမာ၊ ခလုတ်တစ်ခု)
27
သုံးစွဲသူ MAC လိပ်စာ
14:d6:4d:a7:c9:55
hex
6
ထုပ်ပိုးပေးပို့သူ (ဖောက်သည်) ၏ MAC လိပ်စာ
31
ကလိုင်းယင့် ဟာ့ဒ်ဝဲ လိပ်စာ အကွက်များ
hex
10
သီးသန့်ထိုင်ခုံ။ သုညနှင့် ပြည့်တတ်သည်။
41
ဆာဗာ host အမည်
အတန်း
64
DHCP ဆာဗာအမည်။ အများအားဖြင့် မကူးစက်ပါ။
105
Boot ဖိုင်အမည်
အတန်း
128
စဖွင့်သည့်အခါ diskless station များအသုံးပြုသည့်ဆာဗာတွင် ဖိုင်အမည်
235
မျက်လှည့်ကွက်ကီးများ
63: 82: 53: 63
hex
4
“Magic” နံပါတ်၊ ဤပက်ကတ်သည် DHCP ပရိုတိုကောနှင့် သက်ဆိုင်ကြောင်း သင်ဆုံးဖြတ်နိုင်သည်။
DHCP ရွေးချယ်မှုများ။ ကြိုက်သလိုသွားလို့ရပါတယ်။
236
ရွေးချယ်စရာနံပါတ်
53
ဒီဇင်ဘာ
3
DHCP ပက်ကတ်အမျိုးအစား 53 ကိုသတ်မှတ်ပေးသည့် ရွေးချယ်မှု 3 - DHCPREQUEST
ရွေးချယ်မှုအရှည်
1
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
3
ဒီဇင်ဘာ
1
ရွေးချယ်စရာနံပါတ်
61
ဒီဇင်ဘာ
1
ကလိုင်းယင့် ID- 01 (Ehernet အတွက်) + သုံးစွဲသူ MAC လိပ်စာ
ရွေးချယ်မှုအရှည်
7
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
01:2c:ab:25:ff:72:a6
hex
7
ရွေးချယ်စရာနံပါတ်
60
ဒီဇင်ဘာ
"ရောင်းချသူ အတန်းအစား သတ်မှတ်သူ"။ ငါ့ကိစ္စတွင်၊ ၎င်းသည် DHCP client ဗားရှင်းကိုအစီရင်ခံသည်။ အခြားစက်ပစ္စည်းများသည် ကွဲပြားခြားနားသော အရာတစ်ခုကို ပြန်ပေးနိုင်သည်။ ဥပမာ Windows သည် MSFT 5.0 ကိုတင်ပြသည်။
ရွေးချယ်မှုအရှည်
11
ဒီဇင်ဘာ
ရွေးချယ်မှုတန်ဖိုး
udhcp ၀.၉၉
အတန်း
ရွေးချယ်စရာနံပါတ်
55
1
client မှ တောင်းဆိုထားသော ကွန်ရက် ကန့်သတ်ချက်များ။ ဖွဲ့စည်းမှုကွဲပြားနိုင်သည်။
01 - ကွန်ရက်မျက်နှာဖုံး
၀၃ - မုခ်ဦး
06 - DNS
oc — လက်ခံသူအမည်
0f - ကွန်ရက်ဒိုမိန်းအမည်
1c - ထုတ်လွှင့်တောင်းဆိုမှု၏လိပ်စာ (ထုတ်လွှင့်မှု)
42 - TFTP ဆာဗာအမည်
79 - Classless Static လမ်းကြောင်း
ရွေးချယ်မှုအရှည်
8
1
ရွေးချယ်မှုတန်ဖိုး
01:03:06:0c:0f:1c:42:79
8
ရွေးချယ်စရာနံပါတ်
82
ဒီဇင်ဘာ
1
ရွေးချယ်မှု 82၊ DHCPDISCOVER တွင်ပါလာသောအရာကို ထပ်လုပ်သည်။
ရွေးချယ်မှုအရှည်
18
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
ဒီဇင်ဘာ
18
အထုပ် ပြီးပြီ။
255
ဒီဇင်ဘာ
1
255 သည် အထုပ်၏အဆုံးကို ကိုယ်စားပြုသည်။
DHCPACK
DHCP ဆာဗာမှ "ဟုတ်ပါတယ်၊ ဒါမှန်ပါတယ်၊ ဒါက မင်းရဲ့ IP လိပ်စာပါ၊ DHCP ဆာဗာကနေ၊ အဲဒါကို DHCPACK ဖော်မတ်နဲ့ ဆာဗာကနေ ဖောက်သည်ဆီ ဝန်ဆောင်မှုပေးတဲ့ ပက်ကတ်တစ်ခုပါ။ ၎င်းကို အခြားထုပ်ပိုးမှုများကဲ့သို့ ထုတ်လွှင့်သည်။ Python တွင်အသုံးပြုခဲ့သည့် DHCP ဆာဗာအတွက်အောက်ပါကုဒ်တွင်ရှိသော်လည်း၊ အကယ်၍ ၎င်းကိုသိရှိထားပြီးဖြစ်ပါက၊ ကျွန်ုပ်သည် တိကျသော client IP သို့ packet တစ်ခုကိုပေးပို့ခြင်းဖြင့် ထုတ်လွှင့်မှုတောင်းဆိုမှုမှန်သမျှကို ပွားနေပါသည်။ ထို့အပြင်၊ DHCP ဆာဗာသည် DHCPACK ပက်ကက်သည် ဖောက်သည်ထံရောက်ရှိခြင်းရှိမရှိ လုံးဝဂရုမစိုက်ပါ။ အကယ်၍ client သည် DHCPACK ကိုမရရှိပါက၊ ခဏအကြာတွင် ၎င်းသည် DHCPREQUEST ကို ရိုးရိုးရှင်းရှင်းပြန်လုပ်သည်။
DHCPACK Packet Structure Table
အထုပ်ထဲတွင် နေရာယူထားသည်။
တန်ဖိုးအမည် (ဘုံ)
နမူနာ
စိတ်ကူး
ဘိုက်
ကြည်လင်သန့်စေခြင်း
1
Boot Request
2
hex
1
မက်ဆေ့ခ်ျအမျိုးအစား။ 1 - client မှ server သို့ တောင်းဆိုမှု၊ 2 - server မှ client သို့ တုံ့ပြန်မှု
2
Hardware အမျိုးအစား
1
hex
1
ဤပရိုတိုကော 1 - MAC တွင် ဟာ့ဒ်ဝဲလိပ်စာအမျိုးအစား
3
Hardware လိပ်စာအရှည်
6
hex
1
စက်၏ MAC လိပ်စာ အရှည်
4
hops
1
hex
1
အလယ်အလတ်လမ်းကြောင်းများ အရေအတွက်
5
ငွေသွင်းငွေထုတ် ID
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
Relay အေးဂျင့် IP လိပ်စာ
172.16.114.41
အတန်း
4
relay အေးဂျင့်၏ IP လိပ်စာ (ဥပမာ၊ ခလုတ်တစ်ခု)
27
သုံးစွဲသူ MAC လိပ်စာ
14:d6:4d:a7:c9:55
hex
6
ထုပ်ပိုးပေးပို့သူ (ဖောက်သည်) ၏ MAC လိပ်စာ
31
ကလိုင်းယင့် ဟာ့ဒ်ဝဲ လိပ်စာ အကွက်များ
hex
10
သီးသန့်ထိုင်ခုံ။ သုညနှင့် ပြည့်တတ်သည်။
41
ဆာဗာ host အမည်
အတန်း
64
DHCP ဆာဗာအမည်။ အများအားဖြင့် မကူးစက်ပါ။
105
Boot ဖိုင်အမည်
အတန်း
128
စဖွင့်သည့်အခါ diskless station များအသုံးပြုသည့်ဆာဗာတွင် ဖိုင်အမည်
235
မျက်လှည့်ကွက်ကီးများ
63: 82: 53: 63
hex
4
“Magic” နံပါတ်၊ ဤပက်ကတ်သည် DHCP ပရိုတိုကောနှင့် သက်ဆိုင်ကြောင်း သင်ဆုံးဖြတ်နိုင်သည်။
DHCP ရွေးချယ်မှုများ။ ကြိုက်သလိုသွားလို့ရပါတယ်။
236
ရွေးချယ်စရာနံပါတ်
53
ဒီဇင်ဘာ
3
DHCP packet အမျိုးအစား 53 - DHCPACK ကို သတ်မှတ်ပေးသော ရွေးချယ်မှု 5
ရွေးချယ်မှုအရှည်
1
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
5
ဒီဇင်ဘာ
1
ရွေးချယ်စရာနံပါတ်
1
ဒီဇင်ဘာ
1
DHCP သုံးစွဲသူအား ကွန်ရက်မျက်နှာဖုံးတစ်ခု ကမ်းလှမ်းရန် ရွေးချယ်မှု
ရွေးချယ်မှုအရှည်
4
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
255.255.224.0
အတန်း
4
ရွေးချယ်စရာနံပါတ်
3
ဒီဇင်ဘာ
1
DHCP သုံးစွဲသူအား ပုံသေတံခါးပေါက်တစ်ခု ကမ်းလှမ်းရန် ရွေးချယ်မှု
ရွေးချယ်မှုအရှည်
4
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
172.16.12.1
အတန်း
4
ရွေးချယ်စရာနံပါတ်
6
ဒီဇင်ဘာ
1
DNS client သို့ DHCP ကို ကမ်းလှမ်းရန် ရွေးချယ်မှု
ရွေးချယ်မှုအရှည်
4
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
8.8.8.8
အတန်း
4
ရွေးချယ်စရာနံပါတ်
51
ဒီဇင်ဘာ
1
ထုတ်ပေးထားသော ကွန်ရက်ဘောင်များ၏ သက်တမ်းသည် စက္ကန့်ပိုင်းအတွင်း၊ ထို့နောက် DHCP သုံးစွဲသူက ၎င်းတို့ကို ထပ်မံတောင်းဆိုရမည်ဖြစ်သည်။
ရွေးချယ်မှုအရှည်
4
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
86400
ဒီဇင်ဘာ
4
ရွေးချယ်စရာနံပါတ်
82
ဒီဇင်ဘာ
1
ရွေးချယ်မှု 82၊ DHCPDISCOVER တွင်ပါလာသောအရာကို ထပ်လုပ်သည်။
ရွေးချယ်မှုအရှည်
18
ဒီဇင်ဘာ
1
ရွေးချယ်မှုတန်ဖိုး
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
ဒီဇင်ဘာ
18
အထုပ် ပြီးပြီ။
255
ဒီဇင်ဘာ
1
255 သည် အထုပ်၏အဆုံးကို ကိုယ်စားပြုသည်။
ustanovka
တပ်ဆင်ခြင်းတွင် အမှန်တကယ် အလုပ်လုပ်ရန် လိုအပ်သော python module များ ထည့်သွင်းခြင်း ပါဝင်သည်။ MySQL ကို ထည့်သွင်းပြီး ပြင်ဆင်သတ်မှတ်ထားကြောင်း ယူဆရသည်။
FreeBSD
pkg ကို install python3 python3 -m surepip pip3 mysql-connector ကို install လုပ်ပါ။
Ubuntu ကို
sudo apt-get install python3 sudo apt-get install pip3 sudo pip3 mysql-ချိတ်ဆက်ကိရိယာ ထည့်သွင်းပါ
ကျွန်ုပ်တို့သည် MySQL ဒေတာဘေ့စ်ကို ဖန်တီးပြီး၊ ၎င်းထဲသို့ pydhcp.sql အမှိုက်ပုံးကို အပ်လုဒ်လုပ်ကာ configuration ဖိုင်ကို ပြင်ဆင်သတ်မှတ်ပါသည်။
configuration များ
ဆာဗာဆက်တင်များအားလုံးသည် xml ဖိုင်တစ်ခုထဲတွင်ဖြစ်သည်။ ကိုးကားဖိုင်-
၀.၀.၀.၀ 1.0 0.0.0.0 ၈၆၀၀ ၁ 255.255.255.255 192.168.0.71 ၈.၈.၈.၈ localhost စမ်းသပ် စမ်းသပ် pydhcp option_8600_hex:sw_port1:255.255.255.0:192.168.0.1 option_8.8.8.8_hex:sw_port82:1:20 option_22_hex:sw_mac:82:2 ၃ upper(mac)=upper('{option_16_AgentRemoteId_hex}') နှင့် upper(port)=upper('{option_18_AgentCircuitId_port_hex}') ရှိသည့် အသုံးပြုသူများထံမှ ip၊mask၊router၊dns ကို ရွေးပါ upper(mac)=upper('{sw_mac}') နှင့် upper(port)=upper('{sw_port82}') စသည့် အသုံးပြုသူများထံမှ ip၊mask၊router၊dns ကို ရွေးပါ upper(mac)=upper('{ClientMacAddress}') ရှိသည့် အသုံးပြုသူများထံမှ ip၊mask၊router၊dns ကို ရွေးပါ မှတ်တမ်း (id,dt,mac,ip,comment) တန်ဖိုးများ (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')
ယခု tags တွင်အသေးစိတ်အချက်များ
dhcpserver အပိုင်းသည် ဆာဗာကို စတင်ရန်အတွက် အခြေခံဆက်တင်များကို ဖော်ပြသည်၊ ဆိုလိုသည်မှာ-
- host - port 67 တွင် ဆာဗာက နားထောင်သည့် IP လိပ်စာ
- ထုတ်လွှင့်ခြင်း - မည်သည့် ip သည် DHCPOFFER နှင့် DHCPACK အတွက် ထုတ်လွှင့်မှုဖြစ်သည်။
- DHCPServer - DHCP ဆာဗာ၏ ip သည် အဘယ်နည်း
- LeaseTime ထုတ်ပေးထားသော IP လိပ်စာ၏ ငှားရမ်းချိန်
- ThreadLimit - port 67 တွင် ဝင်လာသော UDP ပက်ကေ့ဂျ်များကို လုပ်ဆောင်ရန် လိုင်းအရေအတွက်မည်မျှ တပြိုင်နက် လုပ်ဆောင်နေပါသည်။ ၎င်းသည် ဝန်အားမြင့်မားသော ပရောဂျက်များအတွက် အထောက်အကူဖြစ်စေရန် 😉
- defaultMask၊defaultRouter၊defaultDNS - ဒေတာဘေ့စ်တွင် IP တစ်ခုတွေ့ရှိပါက၊ စာရင်းသွင်းသူအား default အနေဖြင့်ကမ်းလှမ်းသောအရာကို၊ သို့သော်၎င်းအတွက်နောက်ထပ် parameters များကိုမသတ်မှတ်ထားပါ
mysql အပိုင်း-
အိမ်ရှင်၊ အသုံးပြုသူအမည်၊ စကားဝှက်၊ အခြေခံအမည် - အရာအားလုံးသည် သူ့ဘာသာသူ ပြောတတ်ပါသည်။ အနီးစပ်ဆုံး ဒေတာဘေ့စ်ဖွဲ့စည်းပုံကို တင်ထားသည်။
မေးခွန်းကဏ္ဍ- ကမ်းလှမ်းချက်/ACK လက်ခံရရှိရန် တောင်းဆိုချက်များကို ဤနေရာတွင် ဖော်ပြထားပါသည်။
- offer_count — ip၊mask၊router၊dns ကဲ့သို့သော ရလဒ်ကို ပြန်ပေးသည့် တောင်းဆိုချက်များနှင့် လိုင်းအရေအတွက်
- offer_n — စုံစမ်းမှု စာကြောင်း။ ပြန်လာခြင်းသည် ဗလာဖြစ်ပါက၊ ထို့နောက် အောက်ပါကမ်းလှမ်းချက်တောင်းဆိုချက်ကို လုပ်ဆောင်သည်။
- history_sql - ဥပမာအားဖြင့် စာရင်းသွင်းသူအတွက် "ခွင့်ပြုချက်မှတ်တမ်း" သို့ ရေးသော query တစ်ခု
တောင်းဆိုချက်များတွင် ရွေးချယ်စရာများကဏ္ဍမှ သို့မဟုတ် DHCP ပရိုတိုကောမှ ရွေးချယ်စရာများ ပါဝင်နိုင်သည်။
ရွေးချယ်မှုအပိုင်း။ ဒီနေရာက ပိုစိတ်ဝင်စားဖို့ကောင်းတယ်။ ဤနေရာတွင် ကျွန်ုပ်တို့သည် မေးမြန်းမှုကဏ္ဍတွင် နောက်ပိုင်းတွင် ကျွန်ုပ်တို့အသုံးပြုနိုင်သည့် ကိန်းရှင်များကို ဖန်တီးနိုင်သည်။
ဥပမာ:
option_82_hex:sw_port1:20:22
ဤအမိန့်ပေးစာကြောင်းသည် DHCP တောင်းဆိုမှုရွေးချယ်မှု 82 တွင်ပါရှိသော မျဉ်းတစ်ခုလုံးကို hex ဖော်မတ်ဖြင့် 20 မှ 22 bytes အပါအဝင် အကွာအဝေးတွင်ယူ၍ ပြောင်းလဲနိုင်သော sw_port1 အသစ်တွင် ထည့်ထားသည် (တောင်းဆိုချက်ရောက်လာသည့်နေရာမှ ပို့တ်ကိုပြောင်းပါ)
option_82_hex:sw_mac:26:40
အပိုင်းအခြား 26:40 မှ hex ကိုယူပြီး sw_mac ကိန်းရှင်ကို သတ်မှတ်ပါ။
ဆာဗာကို -d ခလုတ်ဖြင့် စတင်ခြင်းဖြင့် စုံစမ်းမှုများတွင် အသုံးပြုနိုင်သည့် ဖြစ်နိုင်သည့် ရွေးချယ်စရာအားလုံးကို သင်တွေ့မြင်နိုင်သည်။ ဤမှတ်တမ်းကဲ့သို့ တစ်စုံတစ်ခုကို ကျွန်ုပ်တို့မြင်ရပါမည်-
--a DHCPINFORM ပက်ကတ်သည် 67ad0025224 , b'x764xa91xe5xa0xa3xa5-x9fx8a' , ('8', 172.30.114.25) {'ClientMacAddress': '68'0025224'764'00-7) {'ClientMacAddress': '91'5'0 %"Jxd3d' , 'HType': 'Ethernet', 'HostName': b'x5xa9xe8xa8xa43xa0.0.0.0-x5.0fx0025224a', 'ReqListDNS': မှန်၊ 'ReqListDomainName': မှန်၊ 'ReqListPerfowmRouterDiscovertic'Reqist'Router' True:', : မှန်ပါတယ်၊ 'ReqListSubnetM ask '- မှန်သည်၊ 'ReqListVendorSpecInfo': 764, 'RequestedIpAddress': '172.30.128.13', 'Vendor': b'MSFT 00', 'chaddr': '00ad'172.30.114.25', '308ad'6', , 'အလံ ': b'x1x82', 'giaddr': '12', 'gpoz': 12, 'hlen': 53, 'hops': 53, 'htype': 'MAC', 'magic_cookie'- b'cx55Sc ', 'op': 'DHCPINFORM', 'option55': 60, 'option60': 61, 'option61': 82, 'option82': 82, 'option12': 01, 'option06': 00၊ option_04_byte': b'x00x01x00x06x02x08x00x06x00x1x9x2' b'x82x12010600040001000602080006001x589eXx2exb82xad', 'option_18_hex': '82' , 'option_12_len': 01 06, 'option_00_str': "b'x04x00x01x00x06x02x08x00x06x00x1x9x2x768x0.0.0.0eXx001exb589xad'", 'result': 2secs'၊ 'siaddr': '1'၊ 'sw_mac': '06e89eb8ad', 'sw_port3': '897', 'xidbyte': b'
ထို့ကြောင့်၊ ကျွန်ုပ်တို့သည် {} တွင် မည်သည့် variable ကိုမဆို ခြုံငုံနိုင်ပြီး ၎င်းကို SQL query တွင် အသုံးပြုမည်ဖြစ်သည်။
သုံးစွဲသူသည် IP လိပ်စာကို လက်ခံရရှိကြောင်း မှတ်တမ်းအတွက် ကျွန်ုပ်တို့အား မှတ်တမ်းတင်ကြပါစို့။
ဆာဗာစတင်သည်။
./pydhcpdb.py -d -c config.xml
— d ကွန်ဆိုးလ် အထွက်မုဒ် အမှားအယွင်း
- c <filename> configuration file
debriefing
ယခု Python ရှိ ဆာဗာကို အကောင်အထည်ဖော်ခြင်းဆိုင်ရာ အသေးစိတ်အချက်များ။ ဝေဒနာ ဖြစ်၏။ Python ကို ပျံသန်းခြင်းတွင် သင်ယူခဲ့သည်။ အခိုက်အတန့်များစွာကို "ဝိုး၊ တစ်နည်းတစ်ဖုံ ငါလုပ်ခဲ့တယ်" ဆိုတဲ့ ပုံစံနဲ့ ပြုလုပ်ထားပါတယ်။ လုံးဝမပြုပြင်ရသေးပါ၊ အဓိကအားဖြင့် Python ဖွံ့ဖြိုးတိုးတက်မှုတွင် အတွေ့အကြုံနည်းပါးခြင်းကြောင့် ဤပုံစံတွင် ကျန်ရစ်ခဲ့သည်။ “ကုဒ်” တွင် ဆာဗာအကောင်အထည်ဖော်မှု၏ စိတ်ဝင်စားဖွယ်အကောင်းဆုံး အသွင်အပြင်များကို ကျွန်ုပ်နေပါမည်။
XML ဖွဲ့စည်းမှုပုံစံ ဖိုင်ခွဲခြမ်းစိတ်ဖြာမှု
ပုံမှန် Python module xml.dom ကို အသုံးပြုထားသည်။ ရိုးရှင်းပုံရသည်၊ သို့သော် အကောင်အထည်ဖော်စဉ်တွင် ဤ module ကိုအသုံးပြုသည့် ကွန်ရက်ပေါ်တွင် ရှင်းလင်းသောစာရွက်စာတမ်းများနှင့် နမူနာများ သိသိသာသာ ကင်းမဲ့သွားပါသည်။
tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") mconfig ရှိ elem အတွက်: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].first gconfig["mysql_username"]=elem.getElementsByTagName("username")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("password")[0].firstChild.name"base"gconfig =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") တွင် elem အတွက် dconfig: gconfig["broadcast"]=elem.getElementsByTagName("broadcast")[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["dhcp_Server"]=elem.getElementsByTagName("DHCPServer")[0].firstChild"firstChild[data] =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_default"DNS"]=emel defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query") qconfig ရှိ elem အတွက်: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[1].firstChild.data for num range(int(gconfig["offer_count"])): gconfig["offer_"+str(num+1)]=elem.getElementsByTagName("offer_"+str(num+0))[0].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[XNUMX].firstChild.data options=tree.getElementsByTagName("options") ရွေးစရာများထဲတွင် elem အတွက်: node=elem.getElementsByTagName("ရွေးချယ်စရာများအတွက် node") : optionsMod.append(options.firstChild.data)
Multithreading
ထူးဆန်းသည်မှာ၊ Python တွင် multithreading ကို အလွန်ရှင်းရှင်းလင်းလင်းနှင့် ရိုးရိုးရှင်းရှင်း အကောင်အထည်ဖော်ပါသည်။
def PacketWork(data,addr): ... # အဝင်ပက်ကတ်ကိုခွဲခြမ်းစိတ်ဖြာပြီး ၎င်းကိုတုံ့ပြန်ခြင်းအား အကောင်အထည်ဖော်ခြင်း ... True: data, addr = udp_socket.recvfrom(1024) # UDP ပက်ကေ့ခ်ျကို စောင့်ဆိုင်းနေသည် = threading.Thread( target=PacketWork , args=(data,addr,)).start() # လာသည်အတိုင်း - ကျွန်ုပ်တို့သည် threading.active_count() >gconfig["dhcp_ThreadLimit"]: အချိန်အတွင်း နောက်ခံတွင် ယခင်သတ်မှတ်ထားသော PacketWork လုပ်ဆောင်ချက်ကို ဘောင်များတွင် စတင်လုပ်ဆောင်ပါသည်။ အိပ်စက်ခြင်း(1) # နံပါတ်သည် ဆက်တင်များတွင် ထက်စာတွဲများ ပိုမိုလည်ပတ်နေပါက၊ ၎င်းတို့ထဲမှ နည်းပါးသွားသည်အထိ စောင့်ပါ
DHCP အထုပ်ကို လက်ခံ/ပေးပို့ပါ။
ကွန်ရက်ကတ်မှတဆင့်လာသော UDP packet များကို ကြားဖြတ်နိုင်ရန်၊ သင်သည် socket ကို "မြှင့်တင်ရန်" လိုအပ်သည်-
udp_socket = socket.socket(socket.AF_INET၊ socket.SOCK_DGRAM၊ socket.IPPROTO_UDP) udp_socket.bind((gconfig["dhcp_host"],67))
အလံများတည်ရှိရာ၊
- AF_INET - ဆိုလိုသည်မှာ လိပ်စာဖော်မတ်သည် IP: ဆိပ်ကမ်း ဖြစ်လိမ့်မည်။ ဖိုင်အမည်ဖြင့် လိပ်စာပေးထားသည့် AF_UNIX လည်း ရှိနိုင်သည်။
- SOCK_DGRAM - ကျွန်ုပ်တို့သည် "ကုန်ကြမ်း ပက်ကတ်" ကို လက်မခံကြောင်း၊ သို့သော် firewall မှတဆင့် ဖြတ်သန်းပြီးသော၊ နှင့် တစ်စိတ်တစ်ပိုင်း ဖြတ်တောက်ထားသော ပက်ကတ်ဖြင့် ဆိုလိုပါသည်။ အဲဒါတွေ။ UDP packet wrapper ၏ "ရုပ်ပိုင်းဆိုင်ရာ" အစိတ်အပိုင်းမပါဘဲ UDP ပက်ကတ်တစ်ခုသာ လက်ခံရရှိပါသည်။ အကယ်၍ သင်သည် SOCK_RAW အလံကို အသုံးပြုပါက၊ သင်သည် ဤ “wrapper” ကို ခွဲခြမ်းစိတ်ဖြာရန် လိုအပ်မည်ဖြစ်သည်။
ပက်ကေ့ဂျ်တစ်ခုပေးပို့ခြင်းသည် ထုတ်လွှင့်မှုတစ်ခုကဲ့သို့ ဖြစ်နိုင်သည်-
udp_socket.setsockopt(socket.SOL_SOCKET၊ socket.SO_BROADCAST၊ 1) #socket ကို အသံလွှင့်မုဒ်သို့ ပြောင်းပါ rz=udp_socket.sendto(packetack၊ (gconfig["broadcast"]၊68))
နှင့် "ပက်ကေ့ဂျ်ဘယ်ကလာသလဲ" လိပ်စာသို့-
udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # socket ကို multi-listener mode သို့ပြောင်း rz=udp_socket.sendto(packetack, addr)
SOL_SOCKET ဆိုသည်မှာ ရွေးချယ်စရာများ သတ်မှတ်ခြင်းအတွက် “ပရိုတိုကောအဆင့်”၊
SO_BROADCAST ထုပ်ပိုးမှုထုပ်ပိုးမှုမှာ “ထုတ်လွှင့်သည်” ဟူသော ရွေးချယ်ခွင့်
၊SO_REUSEADDR ရွေးချယ်မှုသည် socket ကို "နားဆင်သူအများအပြား" မုဒ်သို့ပြောင်းသည်။ သီအိုရီအရ၊ ဤကိစ္စတွင် မလိုအပ်သော်လည်း ကျွန်ုပ်စမ်းသပ်ခဲ့သည့် FreeBSD ဆာဗာများထဲမှ တစ်ခုတွင်၊ ဤရွေးချယ်ခွင့်မရှိဘဲ ကုဒ်သည် အလုပ်မလုပ်ပါ။
DHCP ပက်ကတ်ကို ခွဲခြမ်းစိတ်ဖြာခြင်း။
ဒီနေရာက Python ကို အရမ်းကြိုက်တယ်။ ဘောက်စ်အပြင်က bytecode နဲ့ အတော်လေး ပြောင်းလွယ်ပြင်လွယ် ဖြစ်နိုင်ပါတယ်။ ဒဿမတန်ဖိုးများ၊ စာကြောင်းများနှင့် hex သို့ အလွန်လွယ်ကူစွာ ဘာသာပြန်နိုင်စေခြင်း - i.e. ဒါက package ရဲ့ ဖွဲ့စည်းပုံကို နားလည်ဖို့ အမှန်တကယ်လိုအပ်ပါတယ်။ ထို့ကြောင့်၊ ဥပမာအားဖြင့်၊ သင်သည် HEX နှင့် just bytes တို့တွင် bytes အကွာအဝေးကို ရနိုင်သည်-
res["xidhex"]=data[4:8].hex() res["xidbyte"]=data[4:8]
bytes ကို ဖွဲ့စည်းပုံတစ်ခုအဖြစ် ထုပ်ပိုးပါ-
res["flags"]=pack('BB'၊data[10]၊data[11])
ဖွဲ့စည်းပုံမှ IP ကိုရယူပါ-
res["ciaddr"]=socket.inet_ntoa(pack('BBBB'၊data[12]၊data[13]၊data[14]၊data[15]));
အပြန်အလှန်အားဖြင့်-
res=res+socket.inet_pton(socket.AF_INET၊ gconfig["dhcp_Server"])
လောလောဆယ် ဒီလောက်ပါပဲ။
source: www.habr.com