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:
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.
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.
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.
Ny mpizara nahazo ny DHCPREQUEST dia mandefa fonosana endrika DHCPACK, izay mitanisa indray ny firafitry ny tambajotra natao ho an'ity mpanjifa ity.
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:
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
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
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
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
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
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.
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
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:
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:
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:
, 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: