Pythonдо DHCP+Mysql сервери

Pythonдо DHCP+Mysql сервери

Бул долбоордун максаты:

  • IPv4 тармагындагы DHCP жөнүндө үйрөнүү
  • Python үйрөнүү (нөлдөн караганда бир аз көбүрөөк😉)
  • серверди алмаштыруу DB2DHCP (менин айрым), оригиналдуу бул жерде, жаңы OS үчүн чогултуу барган сайын кыйын болуп баратат. Мага бул экилик системанын "азыр өзгөртүүгө" эч кандай жолу жок экени жакпайт.
  • абоненттин Mac же коммутатор Mac+порт айкалышы аркылуу абоненттин IP дарегин тандоо мүмкүнчүлүгү бар иштеген DHCP серверин алуу (82-параметр)
  • башка велосипед жазуу (Ох! бул менин сүйүктүү ишим)
  • Хабрахабрдагы клубду башкарууңуз жөнүндө комментарий алуу (же андан да жакшысы чакыруу) 😉

Натыйжа: ал иштейт 😉 FreeBSD жана Ubuntu OSде сыналган. Теориялык жактан алганда, код, анткени, кандайдыр бир OS астында иштөө үчүн суралышы мүмкүн Коддо эч кандай конкреттүү байланыштар жок окшойт.
Абайлаңыз! Алдыда дагы көп нерселер бар.

Сүйүүчүлөр үчүн репозиторийге шилтеме "тирүү тийүү".

Орнотуу, конфигурациялоо жана "аппараттык камсыздоону изилдөө" натыйжасын колдонуу процесси кыйла төмөн, андан кийин DHCP протоколу жөнүндө бир аз теория. Озум учун. Ал эми тарых үчүн 😉

Бир аз теория

DHCP деген эмне

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

  1. Түзмөк (кардар) "жакшы, кимдир бирөө мага IP дарегин бериңиз" деген суроо менен бүткүл тармакка UDP берүү өтүнүчүн (DHCPDISCOVER) жөнөтөт. Андан тышкары, адатта (бирок дайыма эмес) суроо-талап 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
Hops
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
Server хост аты
 
Сап
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 - Gateway
06 - DNS
oc — Хост аты
0f - тармактык домендик аталыш
1c - берүү өтүнүчүнүн дареги (берүү)
42 - TFTP серверинин аталышы
79 - Класссыз статикалык маршрут

 
Опциянын узундугу
8
 
1

 
Опциянын мааниси
01:03:06:0c:0f:1c:42:79
 
8

 
Опция номери
82
Dec
 
Option 82, ал кайталоочу түзүлүштүн MAC дарегин жана кээ бир кошумча маанилерди өткөрөт.

Көбүнчө, бул 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
Hops
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
Server хост аты
 
Сап
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:c
Dec
18

 
Пакеттин аягы
255
Dec
1
255 пакеттин аягын билдирет

DHCPREQUEST

Кардар DHCPOFFERди алгандан кийин, ал тармактын параметрлерин тармактагы бардык DHCP серверлерине эмес, DHCPOFFER сунушу ага эң "жактырган" белгилүү бирине гана суроочу пакетти түзөт. "Жакшы" критерийлери ар кандай болушу мүмкүн жана кардардын DHCP ишке ашыруусуна жараша болот. Сурамдын алуучусу DHCP серверинин MAC дареги аркылуу көрсөтүлөт. Ошондой эле, DHCPREQUEST пакети, эгерде сервердин IP дареги мурда алынган болсо, алгач DHCPDISCOVER түзбөй эле кардар тарабынан жөнөтүлүшү мүмкүн.

DHCPREQUEST Пакет структурасынын таблицасы

Пакеттеги позиция
Нарктын аталышы (жалпы)
мисал
ой
Байт
тазалоо

1
Жүктөө сурамы
1
Hex
1
Билдирүү түрү. 1 - клиенттен серверге суроо, 2 - серверден кардарга жооп

2
Аппараттык түрү
1
Hex
1
Аппараттык даректин түрү, бул протоколдо 1 - MAC

3
Аппараттык жабдыктар узундукка кайрылат
6
Hex
1
Түзмөктүн MAC дарегинин узундугу

4
Hops
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
Server хост аты
 
Сап
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 - Gateway
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:c
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
Hops
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
Server хост аты
 
Сап
64
DHCP серверинин аты. Көбүнчө берилбейт

105
Жүктөө файлынын аты
 
Сап
128
Жүктөөдө дисксиз станциялар колдонгон сервердеги файлдын аталышы

235
Сыйкырдуу печенье
63: 82: 53: 63
Hex
4
"Сыйкырдуу" саны, ага ылайык, анын ичинде. бул пакет DHCP протоколуна таандык экенин аныктай аласыз

DHCP параметрлери. Ар кандай тартипте барууга болот

236
Опция номери
53
Dec
3
DHCP пакетинин 53 түрүн аныктаган 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:c
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 upper(mac)=upper('{option_3_AgentRemoteId_hex}') жана upper(port)=upper('{option_1_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, роутер, dns тандаңыз. тарыхка кыстаруу (id,dt,mac,ip,comment) маанилери (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Азыр тегдер боюнча кененирээк:

dhcpserver бөлүмү серверди баштоо үчүн негизги орнотууларды сүрөттөйт, атап айтканда:

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

mysql бөлүмү:

хост, колдонуучу аты, сырсөз, базалык аты - баары өзү үчүн сүйлөйт. Болжолдуу маалымат базасынын түзүмү жайгаштырылган GitHub

Суроо бөлүмү: СУНУШ/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

, 26:40 диапазонунан он алтылыкты алып, sw_mac өзгөрмөсүн аныктаңыз

Серверди -d которуштуруусу менен баштоо менен сурамдарда колдонула турган бардык мүмкүн болгон варианттарды көрө аласыз. Биз бул журналга окшош нерсени көрөбүз:

--67ad0025224 , b'x764xa91xe5xa0xa3xa5-x9fx8a' , ('8', 172.30.114.25) 68-портуна DHCPINFORM пакети келди {'ClientMacAddress': '0025224'MacAddress': '764'MacAddress': '00'Mac7B 'x91% "Jxd5d', ' HType': 'Ethernet', 'HostName': b'x0xa3xe5xa9xa8xa8-x43fx0.0.0.0a', 'ReqListDNS': True, 'ReqListDomainName': Чын, 'ReqListPerfowmRouterDiscover':Stat'RouterDiscover':'Reqeist':'Reqeist': Ырас,' Reqlissubnetmask ': Чыныгы,' reqlistvendspendorspecinfo: '5.0', 'Сатуучу', 'Сатуучу': B'MFFFT 0025224 ',' Chaddr ':' 764Ad172.30.128.13 ',' CIADDR '', 'CIADDR': '00 желекчелер ': b'x00x172.30.114.25', 'giaddr': '308', 'gpoz': 6, 'hlen': 1, 'хопс': 82, 'htype': 'MAC', 'magic_cookie': b' cx12Sc ', 'op': 'DHCPINFORM', 'option12': 53, 'option53': 55, 'option55': 60, 'option60': 61, 'option61': 82, 'option82': 82_te'option : b'x12x01x06x00x04x00x01x00x06x02x08x00' b'x06x00x1eXx9exb2xad', 'option_82_hex': '12010600040001000602080006001'ad589' : 2, 'option_82_str': "b'x18x82x12x01x06x00x04x00x01x00x06x02x08x00x06eXx00exb1xad'", 'натыйжа': False, 'secs'''siaddr', : '9', 'sw_mac': '2e768eb0.0.0.0ad', 'sw_port001': '589', '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("username")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("password")[0].firstChild_dabass["mysql". =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") dconfig ичиндеги elem үчүн: gconfig["broadcast"]=elem.getElementsByTagcastName(]"0." firstChild.data gconfig["dhcp_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["dhcp_LeaseTime"]=elem.getElementsByTagName("LeaseTime") gconfig.[0] dhcp_ThreadLimit"]=int(elem.getElementsByTagName("ThreadLimit")[0].firstChild.data) gconfig["dhcp_Server"]=elem.getElementsByTagName("DHCPServer")[0]fi]macdas[0]. =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhlem.data gconfig["dhlemBg"("dhlemB"y) defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query") qconfig ичиндеги elem үчүн: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[1].firstChild inda. диапазон(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("option") node ичиндеги параметрлер үчүн : optionsMod.append(options.firstChild.data)

Multithreading

Кызык жери, Pythonдо көп агым абдан так жана жөнөкөй ишке ашырылган.

def PacketWork(data,addr): ... # келген пакетти талдоо жана ага жооп берүүнү ишке ашыруу ... ал эми True: маалымат, addr = udp_socket.recvfrom(1024) # UDP пакет жипти күтүүдө = threading.Thread( target=PacketWork, args=(data,addr,)).start() # келди - биз threading.active_count() >gconfig["dhcp_ThreadLimit"]: убакыт учурунда мурда аныкталган PacketWork функциясын фондо параметрлер менен ишке киргизебиз. уйку(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 абдан жакты. Көрсө, бул кутудан байткод менен абдан ийкемдүү болууга мүмкүндүк берет. Аны ондук санга, саптарга жана он алтылык санга оңой которууга мүмкүндүк берүү - б.а. Бул пакеттин түзүмүн түшүнүшүбүз керек. Ошентип, мисалы, сиз HEX жана жөн гана байт байт диапазонун ала аласыз:

    res["xidhex"]=дата[4:8].hex() res["xidbyte"]=дата[4:8]

, байттарды структурага топтоо:

res["flags"]=пакет('BB',дата[10],дата[11])

Түзүмдөн IP алуу:

res["ciaddr"]=socket.inet_ntoa(пакет('BBBB',дата[12],дата[13],дата[14],дата[15]));

Жана тескерисинче:

res=res+socket.inet_pton(socket.AF_INET, gconfig["dhcp_Server"])

Азырынча ушунча 😉

Source: www.habr.com

Комментарий кошуу