DHCP+Mysql mpizara amin'ny Python

DHCP+Mysql mpizara amin'ny Python

Ny tanjon'ity tetikasa ity dia:

  • Mianara momba ny DHCP amin'ny tambajotra IPv4
  • Mianara Python (mihoatra noho ny hatramin'ny voalohany 😉)
  • fanoloana mpizara DB2DHCP (ny fork), original eto, izay mihasarotra kokoa ny mivory ho an'ny OS vaovao. Ary tsy tiako izany binary izany fa tsy misy fomba "hiova izao"
  • fahazoana mpizara DHCP miasa manana fahafahana misafidy ny adiresy IP an'ny mpanjifa amin'ny alàlan'ny mac an'ny mpanjifa na mifamadika mac+port fitambarana (Safidy 82)
  • manoratra bisikileta hafa (Oh! ity no asa tiako indrindra)
  • mandray fanehoan-kevitra momba ny tànanao amin'ny klioba amin'ny Habrahabr (na tsara kokoa, fanasana) 😉

Vokany: miasa 😉 Voasedra amin'ny FreeBSD sy Ubuntu OS. Ara-teorika, ny kaody dia azo angatahina hiasa amin'ny OS rehetra, satria Toa tsy misy fatorana manokana ao amin'ny kaody.
Mitandrema! Mbola betsaka ny ho avy.

Rohy mankany amin'ny tahiry ho an'ny mpankafy "mikasika velona".

Ny dingan'ny fametrahana, ny fanamafisana ary ny fampiasana ny vokatry ny "fianarana ny fitaovana" dia ambany kokoa, ary avy eo ny teoria kely momba ny protocol DHCP. Ho an'ny tenako. Ary ho an'ny tantara 😉

Teoria kely

Inona no atao hoe DHCP

Ity dia protocole an-tambajotra izay ahafahan'ny fitaovana iray mahita ny adiresy IP-ny (sy ny mari-pamantarana hafa toy ny vavahady, DNS, sns.) avy amin'ny mpizara DHCP. Ny fonosana dia mifanakalo amin'ny alàlan'ny protocol UDP. Ny fitsipika ankapobeny amin'ny fiasan'ny fitaovana rehefa mangataka mari-pamantarana tambajotra dia toy izao manaraka izao:

  1. Ny fitaovana (mpanjifa) dia mandefa fangatahana fampielezam-peo UDP (DHCPDISCOVER) manerana ny tambajotra miaraka amin'ny fangatahana "tsara, misy manome adiresy IP ahy." Ankoatr'izay, matetika (fa tsy foana) dia avy amin'ny seranan-tsambo 68 (loharano) ny fangatahana, ary ny seranan-tsambo 67 (fitetezana) no tanjona. Ny fitaovana sasany koa dia mandefa fonosana avy amin'ny seranan-tsambo 67. Ny adiresy MAC an'ny fitaovana mpanjifa dia tafiditra ao anatin'ny fonosana DHCPDISCOVER.
  2. Ny mpizara DHCP rehetra hita ao amin'ny tambajotra (ary mety ho maromaro amin'izy ireo) dia manangana tolotra DHCPOFFER miaraka amin'ny firafitry ny tambajotra ho an'ny fitaovana nandefa DHCPDISCOVER, ary mandefa izany amin'ny tambajotra. Ny famantarana hoe iza ity fonosana ity dia mifototra amin'ny adiresy MAC an'ny mpanjifa nomena teo aloha tao amin'ny fangatahana DHCPDISCOVER.
  3. Ny mpanjifa dia manaiky ny fonosana misy tolo-kevitra momba ny fandrindrana ny tambajotra, mifidy ny tena mahasarika indrindra (mety ho hafa ny fepetra, ohatra, ny fotoana fandefasana fonosana, ny isan'ny lalana manelanelana), ary manao "fangatahana ofisialy" DHCPREQUEST miaraka amin'ny firafitry ny tambajotra. avy amin'ny mpizara DHCP tiany. Amin'ity tranga ity, ny fonosana dia mankany amin'ny mpizara DHCP manokana.
  4. Ny mpizara nahazo ny DHCPREQUEST dia mandefa fonosana endrika DHCPACK, izay mitanisa indray ny firafitry ny tambajotra natao ho an'ity mpanjifa ity.

DHCP+Mysql mpizara amin'ny Python

Ankoatr'izay dia misy fonosana DHCPINFORM izay avy amin'ny mpanjifa, ary ny tanjona dia ny mampahafantatra ny mpizara DHCP fa "velona" ny mpanjifa ary mampiasa ny tambajotra navoaka. Amin'ny fampiharana an'ity mpizara ity dia tsy raharahaina ireo fonosana ireo.

endrika fonosana

Amin'ny ankapobeny, ny rafitra fonosana Ethernet dia toa izao:

DHCP+Mysql mpizara amin'ny Python

Amin'ity tranga ity, ny angon-drakitra mivantana avy amin'ny votoatin'ny fonosana UDP ihany no hodinihintsika, tsy misy lohatenin'ny protocol OSI layer, izany hoe ny rafitra DHCP:

DHCPDISCOVER

Noho izany, ny dingana hahazoana adiresy IP ho an'ny fitaovana iray dia manomboka amin'ny mpanjifa DHCP mandefa fangatahana fampitana avy amin'ny seranana 68 mankany 255.255.255.255:67. Ao anatin'ity fonosana ity, ny mpanjifa dia ahitana ny adiresy MAC, ary koa ny tena tiany horaisina amin'ny mpizara DHCP. Ny firafitry ny fonosana dia voalaza ao amin'ny tabilao etsy ambany.

DHCPDISCOVER tabilao firafitry ny fonosana

Position ao amin'ny fonosana
Anarana sarobidy
ohatra
hevitra
Byte
fanazavana

1
Fangatahana Boot
1
Hex
1
Karazana hafatra. 1 - fangatahana avy amin'ny mpanjifa mankany amin'ny mpizara, 2 - valiny avy amin'ny mpizara mankany amin'ny mpanjifa

2
Karazana fitaovana
1
Hex
1
Karazana adiresy hardware, amin'ity protocol 1 - MAC ity

3
Ny halavan'ny adiresin'ny fitaovana
6
Hex
1
Ny halavan'ny adiresy MAC fitaovana

4
Hops
1
Hex
1
Isan'ny lalana manelanelana

5
ID fifanakalozana
23:cf:de:1d
Hex
4
Famantarana fifanakalozana tokana. Namboarin'ny mpanjifa tany am-piandohan'ny hetsika fangatahana

7
Lasa ny faharoa
0
Hex
4
Fotoana ao anatin'ny segondra manomboka amin'ny fizotry ny fahazoana adiresy

9
Boot flags
0
Hex
2
Saina sasany azo apetraka hanondro ny masontsivana protocol

11
Adiresy IP mpanjifa
0.0.0.0
-dalana,
4
Adiresy IP mpanjifa (raha misy)

15
Adiresy IP mpanjifanao
0.0.0.0
-dalana,
4
Adiresy IP omen'ny mpizara (raha misy)

19
Adiresy IP mpizara manaraka
0.0.0.0
-dalana,
4
Adiresy IP mpizara (raha fantatra)

23
Adiresy IP mpitatitra
172.16.114.41
-dalana,
4
Adiresy IP an'ny mpitatitra (ohatra, switch)

27
Adiresy MAC mpanjifa
14:d6:4d:a7:c9:55
Hex
6
Adiresy MAC an'ny mpandefa fonosana (mpanjifa)

31
Padding adiresy hardware mpanjifa
 
Hex
10
Seza voatokana. Matetika feno aotra

41
Anaran'ny mpampiantrano mpizara
 
-dalana,
64
Anaran'ny mpizara DHCP. Matetika tsy ampitaina

105
Anaran'ny fisie boot
 
-dalana,
128
Anaran'ny fisie eo amin'ny lohamilina ampiasain'ny onjam-peo tsy misy kapila rehefa manomboka

235
Cookies majika
63: 82: 53: 63
Hex
4
"Magic" isa, araka izay, incl. azonao atao ny mamaritra fa an'ny protocol DHCP ity fonosana ity

DHCP safidy. Afaka mandeha amin'ny filaharana rehetra

236
Laharana safidy
53
Dec
1
Option 53, izay mamaritra ny karazana fonosana DHCP

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

 
halavan'ny safidy
1
Dec
1

 
Sanda safidy
1
Dec
1

 
Laharana safidy
50
Dec
1
Inona ny adiresy IP tian'ny mpanjifa horaisina?

 
halavan'ny safidy
4
Dec
1

 
Sanda safidy
172.16.134.61
-dalana,
4

 
Laharana safidy
55
 
1
Masontsivana tambajotra nangatahan'ny mpanjifa. Mety tsy mitovy ny composition

01 - Saron-tambajotra
03 - Vavahady
06 - DNS
oc — Hostname
0f - anaran-tserasera
1c - adiresin'ny fangatahana fampielezam-peo (broadcast)
42 - Anaran'ny mpizara TFTP
79 - Lalana Statika tsy misy kilasy

 
halavan'ny safidy
8
 
1

 
Sanda safidy
01:03:06:0c:0f:1c:42:79
 
8

 
Laharana safidy
82
Dec
 
Safidy 82, izay mampita ny adiresy MAC an'ny fitaovana mamerina sy ny soatoavina fanampiny.

Matetika indrindra, ity no seranan-tsambon'ny switch izay iasan'ny mpanjifa DHCP farany. Ity safidy ity dia misy masontsivana fanampiny. Ny byte voalohany dia ny isan'ny "suboption", ny faharoa dia ny halavany, ary ny sandany.

Amin'ity tranga ity, ao amin'ny safidy 82, ny zana-safidy dia mipetaka:
Agent Circuit ID = 00:04:00:01:00:04, izay misy roa bytes farany ny seranan-tsambo mpanjifa DHCP izay niavian'ny fangatahana

Agent Remote ID = 00:06:c8:be:19:93:11:48 - adiresy MAC an'ny fitaovana DHCP repeater

 
halavan'ny safidy
18
Dec
 

 
Sanda safidy
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Faran'ny fonosana
255
Dec
1
255 dia maneho ny faran'ny fonosana

DHCPOFFER

Raha vantany vao mahazo ny fonosana DHCPDISCOVER ny mpizara ary raha hitany fa afaka manolotra zavatra ho an'ny mpanjifa avy amin'ilay nangatahana izy, dia miteraka valiny ho azy - DHCPDISCOVER. Ny valiny dia alefa any amin'ny seranana "avy amin'ny toerana niaviany", amin'ny alàlan'ny fampielezam-peo, satria Amin'izao fotoana izao dia tsy mbola manana adiresy IP ny mpanjifa, noho izany dia azony atao ny manaiky ny fonosana raha alefa amin'ny fampielezam-peo. Eken'ny mpanjifa fa fonosana ho azy io amin'ny alàlan'ny adiresiny MAC ao anaty fonosana, ary koa ny laharan'ny fifampiraharahana izay vokariny amin'ny fotoana namoronana ny fonosana voalohany.

Tabilao firafitry ny fonosana DHCPOFFER

Position ao amin'ny fonosana
Anaran'ny sanda (mitovy)
ohatra
hevitra
Byte
fanazavana

1
Fangatahana Boot
1
Hex
1
Karazana hafatra. 1 - fangatahana avy amin'ny mpanjifa mankany amin'ny mpizara, 2 - valiny avy amin'ny mpizara mankany amin'ny mpanjifa

2
Karazana fitaovana
1
Hex
1
Karazana adiresy hardware, amin'ity protocol 1 - MAC ity

3
Ny halavan'ny adiresin'ny fitaovana
6
Hex
1
Ny halavan'ny adiresy MAC fitaovana

4
Hops
1
Hex
1
Isan'ny lalana manelanelana

5
ID fifanakalozana
23:cf:de:1d
Hex
4
Famantarana fifanakalozana tokana. Namboarin'ny mpanjifa tany am-piandohan'ny hetsika fangatahana

7
Lasa ny faharoa
0
Hex
4
Fotoana ao anatin'ny segondra manomboka amin'ny fizotry ny fahazoana adiresy

9
Boot flags
0
Hex
2
Saina sasany azo apetraka hanondro ny masontsivana protocol. Amin'ity tranga ity, ny 0 dia midika hoe karazana fangatahana Unicast

11
Adiresy IP mpanjifa
0.0.0.0
-dalana,
4
Adiresy IP mpanjifa (raha misy)

15
Adiresy IP mpanjifanao
172.16.134.61
-dalana,
4
Adiresy IP omen'ny mpizara (raha misy)

19
Adiresy IP mpizara manaraka
0.0.0.0
-dalana,
4
Adiresy IP mpizara (raha fantatra)

23
Adiresy IP mpitatitra
172.16.114.41
-dalana,
4
Adiresy IP an'ny mpitatitra (ohatra, switch)

27
Adiresy MAC mpanjifa
14:d6:4d:a7:c9:55
Hex
6
Adiresy MAC an'ny mpandefa fonosana (mpanjifa)

31
Padding adiresy hardware mpanjifa
 
Hex
10
Seza voatokana. Matetika feno aotra

41
Anaran'ny mpampiantrano mpizara
 
-dalana,
64
Anaran'ny mpizara DHCP. Matetika tsy ampitaina

105
Anaran'ny fisie boot
 
-dalana,
128
Anaran'ny fisie eo amin'ny lohamilina ampiasain'ny onjam-peo tsy misy kapila rehefa manomboka

235
Cookies majika
63: 82: 53: 63
Hex
4
"Magic" isa, araka izay, incl. azonao atao ny mamaritra fa an'ny protocol DHCP ity fonosana ity

DHCP safidy. Afaka mandeha amin'ny filaharana rehetra

236
Laharana safidy
53
Dec
1
Safidy 53, izay mamaritra ny karazana fonosana DHCP 2 - DHCPOFFER

 
halavan'ny safidy
1
Dec
1

 
Sanda safidy
2
Dec
1

 
Laharana safidy
1
Dec
1
Safidy hanolotra saron-tambajotra ho an'ny mpanjifa DHCP

 
halavan'ny safidy
4
Dec
1

 
Sanda safidy
255.255.224.0
-dalana,
4

 
Laharana safidy
3
Dec
1
Safidy hanolotra vavahady default ho an'ny mpanjifa DHCP

 
halavan'ny safidy
4
Dec
1

 
Sanda safidy
172.16.12.1
-dalana,
4

 
Laharana safidy
6
Dec
1
Safidy hanolotra DHCP ho an'ny mpanjifa DNS

 
halavan'ny safidy
4
Dec
1

 
Sanda safidy
8.8.8.8
-dalana,
4

 
Laharana safidy
51
Dec
1
Ny androm-piainan'ireo masontsivana tambajotra navoaka ao anatin'ny segondra, aorian'izay dia tsy maintsy mangataka azy ireo indray ny mpanjifa DHCP

 
halavan'ny safidy
4
Dec
1

 
Sanda safidy
86400
Dec
4

 
Laharana safidy
82
Dec
1
Option 82, mamerina izay tonga tao DHCPDISCOVER

 
halavan'ny safidy
18
Dec
1

 
Sanda safidy
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:f
Dec
18

 
Faran'ny fonosana
255
Dec
1
255 dia maneho ny faran'ny fonosana

DHCPREQUEST

Aorian'ny fandraisan'ny mpanjifa ny DHCPOFFER, dia mamorona fonosana mangataka mari-pamantarana tambajotra izy fa tsy amin'ny mpizara DHCP rehetra ao amin'ny tambajotra, fa amin'ny iray manokana ihany, izay atolotry ny DHCPOFFER izay "tiany" indrindra. Ny fepetra "tia" dia mety tsy mitovy ary miankina amin'ny fampiharana DHCP an'ny mpanjifa. Ny mpandray ny fangatahana dia voafaritra amin'ny alàlan'ny adiresy MAC an'ny mpizara DHCP. Ary koa, ny fonosana DHCPREQUEST dia azo alefan'ny mpanjifa nefa tsy mamorona DHCPDISCOVER aloha, raha efa azo teo aloha ny adiresy IP an'ny mpizara.

DHCPREQUEST tabilao firafitry ny fonosana

Position ao amin'ny fonosana
Anaran'ny sanda (mitovy)
ohatra
hevitra
Byte
fanazavana

1
Fangatahana Boot
1
Hex
1
Karazana hafatra. 1 - fangatahana avy amin'ny mpanjifa mankany amin'ny mpizara, 2 - valiny avy amin'ny mpizara mankany amin'ny mpanjifa

2
Karazana fitaovana
1
Hex
1
Karazana adiresy hardware, amin'ity protocol 1 - MAC ity

3
Ny halavan'ny adiresin'ny fitaovana
6
Hex
1
Ny halavan'ny adiresy MAC fitaovana

4
Hops
1
Hex
1
Isan'ny lalana manelanelana

5
ID fifanakalozana
23:cf:de:1d
Hex
4
Famantarana fifanakalozana tokana. Namboarin'ny mpanjifa tany am-piandohan'ny hetsika fangatahana

7
Lasa ny faharoa
0
Hex
4
Fotoana ao anatin'ny segondra manomboka amin'ny fizotry ny fahazoana adiresy

9
Boot flags
8000
Hex
2
Saina sasany azo apetraka hanondro ny masontsivana protocol. Amin'ity tranga ity dia napetraka ny "broadcast".

11
Adiresy IP mpanjifa
0.0.0.0
-dalana,
4
Adiresy IP mpanjifa (raha misy)

15
Adiresy IP mpanjifanao
172.16.134.61
-dalana,
4
Adiresy IP omen'ny mpizara (raha misy)

19
Adiresy IP mpizara manaraka
0.0.0.0
-dalana,
4
Adiresy IP mpizara (raha fantatra)

23
Adiresy IP mpitatitra
172.16.114.41
-dalana,
4
Adiresy IP an'ny mpitatitra (ohatra, switch)

27
Adiresy MAC mpanjifa
14:d6:4d:a7:c9:55
Hex
6
Adiresy MAC an'ny mpandefa fonosana (mpanjifa)

31
Padding adiresy hardware mpanjifa
 
Hex
10
Seza voatokana. Matetika feno aotra

41
Anaran'ny mpampiantrano mpizara
 
-dalana,
64
Anaran'ny mpizara DHCP. Matetika tsy ampitaina

105
Anaran'ny fisie boot
 
-dalana,
128
Anaran'ny fisie eo amin'ny lohamilina ampiasain'ny onjam-peo tsy misy kapila rehefa manomboka

235
Cookies majika
63: 82: 53: 63
Hex
4
"Magic" isa, araka izay, incl. azonao atao ny mamaritra fa an'ny protocol DHCP ity fonosana ity

DHCP safidy. Afaka mandeha amin'ny filaharana rehetra

236
Laharana safidy
53
Dec
3
Safidy 53, izay mamaritra ny karazana fonosana DHCP 3 - DHCPREQUEST

 
halavan'ny safidy
1
Dec
1

 
Sanda safidy
3
Dec
1

 
Laharana safidy
61
Dec
1
ID mpanjifa: 01 (ho an'ny Ehernet) + adiresy MAC mpanjifa

 
halavan'ny safidy
7
Dec
1

 
Sanda safidy
01:2c:ab:25:ff:72:a6
Hex
7

 
Laharana safidy
60
Dec
 
"Identifier kilasy mpivarotra". Raha ny amiko, dia mitatitra ny dikan'ny mpanjifa DHCP. Angamba ny fitaovana hafa dia mamerina zavatra hafa. Windows ohatra dia mitatitra MSFT 5.0

 
halavan'ny safidy
11
Dec
 

 
Sanda safidy
udhcp 0.9.8
-dalana,
 

 
Laharana safidy
55
 
1
Masontsivana tambajotra nangatahan'ny mpanjifa. Mety tsy mitovy ny composition

01 - Saron-tambajotra
03 - Vavahady
06 - DNS
oc — Hostname
0f - anaran-tserasera
1c - adiresin'ny fangatahana fampielezam-peo (broadcast)
42 - Anaran'ny mpizara TFTP
79 - Lalana Statika tsy misy kilasy

 
halavan'ny safidy
8
 
1

 
Sanda safidy
01:03:06:0c:0f:1c:42:79
 
8

 
Laharana safidy
82
Dec
1
Option 82, mamerina izay tonga tao DHCPDISCOVER

 
halavan'ny safidy
18
Dec
1

 
Sanda safidy
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:f
Dec
18

 
Faran'ny fonosana
255
Dec
1
255 dia maneho ny faran'ny fonosana

DHCPACK

Ho fanamafisana fa "eny, marina izany, ity ny adiresy IP anao, ary tsy homeko olon-kafa" avy amin'ny mpizara DHCP, fonosana amin'ny endrika DHCPACK avy amin'ny mpizara mankany amin'ny mpanjifa. Nalefa fampitana toy ny fonosana hafa ihany izy io. Na izany aza, ao amin'ny kaody etsy ambany ho an'ny mpizara DHCP napetraka amin'ny Python, raha sanatria, dia mandika ny fangatahana fampielezam-peo aho amin'ny alàlan'ny fandefasana fonosana amin'ny IP mpanjifa manokana, raha efa fantatra izany. Ankoatr'izay, ny mpizara DHCP dia tsy miraharaha mihitsy raha tonga any amin'ny mpanjifa ny fonosana DHCPACK. Raha tsy mahazo DHCPACK ny mpanjifa, dia avereno fotsiny ny DHCPREQUEST rehefa afaka kelikely

DHCPACK Packet Structure Table

Position ao amin'ny fonosana
Anaran'ny sanda (mitovy)
ohatra
hevitra
Byte
fanazavana

1
Fangatahana Boot
2
Hex
1
Karazana hafatra. 1 - fangatahana avy amin'ny mpanjifa mankany amin'ny mpizara, 2 - valiny avy amin'ny mpizara mankany amin'ny mpanjifa

2
Karazana fitaovana
1
Hex
1
Karazana adiresy hardware, amin'ity protocol 1 - MAC ity

3
Ny halavan'ny adiresin'ny fitaovana
6
Hex
1
Ny halavan'ny adiresy MAC fitaovana

4
Hops
1
Hex
1
Isan'ny lalana manelanelana

5
ID fifanakalozana
23:cf:de:1d
Hex
4
Famantarana fifanakalozana tokana. Namboarin'ny mpanjifa tany am-piandohan'ny hetsika fangatahana

7
Lasa ny faharoa
0
Hex
4
Fotoana ao anatin'ny segondra manomboka amin'ny fizotry ny fahazoana adiresy

9
Boot flags
8000
Hex
2
Saina sasany azo apetraka hanondro ny masontsivana protocol. Amin'ity tranga ity dia napetraka ny "broadcast".

11
Adiresy IP mpanjifa
0.0.0.0
-dalana,
4
Adiresy IP mpanjifa (raha misy)

15
Adiresy IP mpanjifanao
172.16.134.61
-dalana,
4
Adiresy IP omen'ny mpizara (raha misy)

19
Adiresy IP mpizara manaraka
0.0.0.0
-dalana,
4
Adiresy IP mpizara (raha fantatra)

23
Adiresy IP mpitatitra
172.16.114.41
-dalana,
4
Adiresy IP an'ny mpitatitra (ohatra, switch)

27
Adiresy MAC mpanjifa
14:d6:4d:a7:c9:55
Hex
6
Adiresy MAC an'ny mpandefa fonosana (mpanjifa)

31
Padding adiresy hardware mpanjifa
 
Hex
10
Seza voatokana. Matetika feno aotra

41
Anaran'ny mpampiantrano mpizara
 
-dalana,
64
Anaran'ny mpizara DHCP. Matetika tsy ampitaina

105
Anaran'ny fisie boot
 
-dalana,
128
Anaran'ny fisie eo amin'ny lohamilina ampiasain'ny onjam-peo tsy misy kapila rehefa manomboka

235
Cookies majika
63: 82: 53: 63
Hex
4
"Magic" isa, araka izay, incl. azonao atao ny mamaritra fa an'ny protocol DHCP ity fonosana ity

DHCP safidy. Afaka mandeha amin'ny filaharana rehetra

236
Laharana safidy
53
Dec
3
Safidy 53, izay mamaritra ny karazana fonosana DHCP 5 - DHCPACK

 
halavan'ny safidy
1
Dec
1

 
Sanda safidy
5
Dec
1

 
Laharana safidy
1
Dec
1
Safidy hanolotra saron-tambajotra ho an'ny mpanjifa DHCP

 
halavan'ny safidy
4
Dec
1

 
Sanda safidy
255.255.224.0
-dalana,
4

 
Laharana safidy
3
Dec
1
Safidy hanolotra vavahady default ho an'ny mpanjifa DHCP

 
halavan'ny safidy
4
Dec
1

 
Sanda safidy
172.16.12.1
-dalana,
4

 
Laharana safidy
6
Dec
1
Safidy hanolotra DHCP ho an'ny mpanjifa DNS

 
halavan'ny safidy
4
Dec
1

 
Sanda safidy
8.8.8.8
-dalana,
4

 
Laharana safidy
51
Dec
1
Ny androm-piainan'ireo masontsivana tambajotra navoaka ao anatin'ny segondra, aorian'izay dia tsy maintsy mangataka azy ireo indray ny mpanjifa DHCP

 
halavan'ny safidy
4
Dec
1

 
Sanda safidy
86400
Dec
4

 
Laharana safidy
82
Dec
1
Option 82, mamerina izay tonga tao DHCPDISCOVER

 
halavan'ny safidy
18
Dec
1

 
Sanda safidy
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:f
Dec
18

 
Faran'ny fonosana
255
Dec
1
255 dia maneho ny faran'ny fonosana

fametrahana

Ny fametrahana dia ny fametrahana ny modules python ilaina amin'ny asa. Heverina fa efa napetraka sy namboarina ny MySQL.

FreeBSD

pkg mametraka python3 python3 -m ensurepip pip3 mametraka mysql-connector

Ubuntu

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

Mamorona tahiry MySQL izahay, ampidiro ao anatiny ny fanariam-pako pydhcp.sql, ary amboary ny rakitra fikirakirana.

fanahafana

Ny firafitry ny mpizara rehetra dia ao anaty rakitra xml. rakitra fanondroana:

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 fitsapana fitsapana 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 safidio ip, saron-tava, router, dns avy amin'ny mpampiasa izay ambony (mac) = ambony ('{option_3_AgentRemoteId_hex}') ary ambony (port) = ambony ('{option_1_AgentCircuitId_port_hex}') safidio ip, saron-tava, router, dns avy amin'ny mpampiasa izay ambony (mac) = ambony ('{sw_mac}') sy ambony (port) = ambony ('{sw_port82}') safidio ip, saron-tava, router, dns avy amin'ny mpampiasa izay ambony(mac)=ambony('{ClientMacAddress}') ampidiro ao amin'ny tantara (id,dt,mac,ip,comment) soatoavina (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Ankehitriny amin'ny antsipiriany bebe kokoa momba ny tag:

Ny fizarana dhcpserver dia mamaritra ny toe-javatra fototra hanombohana ny mpizara, izany hoe:

  • mpampiantrano - inona ny adiresy IP henoin'ny mpizara amin'ny seranana 67
  • broadcast - izay ip no fampitana ny DHCPOFFER sy DHCPACK
  • DHCPServer - inona ny ip an'ny mpizara DHCP
  • LeaseTime fotoana fanofana ny adiresy IP navoaka
  • ThreadLimit - firy ny kofehy mandeha miaraka amin'ny fanodinana ny fonosana UDP miditra amin'ny seranana 67. Heverina fa hanampy amin'ny tetikasa be entana 😉
  • defaultMask,defaultRouter,defaultDNS - inona no atolotra ho an'ny mpanjifa amin'ny alàlan'ny default raha misy IP hita ao amin'ny angon-drakitra, saingy tsy voatondro ho azy ny paramètre fanampiny

fizarana mysql:

mpampiantrano, solonanarana, tenimiafina, anarana fototra - miteny ho azy ny zava-drehetra. Misy firafitry ny angon-drakitra eo ho eo apetraka ao GitHub

Fizarana fanontaniana: voalaza eto ny fangatahana fandraisana OFFER/ACK:

  • offer_count — ny isan'ny andalana misy fangatahana mamerina valiny toy ny ip,mask,router,dns
  • offer_n — tady fangatahana. Raha foana ny fiverenana, dia tanteraho ity fangatahana tolotra manaraka ity
  • history_sql - fangatahana manoratra, ohatra, amin'ny "tantaran'ny fanomezan-dàlana" ho an'ny mpanjifa

Ny fangatahana dia mety ahitana fari-pitsipika avy amin'ny fizarana safidy na safidy avy amin'ny protocol DHCP.

Fizarana safidy. Eto no tena mahaliana kokoa. Eto isika dia afaka mamorona fari-piainana izay azontsika ampiasaina any aoriana any amin'ny fizarana fanontaniana.

Ohatra:

option_82_hex:sw_port1:20:22

, ity andalana baiko ity dia maka ny andalana manontolo izay tonga amin'ny safidy fangatahana DHCP 82, amin'ny endrika hex, ao anatin'ny 20 ka hatramin'ny 22 bytes ary mametraka izany ao amin'ny sw_port1 miovaova vaovao (switch port avy amin'ny toerana niavian'ny fangatahana)

option_82_hex:sw_mac:26:40

, mamaritra ny fari-piadidiana sw_mac, maka ny hex avy amin'ny 26:40

Azonao atao ny mahita ny safidy rehetra azo ampiasaina amin'ny fangatahana amin'ny alàlan'ny fanombohana ny mpizara miaraka amin'ny -d switch. Hahita zavatra toy ity log ity isika:

--misy fonosana DHCPINFORM tonga tao amin'ny seranan-tsambo 67, avy amin'ny 0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress': '0025224'764ad00x7', 'B'ClientMacAddress': '91'5ad0c3', 'B'ClientMacAddress:'5'9 8 d' , ' HType': 'Ethernet', 'HostName': b'x8xa43xe0.0.0.0xa5.0xa0025224xa764-x172.30.128.13fx00a', 'ReqListDNS': True, 'ReqListRomainName': True, 'ReqListPerfowmRouterDiscover': True, 'ReqListStatRouter': 'ReqListSubnetM manontany': Marina, 'ReqListVendorSpecInfo': 00, 'RequestedIpAddress': '172.30.114.25', 'Vendor': b'MSFT 308', 'chaddr': '6ad1', '82ad12', '12ad53', '53ad55'. , 'flags': b'x55x60', 'giaddr': '60', 'gpoz': 61, 'hlen': 61, 'hops': 82, 'htype': 'MAC', 'magic_cookie': b'cx82Sc ', 'op': 'DHCPINFORM', 'option82': 12, 'option01': 06, 'option00': 04, 'option00': 01, 'option00': 06, 'option02': 08, ' option_00_byte': b'x06x00x1x9x2x82x12010600040001000602080006001x589x2x82x18x82' b'x12x01x06eXx00exb04xad', 'option_00_hex': '01e tion_00_len': 06 02, 'option_08_str': "b'x00x06x00x1x9x2x768x0.0.0.0x001x589x2x1x06x89x8eXx3exb897xad'", 'valiny': Diso, 'secs,' 'siaddr': '8', 'sw_mac': '0.0.0.0eXNUMXebXNUMXad', 'sw_portXNUMX': 'XNUMX', 'xidbyte': b'

Noho izany, azontsika atao ny mamatotra ny fari-piainana rehetra ao amin'ny {} ary hampiasaina amin'ny fangatahana SQL izany.

Andeha horaketina ho an'ny tantara fa nahazo ny adiresy IP ny mpanjifa:

DHCP+Mysql mpizara amin'ny Python

DHCP+Mysql mpizara amin'ny Python

Manomboka ny mpizara

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

- d fomba famoahana console DEBUG
- c <filename> fichier configuration

fiatrehana ny fahatairana

Ary ankehitriny ny antsipiriany bebe kokoa momba ny fampiharana ny mpizara amin'ny Python. Fanaintainana izany. Ny Python dia nianatra tamin'ny lalitra. Fotoana maro no natao tamin'ny fomba "wow, ahoana no nahatonga ahy hiasa." Tsy optimized mihitsy, ary navela amin'ity endrika ity noho ny tsy fahampian'ny traikefa amin'ny fampandrosoana Python. Hiresaka momba ny lafiny mahaliana indrindra amin'ny fampiharana ny server amin'ny "code" aho.

XML configuration file parser

Ny module Python mahazatra xml.dom dia ampiasaina. Toa tsotra izany, saingy nandritra ny fampiharana dia nisy ny tsy fahampian'ny antontan-taratasy mazava sy ohatra amin'ny tambajotra mampiasa ity module ity.

    tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") ho an'ny elem amin'ny 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") ho an'ny elem amin'ny 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"_default =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultDNS"]=elem.getNaElementsBy defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("Query") ho an'ny elem ao amin'ny qconfig: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild.data ho an'ny num in range(int(gconfig["offer_count")): gconfig["offer_"+str(num+1)]=elem.getElementsByTagName("offer_"+str(num+1))[0].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[0].firstChild.data options=tree.getElementsByTagName("safidy") ho an'ny elem amin'ny safidy: node=elem.getElementsByTagName("safidy") ho an'ny safidy ao amin'ny node : optionsMod.append(options.firstChild.data)

Multithreading

Mahagaga fa ny multithreading amin'ny Python dia ampiharina mazava tsara sy tsotra.

def PacketWork(data,addr): ... # fampiharana ny fanaparitahana ny fonosana miditra sy ny famaliana azy ... raha Marina: data, addr = udp_socket.recvfrom(1024) # miandry ny UDP packet thread = threading.Thread( target=PacketWork , args=(data,addr,)).manomboka() # rehefa tonga - dia manomboka ny PacketWork efa voafaritra teo aloha ao ambadika miaraka amin'ny masontsivana rehefa threading.active_count() >gconfig["dhcp_ThreadLimit"]: fotoana. sleep(1) # raha toa ka misy kofehy efa mandeha mihoatra noho ny ao amin'ny toe-javatra, dia miandry isika mandra-vitsy amin'izy ireo

Mandray / mandefa fonosana DHCP

Mba hanakanana ny fonosana UDP miditra amin'ny karatra tambajotra dia mila "manangana" ny socket ianao:

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

, misy ny saina:

  • AF_INET - midika fa ny endrika adiresy dia IP: port. Mety misy ihany koa ny AF_UNIX - izay misy ny adiresy nomena ny anaran'ny rakitra.
  • SOCK_DGRAM - dia midika fa tsy manaiky "fonosana manta" isika, fa izay efa nandalo teo amin'ny rindrin'ny afo, ary miaraka amin'ny fonosana efa voatapaka. Ireo. fonosana UDP ihany no azonay raha tsy misy ny singa "ara-batana" amin'ny fonosana fonosana UDP. Raha mampiasa ny saina SOCK_RAW ianao, dia mila manara-maso an'io "wrapper" io koa ianao.

Ny fandefasana fonosana dia mety ho toy ny fampielezam-peo:

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

, ary mankany amin'ny adiresy "taiza no niavian'ny fonosana":

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # afindrao amin'ny mode multi-mihaino ny socket rz=udp_socket.sendto(packetack, addr)

, izay SOL_SOCKET dia midika hoe "ambaratonga protocole" amin'ny fametrahana safidy,

, SO_BROADCAST safidy fa ny fonosana fiarovan-doha dia "broadcast"

  , Ny safidy SO_REUSEADDR dia mamadika ny faladia ho amin'ny fomba “mihaino maro”. Amin'ny teoria dia tsy ilaina izany amin'ity tranga ity, fa amin'ny iray amin'ireo mpizara FreeBSD izay notsapaiko dia tsy mandeha ny code raha tsy misy an'io safidy io.

Famakiana fonosana DHCP

Eto no tena tiako ny Python. Hita fa ivelan'ny boaty dia mamela anao ho flexible amin'ny bytecode. Mamela azy ho mora adika amin'ny soatoavina decimal, tady ary hex - i.e. izany no tena ilaintsika hahatakatra ny firafitry ny fonosana. Noho izany, ohatra, azonao atao ny mahazo isa maromaro amin'ny HEX ary bytes fotsiny:

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

, fenoy ao anaty rafitra ny bytes:

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

Makà IP avy amin'ny rafitra:

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

Ary ny mifamadika amin'izany:

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

Izay ihany aloha 😉

Source: www.habr.com

Add a comment