経緯
小規模だったり一般の家庭レベルであれば不要ですが、少し凝ったことをする(しかも日常的に変更を加えていなかったり)と、または規模がそこそこ大きくなるとIPアドレスの管理というのは割と大変です。
- 少し凝ったことをする場合:
- 日常的に変更が加わるわけではないならば、どの端末がどのIPアドレスを使用しているか分からなくなる
- そこそこの規模より大きい場合:
- いつの間にか機器が増えている
- 該当のIPアドレスを使用している端末が廃棄される
- 包括的な管理者がいない
小規模であれば Microsoft Excel やスプレッドシートでも管理できそうですが、そこそこの規模になってくるとシートが複数になって見通しが悪くなってきます。
そうでなくとも、 LAN のIPアドレス情報なので Excel がない (わざわざ Office 製品を買っていない) 環境で、クラウドにデータを保存するスプレッドシートもやや憚られる……という具合で絶妙に取り扱いが難しいところだったりします。
そこでこうした IPアドレス を管理するツールは何かないものか……と思っていたら、 IPAM (IP Address Management) というずばりそのもののカテゴリが存在していることを知りました。インフラ周りもだいぶ浸かっているのですが、恥ずかしながら名前を知りませんでした……。
これで正鵠を失わず検索ができる、というもの。試しに調べてみたところ、すぐに phpIPAM という PHP 製の IPAM ツールが見付かりました。
インストール
公式のインストールガイドに拠ると PHP7.2 以上であれば動作するようなので、適当な LAMP の箱にインストールしてみることにします。なお、1月下旬に検証は実施していたのですが記事にするのが非常に遅くなってしましました……。
今回は Ubuntu の箱をチョイス。
- Ubuntu: 24.04.1 LTS
- Apache: 2.4.58
- PHP: 8.3.6
- MySQL: 15.1
バージョンとしてはこのような感じです。
Apache
まずは仮想サイトを切ります。
# mkdir /var/www/animae-partus-2/
# cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/animae-partus-2.conf
# vi /etc/apache2/sites-available/animae-partus-2.conf
<VirtualHost *:80>
# DocumentRoot /var/www/html
ServerName apii.example.jp
DocumentRoot /var/www/animae-partus-2
# ErrorLog ${APACHE_LOG_DIR}/error.log
# CustomLog ${APACHE_LOG_DIR}/access.log combined
ErrorLog ${APACHE_LOG_DIR}/error-animae-partus-2.log
CustomLog ${APACHE_LOG_DIR}/access-animae-partus-2.log combined
ディレクトリを切って仮想サイトの設定を作成。
# a2ensite animae-partus-2
# systemctl restart apache2
仮想サイトの設定を読み込ませて Apache 再起動。
# chown -R www-data:www-data /var/www/animae-partus-2/
# vi /etc/hosts
127.0.1.1 apii.examplejp
権限設定とホスト名参照 (DNSに未登録のホスト名なので自前で名前解決できるように hosts
に追加) を設定。
MariaDB


phpMyAdmin から DB 作成、作成した DB に対してのみ全権限を付与したユーザを作成します。
phpIPAM インストール
DB の準備ができたので phpIPAM をインストールします。
# git clone --recursive https://github.com/phpipam/phpipam.git /var/www/animae-partus-2
cp -p /var/www/animae-partus-2/config.dist.php /var/www/animae-partus-2/config.php
vi /var/www/animae-partus-2/config.php
/**
* database connection details
******************************/
$db['host'] = '127.0.0.1';
$db['user'] = 'DeusNovaMobile';
$db['pass'] = 'PASSWORD-ANIMAE-PARTUS';
$db['name'] = 'animaepartus2db';
$db['port'] = 3306;
config.dist.php
から config.php
を作り、必要なパラメータを調整します (パスワードは適当な文字列に置き換えています)。

これで先程切った仮想サイトの URL http://apii.examplejp
にアクセスしてみましたが、エラーページが表示されました……。
PHP の拡張機能 GMP と Apache の mod_rewrite が足らないようです。
mod_rewrite 有効化
# cat /etc/apache2/mods-available/rewrite.load
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
# sudo a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
systemctl restart apache2
# systemctl restart apache2
#
mod_rewrite
はあったはず……と思って確認したところモジュール自体は存在していたので有効化しました。
GMP インストール
GMP はなさそうなのでインストールします。
# apt install php8.3-gmp
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
python3-netifaces
これを削除するには 'apt autoremove' を利用してください。
以下のパッケージが新たにインストールされます:
php8.3-gmp
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 10 個。
23.8 kB のアーカイブを取得する必要があります。
この操作後に追加で 106 kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com/ubuntu noble-updates/main amd64 php8.3-gmp amd64 8.3.6-0ubuntu0.24.04.3 [23.8 kB]
23.8 kB を 1秒 で取得しました (22.8 kB/s)
以前に未選択のパッケージ php8.3-gmp を選択しています。
(データベースを読み込んでいます ... 現在 237777 個のファイルとディレクトリがインストールされています。)
.../php8.3-gmp_8.3.6-0ubuntu0.24.04.3_amd64.deb を展開する準備をしています ...
php8.3-gmp (8.3.6-0ubuntu0.24.04.3) を展開しています...
php8.3-gmp (8.3.6-0ubuntu0.24.04.3) を設定しています ...
Creating config file /etc/php/8.3/mods-available/gmp.ini with new version
libapache2-mod-php8.3 (8.3.6-0ubuntu0.24.04.3) のトリガを処理しています ...
php8.3-cli (8.3.6-0ubuntu0.24.04.3) のトリガを処理しています ...
OK.
(不要) GMP を make install
この手順はおそらく不要ですが、 PHP の拡張機能ではなく GMP を普通に make install
してしまいました。
# apt install g++ m4 zlib1g-dev make p7zip
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
g++ はすでに最新バージョン (4:13.2.0-7ubuntu1) です。
g++ は手動でインストールしたと設定されました。
m4 はすでに最新バージョン (1.4.19-4build1) です。
m4 は手動でインストールしたと設定されました。
make はすでに最新バージョン (4.3-4.1build2) です。
make は手動でインストールしたと設定されました。
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
python3-netifaces
これを削除するには 'apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
7zip
提案パッケージ:
7zip-standalone 7zip-rar
以下のパッケージが新たにインストールされます:
7zip p7zip zlib1g-dev
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 10 個。
2,743 kB のアーカイブを取得する必要があります。
この操作後に追加で 7,668 kB のディスク容量が消費されます。
続行しますか? [Y/n] y
## 略
zlib1g-dev:amd64 (1:1.3.dfsg-3.1ubuntu2.1) を設定しています ...
p7zip (16.02+transitional.1) を設定しています ...
man-db (2.12.0-4build2) のトリガを処理しています ...
#
必要パッケージのインストール。
# wget https://gmplib.org/download/gmp/gmp-6.3.0.tar.xz
--yyyy-mm-dd hh:ii:ss-- https://gmplib.org/download/gmp/gmp-6.3.0.tar.xz
gmplib.org (gmplib.org) をDNSに問いあわせています... 130.242.124.102
gmplib.org (gmplib.org)|130.242.124.102|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 2094196 (2.0M) [application/octet-stream]
‘gmp-6.3.0.tar.xz’ に保存中
gmp-6.3.0.tar.xz 100%[===================>] 2.00M 1.02MB/s in 2.0s
yyyy-mm-dd hh:ii:ss (1.02 MB/s) - ‘gmp-6.3.0.tar.xz’ へ保存完了 [2094196/2094196]
## 略
#
最新版は 6.3.0 でした。
# tar -xvf gmp-6.3.0.tar.xz
## 略
#
# ls
gmp-6.3.0 gmp-6.3.0.tar.xz snap
# cd gmp-6.3.0/
gmp-6.3.0# ./configure --enable-cxx
checking build system type... core2-pc-linux-gnu
checking host system type... core2-pc-linux-gnu
## 略
config.status: linking mpn/generic/add_n_sub_n.c to mpn/add_n_sub_n.c
config.status: linking mpn/x86_64/core2/gmp-mparam.h to gmp-mparam.h
config.status: executing libtool commands
configure: summary of build options:
Version: GNU MP 6.3.0
Host type: core2-pc-linux-gnu
ABI: 64
Install prefix: /usr/local
Compiler: gcc
Static libraries: yes
Shared libraries: yes
gmp-6.3.0#
configure
して……
# make
gcc `test -f 'gen-fac.c' || echo './'`gen-fac.c -o gen-fac
./gen-fac 64 0 >fac_table.h || (rm -f fac_table.h; exit 1)
## 略
ibtool: link: (cd ".libs" && rm -f "libgmpxx.so.4" && ln -s "libgmpxx.so.4.7.0" "libgmpxx.so.4")
libtool: link: (cd ".libs" && rm -f "libgmpxx.so" && ln -s "libgmpxx.so.4.7.0" "libgmpxx.so")
libtool: link: ar cq .libs/libgmpxx.a cxx/dummy.o cxx/isfuns.o cxx/ismpf.o cxx/ismpq.o cxx/ismpz.o cxx/ismpznw.o cxx/limits.o cxx/osdoprnti.o cxx/osfuns.o cxx/osmpf.o cxx/osmpq.o cxx/osmpz.o
libtool: link: ranlib .libs/libgmpxx.a
libtool: link: ( cd ".libs" && rm -f "libgmpxx.la" && ln -s "../libgmpxx.la" "libgmpxx.la" )
make[2]: ディレクトリ '/root/gmp-6.3.0' から出ます
make[1]: ディレクトリ '/root/gmp-6.3.0' から出ます
OK.
# make check
make check-recursive
make[1]: ディレクトリ '/root/gmp-6.3.0' に入ります
Making check in tests
make[2]: ディレクトリ '/root/gmp-6.3.0/tests' に入ります
Making check in .
## 略
============================================================================
Testsuite summary for GNU MP 6.3.0
============================================================================
# TOTAL: 22
# PASS: 22
# SKIP: 0
# XFAIL: 0
# FAIL: 0
# XPASS: 0
# ERROR: 0
============================================================================
make[5]: ディレクトリ '/root/gmp-6.3.0/tests/cxx' から出ます
make[4]: ディレクトリ '/root/gmp-6.3.0/tests/cxx' から出ます
make[3]: ディレクトリ '/root/gmp-6.3.0/tests/cxx' から出ます
make[2]: ディレクトリ '/root/gmp-6.3.0/tests' から出ます
Making check in mpn
make[2]: ディレクトリ '/root/gmp-6.3.0/mpn' に入ります
make[2]: 'check' に対して行うべき事はありません.
make[2]: ディレクトリ '/root/gmp-6.3.0/mpn' から出ます
Making check in mpz
make[2]: ディレクトリ '/root/gmp-6.3.0/mpz' に入ります
make[2]: 'check' に対して行うべき事はありません.
make[2]: ディレクトリ '/root/gmp-6.3.0/mpz' から出ます
Making check in mpq
make[2]: ディレクトリ '/root/gmp-6.3.0/mpq' に入ります
make[2]: 'check' に対して行うべき事はありません.
make[2]: ディレクトリ '/root/gmp-6.3.0/mpq' から出ます
Making check in mpf
make[2]: ディレクトリ '/root/gmp-6.3.0/mpf' に入ります
make[2]: 'check' に対して行うべき事はありません.
make[2]: ディレクトリ '/root/gmp-6.3.0/mpf' から出ます
Making check in printf
make[2]: ディレクトリ '/root/gmp-6.3.0/printf' に入ります
make[2]: 'check' に対して行うべき事はありません.
make[2]: ディレクトリ '/root/gmp-6.3.0/printf' から出ます
Making check in scanf
make[2]: ディレクトリ '/root/gmp-6.3.0/scanf' に入ります
make[2]: 'check' に対して行うべき事はありません.
make[2]: ディレクトリ '/root/gmp-6.3.0/scanf' から出ます
Making check in rand
make[2]: ディレクトリ '/root/gmp-6.3.0/rand' に入ります
make[2]: 'check' に対して行うべき事はありません.
make[2]: ディレクトリ '/root/gmp-6.3.0/rand' から出ます
Making check in cxx
make[2]: ディレクトリ '/root/gmp-6.3.0/cxx' に入ります
make[2]: 'check' に対して行うべき事はありません.
make[2]: ディレクトリ '/root/gmp-6.3.0/cxx' から出ます
Making check in demos
make[2]: ディレクトリ '/root/gmp-6.3.0/demos' に入ります
Making check in calc
make[3]: ディレクトリ '/root/gmp-6.3.0/demos/calc' に入ります
make check-am
make[4]: ディレクトリ '/root/gmp-6.3.0/demos/calc' に入ります
make[4]: 'check-am' に対して行うべき事はありません.
make[4]: ディレクトリ '/root/gmp-6.3.0/demos/calc' から出ます
make[3]: ディレクトリ '/root/gmp-6.3.0/demos/calc' から出ます
Making check in expr
make[3]: ディレクトリ '/root/gmp-6.3.0/demos/expr' に入ります
make[3]: 'check' に対して行うべき事はありません.
make[3]: ディレクトリ '/root/gmp-6.3.0/demos/expr' から出ます
make[3]: ディレクトリ '/root/gmp-6.3.0/demos' に入ります
make[3]: 'check-am' に対して行うべき事はありません.
make[3]: ディレクトリ '/root/gmp-6.3.0/demos' から出ます
make[2]: ディレクトリ '/root/gmp-6.3.0/demos' から出ます
Making check in tune
make[2]: ディレクトリ '/root/gmp-6.3.0/tune' に入ります
make[2]: 'check' に対して行うべき事はありません.
make[2]: ディレクトリ '/root/gmp-6.3.0/tune' から出ます
Making check in doc
make[2]: ディレクトリ '/root/gmp-6.3.0/doc' に入ります
make[2]: 'check' に対して行うべき事はありません.
make[2]: ディレクトリ '/root/gmp-6.3.0/doc' から出ます
make[2]: ディレクトリ '/root/gmp-6.3.0' に入ります
make[2]: ディレクトリ '/root/gmp-6.3.0' から出ます
make[1]: ディレクトリ '/root/gmp-6.3.0' から出ます
#
OK.
# make install
make install-recursive
make[1]: ディレクトリ '/root/gmp-6.3.0' に入ります
Making install in tests
make[2]: ディレクトリ '/root/gmp-6.3.0/tests' に入ります
Making install in .
## 略
libtool: install: /usr/bin/install -c .libs/libgmpxx.so.4.7.0T /usr/local/lib/libgmpxx.so.4.7.0
libtool: install: (cd /usr/local/lib && { ln -s -f libgmpxx.so.4.7.0 libgmpxx.so.4 || { rm -f libgmpxx.so.4 && ln -s libgmpxx.so.4.7.0 libgmpxx.so.4; }; })
libtool: install: (cd /usr/local/lib && { ln -s -f libgmpxx.so.4.7.0 libgmpxx.so || { rm -f libgmpxx.so && ln -s libgmpxx.so.4.7.0 libgmpxx.so; }; })
libtool: install: /usr/bin/install -c .libs/libgmpxx.lai /usr/local/lib/libgmpxx.la
libtool: install: /usr/bin/install -c .libs/libgmp.a /usr/local/lib/libgmp.a
libtool: install: chmod 644 /usr/local/lib/libgmp.a
libtool: install: ranlib /usr/local/lib/libgmp.a
libtool: install: /usr/bin/install -c .libs/libgmpxx.a /usr/local/lib/libgmpxx.a
libtool: install: chmod 644 /usr/local/lib/libgmpxx.a
libtool: install: ranlib /usr/local/lib/libgmpxx.a
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/sbin" ldconfig -n /usr/local/lib
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/lib
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the 'LD_RUN_PATH' environment variable
during linking
- use the '-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to '/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
/usr/bin/mkdir -p '/usr/local/include'
/usr/bin/install -c -m 644 gmp.h '/usr/local/include'
/usr/bin/mkdir -p '/usr/local/include'
/usr/bin/install -c -m 644 gmpxx.h '/usr/local/include'
/usr/bin/mkdir -p '/usr/local/lib/pkgconfig'
/usr/bin/install -c -m 644 gmp.pc gmpxx.pc '/usr/local/lib/pkgconfig'
make install-data-hook
make[4]: ディレクトリ '/root/gmp-6.3.0' に入ります
+-------------------------------------------------------------+
| CAUTION: |
| |
| If you have not already run "make check", then we strongly |
| recommend you do so. |
| |
| GMP has been carefully tested by its authors, but compilers |
| are all too often released with serious bugs. GMP tends to |
| explore interesting corners in compilers and has hit bugs |
| on quite a few occasions. |
| |
+-------------------------------------------------------------+
make[4]: ディレクトリ '/root/gmp-6.3.0' から出ます
make[3]: ディレクトリ '/root/gmp-6.3.0' から出ます
make[2]: ディレクトリ '/root/gmp-6.3.0' から出ます
make[1]: ディレクトリ '/root/gmp-6.3.0' から出ます
#
完了。
phpIPAM インストールに戻る

2つの拡張機能をインストール・有効化したことで phpIPAM インストール画面 が正常に上がってきました。
「1. New phpipam installation」のボタンをクリックします。

「1. Automatic database installation」のボタンをクリックします。

MySQL (MariaDB) のユーザ名、パスワード、データベースサーバのホスト、データベース名を指定します。今回は同じサーバ内なのでホストは 127.0.0.1
で、それ以外は先程 phpMyAdmin で設定した内容を入力します。
また、 phpMyAdmin でデータベースを作成しているので、「⚙Show advanced options」ボタンをクリックして……。

展開した項目から「□Create new database」「□Set permissions to tables」の2項目のチェックを外します。逆に言えば phpMyAdmin で設定していなくてもここで設定できそうですね……。

「Install phpipam database」をクリックすると、画面下部に「Database installed successfully!」と表示されるのでその横の「Continue」ボタンをクリック。

続いて phpIPAM 自身の管理者パスワードとサイト名、URLの設定を行います。必要な項目を記入して「Save settings」ボタンをクリック。

画面下部に「Settings updated, installation complete!」と表示されるので、その下の「Proceed to login.」ボタンをクリック。

ログイン画面に到達しました。 config.php
のパラメータを調整したら完了です。後は admin
と先程入力した管理者パスワードでログイン。

ダッシュボードが表示されました。インストール完了、正常動作を確認できました。
少し触ってみる
試しにいくつかの項目を編集してみます。
サブネットの追加

右上の「Administration」からメニューを展開し、「Sections」をクリック。

「Add section」でセクションを追加します。

デモでは触れなかった VLAN は触ってみたいので VLAN メニュ- の表示は Yes で。

「Subnets」の中に今追加したセクションが増えていることが確認できます。

今度はセクションの中にサブネットを追加してみます。
VLAN の追加

今度は VLAN を追加してみます。 ☁ のアイコン → 「Add VLAN」で追加。

試しに適当に VLAN を切ってみます。

追加されました。

Edit subnet で VLAN のセレクトボックスに先程追加した VLAN が選択できるようになったことが確認できました。

サブネットの一覧でも確認。OKです。
サブネットの確認とIP追加

いくつかサブネットを切ってみました。


そのうちの一つを選択。サブネットに対してどのくらいのIPが使用されているか等のサブネットの詳細な情報が表示されます。下部にはIP一覧。


IP を追加します。1つはゲートウェイ、他は普通のデバイス、として追加してみます。

IP 一覧ができました。
デバイス追加

🖥️ のアイコンから「Add device」でデバイスを追加。

ゲートウェイはルータとします。

IP編集のモーダル画面の「Device」で先程追加したデバイスがセレクトボックスで選択できるようになったことが確認できました。
このような手順で IP, VLAN, 機器を追加していけば IP 管理が捗りそうですね。
死活監視 (ping応答)
最後に ping の死活監視について設定してみます。

サブネットの編集で「Check hosts status」のトグルスイッチを「Yes」に変更します。

これでサブネットにIPを登録すると、登録直後はIP横の状態ランプが緑色になります (疎通できないものはブランクのまま)。

が、暫くすると状態ランプが赤くなりました。
これはこの記事に拠ると死活監視の機能が自動で行われるわけではない、ということで別途設定が必要らしいです。
# vi /etc/crontab
*/15 * * * * www-data /bin/php /var/www/animae-partus-2/functions/scripts/pingCheck.php
*/15 * * * * www-data /bin/php /var/www/animae-partus-2/functions/scripts/discoveryCheck.php
今回は Ubuntu なのでユーザは apache
ではなく www-data
で、 PHP のパスはシンボリックリンクですが /bin/php
で通っていたのでそのまま、後は PhpIPAM をインストールしたディレクトリの該当の PHP スクリプトを実行するように cron に登録。

これでさらに時間を置くと緑色に戻って ping の疎通テストが行われるようになったことが確認できました。
ひとまず今回検証したのはここまで。
余談: DCIM
余談ですが、データセンタの管理 (ラック内の何段目にどういった機器がある、とか、ラック間の配線とか) も含めた管理となると「DCIM (Data Center Infrastructure Management)」という概念に該当するようです。
- e.x. netbox
netbox ならば Ansible との連携もできるようなので、自動化 + 管理にも使えそうですね……まあ、個人レベルで使うことはあまりないでしょうけど……。
参考
IPAM
phpIPAM
- phpIPAM の紹介 ~オープンソースのIPアドレス管理ソフト~ | iCRAFT アイクラフト株式会社
- GitHub – phpipam/phpipam: phpipam development repository
- pelican@ainoniwa.net – phpIPAMを使ってIPアドレス管理を始めたい僕の一歩目
- phpIPAMでデータセンターの見える化をしてみた – 朝日ネット 技術者ブログ
DCIM
netbox
- netbox〜データセンター管理(DCIM)のOSS〜 | OSSのデージーネット
- GitHub – netbox-community/netbox: The premier source of truth powering network automation. Open source under Apache 2. Try NetBox Cloud free: https://netboxlabs.com/free-netbox-cloud/
- NetBoxを使ってみよう 1回: NetBoxとは #netbox – Qiita