pythonでDHCPサーバ作成 ~②DHCP試験環境(windowsPC)~
pythonによるDHCPサーバの実装前に、環境構築でいろいろつまずいたのでまずはことらの説明から。
試験構成
まず初めに、windowsPCにおける試験環境の構築方法から説明します。
本来はPC2台で構成するのが正しいありようですが、IFを別に設けることでPC1台のDHCPクライアント、サーバ通信を実現させます。
DHCPクライアントは前章で話した、コマンドプロンプトからのIPアドレス開放を契機に動作させます。
DHCPリクエストの受信は、USB-LAN変換アダプタ(以降LANアダプタとする)を使いPCのLANポートとUSBポートを直結させることにより行います。
変換アダプタ側のIPアドレスは192.168.0.1としておりますがこれは任意の値に設定できるようツールを作成します。
またMACアドレスも任意の値を設定していますが、こちらは設定しなくてもDHCP通信は可能です。
事前準備
LANケーブルをつないだのち、以下事前準備が必要となります。ちなみに私は当初③の停止に考えが及ばす、諦めかけました。
① LANアダプタの設定
② ARPテーブルの設定
③ PCの再起動
④ ファイアウォールの停止
LANアダプタの設定
LANアダプタのIPアドレスをツールのDHCPサーバIPアドレスへ設定します。
まずは以下の順番で設定画面を表示させます。
「コントロールパネル」→「ネットワークとインターネット」→「ネットワークと共有センター」→「アダプターの設定の変更」
上記のような画面が出てきたら、追加されているIF(今回は"イーサネット2″)をダブルクリックします。
なお追加されているIFがどれかわからなければ、LANアダプタを抜き差しして消えるIFが該当のIFとなります。
クリック後はさらに「インターネットプロトコルバージョン4(TCP/IPv4)」をクリックしIPアドレスの選択画面を表示させます。
IPアドレスとサブネットマスク(255.255.255.0)設定後、「OK」を押してください。
ARPテーブルの設定
ARPテーブルについてはそのうち詳しく説明しようと思いますが、まずは通信しうる相手のIPアドレスとMACアドレスの対応表だと思っていただければよいです。
今回の場合、DHCPサーバがDHCPクライアントへ応答を返すため、応答用のテーブルを静的に設定しておく必要があります。
まず、管理者権限でコマンドプロンプトを起動します。コマンドプロンプトを起動したら以下コマンドを実行します。
(今回はDHCPサーバがDHCPクライアントに対しIPアドレス192.168.0.100を割り当てることを想定しています)
コマンドフォーマット
netsh interface ipv4 set neighbors "設定するIF" "相手のIPアドレス" "相手のMACアドレス"
実行例
netsh interface ipv4 set neighbors "イーサネット 2" 192.168.0.100 XX-XX-XX-XX-XX-XX
上記の「設定するIF」はipconfigで確認できます。コマンド実行後、「arp -a」でARPテーブルを表示し、期待する情報が追加されていれば設定成功です。
PCの再起動
通信試験時、ここでかなりつまずいたのですが、①、②が完了し冒頭の試験構成時点で必ずPCを再起動してください。
そうしないと ブロードキャストパケット をソケットが受信することが出来ません。
理由はイーサアダプタからのIFでブロードキャストパケットを受信するためのルート設定をPCにさせるためだと認識しております。
(ここら辺の話については自分の知識不足からあまり詳しい話が出来ず申し訳ございません。そのうち詳しい話もブログで載せていけたらと思っています)
ファイアウォールの停止
ファイアウォールを停止することで許可されていない通信を有効可する必要があります。
Windowsファイアウォール停止方法については以下参考にしてください。
私のPCの場合、Windowsファイアウォールではなくセキュリティソフトのファイアウォールを無効化することで通信ができるようになりました
なお今回はPCがWANにつながらなくなることから、ざっくりとファイアウォールを停止していますが、既定の通信(ポート開放)のみを許可することで試験を実施することも可能です。
コード
最終的なDHCPサーバコードは以下にあります。(詳細については関連記事参照)