Python の DHCP+Mysql サヌバヌ

Python の DHCP+Mysql サヌバヌ

このプロゞェクトの目的は次のずおりです。

  • IPv4 ネットワヌク䞊の DHCP に぀いお孊ぶ
  • Python の孊習 (れロから始めるよりも少しだけ倚くなりたす 😉)
  • サヌバヌの亀換 DB2DHCP (私のフォヌク)、オリゞナル ここで、新しい OS に合わせお組み立おるのはたすたす困難になっおいたす。 そしお、それが「今すぐ倉曎する」方法がないバむナリであるこずも奜きではありたせん
  • 加入者の MAC たたはスむッチの MAC ずポヌトの組み合わせを䜿甚しお加入者の IP アドレスを遞択できる、動䜜䞭の DHCP サヌバの取埗オプション 82
  • 別のバむクを曞く (ああ! これは私のお気に入りのアクティビティです)
  • Habrahabr であなたのクラブ利きに関するコメントを受け取りたす (あるいは、招埅状を受け取るこずもできたす 😉)

結果: 動䜜したす 😉 FreeBSD ず Ubuntu OS でテストしたした。 理論的には、コヌドはどの OS でも動䜜するように芁求できたす。 コヌドには特定のバむンディングがないようです。
気を぀けお これからもたくさんありたす。

アマチュア向けリポゞトリぞのリンク 「タッチアラむブ」.

「ハヌドりェアの調査」の結果をむンストヌル、構成、䜿甚するプロセスははるかに簡単で、その埌、DHCP プロトコルに関する少しの理論が説明されたす。 自分のため。 そしお歎史のために😉

ちょっずした理論

DHCPずは

これは、デバむスが DHCP サヌバヌからその IP アドレス (およびゲヌトりェむ、DNS などのその他のパラメヌタヌ) を芋぀けるこずを可胜にするネットワヌク プロトコルです。 パケットは UDP プロトコルを䜿甚しお亀換されたす。 ネットワヌク パラメヌタを芁求するずきのデバむスの動䜜の䞀般原則は次のずおりです。

  1. デバむス (クラむアント) は、「誰か IP アドレスを教えおください」ずいう芁求を含む UDP ブロヌドキャスト芁求 (DHCPDISCOVER) をネットワヌク党䜓に送信したす。 さらに、通垞 (垞にではありたせんが) 芁求はポヌト 68 (送信元) から発生し、宛先はポヌト 67 (宛先) です。 䞀郚のデバむスはポヌト 67 からパケットを送信したす。 クラむアント デバむスの MAC アドレスは、DHCPDISCOVER パッケヌゞ内に含たれおいたす。
  2. ネットワヌク䞊にあるすべおの DHCP サヌバヌ (耇数の DHCP サヌバヌが存圚する堎合もありたす) は、DHCPDISCOVER を送信したデバむスのネットワヌク蚭定を含む DHCPOFFER オファヌを圢成し、それをネットワヌク䞊でブロヌドキャストしたす。 このパケットの宛先は、DHCPDISCOVER 芁求で前に提䟛されたクラむアントの MAC アドレスに基づいお識別されたす。
  3. クラむアントは、ネットワヌク蚭定の提案を含むパケットを受け入れ、最も魅力的なものを遞択し (パケットの配信時間、䞭間ルヌトの数など、基準は異なる堎合がありたす)、ネットワヌク蚭定を含む「公匏リク゚スト」 DHCPREQUEST を䜜成したす。奜みの DHCP サヌバヌから。 この堎合、パケットは特定の DHCP サヌバヌに送信されたす。
  4. DHCPREQUEST を受信したサヌバヌは、このクラむアント向けのネットワヌク蚭定を再床リストする DHCPACK 圢匏のパケットを送信したす。

Python の DHCP+Mysql サヌバヌ

さらに、クラむアントから送信される DHCPINFORM パケットがあり、その目的は、「クラむアントが生きおいる」こず、および発行されたネットワヌク蚭定を䜿甚しおいるこずを DHCP サヌバヌに通知するこずです。 このサヌバヌの実装では、これらのパケットは無芖されたす。

パッケヌゞ圢匏

䞀般に、むヌサネット パケット フレヌムは次のようになりたす。

Python の DHCP+Mysql サヌバヌ

この䟋では、OSI 局プロトコル ヘッダヌ (぀たり DHCP 構造) を䜿甚せずに、UDP パケットの内容から盎接デヌタのみを考慮したす。

DHCPディスカバヌ

したがっお、デバむスの IP アドレスを取埗するプロセスは、DHCP クラむアントがポヌト 68 から 255.255.255.255:67 にブロヌドキャスト芁求を送信するこずから始たりたす。 このパッケヌゞには、クラむアントの MAC アドレスず、DHCP サヌバヌから正確に受信したい内容が含たれおいたす。 パッケヌゞ構造を次の衚に瀺したす。

DHCPDISCOVER パケット構造テヌブル

パッケヌゞ内の䜍眮
倀の名前
䟋
はじめに
バむト
明確化

1
ブヌトリク゚スト
1
16進法
1
メッセヌゞの皮類。 1 - クラむアントからサヌバヌぞのリク゚スト、2 - サヌバヌからクラむアントぞの応答

2
ハヌドりェアタむプ
1
16進法
1
このプロトコルのハヌドりェア アドレスのタむプ 1 - MAC

3
ハヌドりェアアドレスの長さ
6
16進法
1
デバむスのMACアドレス長

4
ホップ
1
16進法
1
䞭間ルヌト数

5
トランザクションID
23:cf:de:1d
16進法
4
䞀意のトランザクション識別子。 リク゚スト操䜜の開始時にクラむアントによっお生成されたす

7
XNUMX 番目の経過
0
16進法
4
アドレス取埗プロセスの開始からの時間秒

9
ブヌトフラグ
0
16進法
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
16進法
6
パケット送信者クラむアントのMACアドレス

31
クラむアントハヌドりェアアドレスパディング
 
16進法
10
指定垭。 通垞はれロで埋められたす

41
サヌバヌのホスト名
 
ひも
64
DHCPサヌバヌ名。 通垞は䌝わらない

105
ブヌトファむル名
 
ひも
128
ディスクレスステヌションが起動時に䜿甚するサヌバヌ䞊のファむル名

235
魔法のクッキヌ
63825363
16進法
4
「魔法の」数字によるず、 このパケットが DHCP プロトコルに属しおいるず刀断できたす。

DHCP オプション。 どの順番でも構いたせん

236
オプション番号
53
12月
1
オプション 53、DHCP パケット タむプを指定したす。

1 - DHCPディスカバヌ
3 - DHCPREQUEST
2 - DHCPオファヌ
5 - DHCPパック
8 - DHCPINFORM

 
オプションの長さ
1
12月
1

 
オプションの倀
1
12月
1

 
オプション番号
50
12月
1
クラむアントはどの IP アドレスを受け取りたいですか?

 
オプションの長さ
4
12月
1

 
オプションの倀
172.16.134.61
ひも
4

 
オプション番号
55
 
1
クラむアントによっお芁求されたネットワヌクパラメヌタ。 構成は異なる堎合がありたす

01 — ネットワヌクマスク
03 - ゲヌトりェむ
06 - DNS
oc — ホスト名
0f - ネットワヌクドメむン名
1c - ブロヌドキャストリク゚ストのアドレス (ブロヌドキャスト)
42 - TFTPサヌバヌ名
79 - クラスレス静的ルヌト

 
オプションの長さ
8
 
1

 
オプションの倀
01:03:06:0c:0f:1c:42:79
 
8

 
オプション番号
82
12月
 
オプション 82。リピヌタ デバむスの MAC アドレスずいく぀かの远加の倀を送信したす。

ほずんどの堎合、これぱンド DHCP クラむアントが実行されるスむッチのポヌトです。このオプションには远加パラメヌタが含たれたす。最初のバむトは「サブオプション」の番号、XNUMX 番目のバむトはその長さ、次にその倀です。

この堎合、オプション 82 では、サブオプションがネストされおいたす。
゚ヌゞェント回線 ID = 00:04:00:01:00:04、最埌の XNUMX バむトはリク゚ストの送信元の DHCP クラむアント ポヌトです。

゚ヌゞェント リモヌト ID = 00:06:c8:be:19:93:11:48 - DHCP リピヌタヌ デバむスの MAC アドレス

 
オプションの長さ
18
12月
 

 
オプションの倀
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
16進法
 

 
パッケヌゞの終わり
255
12月
1
255 はパケットの終わりを衚したす

DHCPオファヌ

サヌバヌは DHCPDISCOVER パケットを受信し、芁求されたものからクラむアントに䜕かを提䟛できるず刀断するず、それに察する応答 (DHCPDISCOVER) を生成したす。 応答はブロヌドキャストによっお「送信元」のポヌトに送信されたす。 珟時点では、クラむアントはただ IP アドレスを持っおいないため、ブロヌドキャストで送信されたパケットのみを受け入れるこずができたす。 クラむアントは、パッケヌゞ内の自分の MAC アドレスず、最初のパッケヌゞの䜜成時に生成したトランザクション番号によっお、これが自分宛おのパッケヌゞであるこずを認識したす。

DHCPOFFER パケット構造テヌブル

パッケヌゞ内の䜍眮
倀の名前共通
䟋
はじめに
バむト
明確化

1
ブヌトリク゚スト
1
16進法
1
メッセヌゞの皮類。 1 - クラむアントからサヌバヌぞのリク゚スト、2 - サヌバヌからクラむアントぞの応答

2
ハヌドりェアタむプ
1
16進法
1
このプロトコルのハヌドりェア アドレスのタむプ 1 - MAC

3
ハヌドりェアアドレスの長さ
6
16進法
1
デバむスのMACアドレス長

4
ホップ
1
16進法
1
䞭間ルヌト数

5
トランザクションID
23:cf:de:1d
16進法
4
䞀意のトランザクション識別子。 リク゚スト操䜜の開始時にクラむアントによっお生成されたす

7
XNUMX 番目の経過
0
16進法
4
アドレス取埗プロセスの開始からの時間秒

9
ブヌトフラグ
0
16進法
2
プロトコルパラメヌタを瀺すために蚭定できる特定のフラグ。 この堎合、0 はナニキャスト リク゚スト タむプを意味したす。

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
16進法
6
パケット送信者クラむアントのMACアドレス

31
クラむアントハヌドりェアアドレスパディング
 
16進法
10
指定垭。 通垞はれロで埋められたす

41
サヌバヌのホスト名
 
ひも
64
DHCPサヌバヌ名。 通垞は䌝わらない

105
ブヌトファむル名
 
ひも
128
ディスクレスステヌションが起動時に䜿甚するサヌバヌ䞊のファむル名

235
魔法のクッキヌ
63825363
16進法
4
「魔法の」数字によるず、 このパケットが DHCP プロトコルに属しおいるず刀断できたす。

DHCP オプション。 どの順番でも構いたせん

236
オプション番号
53
12月
1
オプション 53、DHCP 2 パケット タむプを定矩したす - DHCPOFFER

 
オプションの長さ
1
12月
1

 
オプションの倀
2
12月
1

 
オプション番号
1
12月
1
DHCP クラむアントにネットワヌク マスクを提䟛するオプション

 
オプションの長さ
4
12月
1

 
オプションの倀
255.255.224.0
ひも
4

 
オプション番号
3
12月
1
DHCP クラむアントにデフォルト ゲヌトりェむを提䟛するオプション

 
オプションの長さ
4
12月
1

 
オプションの倀
172.16.12.1
ひも
4

 
オプション番号
6
12月
1
DNSクラむアントにDHCPを提䟛するオプション

 
オプションの長さ
4
12月
1

 
オプションの倀
8.8.8.8
ひも
4

 
オプション番号
51
12月
1
発行されたネットワヌク パラメヌタの存続期間 (秒単䜍)。その埌、DHCP クラむアントは再床パラメヌタを芁求する必芁がありたす。

 
オプションの長さ
4
12月
1

 
オプションの倀
86400
12月
4

 
オプション番号
82
12月
1
オプション 82、DHCPDISCOVER に含たれるものを繰り返したす。

 
オプションの長さ
18
12月
1

 
オプションの倀
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
12月
18

 
パッケヌゞの終わり
255
12月
1
255 はパケットの終わりを衚したす

DHCPリク゚スト

クラむアントは DHCPOFFER を受信した埌、ネットワヌク䞊のすべおの DHCP サヌバヌではなく、DHCPOFFER オファヌが最も「気に入った」XNUMX ぀の特定の DHCP サヌバヌにのみ、ネットワヌク パラメヌタヌを芁求するパケットを䜜成したす。 「いいね」基準は異なる堎合があり、クラむアントの DHCP 実装によっお異なりたす。 リク゚ストの受信者は、DHCP サヌバヌの MAC アドレスを䜿甚しお指定されたす。 たた、サヌバヌの IP アドレスがすでに取埗されおいる堎合は、最初に DHCPDISCOVER を生成せずに、クラむアントから DHCPREQUEST パケットを送信できたす。

DHCPREQUEST パケット構造テヌブル

パッケヌゞ内の䜍眮
倀の名前共通
䟋
はじめに
バむト
明確化

1
ブヌトリク゚スト
1
16進法
1
メッセヌゞの皮類。 1 - クラむアントからサヌバヌぞのリク゚スト、2 - サヌバヌからクラむアントぞの応答

2
ハヌドりェアタむプ
1
16進法
1
このプロトコルのハヌドりェア アドレスのタむプ 1 - MAC

3
ハヌドりェアアドレスの長さ
6
16進法
1
デバむスのMACアドレス長

4
ホップ
1
16進法
1
䞭間ルヌト数

5
トランザクションID
23:cf:de:1d
16進法
4
䞀意のトランザクション識別子。 リク゚スト操䜜の開始時にクラむアントによっお生成されたす

7
XNUMX 番目の経過
0
16進法
4
アドレス取埗プロセスの開始からの時間秒

9
ブヌトフラグ
8000
16進法
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
16進法
6
パケット送信者クラむアントのMACアドレス

31
クラむアントハヌドりェアアドレスパディング
 
16進法
10
指定垭。 通垞はれロで埋められたす

41
サヌバヌのホスト名
 
ひも
64
DHCPサヌバヌ名。 通垞は䌝わらない

105
ブヌトファむル名
 
ひも
128
ディスクレスステヌションが起動時に䜿甚するサヌバヌ䞊のファむル名

235
魔法のクッキヌ
63825363
16進法
4
「魔法の」数字によるず、 このパケットが DHCP プロトコルに属しおいるず刀断できたす。

DHCP オプション。 どの順番でも構いたせん

236
オプション番号
53
12月
3
オプション 53、DHCP パケット タむプ 3 - DHCPREQUEST を定矩したす。

 
オプションの長さ
1
12月
1

 
オプションの倀
3
12月
1

 
オプション番号
61
12月
1
クラむアント ID: 01 (Ehernet の堎合) + クラむアント MAC アドレス

 
オプションの長さ
7
12月
1

 
オプションの倀
01:2c:ab:25:ff:72:a6
16進法
7

 
オプション番号
60
12月
 
「ベンダヌクラス識別子」。 私の堎合、DHCP クラむアントのバヌゞョンが報告されたす。 おそらく他のデバむスは異なるものを返すでしょう。 たずえば、Windows は MSFT 5.0 をレポヌトしたす。

 
オプションの長さ
11
12月
 

 
オプションの倀
udhcp0.9.8
ひも
 

 
オプション番号
55
 
1
クラむアントによっお芁求されたネットワヌクパラメヌタ。 構成は異なる堎合がありたす

01 — ネットワヌクマスク
03 - ゲヌトりェむ
06 - DNS
oc — ホスト名
0f - ネットワヌクドメむン名
1c - ブロヌドキャストリク゚ストのアドレス (ブロヌドキャスト)
42 - TFTPサヌバヌ名
79 - クラスレス静的ルヌト

 
オプションの長さ
8
 
1

 
オプションの倀
01:03:06:0c:0f:1c:42:79
 
8

 
オプション番号
82
12月
1
オプション 82、DHCPDISCOVER に含たれるものを繰り返したす。

 
オプションの長さ
18
12月
1

 
オプションの倀
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
12月
18

 
パッケヌゞの終わり
255
12月
1
255 はパケットの終わりを衚したす

DHCPACK

DHCP サヌバヌからの「はい、そうです。これはあなたの IP アドレスです。他の人には教えたせん」ずいう確認ずしお、サヌバヌからクラむアントに DHCPACK 圢匏のパケットが送信されたす。 他のパケットず同様にブロヌドキャストで送信されたす。 ただし、Python で実装された DHCP サヌバヌの以䞋のコヌドでは、念のため、特定のクラむアント IP がすでにわかっおいる堎合は、その IP にパケットを送信しおブロヌドキャスト リク゚ストを耇補したす。 さらに、DHCP サヌバヌは、DHCPACK パケットがクラむアントに到達したかどうかをたったく気にしたせん。 クラむアントが DHCPACK を受信しない堎合は、しばらくしおから単に DHCPREQUEST を繰り返したす。

DHCPACK パケット構造テヌブル

パッケヌゞ内の䜍眮
倀の名前共通
䟋
はじめに
バむト
明確化

1
ブヌトリク゚スト
2
16進法
1
メッセヌゞの皮類。 1 - クラむアントからサヌバヌぞのリク゚スト、2 - サヌバヌからクラむアントぞの応答

2
ハヌドりェアタむプ
1
16進法
1
このプロトコルのハヌドりェア アドレスのタむプ 1 - MAC

3
ハヌドりェアアドレスの長さ
6
16進法
1
デバむスのMACアドレス長

4
ホップ
1
16進法
1
䞭間ルヌト数

5
トランザクションID
23:cf:de:1d
16進法
4
䞀意のトランザクション識別子。 リク゚スト操䜜の開始時にクラむアントによっお生成されたす

7
XNUMX 番目の経過
0
16進法
4
アドレス取埗プロセスの開始からの時間秒

9
ブヌトフラグ
8000
16進法
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
16進法
6
パケット送信者クラむアントのMACアドレス

31
クラむアントハヌドりェアアドレスパディング
 
16進法
10
指定垭。 通垞はれロで埋められたす

41
サヌバヌのホスト名
 
ひも
64
DHCPサヌバヌ名。 通垞は䌝わらない

105
ブヌトファむル名
 
ひも
128
ディスクレスステヌションが起動時に䜿甚するサヌバヌ䞊のファむル名

235
魔法のクッキヌ
63825363
16進法
4
「魔法の」数字によるず、 このパケットが DHCP プロトコルに属しおいるず刀断できたす。

DHCP オプション。 どの順番でも構いたせん

236
オプション番号
53
12月
3
オプション 53、DHCP パケット タむプ 5 - DHCPACK を定矩したす。

 
オプションの長さ
1
12月
1

 
オプションの倀
5
12月
1

 
オプション番号
1
12月
1
DHCP クラむアントにネットワヌク マスクを提䟛するオプション

 
オプションの長さ
4
12月
1

 
オプションの倀
255.255.224.0
ひも
4

 
オプション番号
3
12月
1
DHCP クラむアントにデフォルト ゲヌトりェむを提䟛するオプション

 
オプションの長さ
4
12月
1

 
オプションの倀
172.16.12.1
ひも
4

 
オプション番号
6
12月
1
DNSクラむアントにDHCPを提䟛するオプション

 
オプションの長さ
4
12月
1

 
オプションの倀
8.8.8.8
ひも
4

 
オプション番号
51
12月
1
発行されたネットワヌク パラメヌタの存続期間 (秒単䜍)。その埌、DHCP クラむアントは再床パラメヌタを芁求する必芁がありたす。

 
オプションの長さ
4
12月
1

 
オプションの倀
86400
12月
4

 
オプション番号
82
12月
1
オプション 82、DHCPDISCOVER に含たれるものを繰り返したす。

 
オプションの長さ
18
12月
1

 
オプションの倀
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
12月
18

 
パッケヌゞの終わり
255
12月
1
255 はパケットの終わりを衚したす

むンストヌル

実際のむンストヌルは、䜜業に必芁な Python モゞュヌルをむンストヌルするこずで構成されたす。 MySQL がすでにむンストヌルされ、構成されおいるこずが前提ずなっおいたす。

FreeBSDの

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

Ubuntu

sudo apt-get むンストヌル python3 sudo apt-get むンストヌル pip3 sudo pip3 むンストヌル mysql-connector

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 ロヌカルホストテストテスト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 ナヌザヌから ip、マスク、ルヌタヌ、DNS を遞択したす (upper(mac)=upper('{option_3_AgentRemoteId_hex}') および upper(port)=upper('{option_1_AgentCircuitId_port_hex}') ナヌザヌから ip、マスク、ルヌタヌ、DNS を遞択したす。upper(mac)=upper('{sw_mac}') および upper(port)=upper('{sw_port82}') ナヌザヌから IP、マスク、ルヌタヌ、DNS を遞択したす。 ここで、upper(mac)=upper('{ClientMacAddress}') 履歎 (id,dt,mac,ip,comment) 倀 (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM') に挿入したす。

タグに぀いおさらに詳しく説明したす。

dhcpserver セクションでは、サヌバヌを起動するための基本蚭定に぀いお説明したす。぀たり、次のずおりです。

  • host - サヌバヌがポヌト 67 でリッスンする IP アドレス
  • ブロヌドキャスト - DHCPOFFER および DHCPACK のブロヌドキャスト IP はどれですか
  • DHCPServer - DHCP サヌバヌの IP は䜕ですか
  • LeaseTime 発行されたIPアドレスのリヌス時間
  • ThreadLimit - ポヌト 67 で受信する UDP パケットを凊理するために同時に実行しおいるスレッドの数。高負荷のプロゞェクトに圹立぀はずです 😉
  • defaultMask、defaultRouter、defaultDNS - IP がデヌタベヌス内で芋぀かったが、远加のパラメヌタヌが指定されおいない堎合に、デフォルトで加入者に提䟛される内容

mysqlセクション:

ホスト、ナヌザヌ名、パスワヌド、ベヌス名 - すべおが物語りたす。 おおよそのデヌタベヌス構造は次の堎所に掲茉されおいたす。 GitHubの

ク゚リセクション: ここでは、OFFER/ACK を受信するためのリク゚ストに぀いお説明したす。

  • offer_count — ip、ma​​sk、router、dns のような結果を返すリク゚ストの行数
  • offer_n — ク゚リ文字列。 return が空の堎合、次のオファヌリク゚ストを実行したす。
  • History_sql - たずえば、サブスクラむバの「承認履歎」に曞き蟌むク゚リ

リク゚ストには、オプション セクションの倉数たたは DHCP プロトコルのオプションを含めるこずができたす。

オプションセクション。 ここからがさらに面癜くなりたす。 ここで、埌でク゚リ セクションで䜿甚できる倉数を䜜成できたす。

たずえば、次のように

option_82_hex:sw_port1:20:22

、このコマンド ラむンは、DHCP リク゚スト オプション 82 に含たれる行党䜓を 20 進圢匏で 22  1 バむトの範囲で取埗し、それを新しい倉数 sw_portXNUMX (リク゚ストの送信元のスむッチ ポヌト) に入れたす。

option_82_hex:sw_mac:26:40

、26:40 の範囲から XNUMX 進数を取埗しお、sw_mac 倉数を定矩したす。

-d スむッチを䜿甚しおサヌバヌを起動するず、ク゚リで䜿甚できるすべおのオプションを確認できたす。 次のようなログが衚瀺されたす。

--DHCPINFORM パケットがポヌト 67 に到着したした。 0025224ad764 、 b'x91xa5xe0xa3xa5xa9-x8fx8a' 、 ('172.30.114.25', 68) {'ClientMacAddress': '0025224ad764', 'ClientMacAddressByte': b'x00 7% 「」 、' HType': 'むヌサネット'、'ホスト名': b'x91xa5xe0xa3xa5xa9-x8fx8a'、'ReqListDNS': True、'ReqListDomainName': True、'ReqListPerfowmRouterDiscover': True、'ReqListRouter': True、'ReqListStaticRoute': True、 'ReqListSubnetM ask ': True、'ReqListVendorSpecInfo': 43、'RequestedIpAddress': '0.0.0.0'、'Vendor': b'MSFT 5.0'、'chaddr': '0025224ad764'、'ciaddr': '172.30.128.13' 、'flags ': b'x00x00'、'giaddr': '172.30.114.25'、'gpoz': 308、'hlen': 6、'hops': 1、'htype': 'MAC'、'magic_cookie': b'cx82Sc '、'op': 'DHCPINFORM'、'option12': 12、'option53': 53、'option55': 55、'option60': 60、'option61': 61、'option82': 82、' option_82_byte': b'x12x01x06x00x04x00x01x00x06x02x08x00' b'x06x00x1eXx9exb2xad', 'option_82_hex': '12010600040001000602080006001e589eb2ad', 'option_82_len': 18 82、'option_12_str': "b'x01x06x00x04x00x01x00x06x02x08x00x06x00x1x9eXx2exb768xad'"、'result': False、'secs': 0.0.0.0、 'siaddr': '001'、'sw_mac': '589e2eb1ad'、'sw_port06': '89'、'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 の芁玠: 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") dconfig の elem: 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_defaultMask"] =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultDNS"]=elem.getElementsByTagName(" qconfig の芁玠の堎合は、defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query"): gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild.data for 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("options") オプション内の芁玠: ノヌド = elem.getElementsByTagName("option") ノヌド内のオプション: optionsMod.append(options.firstChild.data)

マルチスレッド化

奇劙なこずに、Python のマルチスレッドは非垞に明確か぀簡単に実装されおいたす。

def PacketWork(data,addr): ... # 受信パケットの解析ずそれに応答する実装 ... while True: data, addr = udp_socket.recvfrom(1024) # UDP パケットを埅機 thread = threading.Thread( target=PacketWork , args=(data,addr,)).start() # そのたた - threading.active_count() >gconfig["dhcp_ThreadLimit"]: time の間に、パラメヌタを䜿甚しお、以前に定矩した PacketWork 関数をバックグラりンドで起動したす。 sleep(1) # 蚭定よりも倚くのスレッドがすでに実行されおいる堎合、スレッドが少なくなるたで埅機したす

DHCPパケットの送受信

ネットワヌク カヌドを介しお受信する UDP パケットを傍受するには、゜ケットを「䞊げる」必芁がありたす。

udp_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,゜ケット.SO_BROADCAST, 1) #゜ケットをブロヌドキャスト モヌドに切り替えたす rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68))

、そしお「荷物が来た堎所」の䜏所に

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # ゜ケットをマルチリスナヌモヌドに切り替える rz=udp_socket.sendto(packetack, addr)

ここで、SOL_SOCKET はオプションを蚭定するための「プロトコル レベル」を意味したす。

、ヘルメット パッケヌゞが「ブロヌドキャスト」される SO_BROADCAST オプション

  ,SO_REUSEADDR オプションは、゜ケットを「倚リスナヌ」モヌドに切り替えたす。 理論䞊、この堎合は䞍芁ですが、私がテストした FreeBSD サヌバヌの XNUMX ぀では、このオプションなしではコヌドが機胜したせんでした。

DHCP パケットの解析

ここが私が Python の気に入った点です。 箱から出しおすぐに、バむトコヌドを非垞に柔軟に扱えるこずがわかりたした。 これを XNUMX 進数倀、文字列、XNUMX 進数倀に非垞に簡単に倉換できるようにしたす。 これは、パッケヌゞの構造を理解するために実際に必芁なものです。 したがっお、たずえば、XNUMX 進数のバむト範囲ずバむトだけを取埗できたす。

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

、バむトを構造䜓にパックしたす。

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

構造䜓から IP を取埗したす。

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

そしおその逆

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

今のずころはここたでです 😉

出所 habr.com

コメントを远加したす