半年前、私たちのチームはオフィスの3フロアにまたがる480個のスイッチポートの管理で壁にぶつかっていました。請負業者がデスク間で勝手にLANケーブルを差し替える。未承認の検証機器がタグなしポートに現れる。ほぼ毎午後のように不正なMACアドレスが静的なポートセキュリティ規則に引っかかり、ヘルプデスクへの対応依頼チケットが絶え間なく発行されていました。その摩擦を解消するため、私たちはDebian 12上で稼働するオープンソースのネットワークアクセス制御(NAC)プラットフォーム「PacketFence」の導入に踏み切りました。
現在では、そのクラスタが18台のアクセススイッチと32台の無線アクセスポイントを何の問題もなく管理しています。本記事では、ロールアウト時に有効だった構成、移行時に直面した落とし穴、そして自社環境で動的なデバイス隔離を稼働させるための具体的な手順を紹介します。
クイックスタート(5分)
PacketFenceの最小構成の検証環境には、4 vCPU、8GB RAM、および2つのネットワークインターフェースを備えたクリーンなDebian 12 VMが必要です。eth0を管理アクセス用に確保し、eth1をトランク接続されたアクセスVLANのリッスン専用として割り当てます。
まず依存パッケージをインストールし、Inverseリポジトリの署名キーをインポートしてパッケージを取得します。
# 鍵管理ユーティリティのインストール
apt-get update && apt-get install -y curl gnupg lsb-release
# Inverse署名キーのインポート
curl -fsSL https://inverse.ca/downloads/GPG-KEY-Inverse | gpg --dearmor -o /etc/apt/trusted.gpg.d/inverse.gpg
# 公式Bookwormリポジトリの追加
echo "deb http://inverse.ca/downloads/PacketFence/debian/bookworm bookworm bookworm" > /etc/apt/sources.list.d/packetfence.list
# リポジトリを更新してスタックをインストール
apt-get update
apt-get install -y packetfence
次に、初期設定プロセスを実行するためにWebベースのコンフィギュレータデーモンを起動します。
# 設定サービスの起動と確認
systemctl enable --now packetfence-configurator
systemctl status packetfence-configurator
# ブラウザでWebウィザードを開く:
# https://<SERVER_IP>:1443/configuration
ウィザードの3つのステップに従って設定を進めます。
- データベース設定: PacketFenceにMariaDBスキーマをプロビジョニングさせ、ローカル認証情報を自動生成します。
- インターフェースの割り当て:
eth0をManagement(例:192.168.10.50/24)としてバインドし、eth1を強制用のトランクとして指定します。 - 管理者アカウント: クラスタのプライマリ管理者アカウントを作成します。
ウィザードによって設定ファイルが出力されたら、シェルからコアサービススタックを起動します。
/usr/local/pf/bin/pfcmd service pf start
/usr/local/pf/bin/pfcmd service pf status
詳細解説
PacketFenceはインラインに配置されてボトルネックになるような構成は採りません。ユーザーのスループットトラフィックがPacketFenceのCPUを通過することはありません。代わりに、完全にアウトオブバンドのコントロールプレーンディレクターとして動作します。RADIUSトランザクションをリッスンし、DHCPリクエストを検査した上で、SNMPまたはRADIUS Change of Authorization(CoA)経由でスイッチへ制御コマンドを発行します。
認証のライフサイクル
エンジニアがポートGi1/0/12にLANケーブルを接続すると、スイッチとPacketFenceは約800ミリ秒以内に連携したシーケンスを実行します。
- 初期プローブ: スイッチポートがリンクアップを検知します。エンドポイントに対して802.1XのIdentity Requestを送信します。2回のタイムアウト後にマシンに802.1Xサプリカントが存在しない場合、スイッチはMAC認証バイパス(MAB)にフォールバックします。
- RADIUSクエリ: スイッチは、デバイスのMACアドレス、Calling-Station-ID、スイッチIPを含む
Access-RequestペイロードをPacketFenceのUDPポート1812宛に転送します。 - ポリシー評価: PacketFenceはホストフィンガープリントを解析し、ディレクトリのグループ所属を確認し、ローカルノードのコンプライアンスステータスを照会します。
- VLAN割り当て: PacketFenceは、RFC 2868およびRFC 3580のベンダ属性(
Tunnel-Type = VLAN、Tunnel-Medium-Type = IEEE-802、Tunnel-Private-Group-Id = <VLAN_ID>)を含むRADIUSAccess-Acceptフレームで応答します。 - CoAによる状態遷移: 未認証のデバイスがキャプティブポータル経由でオンボーディングを完了すると、PacketFenceはスイッチのUDPポート3799宛にRFC 3576 / RFC 5176 Disconnect-Requestを発行します。スイッチはセッションをクリアし、即座にポートを再評価します。ケーブルの抜き差しは不要です。
アクセススイッチの設定
この本番用ベースラインは、IOS-XE 17.xが稼働するCisco Catalyst 2960Xおよび9300シリーズスイッチで検証しました。
! RADIUSグローバル設定
radius server PACKETFENCE
address ipv4 192.168.10.50 auth-port 1812 acct-port 1813
key SuperSecretRadiusKey2026
!
aaa new-model
aaa group server radius PF_GROUP
server name PACKETFENCE
!
aaa authentication dot1x default group PF_GROUP
aaa authorization network default group PF_GROUP
aaa accounting dot1x default start-stop group PF_GROUP
aaa server radius dynamic-author
client 192.168.10.50 server-key SuperSecretRadiusKey2026
!
! エッジアクセスポートの設定
interface GigabitEthernet1/0/12
description Access-Port-Controlled-by-NAC
switchport mode access
switchport access vlan 99
authentication host-mode multi-auth
authentication port-control auto
dot1x pae authenticator
authentication order dot1x mab
authentication priority dot1x mab
mab
フォールバック用のバインドであるswitchport access vlan 99に注目してください。VLAN 99は隔離された登録用VLAN(Registration VLAN)として機能します。未登録のハードウェアはまずここに接続され、サンドボックス化されたIPアドレスを取得して、HTTPキャプティブポータルにインターセプトされます。
高度な活用法
基本的なMAC認証は第一歩にすぎません。真の運用のメリットは、LDAP/Active Directoryのグループ検索と自動隔離を連動させることで得られます。
ロールベースの動的VLANステアリング
現代のオフィスにおいて固定席の運用はもはや時代遅れです。財務監査担当者とDevOpsエンジニアが会議室Bのまったく同じ壁面ジャックに接続しても、完全に分離されたサブネットに配置できます。スイッチポートは認証されたユーザーに合わせて動的に変化します。
スイッチプロファイルは/usr/local/pf/conf/switches.conf、またはWeb管理画面のConfiguration > Network Infrastructure > Switchesで設定します。
[192.168.10.10]
description=Core-Stack-IDF1
type=Cisco::Catalyst_2960
mode=production
radiusSecret=SuperSecretRadiusKey2026
VoIPEnabled=yes
# 動的VLANターゲット
RoleMap=yes
defaultRole=default
registrationVlan=99
isolationVlan=98
guestVlan=30
employee_engineeringVlan=40
employee_financeVlan=50
不審な挙動に対する自動隔離
PacketFenceはSuricata、Zeek、Defender for Endpointなどのセキュリティツールと直接連携できます。例えば社内のワークステーションがサーバー用サブネットに対して過度なポートスキャンを開始したとします。IDSがPacketFenceへのアラートWebhookを発行し、PacketFenceは該当ノードのカテゴリをisolatedに降格させて、CoA経由で2秒以内にVLAN 98へ隔離します。
侵害されたワークステーションは、ターミナルから手動で隔離することも可能です。
# 侵害されたエンドポイントにフラグを設定
/usr/local/pf/bin/pfcmd node modify 00:11:22:33:44:55 status=unreg category="Security_Incident"
# アクセススイッチに対して即座にCoAバウンスを発行
/usr/local/pf/bin/pfcmd radius authorize 00:11:22:33:44:55
実践的なTips
毎日数百台の端末が接続されるオフィス環境でNACクラスタを運用すると、テスト環境ではめったに表面化しないエッジケースに直面します。運用時には以下の点に留意してください。
- MACアドレスのランダム化への対策: iOS、Android、Windows 11では、デフォルトで信頼できないネットワークに対してMACアドレスがランダム化されます。再接続時に仮想ハードウェアアドレスが変更されるため、純粋なMABではオンボーディングが破綻します。代わりにEAP-TLSやPEAPを用いた802.1Xを導入し、ハードウェアアドレスではなくユーザーまたはマシンの証明書にネットワークアクセス許可を紐付けてください。
- 管理インターフェースのエアギャップ化: Web管理ポート(
TCP 1443)やスイッチの管理IPを登録用サブネットに絶対に公開してはいけません。管理用ファイアウォールルールによってeth0を隔離してください。VLAN 99の未認証ゲストがスイッチの管理プレーンにpingを通せる状態であれば、そのNACアーキテクチャには重大なセキュリティホールが存在します。 - 登録用プールのDHCPリース期間の短縮: 端末がVLAN 99に留まるのは、認証済みロールへ移行するまでの5分未満であるべきです。登録用DHCPのリース期間は10分または15分に設定してください。利用者が多い平日に
/24の登録プールでデフォルトの24時間リースを使用していると、昼休み前にはIPアドレスが枯渇します。 - CLIを使用したリアルタイムRADIUSフレームのトラブルシューティング: スイッチのログに認証タイムアウトが記録されている場合は、Web GUIではなくサーバー上で生のパケットを直接監視してください。
# 認証の判定ログをリアルタイムで追跡
tail -f /usr/local/pf/logs/radius.log | grep -E "(Login OK|Login incorrect|Auth-Type)"
# パケットトレースの詳細を確認するためFreeRADIUSをフォアグラウンドデバッグモードで実行
/usr/local/pf/bin/pfcmd service radiusd stop
/usr/sbin/freeradius -X -d /usr/local/pf/raddb
PacketFence導入への投資効果はすぐに現れます。スイッチ設定とディレクトリ連携が安定すれば、手動でのスイッチポート差し替え作業から完全に解放され、未知のハードウェアを重要なサブネットから確実に締め出すことができます。

