English | 日本語
LAN内の未許可端末を検知し、Gratuitous ARP (GARP) によってネットワークから論理的に 遮断する、小規模向け・エージェントレスのネットワークアクセス制御 (NAC) システム。
802.1XやスイッチのポートセキュリティのようなL2スイッチ側の機能を使わずに、 既存のネットワーク構成を変更しないまま「許可リストにない端末を検知・遮断する」ことを 目的とした軽量な実装です。
- エージェントレス: 監視対象の端末側には何もインストールしない。ARPパケットの パッシブ監視とアクティブスキャンにより端末を検知する。
- 論理的な遮断: スイッチやルーターの設定を変更せず、Gratuitous ARPの送信によって 未許可端末の通信を妨害する。
- 監視NICごとに独立: 監視対象のNIC(サブネット)ごとに独立したプロセス・ SQLiteデータベース・Webダッシュボードを持つ。プロセス間のデータ共有は行わない。
- 3段階のステータス管理: 端末は
allowed(許可済み)・unknown(未許可・検知のみ)・blocked(遮断中)のいずれかの状態で管理される。まずmonitorモードで検知結果を 確認し、問題なければenforceモードで遮断を有効化する運用を想定している。
監視対象NICごとに独立したプロセス(NACLエンジン・Webダッシュボード)を立て、 許可リスト(YAML)との照合結果に応じて端末を allowed / unknown / blocked の3状態で管理する。
flowchart LR
subgraph nic["監視対象NIC"]
device["LAN内の端末"]
end
allowlist["許可リスト\n(YAML)"] -->|同期| db[("SQLite DB\n(NICごと)")]
device -->|ARP| engine["NACLエンジン\n(検知・遮断)"]
engine -->|devices更新| db
engine -->|"未許可端末にGARP送信"| device
db -->|参照| web["Webダッシュボード"]
engine -->|イベント通知| mail["SMTP通知"]
トップページ(監視対象NIC一覧):
NIC別ダッシュボード(検知端末一覧):
- AlmaLinux 9(他のRHEL系ディストリビューションでも動作する可能性があるが未検証)
- Python 3.11
- root権限(ARP監視・GARP送信にRawソケットを使用するため)
- 対象サブネットは /21(約2,000ホスト)以下を推奨
bin/ NACLエンジン・Webダッシュボード・CLIツール(Python)
conf/ 設定ファイルの例(*.yaml.example)・logrotate設定
systemd/ systemdユニットファイル
tests/ unitテスト(ネットワーク・DBに依存しない純粋なロジックテスト)
docs/ セットアップ手順・NIC追加手順・スクリーンショット
新規導入の手順は docs/SETUP.md を参照。 稼働中のシステムに監視対象NICを追加する手順は docs/ADDING_NIC.md を参照。
tests/unit/ はネットワーク・DB・ファイルアクセスに依存しない純粋なロジックテストのみを
含み、Windows/Linuxいずれの環境でも実行できる。
python -m venv .venv
# Windows
.venv/Scripts/python.exe -m pip install -r requirements-dev.txt
.venv/Scripts/python.exe -m pytest tests/unit/
# Linux / macOS
.venv/bin/pip install -r requirements-dev.txt
.venv/bin/pytest tests/unit/- /21を超える大規模ネットワーク: ARPスキャン時間・GARP負荷・ブラウザ描画のいずれかが 実用範囲を超えるため対象外。
- HTTPS対応: クローズドネットワーク内での運用を前提としており、現時点では未対応。
- 802.1Xやスイッチ連携による遮断: 商用NAC製品が担う領域であり、本システムの対象外。
- コンテナ化: 非コンテナ構成での実装を優先しており、今後の課題。

