DHCPのIPアドレスリース状況の確認


DHCP

DHCPは普段我々があまり意識せず使っている、インターネットを支える通信インフラの一つで、所謂IPアドレスをPCに割り当てて、TCP/IP通信が可能な状態にしてくれます。これは、PCだけではなく、携帯電話やタブレット、IoT機器のすべてに当てはまります。ここでは、IPアドレスの割当などといった、先駆者の方々が説明してくれているような、DHCPの設定方式等のお話をすることはありません。もっとニッチにですが、サブネットに対するIP払出情報をまとめることについて備忘録を書いていきます。

leases

DHCPのIP払出情報は、ISC-DHCPだと、leasesファイルといわれるファイルで管理しています。この内容を読み込めば、各IPの情報を知ることができます。ただ、ちょっと癖があって、

leaseファイルの中身は同一IPに対して複数状態が書かれる。

というルールです。最初、単純に状態freeの数を数えていけばよいと思ったのですが、exfiredやfree, activeなどが混在したIPアドレス情報が出力されていました。
これどれが正しいの?と思ったのですが、これはマニュアルに書いてありました。

Internet Software Consortium DHCP サーバは、割り当てたアドレスの貸し出し記録を永続的なデータベースに保持しています。このデータベースはフリーフォームの ASCII ファイルで、一連の貸し出し宣言 (declaration) からなります。貸し出しが要求・更新・破棄されると、その新しい値がこの貸し出しファイルの末尾に記録されます。よって、ひとつの貸し出しに対して複数の宣言があった場合は、ファイルの後ろの方にあるものが現在のものになります。

すなわち、同一IPの場合、最後に書かれた状態が現在の状態ですよ。ということになります。マニュアルめんどくさいけどちゃんと読まないといけなかった。

binding state

さて、IPの状態を示すbinding stateですが、以下の内容が定義されています。

  1. FREE... 利用可能なIPアドレス
  2. ACTIVE... 現在利用中なIPアドレス
  3. EXPIRED... 期限切れなIPアドレス
  4. RELEASED... 利用機器から解放されたIPアドレス
  5. ABANDONED... 破棄されたIPアドレス
  6. RESET... 現在利用中なIPアドレス
  7. BACKUP... Failoverしている相手サーバで払出可能なIPアドレス

ここで、IPの払出状況に関係するのは、freeとactiveなんですが、failoverしているなら、バックアップの数も数えておいた方がよさそうです。EXPIRED, RELEASED, ABANDONEDが利用可能に含めるか否かはちょっとわからないので、今回は見送りました。

払出数の確認

dhcpd.leasesの中身は、こんな感じです。

lease 192.168.1.2 {
  starts 1 2021/01/11 03:08:04;
  tstp 1 2021/01/11 02:08:01;
  tsfp 1 2021/01/11 03:08:04;
  atsfp 1 2021/01/11 03:08:04;
  binding state free;
}

lease 192.168.1.3 {
  starts 0 2021/01/03 03:48:29;
  ends 0 2021/01/03 03:48:39;
  tstp 0 2021/01/03 03:48:39;
  tsfp 0 2021/01/03 03:48:39;
  atsfp 0 2021/01/03 03:48:39;
  cltt 0 2021/01/03 03:48:39;
  binding state free;
  hardware ethernet 00:11:22:33:44:55;
  uid "\001\000\333p\303\021\327";
}

これらの内容は、たぶんいろんなサイトで書かれておりますが、
払い出したipアドレスを示す、lease 192.168.1.xxxの値とそのIPの状態を示す、binding state xxxxをカウントしていけばよさそうですね。で、IPは複数出てくることがありますが、最後のものを採用することで現在の状態が得られます。leasesファイルは、dhcpd.confで定義した、払出範囲のIP情報と突き合せれば、払出数の計算ができるので、今回はちまちまエクセルでまとめてIPを払い出せなくなりそうなサブネットを見つけ出すことにしました。
定期的にこの作業を行うのなら、スクリプトやプログラムを作成して、定期実行すると良さそうです。

参考文献

  1. https://www.ns-lab.org/wiki/?FrontPage
  2. リナックスコマンド
  3. Nobwak's Lair
  4. golangによるdhcpd.leasesファイルパーサー