Ubuntuで実践するarpd入門:ARPキャッシュ管理と負荷軽減策

はじめに

膨大なノードが接続されるネットワーク環境では、カーネル内部のARPテーブル肥大化やルックアップ負荷がシステム性能のボトルネックになり得ます。こうした課題への有効なアプローチが、ユーザー空間でアドレス解決キャッシュをオフロード・管理するarpdデーモンの導入です。本稿ではUbuntuを対象に、arpdが担う役割や内部機構を整理した上で、CLI操作を通じたデーモン起動、永続DB連携、キャッシュ収集状況の監視手順を体系的に解説します。

必要パッケージのセットアップと実行準備

デーモン運用の前提となるバイナリ群に加え、インターフェース検証やプロセス操作で用いる関連ユーティリティを導入するため、apt-get update -qq && apt-get install -y iproute2 net-tools psmisc を実行してシステムを整えます。

パッケージ群のインストール実行

インストールされた実行ファイルが環境変数PATH上の適切な場所に配置されているか確かめるため、which arpd で所在を照会します。
コマンドの戻り値として /usr/sbin/arpd が返されれば、実行準備は完了です。

arpd実行ファイルの配置パス確認

arpdはユーザー空間上でARP要求の送受信を肩代わりし、ローカルデータベースを介してキャッシュエントリを維持・管理する常駐プログラムです。
まずはビルトインヘルプを出力させ、起動パラメータや各種チューニングオプションの指定形式を把握しておきましょう。
⚙️ [主要オプション一覧]

-l : 受信したARPクエリおよび内部動作のログを標準出力へリアルタイムにダンプします。
-k : カーネルと連携して稼働中の既存arpdプロセスを安全に停止させます。
-b <dbase> : アドレス解決結果を保管するデータベースファイルの保存先を指定します。
(未指定時の初期値: /var/lib/arpd/arpd.db)
-B <number> : 1回のバッチ処理でブロードキャスト可能なARPクエリのバッファ枠数を設定します。
-a <N> : ネガティブレスポンス(無応答)判定を下すまでに試行する再送プローブ回数を指定します。
-n <time> : 収集したエントリが破棄されるまでのアイドルタイムアウト(秒単位)を設定します。
-R <rate> : 秒あたりに送出できるARPリクエストの上限レートを制御します。

arpdヘルプメッセージとオプション概要

ネットワークインターフェースと近隣キャッシュの現状把握

デーモンをバインドすべきNICの物理・論理リンク状態を確認するため、ip link show を投入します。
出力内容から、ローカルループバック lo に加えて、トラフィック送受信を担う主インターフェース eth0 がUPステータスで稼働している状況が読み取れます。

ネットワークインターフェースのリンク状態一覧

続いて、カーネル側が現在保持している近隣ノードのアドレス解決状態(Neighborキャッシュ)を ip neigh show でチェックします。
一覧より、デフォルトゲートウェイのIP 172.18.0.1 が eth0 経由で捕捉され、ステータスが到達可能を示す REACHABLE になっていることが確認できます。

カーネルのNeighborキャッシュ情報確認

従来のネットワーク管理手法に倣い、arp -n で数値表記のARPテーブル一覧も併せて参照してみましょう。
Flags列に完全な解決済みエントリを表す C(Complete)が記録されており、正常なMACアドレスマッピングが確立されていることが分かります。

arpコマンドによるキャッシュフラグの確認

arpdデーモンの常駐起動とキャッシュ保存設定

arpdがエントリを永続ファイルとして記録・保持できるよう、格納先となる専用ディレクトリを mkdir -p /var/lib/arpd で事前に作成します。

データベース配置用ディレクトリの作成

ポートやファイルの競合トラブルを未然に防ぐため、先行して動いているバックグラウンドプロセスがあれば killall arpd 2>/dev/null || true を投げて一度クリーンアップしておきます。

既存プロセスのクリーンアップ実行

次に、実トラフィックが流れる有効なNICを自動判定してシェル変数 IFACE へ格納し、DBパスおよびプローブ再試行ポリシーを与えてデーモンを立ち上げるため、IFACE=$(ip -o link show | awk -F': ' '{print $2}' | grep -v 'lo' | head -n1); arpd -b /var/lib/arpd/arpd.db -a 3 $IFACE を投入します。

アクティブNICを自動検出してarpdを起動

プロセス一覧を検索する ps aux | grep [a]rpd を通じて、プロセスが意図通りバックグラウンドへ常駐したかを検証します。
指定したファイルパスやインターフェース引数を伴って正常にプロセスが維持されていることが確認できます。

常駐しているarpdプロセスの稼働確認

キャッシュ同期検証とデーモンの安全な終了手順

外部宛てのパケット疎通を意図的に発生させ、ゲートウェイとの間で新規ARPトラフィックを誘発するために ping -c 2 8.8.8.8 > /dev/null 2>&1 || true を実行します。

テスト疎通によるARPトラフィックの誘発

トラフィック発生後、arpdがデータベースファイルへ蓄積したMAC・IPマッピング情報を参照すべく、arpd -l -b /var/lib/arpd/arpd.db 2>&1 | head -n 10 || true を実行します。
インターフェースID、IPアドレス、対応するMACアドレスがテーブル構造として正しくキャッシュ・トラッキングされている様子が分かります。

arpdデータベース内のキャッシュレコード閲覧

一連の挙動確認が終わったら、検証用に常駐させていたプロセスを killall arpd 2>/dev/null || true で停止し、余剰なシステムリソースを解放します。

検証用プロセスの正常停止とリソース解放

デーモンの終了後もOSカーネル側の近隣情報テーブルが損なわれていないか確かめるため、最後に ip neigh show を再実行します。
ゲートウェイ 172.18.0.1 に対するMACエントリは eth0 上で依然として REACHABLE を保っており、ネットワーク疎通性に悪影響を与えていないことが確認できました。

デーモン停止後のNeighborテーブル整合性確認

本稿ではUbuntu環境をベースに、arpdデーモンを活用したARPキャッシュのオフロードと運用手順を解説しました。
大規模セグメントや仮想化基盤などでARPフラッディングやテーブル枯渇の対策を検討する際は、システム最適化の有力な選択肢としてぜひ役立ててください。