DHCP+Mysql server sa Python

DHCP+Mysql server sa Python

Ang katuyoan niini nga proyekto mao ang:

  • Pagkat-on mahitungod sa DHCP sa IPv4 network
  • Pagkat-on sa Python (sobra gamay kay sa gikan 😉)
  • puli sa server DB2DHCP (akong tinidor), orihinal dinhi, nga nahimong mas ug mas lisud sa pag-assemble alang sa bag-ong OS. Ug dili ko ganahan nga kini usa ka binary nga wala’y paagi nga "magbag-o karon"
  • pagkuha sa usa ka nagtrabaho nga DHCP server nga adunay abilidad sa pagpili sa IP address sa subscriber gamit ang mac sa subscriber o switch mac+port nga kombinasyon (Option 82)
  • pagsulat og laing bisikleta (Oh! kini ang akong paborito nga kalihokan)
  • nakadawat ug mga komento bahin sa imong pagka-klab sa Habrahabr (o mas maayo pa, usa ka imbitasyon) 😉

Resulta: kini molihok 😉 Gisulayan sa FreeBSD ug Ubuntu OS. Sa teoriya, ang code mahimong hangyoon nga magtrabaho ubos sa bisan unsang OS, tungod kay Daw walay espesipikong mga binding sa code.
Pag-amping! Daghan pa ang umaabot.

Link sa repository para sa mga amateur "paghikap buhi".

Ang proseso sa pag-instalar, pag-configure ug paggamit sa resulta sa "pagtuon sa hardware" mas ubos, ug dayon usa ka gamay nga teorya mahitungod sa DHCP protocol. Para sa akong kaugalingon. Ug para sa kasaysayan 😉

Usa ka gamay nga teorya

Unsa ang DHCP

Kini usa ka protocol sa network nga nagtugot sa usa ka aparato nga mahibal-an ang IP address niini (ug uban pang mga parameter sama sa gateway, DNS, ug uban pa) gikan sa usa ka DHCP server. Ang mga pakete gibaylo gamit ang UDP protocol. Ang kinatibuk-ang prinsipyo sa operasyon sa device sa dihang nangayo sa mga parameter sa network mao ang mosunod:

  1. Ang aparato (kliyente) nagpadala usa ka hangyo sa broadcast sa UDP (DHCPDISCOVER) sa tibuuk nga network nga adunay hangyo nga "maayo, adunay naghatag kanako usa ka IP address." Dugang pa, kasagaran (apan dili kanunay) ang hangyo mahitabo gikan sa port 68 (tinubdan), ug ang destinasyon mao ang port 67 (destinasyon). Ang ubang mga himan nagpadala usab og mga pakete gikan sa port 67. Ang MAC address sa device sa kliyente gilakip sa sulod sa DHCPDISCOVER packet.
  2. Ang tanan nga mga server sa DHCP nga nahimutang sa network (ug mahimo’g daghan kanila) nagporma usa ka tanyag nga DHCPOFFER nga adunay mga setting sa network alang sa aparato nga nagpadala sa DHCPDISCOVER, ug gisibya usab kini sa network. Ang pag-ila kung kinsa ang gituyo niini nga pakete gibase sa MAC address sa kliyente nga gihatag sa sayo pa sa hangyo sa DHCPDISCOVER.
  3. Gidawat sa kliyente ang mga pakete nga adunay mga sugyot alang sa mga setting sa network, gipili ang labing madanihon (ang mga pamatasan mahimong lahi, pananglitan, ang oras sa paghatud sa packet, ang gidaghanon sa mga intermediate nga ruta), ug naghimo usa ka "opisyal nga hangyo" DHCPREQUEST sa mga setting sa network gikan sa DHCP server nga gusto niini. Sa kini nga kaso, ang pakete moadto sa usa ka piho nga DHCP server.
  4. Ang server nga nakadawat sa DHCPREQUEST nagpadala sa usa ka DHCPACK format nga pakete, diin kini sa makausa pa naglista sa mga setting sa network alang niini nga kliyente.

DHCP+Mysql server sa Python

Dugang pa, adunay mga pakete sa DHCPINFORM nga gikan sa kliyente, ug ang katuyoan niini mao ang pagpahibalo sa DHCP server nga ang "kliyente buhi" ug gigamit ang gi-isyu nga mga setting sa network. Sa pagpatuman niini nga server, kini nga mga pakete wala tagda.

Pormat sa package

Sa kinatibuk-an, ang usa ka Ethernet packet frame ingon niini:

DHCP+Mysql server sa Python

Sa among kaso, atong hisgotan lamang ang datos nga direkta gikan sa sulod sa UDP packet, nga walay OSI layer protocol header, nga mao ang DHCP structure:

DHCPDISCOVER

Busa, ang proseso sa pagkuha og IP address alang sa usa ka device nagsugod sa DHCP client nga nagpadala og broadcast request gikan sa port 68 ngadto sa 255.255.255.255:67. Sa kini nga pakete, ang kliyente naglakip sa MAC address niini, ingon man kung unsa gyud ang gusto nga madawat gikan sa DHCP server. Ang istruktura sa pakete gihulagway sa lamesa sa ubos.

DHCPDISCOVER Packet Structure Table

Posisyon sa package
Ngalan sa bili
Pananglitan:
Pasiuna
Byte
Pagpatin-aw

1
Paghangyo sa Boot
1
Hex
1
Uri sa mensahe. 1 - hangyo gikan sa kliyente ngadto sa server, 2 - tubag gikan sa server ngadto sa kliyente

2
Type sa hardware
1
Hex
1
Matang sa adres sa hardware, sa kini nga protocol 1 - MAC

3
Ang gitas-on sa mga adres sa hardware
6
Hex
1
Ang gitas-on sa adres sa MAC sa aparato

4
Hops
1
Hex
1
Gidaghanon sa mga intermediate nga ruta

5
Transaksyon ID
23:cf:de:1d
Hex
4
Talagsaong identifier sa transaksyon. Gihimo sa kliyente sa pagsugod sa usa ka operasyon sa paghangyo

7
Ikaduhang nilabay
0
Hex
4
Oras sa mga segundo gikan sa sinugdanan sa proseso sa pagkuha sa usa ka adres

9
Mga bandila sa boot
0
Hex
2
Pila ka mga bandera nga mahimong itakda aron ipakita ang mga parameter sa protocol

11
IP adres sa kliyente
0.0.0.0
Linya
4
IP address sa kliyente (kon aduna)

15
Ang imong kliyente IP address
0.0.0.0
Linya
4
IP address nga gitanyag sa server (kon anaa)

19
Sunod nga server IP address
0.0.0.0
Linya
4
IP address sa server (kon nahibal-an)

23
Relay agent IP address
172.16.114.41
Linya
4
IP address sa relay agent (pananglitan, switch)

27
MAC address sa kliyente
14:d6:4d:a7:c9:55
Hex
6
MAC address sa nagpadala sa packet (kliyente)

31
Padding sa address sa hardware sa kliyente
 
Hex
10
Gireserba nga lingkuranan. Kasagaran puno sa mga sero

41
Ngalan sa host sa server
 
Linya
64
Ngalan sa DHCP server. Kasagaran dili mapasa

105
Ngalan sa boot file
 
Linya
128
Ngalan sa file sa server nga gigamit sa mga estasyon nga walay disk kung nag-boot

235
Magic nga cookies
63: 82: 53: 63
Hex
4
"Magic" nga numero, sumala sa diin, incl. imong matino nga kini nga pakete iya sa DHCP protocol

Mga kapilian sa DHCP. Mahimong moadto sa bisan unsang order

236
Numero sa kapilian
53
Dec
1
Opsyon 53, nga nagtino sa tipo sa packet sa DHCP

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

 
Ang gitas-on sa opsyon
1
Dec
1

 
bili sa opsyon
1
Dec
1

 
Numero sa kapilian
50
Dec
1
Unsang IP address ang gusto nga madawat sa kliyente?

 
Ang gitas-on sa opsyon
4
Dec
1

 
bili sa opsyon
172.16.134.61
Linya
4

 
Numero sa kapilian
55
 
1
Mga parameter sa network nga gihangyo sa kliyente. Ang komposisyon mahimong magkalainlain

01 - Mask sa network
03 - Gateway
06 - DNS
oc — Hostname
0f - ngalan sa domain sa network
1c - adres sa hangyo sa pagsibya (broadcast)
42 - TFTP server ngalan
79 - Walay Klase nga Static nga Ruta

 
Ang gitas-on sa opsyon
8
 
1

 
bili sa opsyon
01:03:06:0c:0f:1c:42:79
 
8

 
Numero sa kapilian
82
Dec
 
Opsyon 82, nga nagpadala sa MAC address sa repeater device ug pipila ka dugang nga mga bili.

Kasagaran, kini ang pantalan sa switch diin ang katapusan nga kliyente sa DHCP nagdagan. Kini nga kapilian adunay dugang nga mga parameter. Ang una nga byte mao ang numero sa "suboption", ang ikaduha mao ang gitas-on niini, dayon ang kantidad niini.

Sa kini nga kaso, sa kapilian 82, ang mga sub-opsyon gisalag:
Agent Circuit ID = 00:04:00:01:00:04, diin ang katapusang duha ka byte mao ang DHCP client port diin gikan ang hangyo

Agent Remote ID = 00:06:c8:be:19:93:11:48 - MAC address sa DHCP repeater device

 
Ang gitas-on sa opsyon
18
Dec
 

 
bili sa opsyon
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Katapusan sa pakete
255
Dec
1
Ang 255 nagsimbolo sa katapusan sa pakete

DHCPOFFER

Sa diha nga ang server makadawat sa DHCPDISCOVER packet ug kung makita nga kini makahatag sa kliyente og usa ka butang gikan sa gihangyo, nan kini makamugna og tubag alang niini - DHCPDISCOVER. Ang tubag gipadala ngadto sa pantalan "gikan sa diin kini gikan", pinaagi sa sibya, tungod kay Sa pagkakaron, ang kliyente wala pay IP address, busa madawat ra ang pakete kung ipadala kini pinaagi sa broadcast. Nahibal-an sa kliyente nga kini usa ka pakete alang kaniya pinaagi sa iyang MAC address sa sulod sa package, ingon man ang numero sa transaksyon nga iyang nahimo sa panahon nga ang una nga pakete gihimo.

DHCPOFFER Packet Structure Table

Posisyon sa package
Ngalan sa bili (komon)
Pananglitan:
Pasiuna
Byte
Pagpatin-aw

1
Paghangyo sa Boot
1
Hex
1
Uri sa mensahe. 1 - hangyo gikan sa kliyente ngadto sa server, 2 - tubag gikan sa server ngadto sa kliyente

2
Type sa hardware
1
Hex
1
Matang sa adres sa hardware, sa kini nga protocol 1 - MAC

3
Ang gitas-on sa mga adres sa hardware
6
Hex
1
Ang gitas-on sa adres sa MAC sa aparato

4
Hops
1
Hex
1
Gidaghanon sa mga intermediate nga ruta

5
Transaksyon ID
23:cf:de:1d
Hex
4
Talagsaong identifier sa transaksyon. Gihimo sa kliyente sa pagsugod sa usa ka operasyon sa paghangyo

7
Ikaduhang nilabay
0
Hex
4
Oras sa mga segundo gikan sa sinugdanan sa proseso sa pagkuha sa usa ka adres

9
Mga bandila sa boot
0
Hex
2
Pila ka mga bandera nga mahimong itakda aron ipakita ang mga parameter sa protocol. Sa kini nga kaso, ang 0 nagpasabut nga tipo sa hangyo sa Unicast

11
IP adres sa kliyente
0.0.0.0
Linya
4
IP address sa kliyente (kon aduna)

15
Ang imong kliyente IP address
172.16.134.61
Linya
4
IP address nga gitanyag sa server (kon anaa)

19
Sunod nga server IP address
0.0.0.0
Linya
4
IP address sa server (kon nahibal-an)

23
Relay agent IP address
172.16.114.41
Linya
4
IP address sa relay agent (pananglitan, switch)

27
MAC address sa kliyente
14:d6:4d:a7:c9:55
Hex
6
MAC address sa nagpadala sa packet (kliyente)

31
Padding sa address sa hardware sa kliyente
 
Hex
10
Gireserba nga lingkuranan. Kasagaran puno sa mga sero

41
Ngalan sa host sa server
 
Linya
64
Ngalan sa DHCP server. Kasagaran dili mapasa

105
Ngalan sa boot file
 
Linya
128
Ngalan sa file sa server nga gigamit sa mga estasyon nga walay disk kung nag-boot

235
Magic nga cookies
63: 82: 53: 63
Hex
4
"Magic" nga numero, sumala sa diin, incl. imong matino nga kini nga pakete iya sa DHCP protocol

Mga kapilian sa DHCP. Mahimong moadto sa bisan unsang order

236
Numero sa kapilian
53
Dec
1
Opsyon 53, nga naghubit sa DHCP 2 packet type - DHCPOFFER

 
Ang gitas-on sa opsyon
1
Dec
1

 
bili sa opsyon
2
Dec
1

 
Numero sa kapilian
1
Dec
1
Ang kapilian sa pagtanyag sa kliyente sa DHCP usa ka maskara sa network

 
Ang gitas-on sa opsyon
4
Dec
1

 
bili sa opsyon
255.255.224.0
Linya
4

 
Numero sa kapilian
3
Dec
1
Kapilian sa pagtanyag sa kliyente sa DHCP og default gateway

 
Ang gitas-on sa opsyon
4
Dec
1

 
bili sa opsyon
172.16.12.1
Linya
4

 
Numero sa kapilian
6
Dec
1
Opsyon sa pagtanyag sa DHCP sa DNS client

 
Ang gitas-on sa opsyon
4
Dec
1

 
bili sa opsyon
8.8.8.8
Linya
4

 
Numero sa kapilian
51
Dec
1
Ang tibuok kinabuhi sa gi-isyu nga mga parameter sa network sa mga segundo, pagkahuman ang kliyente sa DHCP kinahanglan nga mohangyo niini pag-usab

 
Ang gitas-on sa opsyon
4
Dec
1

 
bili sa opsyon
86400
Dec
4

 
Numero sa kapilian
82
Dec
1
Ang kapilian 82, gisubli kung unsa ang naa sa DHCPDISCOVER

 
Ang gitas-on sa opsyon
18
Dec
1

 
bili sa opsyon
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Dec
18

 
Katapusan sa pakete
255
Dec
1
Ang 255 nagsimbolo sa katapusan sa pakete

DHCPREQUEST

Human madawat sa kliyente ang DHCPOFFER, nagporma siya og packet nga nangayo og mga parameter sa network dili sa tanang DHCP server sa network, apan sa usa lang ka espesipiko, kansang tanyag sa DHCPOFFER iyang “gigustohan” pag-ayo. Ang "sama" nga pamatasan mahimong lahi ug nagdepende sa pagpatuman sa DHCP sa kliyente. Ang nakadawat sa hangyo gitino gamit ang MAC address sa DHCP server. Usab, ang usa ka DHCPREQUEST packet mahimong ipadala sa kliyente nga dili una makamugna og DHCPDISCOVER, kung ang IP address sa server nakuha na kaniadto.

DHCPREQUEST Packet Structure Table

Posisyon sa package
Ngalan sa bili (komon)
Pananglitan:
Pasiuna
Byte
Pagpatin-aw

1
Paghangyo sa Boot
1
Hex
1
Uri sa mensahe. 1 - hangyo gikan sa kliyente ngadto sa server, 2 - tubag gikan sa server ngadto sa kliyente

2
Type sa hardware
1
Hex
1
Matang sa adres sa hardware, sa kini nga protocol 1 - MAC

3
Ang gitas-on sa mga adres sa hardware
6
Hex
1
Ang gitas-on sa adres sa MAC sa aparato

4
Hops
1
Hex
1
Gidaghanon sa mga intermediate nga ruta

5
Transaksyon ID
23:cf:de:1d
Hex
4
Talagsaong identifier sa transaksyon. Gihimo sa kliyente sa pagsugod sa usa ka operasyon sa paghangyo

7
Ikaduhang nilabay
0
Hex
4
Oras sa mga segundo gikan sa sinugdanan sa proseso sa pagkuha sa usa ka adres

9
Mga bandila sa boot
8000
Hex
2
Pila ka mga bandera nga mahimong itakda aron ipakita ang mga parameter sa protocol. Sa kini nga kaso, ang "broadcast" gitakda

11
IP adres sa kliyente
0.0.0.0
Linya
4
IP address sa kliyente (kon aduna)

15
Ang imong kliyente IP address
172.16.134.61
Linya
4
IP address nga gitanyag sa server (kon anaa)

19
Sunod nga server IP address
0.0.0.0
Linya
4
IP address sa server (kon nahibal-an)

23
Relay agent IP address
172.16.114.41
Linya
4
IP address sa relay agent (pananglitan, switch)

27
MAC address sa kliyente
14:d6:4d:a7:c9:55
Hex
6
MAC address sa nagpadala sa packet (kliyente)

31
Padding sa address sa hardware sa kliyente
 
Hex
10
Gireserba nga lingkuranan. Kasagaran puno sa mga sero

41
Ngalan sa host sa server
 
Linya
64
Ngalan sa DHCP server. Kasagaran dili mapasa

105
Ngalan sa boot file
 
Linya
128
Ngalan sa file sa server nga gigamit sa mga estasyon nga walay disk kung nag-boot

235
Magic nga cookies
63: 82: 53: 63
Hex
4
"Magic" nga numero, sumala sa diin, incl. imong matino nga kini nga pakete iya sa DHCP protocol

Mga kapilian sa DHCP. Mahimong moadto sa bisan unsang order

236
Numero sa kapilian
53
Dec
3
Opsyon 53, nga naghubit sa DHCP packet type 3 - DHCPREQUEST

 
Ang gitas-on sa opsyon
1
Dec
1

 
bili sa opsyon
3
Dec
1

 
Numero sa kapilian
61
Dec
1
Client ID: 01 (alang sa Ehernet) + kliyente MAC address

 
Ang gitas-on sa opsyon
7
Dec
1

 
bili sa opsyon
01:2c:ab:25:ff:72:a6
Hex
7

 
Numero sa kapilian
60
Dec
 
"Vendor class identifier". Sa akong kaso, kini nagtaho sa bersyon sa kliyente sa DHCP. Tingali ang ubang mga aparato nagbalik sa usa ka butang nga lahi. Pananglitan, ang Windows nagtaho sa MSFT 5.0

 
Ang gitas-on sa opsyon
11
Dec
 

 
bili sa opsyon
udhcp 0.9.8
Linya
 

 
Numero sa kapilian
55
 
1
Mga parameter sa network nga gihangyo sa kliyente. Ang komposisyon mahimong magkalainlain

01 - Mask sa network
03 - Gateway
06 - DNS
oc — Hostname
0f - ngalan sa domain sa network
1c - adres sa hangyo sa pagsibya (broadcast)
42 - TFTP server ngalan
79 - Walay Klase nga Static nga Ruta

 
Ang gitas-on sa opsyon
8
 
1

 
bili sa opsyon
01:03:06:0c:0f:1c:42:79
 
8

 
Numero sa kapilian
82
Dec
1
Ang kapilian 82, gisubli kung unsa ang naa sa DHCPDISCOVER

 
Ang gitas-on sa opsyon
18
Dec
1

 
bili sa opsyon
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Dec
18

 
Katapusan sa pakete
255
Dec
1
Ang 255 nagsimbolo sa katapusan sa pakete

DHCPACK

Isip kumpirmasyon nga "oo, husto kana, kini ang imong IP address, ug dili ko kini ihatag kang bisan kinsa" gikan sa DHCP server, usa ka pakete sa DHCPACK format gikan sa server ngadto sa kliyente nga nagsilbi. Gipadala kini nga sibya sama sa ubang mga pakete. Bisan pa, sa code sa ubos alang sa usa ka DHCP server nga gipatuman sa Python, kung ugaling, gidoble nako ang bisan unsang hangyo sa broadcast pinaagi sa pagpadala usa ka pakete sa usa ka piho nga IP kliyente, kung nahibal-an na kini. Dugang pa, ang DHCP server wala magtagad sa tanan kung ang DHCPACK packet nakaabot sa kliyente. Kung ang kliyente dili makadawat sa DHCPACK, pagkahuman sa usa ka panahon gisubli ra ang DHCPREQUEST

DHCPACK Packet Structure Table

Posisyon sa package
Ngalan sa bili (komon)
Pananglitan:
Pasiuna
Byte
Pagpatin-aw

1
Paghangyo sa Boot
2
Hex
1
Uri sa mensahe. 1 - hangyo gikan sa kliyente ngadto sa server, 2 - tubag gikan sa server ngadto sa kliyente

2
Type sa hardware
1
Hex
1
Matang sa adres sa hardware, sa kini nga protocol 1 - MAC

3
Ang gitas-on sa mga adres sa hardware
6
Hex
1
Ang gitas-on sa adres sa MAC sa aparato

4
Hops
1
Hex
1
Gidaghanon sa mga intermediate nga ruta

5
Transaksyon ID
23:cf:de:1d
Hex
4
Talagsaong identifier sa transaksyon. Gihimo sa kliyente sa pagsugod sa usa ka operasyon sa paghangyo

7
Ikaduhang nilabay
0
Hex
4
Oras sa mga segundo gikan sa sinugdanan sa proseso sa pagkuha sa usa ka adres

9
Mga bandila sa boot
8000
Hex
2
Pila ka mga bandera nga mahimong itakda aron ipakita ang mga parameter sa protocol. Sa kini nga kaso, ang "broadcast" gitakda

11
IP adres sa kliyente
0.0.0.0
Linya
4
IP address sa kliyente (kon aduna)

15
Ang imong kliyente IP address
172.16.134.61
Linya
4
IP address nga gitanyag sa server (kon anaa)

19
Sunod nga server IP address
0.0.0.0
Linya
4
IP address sa server (kon nahibal-an)

23
Relay agent IP address
172.16.114.41
Linya
4
IP address sa relay agent (pananglitan, switch)

27
MAC address sa kliyente
14:d6:4d:a7:c9:55
Hex
6
MAC address sa nagpadala sa packet (kliyente)

31
Padding sa address sa hardware sa kliyente
 
Hex
10
Gireserba nga lingkuranan. Kasagaran puno sa mga sero

41
Ngalan sa host sa server
 
Linya
64
Ngalan sa DHCP server. Kasagaran dili mapasa

105
Ngalan sa boot file
 
Linya
128
Ngalan sa file sa server nga gigamit sa mga estasyon nga walay disk kung nag-boot

235
Magic nga cookies
63: 82: 53: 63
Hex
4
"Magic" nga numero, sumala sa diin, incl. imong matino nga kini nga pakete iya sa DHCP protocol

Mga kapilian sa DHCP. Mahimong moadto sa bisan unsang order

236
Numero sa kapilian
53
Dec
3
Opsyon 53, nga naghubit sa DHCP packet type 5 - DHCPACK

 
Ang gitas-on sa opsyon
1
Dec
1

 
bili sa opsyon
5
Dec
1

 
Numero sa kapilian
1
Dec
1
Ang kapilian sa pagtanyag sa kliyente sa DHCP usa ka maskara sa network

 
Ang gitas-on sa opsyon
4
Dec
1

 
bili sa opsyon
255.255.224.0
Linya
4

 
Numero sa kapilian
3
Dec
1
Kapilian sa pagtanyag sa kliyente sa DHCP og default gateway

 
Ang gitas-on sa opsyon
4
Dec
1

 
bili sa opsyon
172.16.12.1
Linya
4

 
Numero sa kapilian
6
Dec
1
Opsyon sa pagtanyag sa DHCP sa DNS client

 
Ang gitas-on sa opsyon
4
Dec
1

 
bili sa opsyon
8.8.8.8
Linya
4

 
Numero sa kapilian
51
Dec
1
Ang tibuok kinabuhi sa gi-isyu nga mga parameter sa network sa mga segundo, pagkahuman ang kliyente sa DHCP kinahanglan nga mohangyo niini pag-usab

 
Ang gitas-on sa opsyon
4
Dec
1

 
bili sa opsyon
86400
Dec
4

 
Numero sa kapilian
82
Dec
1
Ang kapilian 82, gisubli kung unsa ang naa sa DHCPDISCOVER

 
Ang gitas-on sa opsyon
18
Dec
1

 
bili sa opsyon
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Dec
18

 
Katapusan sa pakete
255
Dec
1
Ang 255 nagsimbolo sa katapusan sa pakete

Pag-instalar

Ang pag-instalar sa tinuud naglangkob sa pag-instalar sa mga module sa python nga gikinahanglan alang sa trabaho. Gituohan nga ang MySQL na-install ug na-configure na.

FreeBSD

pkg i-install ang python3 python3 -m ensurepip pip3 i-install ang mysql-connector

Ubuntu

sudo apt-get install python3 sudo apt-get install pip3 sudo pip3 install mysql-connector

Naghimo mi og MySQL database, i-upload ang pydhcp.sql dump niini, ug i-configure ang configuration file.

Pagsalig

Ang tanan nga mga setting sa server naa sa xml file. Reference file:

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 pagsulay pagsulay 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 pilia ang ip,mask,router,dns gikan sa mga tiggamit diin ang upper(mac)=upper('{option_3_AgentRemoteId_hex}') ug upper(port)=upper('{option_1_AgentCircuitId_port_hex}') pilia ang ip,mask,router,dns gikan sa mga tiggamit diin ang upper(mac)=upper('{sw_mac}') ug upper(port)=upper('{sw_port82}') pilia ang ip,mask,router,dns gikan sa mga tiggamit diin ang upper(mac)=upper('{ClientMacAddress}') isulod sa kasaysayan (id,dt,mac,ip,comment) nga mga bili (null,karon(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Karon sa dugang nga detalye sa mga tag:

Ang seksyon sa dhcpserver naghulagway sa mga batakang setting sa pagsugod sa server, nga mao ang:

  • host - unsa nga IP address ang gipamati sa server sa port 67
  • broadcast - nga ip ang broadcast para sa DHCPOFFER ug DHCPACK
  • DHCPServer - unsa ang ip sa DHCP server
  • LeaseTime nga oras sa pag-abang sa gi-isyu nga IP address
  • ThreadLimit - pila ka mga thread ang dungan nga nagdagan para maproseso ang umaabot nga UDP packets sa port 67. Makatabang kuno kini sa mga high-load nga proyekto 😉
  • defaultMask,defaultRouter,defaultDNS - unsa ang gitanyag sa suskritor pinaagi sa default kung ang usa ka IP makit-an sa database, apan ang dugang nga mga parameter wala gitino alang niini

mysql nga seksyon:

host, username, password, basename - ang tanan nagsulti alang sa iyang kaugalingon. Usa ka gibanabana nga istruktura sa database gi-post sa GitHub

Seksyon sa pangutana: ang mga hangyo alang sa pagdawat sa OFFER/ACK gihulagway dinhi:

  • offer_count - ang gidaghanon sa mga linya nga adunay mga hangyo nga nagbalik sa usa ka resulta sama sa ip,mask,router,dns
  • offer_n — string sa pangutana. Kung ang pagbalik walay sulod, dayon ipatuman ang mosunod nga hangyo sa tanyag
  • history_sql - usa ka pangutana nga nagsulat, pananglitan, sa "kasaysayan sa pagtugot" alang sa usa ka subscriber

Ang mga hangyo mahimong maglakip sa bisan unsang mga variable gikan sa seksyon sa mga kapilian o mga kapilian gikan sa DHCP protocol.

Mga opsyon nga seksyon. Dinhi kini mahimong mas makapaikag. Dinhi makahimo kita og mga baryable nga mahimo natong gamiton sa ulahi sa seksyon sa pangutana.

Pananglitan:

option_82_hex:sw_port1:20:22

, kini nga command line nagkuha sa tibuok linya nga miabut sa DHCP request option 82, sa hex format, sa range gikan sa 20 ngadto sa 22 bytes inclusive ug gibutang kini sa bag-ong variable sw_port1 (switch port gikan diin ang hangyo miabut)

option_82_hex:sw_mac:26:40

, ipasabut ang sw_mac variable, pagkuha sa hex gikan sa range 26:40

Makita nimo ang tanan nga posible nga mga kapilian nga magamit sa mga pangutana pinaagi sa pagsugod sa server gamit ang -d switch. Atong makita ang usa ka butang nga sama niini nga log:

--usa ka DHCPINFORM nga packet ang miabot sa port 67, gikan sa 0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress': '0025224'764ads 00d' , ' HType': 'Ethernet', 'HostName': b'x7xa91xe5xa0xa3xa5-x9fx8a', 'ReqListDNS': Tinuod, 'ReqListRomainName': Tinuod, 'ReqListPerfowmRouterDiscover': Tinuod, 'ReqListDNS': Tinuod, 'ReqListRomainName': Tinuod, 'ReqListPerfowmRouterDiscover': Tinuod, 'L TruistStatRouter': 'ReqListSubnetM ask': Tinuod, 'ReqListVendorSpecInfo': 8, 'RequestedIpAddress': '43', 'Vendor': b'MSFT 0.0.0.0', 'chaddr': '5.0ad0025224', '764ad172.30.128.13', '00ad00', '172.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': '82e tion_18_len': 82 12, 'option_01_str': "b'x06x00x04x00x01x00x06x02x08x00x06x00x1x9x2eXx768exb0.0.0.0xad'", 'result': False, 'secs,' 'siaddr': '001', 'sw_mac': '589e2eb1ad', 'sw_port06': '89', 'xidbyte': b'

Subay niini, mahimo natong iputos ang bisan unsang variable sa {} ug kini gamiton sa SQL query.

Atong irekord alang sa kasaysayan nga ang kliyente nakadawat sa IP address:

DHCP+Mysql server sa Python

DHCP+Mysql server sa Python

Pagsugod sa server

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

— d console output mode DEBUG
- c <filename> configuration file

Debriefing

Ug karon dugang nga mga detalye sa pagpatuman sa server sa Python. Kini usa ka sakit. Ang Python nakat-on sa langaw. Daghang mga gutlo ang gihimo sa istilo nga "wow, sa usa ka paagi gihimo nako kini nga molihok." Dili gyud ma-optimize, ug gibiyaan sa kini nga porma tungod sa gamay nga kasinatian sa pag-uswag sa Python. Magpuyo ako sa labing makapaikag nga mga aspeto sa pagpatuman sa server sa "code".

XML configuration file parser

Ang standard nga Python module xml.dom gigamit. Ingon og yano, apan sa panahon sa pagpatuman adunay usa ka mamatikdan nga kakulang sa tin-aw nga dokumentasyon ug mga pananglitan sa network gamit kini nga module.

    kahoy = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") para sa elem sa mconfig: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["mysql_username"]=elem.getElementsByTagName("username")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("password")[0].firstChild.data gconfig["mysql_basename"] =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") para sa elem sa 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["skp"_default =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultDNS"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultDNS"]=elem.getElementsBy(" defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query") para sa elem sa qconfig: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[1].firstChild.data para sa num sa 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") para sa elem sa mga opsyon: node=elem.getElementsByTagName("option") para sa mga opsyon sa node : optionsMod.append(options.firstChild.data)

Multithreading

Katingad-an, ang multithreading sa Python gipatuman nga tin-aw ug yano.

def PacketWork(data,addr): ... # pagpatuman sa pag-parse sa umaabot nga packet ug pagtubag niini ... samtang Tinuod: data, addr = udp_socket.recvfrom(1024) # naghulat sa UDP packet thread = threading.Thread( target=PacketWork , args=(data,addr,)).start() # as it came - we launch the previously explained PacketWork function in the background with parameters while threading.active_count() >gconfig["dhcp_ThreadLimit"]: time. pagkatulog(1) # kung ang numero Adunay daghang mga hilo nga nagdagan na kaysa sa mga setting, maghulat kami hangtod nga adunay gamay ra nila

Pagdawat/pagpadala DHCP packet

Aron mapugngan ang mga pakete sa UDP nga moabut pinaagi sa network card, kinahanglan nimo nga "ipataas" ang socket:

udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,socket.IPPROTO_UDP) udp_socket.bind((gconfig["dhcp_host"],67))

, diin ang mga bandera mao ang:

  • AF_INET - nagpasabot nga ang address format mao ang IP: port. Mahimo usab nga adunay AF_UNIX - diin ang adres gihatag sa ngalan sa file.
  • SOCK_DGRAM - nagpasabot nga dili mi modawat ug “hilaw nga packet”, apan usa nga miagi na sa firewall, ug adunay partially trimmed packet. Mga. makadawat lang mi og UDP packet nga walay "pisikal" nga component sa UDP packet wrapper. Kung gigamit nimo ang bandila sa SOCK_RAW, kinahanglan nimo usab nga i-parse kini nga "wrapper".

Ang pagpadala sa usa ka pakete mahimong sama sa usa ka sibya:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #switch ang socket sa broadcast mode rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68))

, ug sa adres nga "diin gikan ang pakete":

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # ibalhin ang socket sa multi-listener mode rz=udp_socket.sendto(packetack, addr)

, diin ang SOL_SOCKET nagpasabut nga "ang-ang sa protocol" alang sa mga kapilian sa pag-set,

, SO_BROADCAST nga opsyon nga ang helmet package kay "broadcast"

  , Ang opsyon sa SO_REUSEADDR nagbalhin sa socket ngadto sa "daghang tigpaminaw" nga mode. Sa teorya, dili kinahanglan sa kini nga kaso, apan sa usa sa mga server sa FreeBSD nga akong gisulayan, ang code wala molihok kung wala kini nga kapilian.

Pag-parse sa usa ka DHCP packet

Dinhi ko ganahan kaayo sa Python. Kini nahimo nga gikan sa kahon gitugotan ka nga mahimong flexible sa bytecode. Gitugotan kini nga dali kaayo mahubad sa mga kantidad nga desimal, mga kuwerdas ug hex - i.e. mao kini ang kinahanglan gayud natong masabtan ang istruktura sa pakete. Mao nga, pananglitan, makakuha ka usa ka lainlaing mga byte sa HEX ug mga byte lang:

    res["xidhex"]=data[4:8].hex() res["xidbyte"]=data[4:8]

, i-pack ang mga byte sa usa ka istruktura:

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

Pagkuha IP gikan sa istruktura:

res["ciaddr"]=socket.inet_ntoa(pack('BBBB',data[12],data[13],data[14],data[15]));

Ug vice versa:

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

Kana lang sa pagkakaron 😉

Source: www.habr.com

Idugang sa usa ka comment