Python дээрх DHCP+Mysql сервер

Python дээрх DHCP+Mysql сервер

Энэхүү төслийн зорилго нь:

  • IPv4 сүлжээнд DHCP-ийн талаар суралцах
  • Python сурах (эхнээс нь арай илүү 😉)
  • сервер солих DB2DHCP (миний сэрээ), эх энд, энэ нь шинэ үйлдлийн системд зориулж угсрах нь улам бүр хэцүү болж байна. "Яг одоо өөрчлөх" ямар ч боломжгүй хоёртын систем байх нь надад таалагдахгүй байна.
  • захиалагчийн mac ашиглан захиалагчийн IP хаягийг сонгох боломжтой DHCP серверийг олж авах эсвэл mac+port хослолыг солих (Сонголт 82)
  • өөр дугуй бичих (Өө! энэ бол миний дуртай үйл ажиллагаа)
  • Хабрахабр дээр таны клубын гар урлалын талаархи сэтгэгдлийг хүлээн авах (эсвэл илүү сайн, урилга) 😉

Үр дүн: энэ нь ажилладаг 😉 FreeBSD болон Ubuntu үйлдлийн систем дээр туршиж үзсэн. Онолын хувьд кодыг ямар ч үйлдлийн систем дээр ажиллуулахыг хүсч болно, учир нь Кодод ямар ч тусгай холболт байхгүй бололтой.
Болгоомжтой! Цаашид зөндөө юм байна.

Сонирхогчдод зориулсан агуулахын холбоос "амьд хүрэх".

"Техник хангамжийг судлах" үр дүнг суулгах, тохируулах, ашиглах үйл явц нь хамаагүй доогуур, дараа нь DHCP протоколын тухай бага зэрэг онол юм. Өөрийнхөө төлөө. Мөн түүхийн хувьд 😉

Бага зэрэг онол

DHCP гэж юу вэ

Энэ нь төхөөрөмжид өөрийн IP хаягийг (мөн гарц, DNS гэх мэт бусад параметрүүдийг) DHCP серверээс олж мэдэх боломжийг олгодог сүлжээний протокол юм. Пакетуудыг UDP протокол ашиглан солилцдог. Сүлжээний параметрүүдийг хүсэх үед төхөөрөмжийн ажиллах ерөнхий зарчим нь дараах байдалтай байна.

  1. Төхөөрөмж (үйлчлүүлэгч) нь сүлжээ даяар UDP өргөн нэвтрүүлгийн хүсэлтийг (DHCPDISCOVER) илгээж, "За хэн нэгэн надад IP хаяг өгөөч" гэсэн хүсэлтийг илгээдэг. Түүнээс гадна, ихэвчлэн (гэхдээ үргэлж биш) хүсэлт 68-р портоос (эх сурвалж) ирдэг бөгөөд очих газар нь 67-р порт (очих газар) юм. Зарим төхөөрөмжүүд мөн 67-р портоос пакет илгээдэг. Үйлчлүүлэгч төхөөрөмжийн MAC хаяг нь DHCPDISCOVER багцад багтсан болно.
  2. Сүлжээнд байрладаг бүх DHCP серверүүд (мөн хэд хэдэн байж болно) DHCPDISCOVER илгээсэн төхөөрөмжийн сүлжээний тохиргоо бүхий DHCPOFFER саналыг бүрдүүлж, сүлжээгээр дамжуулдаг. Энэ пакет нь хэнд зориулагдсан болохыг тодорхойлох нь DHCPDISCOVER хүсэлтийн өмнө өгсөн үйлчлүүлэгчийн MAC хаяг дээр суурилдаг.
  3. Үйлчлүүлэгч нь сүлжээний тохиргооны санал бүхий пакетуудыг хүлээн авч, хамгийн сонирхол татахуйцыг нь сонгож (шалгуурууд нь өөр байж болно, жишээлбэл, пакет хүргэх хугацаа, завсрын маршрутын тоо), сүлжээний тохиргоотой DHCPREQUEST "албан ёсны хүсэлт" гаргадаг. дуртай DHCP серверээс. Энэ тохиолдолд пакет тодорхой DHCP сервер рүү очдог.
  4. DHCPREQUEST-г хүлээн авсан сервер нь DHCPACK форматын пакет илгээж, энэ клиентэд зориулагдсан сүлжээний тохиргоог дахин жагсаав.

Python дээрх DHCP+Mysql сервер

Нэмж дурдахад үйлчлүүлэгчээс ирдэг DHCPINFORM багцууд байдаг бөгөөд тэдгээрийн зорилго нь DHCP серверт "үйлчлүүлэгч амьд" бөгөөд олгосон сүлжээний тохиргоог ашиглаж байгааг мэдээлэх явдал юм. Энэ серверийг хэрэгжүүлэхэд эдгээр пакетуудыг үл тоомсорлодог.

Багцын формат

Ерөнхийдөө Ethernet пакетийн хүрээ нь дараах байдалтай харагдана.

Python дээрх DHCP+Mysql сервер

Манай тохиолдолд бид OSI давхаргын протоколын толгой, тухайлбал DHCP бүтэцгүйгээр UDP пакетийн контентоос шууд мэдээллийг авч үзэх болно.

DHCPDISCOVER

Тиймээс төхөөрөмжийн 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
"Ид шидийн" дугаар, үүний дагуу. та энэ пакет DHCP протоколд хамаарах эсэхийг тодорхойлж болно

DHCP сонголтууд. Ямар ч дарааллаар явж болно

236
Сонголтын дугаар
53
Dec
1
DHCP пакетийн төрлийг тодорхойлсон сонголт 53

1 - DHCPDISCOVER
3 - DHCPREQUEST
2 - DHCPOFFER
5 - DHCPACK
8 - DHCPINFORM

 
Сонголтын урт
1
Dec
1

 
Сонголтын утга
1
Dec
1

 
Сонголтын дугаар
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
 
Давтан төхөөрөмжийн MAC хаяг болон зарим нэмэлт утгыг дамжуулдаг сонголт 82.

Ихэнхдээ энэ нь эцсийн DHCP клиент ажилладаг шилжүүлэгчийн порт юм. Энэ сонголт нь нэмэлт параметрүүдийг агуулдаг. Эхний байт нь "дэд сонголтын тоо", хоёр дахь нь урт, дараа нь утга юм.

Энэ тохиолдолд 82-р сонголтод дэд сонголтуудыг оруулав:
Agent Circuit ID = 00:04:00:01:00:04, сүүлийн хоёр байт нь хүсэлт ирсэн DHCP клиент порт юм.

Agent Remote 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 нь багцын төгсгөлийг бэлэгддэг

DHCPOFFER

Сервер 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 нь 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
Реле агент 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
"Ид шидийн" дугаар, үүний дагуу. та энэ пакет DHCP протоколд хамаарах эсэхийг тодорхойлж болно

DHCP сонголтууд. Ямар ч дарааллаар явж болно

236
Сонголтын дугаар
53
Dec
1
DHCP 53 пакетийн төрлийг тодорхойлдог сонголт 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
"Ид шидийн" дугаар, үүний дагуу. та энэ пакет DHCP протоколд хамаарах эсэхийг тодорхойлж болно

DHCP сонголтууд. Ямар ч дарааллаар явж болно

236
Сонголтын дугаар
53
Dec
3
DHCP пакетийн төрөл 53-ыг тодорхойлсон сонголт 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 форматтай пакет үйлчилдэг. Энэ нь бусад пакетуудын нэгэн адил цацалтаар илгээгддэг. Хэдийгээр Python дээр хэрэгжсэн DHCP серверийн доорх кодонд би аль хэдийн мэдэгдэж байгаа бол тодорхой клиент IP руу пакет илгээх замаар ямар ч өргөн нэвтрүүлгийн хүсэлтийг хуулбарлаж байна. Түүнчлэн DHCP сервер нь DHCPACK пакет үйлчлүүлэгчид хүрсэн эсэхэд огт хамаагүй. Хэрэв үйлчлүүлэгч 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
"Ид шидийн" дугаар, үүний дагуу. та энэ пакет DHCP протоколд хамаарах эсэхийг тодорхойлж болно

DHCP сонголтууд. Ямар ч дарааллаар явж болно

236
Сонголтын дугаар
53
Dec
3
DHCP пакетийн төрөл 53 - DHCPACK-ийг тодорхойлсон сонголт 5

 
Сонголтын урт
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 нь багцын төгсгөлийг бэлэгддэг

тохиргоо

Угсралт нь үнэндээ ажилд шаардлагатай python модулиудыг суулгахаас бүрддэг. MySQL-г аль хэдийн суулгаж, тохируулсан гэж үздэг.

FreeBSD-ийн

pkg суулгах python3 python3 -m surepip pip3 суулгах mysql-холбогч

Ubuntu

sudo apt-get суулгах python3 sudo apt-get суулгах pip3 sudo pip3 суулгах 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 localhost тест тест 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)=дээд('{option_3_AgentRemoteId_hex}') ба дээд(порт)=дээд('{option_1_AgentCircuitId_port_hex}') байгаа хэрэглэгчдээс ip,mask,router,dns-ийг сонгоно уу. Дээд(mac)=дээд('{sw_mac}') болон дээд(порт)=дээд('{sw_port82}') байгаа хэрэглэгчдээс ip,mask,router,dns-ийг сонгоно уу. upper(mac)=upper('{ClientMacAddress}') байгаа хэрэглэгчдээс ip,mask,router,dns сонгоно уу. түүхэнд оруулах (id,dt,mac,ip,коммент) утгууд (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Одоо шошго дээр илүү дэлгэрэнгүй:

Dhcpserver хэсэг нь серверийг эхлүүлэх үндсэн тохиргоог тайлбарладаг, тухайлбал:

  • хост - 67-р порт дээр сервер ямар IP хаягийг сонсдог
  • broadcast - DHCPOFFER болон DHCPACK-д зориулсан өргөн нэвтрүүлэг аль ip вэ
  • DHCPServer - DHCP серверийн IP гэж юу вэ
  • Өгөгдсөн IP хаягийн LeaseTime түрээсийн хугацаа
  • ThreadLimit - 67-р порт дээр ирж буй UDP пакетуудыг боловсруулахын тулд хэдэн хэлхээ нэгэн зэрэг ажиллаж байна. Энэ нь ачаалал ихтэй төслүүдэд туслах болно 😉
  • defaultMask,defaultRouter,defaultDNS - өгөгдлийн санд IP олдсон боловч нэмэлт параметрүүдийг заагаагүй тохиолдолд захиалагчид анхдагчаар юу санал болгодог вэ

mysql хэсэг:

хост, хэрэглэгчийн нэр, нууц үг, үндсэн нэр - бүх зүйл өөрөө ярьдаг. Өгөгдлийн сангийн ойролцоо бүтцийг дээр байрлуулсан GitHub

Асуулгын хэсэг: OFFER/ACK хүлээн авах хүсэлтийг энд тайлбарласан болно:

  • offer_count — IP, маск, чиглүүлэгч, 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 мужаас hex-ыг авна

Та серверийг -d шилжүүлэгчээр эхлүүлснээр асуулгад ашиглаж болох бүх боломжит сонголтуудыг харж болно. Бид иймэрхүү бүртгэлийг харах болно:

--67ad0025224, b'x764xa91xe5xa0xa3xa5-x9fx8a' , ('8', 172.30.114.25) {'ClientMacAddress': '68''ClientMacAddress': '0025224''MacAdress': '764'Caddress'-аас DHCPINFORM пакет 00-р порт дээр ирсэн. : b'x7 91%"Jxd5d' , ' HType': 'Ethernet', 'HostName': b'x0xa3xe5xa9xa8xa8-x43fx0.0.0.0a', 'ReqListDNS': Үнэн, 'ReqListDomainName': Үнэн, 'ReqListPerfowmRouterDiscoveric,'ReqList,'RouterDiscoveric,'Req':L Маршрут': Үнэн, 'ReqListSubnetM асуух ': Үнэн, 'ReqListVendorSpecInfo': 5.0, 'RequestedIpAddress': '0025224', 'Vendor': b'MSFT 764', 'chaddr': '172.30.128.13ad00ad': '00ad172.30.114.25.' ' , 'flags ': b'x308x6', 'giaddr': '1', 'gpoz': 82, 'hlen': 12, 'hops': 12, 'htype': 'MAC', 'magic_cookie': b'cx53Sc ', 'op': 'DHCPINFORM', 'option53': 55, 'option55': 60, 'option60': 61, 'option61': 82, 'option82': 82, 'option12': 01, option_06_byte': b'x00x04x00x01x00x06x02x08x00x06x00x1' b'x9x2x82eXx12010600040001000602080006001exb589xad', 'option_2_hex': '82 'option_18_len': 82 12, 'option_01_str': "b'x06x00x04x00x01x00x06x02x08x00x06x00x1x9x2eXx768exb0.0.0.0xad'", 'үр дүн': Худал', 001s's 'siaddr': '589', 'sw_mac': '2e1eb06ad', 'sw_port89': '8', 'xidbyte': b'

Үүний дагуу бид ямар ч хувьсагчийг {}-д ороож болох бөгөөд үүнийг SQL асуулгад ашиглах болно.

Үйлчлүүлэгчийн IP хаягийг хүлээн авсан түүхийг бичнэ үү:

Python дээрх DHCP+Mysql сервер

Python дээрх DHCP+Mysql сервер

Серверийг эхлүүлж байна

./pydhcpdb.py -d -c config.xml

— d консолын гаралтын горим DEBUG
- c <файлын нэр> тохиргооны файл

Дүгнэлт

Одоо Python дээр серверийг хэрэгжүүлэх талаар дэлгэрэнгүй мэдээлэл. Энэ бол өвдөлт юм. Python-ыг шууд л сурсан. Олон агшинг “хөөх, би яаж ийгээд хийчихлээ” гэх маягаар бүтээгдсэн байдаг. Огт оновчтой болгоогүй бөгөөд Python хөгжүүлэлтийн туршлага багатай учраас энэ хэлбэрээр үлдсэн. Би "код" дахь серверийн хэрэгжилтийн хамгийн сонирхолтой талуудын талаар ярих болно.

XML тохиргооны файл задлагч

Стандарт Python модулийг xml.dom ашигладаг. Энэ нь энгийн мэт боловч хэрэгжүүлэх явцад энэ модулийг ашиглан сүлжээнд тодорхой баримт бичиг, жишээ дутагдалтай байсан.

    tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") mconfig доторх elem: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].Child. gconfig["mysql_username"]=elem.getElementsByTagName("хэрэглэгчийн нэр")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("нууц үг")[0].firstChild_gsgss["tabaa." =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") dconfig доторх elem: gconfig["broadcast"]=elem.getElementsByTagName("0)"bro." firstChild.data gconfig["dhcp_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["dhcp_LeaseTime"]=elem.getElementsByTagName("LeaseTime") gconfig.[0] dhcp_threadlimit "= int (ent.getchild.dathild.data.dathig (" DHCPSERTHINTAINE "). =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultDNS"]=elem.getElementsByTagName(" defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query") qconfig доторх elem: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild inta. муж(int(gconfig["offer_count"])): gconfig["offer_"+str(num+0)]=elem.getElementsByTagName("offer_"+str(num+0))[1].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[1].firstChild.data options=tree.getElementsByTagName("options") нь сонголтууд доторх: node доторх сонголтуудын хувьд node=elem.getElementsByTagName("option") : optionsMod.append(options.firstChild.data)

Олон урсгалтай

Хачирхалтай нь, Python-д multithreading нь маш ойлгомжтой бөгөөд энгийн байдлаар хэрэгждэг.

def PacketWork(data,addr): ... # ирж буй пакетийг задлан шинжилж, түүнд хариу өгөх үйл ажиллагаа ... байхад Үнэн: өгөгдөл, addr = udp_socket.recvfrom(1024) # UDP багцын хэлхээг хүлээж байна = threading.Thread( target=PacketWork , args=(data,addr,)).start() # ирсэн шиг - бид threading.active_count() >gconfig["dhcp_ThreadLimit"]: цаг үед өмнө нь тодорхойлсон PacketWork функцийг арын дэвсгэр дээр параметрүүдээр ажиллуулдаг. sleep(1) # хэрэв тоо Тохиргооноос илүү олон хэлхээ ажиллаж байгаа бол бид цөөхөн болтол хүлээнэ.

DHCP пакет хүлээн авах/илгээх

Сүлжээний картаар дамжин ирж буй UDP пакетуудыг таслан зогсоохын тулд та залгуурыг "өргөх" хэрэгтэй.

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 - бид "түүхий пакет"-ийг хүлээн авахгүй, харин галт ханаар аль хэдийн нэвтэрсэн, хэсэгчлэн таслагдсан пакеттай гэсэн үг юм. Тэдгээр. Бид зөвхөн UDP багцын "биет" бүрэлдэхүүн хэсэггүй UDP багцыг хүлээн авдаг. Хэрэв та SOCK_RAW тугийг ашигладаг бол энэ "боодол"-ыг мөн задлах шаардлагатай болно.

Пакет илгээх нь өргөн нэвтрүүлэгтэй адил байж болно:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #сокетыг өргөн нэвтрүүлгийн горимд шилжүүлэх rz=udp_socket.sendto(packettack, (gconfig["broadcast"],68))

, мөн "багц хаанаас ирсэн" хаяг руу:

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # залгуурыг олон сонсогчтой горимд шилжүүлнэ rz=udp_socket.sendto(packettack, addr)

, энд SOL_SOCKET нь тохируулгын тохиргооны "протоколын түвшин" гэсэн үг,

, SO_BROADCAST сонголт нь малгайны багцыг "цахилгаан дамжуулах"

  ,SO_REUSEADDR сонголт нь залгуурыг "олон сонсогч" горимд шилжүүлдэг. Онолын хувьд энэ тохиолдолд шаардлагагүй, гэхдээ миний туршиж үзсэн FreeBSD серверүүдийн аль нэгэнд энэ сонголтгүйгээр код ажиллахгүй байсан.

DHCP пакетийг задлан шинжилж байна

Эндээс би Python-д үнэхээр дуртай байсан. Энэ нь хайрцагнаас гарч, байт кодтой нэлээд уян хатан байх боломжийг олгодог. Үүнийг аравтын бутархай, мөр, зургаан тал руу хялбархан хөрвүүлэхийг зөвшөөрөх - i.e. Энэ бол бид багцын бүтцийг ойлгох ёстой зүйл юм. Тиймээс, жишээлбэл, та HEX-д хэд хэдэн байт ба зөвхөн байт авч болно:

    res["xidhex"]=өгөгдөл[4:8].hex() res["xidbyte"]=өгөгдөл[4:8]

, байтуудыг бүтэц болгон багцлана:

res["flags"]=pack('BB',data[10],data[11])

Бүтэцээс IP авах:

res["ciaddr"]=socket.inet_ntoa(багц('BBBB',дата[12],өгөгдөл[13],дата[14],өгөгдөл[15]));

Мөн эсрэгээр:

res=res+socket.inet_pton(сокет.AF_INET, gconfig["dhcp_Server"])

Одоохондоо ийм л байна 😉

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх