背景と導入の理由
火曜日の午前2時15分、syslogサーバーが2分足らずの間に14,000件以上のアラートを発出しました。ノーブランドのAndroid TVストリーミング端末がMiraiの亜種に感染していたのです。その端末は即座にフラットな192.168.1.0/24サブネットへSYNスキャンを一斉送信し、192.168.1.2:8006にあるProxmoxのWeb GUIに対して毎秒450回もの認証試行を仕掛けていました。30ドルの怪しいメディアプレーヤーがハイパーバイザーのコントロールプレーンを攻撃している現実は、ネットワーク設計を見直すには十分すぎる警鐘でした。
フラットなサブネットはセキュリティリスクを増大させます。ストレージアレイ、個人のワークステーション、スマートプラグが同一のレイヤー2ブロードキャストドメインを共有していると、たった1台の侵害されたガジェットから環境全体が危険にさらされます。OPNsenseをProxmox VE上に移行すれば、何台もの専用機器を用意することなく、これらのセグメントを完全に分離できます。カーネル更新前の即時ZFSロールバックスナップショット、消費電力の一元化、そして仮想ポートと物理ポートをまたぐ柔軟なソフトウェアスイッチングといった恩恵も得られます。
物理PCIeネットワークカードをVMに直接パススルーすると、ハイパーバイザーレベルの柔軟性が失われます。そこで本構成では、ProxmoxのVLAN対応(VLAN-aware)Linuxブリッジを採用します。デュアルポートの2.5GbEまたは10GbE NICが1枚あれば、WAN、ハイパーバイザー管理、信頼済みエンドポイント、隔離ゾーンのタグ付きトラフィックをまとめて伝送可能です。OPNsenseがVLAN間ルーティングを制御し、Zenarmorがレイヤー7のパケットペイロードをリアルタイムで検査します。
インストール
まず、802.1Qのタグ付きフレームをゲストVMの仮想NICへ直接透過させるよう、Proxmoxのネットワーク層を設定します。ProxmoxノードにSSH接続し、/etc/network/interfacesを確認します。
1. ProxmoxのVLAN対応ブリッジの準備
2つの論理ブリッジを定義します。1つはISPゲートウェイ接続専用のブリッジ、もう1つはすべての内部トラフィックを処理するトランクブリッジです。
# /etc/network/interfaces の設定例
auto lo
iface lo inet loopback
iface eno1 inet manual
# ISPのWANモデム接続用物理NIC
iface eno2 inet manual
# L2+マネージドスイッチ(UniFi Pro、TP-Link Omada等)への物理トランク
auto vmbr0
iface vmbr0 inet manual
bridge-ports eno1
bridge-stp off
bridge-fd 0
# WANブリッジ(モデムへの直接レイヤー2ブリッジ)
auto vmbr1
iface vmbr1 inet manual
bridge-ports eno2
bridge-stp off
bridge-fd 0
bridge-vlan-aware yes
bridge-vids 2-4094
# 内部トランクブリッジ
auto vmbr1.10
iface vmbr1.10 inet static
address 192.168.10.2/24
gateway 192.168.10.1
# VLAN 10に隔離されたProxmox管理インターフェース
ホストを再起動することなく、ifupdown2を使用して新しいインターフェース設定を即座に適用します。
ifreload -a
2. Proxmox CLIによるOPNsense VMのプロビジョニング
公式のOPNsense DVD ISOをローカルのISOディレクトリにダウンロードします。その後、ハイパーバイザーの最適化フラグを指定して仮想マシンを作成します。
qm create 100 --name "OPNsense-Core" \
--memory 8192 --cores 4 --cpu host \
--net0 virtio,bridge=vmbr0,firewall=0 \
--net1 virtio,bridge=vmbr1,firewall=0 \
--scsihw virtio-scsi-pci \
--scsi0 local-lvm:32,discard=on,ssd=1 \
--boot order=scsi0;ide2 \
--ide2 local:iso/OPNsense-dvd.iso,media=cdrom \
--ostype other --onboot 1 --startup order=1
特に重要なパフォーマンス向上のための2つのフラグ:
- CPUモデルを
hostに設定: AES-NIやSHAなどのインストラクションセット拡張をFreeBSDへ直接渡します。これにより、CPUオーバーヘッドを最小限に抑えつつ、ワイヤスピードでのWireGuard暗号化スループットを実現します。 - VirtIOアダプターに
firewall=0を設定: ブリッジ上のLinux ebtablesおよびiptablesフィルターをバイパスします。これにより、トラフィックがファイアウォールエンジンに到達する前に発生するパケット追跡の重複や意図しないドロップを防止します。
3. 基本インストールとハードウェアオフロードの無効化
VM 100を起動し、noVNCコンソールを開きます。ユーザー名 installer、パスワード opnsense でログインします。予期せぬホストの再起動に対して標準のUFSよりはるかに堅牢なZFSをルートファイルシステムとして選択してください。インストールが完了したら、インストーラーISOを切断してゲストを再起動します。
初期コンソールセットアップウィザードで、プライマリネットワークアダプターを割り当てます。
- WANインターフェース:
vtnet0(WANブリッジvmbr0にバインド) - LANトランクインターフェース:
vtnet1(トランクブリッジvmbr1にバインド)
ブラウザから https://192.168.1.1 でOPNsenseのWeb GUIにアクセスします。すぐに Interfaces > Settings へ移動し、以下の3つのオフロード無効化オプションを有効にします。
- Disable Hardware Checksum Offload(ハードウェアチェックサムオフロードを無効化)
- Disable Hardware TCP Segmentation Offload(ハードウェアTCPセグメンテーションオフロードを無効化)
- Disable Hardware Large Receive Offload(ハードウェアLROを無効化)
KVM仮想マシン内部でハードウェアオフロードが有効なままだと、FreeBSD VirtIOドライバー(vtnet)がブリッジフレームを頻繁にドロップする問題が発生します。設定を保存し、Applyをクリックして、WebコンソールからVMを再起動します。
設定
1. マルチVLANのセットアップ
サブネットを整理するために、Interfaces > Other Types > VLAN を開きます。親トランクとなる vtnet1 の上に仮想サブインターフェースを追加します。
- VLAN 10(MGMT): タグ
10、親vtnet1— ハイパーバイザー、IPMI、マネージドスイッチ(192.168.10.1/24) - VLAN 20(TRUSTED): タグ
20、親vtnet1— デスクトップ、業務用ノートPC、管理者スマートフォン(192.168.20.1/24) - VLAN 30(SERVERS): タグ
30、親vtnet1— TrueNAS、Docker、Jellyfin(192.168.30.1/24) - VLAN 40(IOT): タグ
40、親vtnet1— ネットワークカメラ、スマートTV、ESP32センサー(192.168.40.1/24)
Interfaces > Assignments に進み、各VLANタグを割り当ててインターフェースを有効化します。それぞれのゲートウェイに静的IPv4アドレスを割り振ります。続いて Services > ISC DHCPv4(またはKea)を開き、サブネットごとのアドレスプールを定義して、ハイパーバイザーやマネージドスイッチ向けに静的リースを予約します。
2. 厳格なファイアウォールルールとサブネット分離
OPNsenseでは、インターフェースを割り当てるとデフォルトでインターフェース間のトラフィックが遮断されます。管理用アクセスを許可しつつ信頼できないネットワークをクリーンに隔離するために、明示的なエイリアスを使ってルールを記述します。
Firewall > Aliases に移動し、プライベートネットワークをまとめたエイリアスを作成します。
- Name:
RFC1918_Networks - Type: Network(s)
- Content:
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
Firewall > Rules > IOT を開きます。必ず以下の順序でルールを作成してください。
- DNSの許可: Pass | IPv4 UDP | 送信元:
IOT net| 送信先:This Firewall| ポート:53 - NTPの許可: Pass | IPv4 UDP | 送信元:
IOT net| 送信先:This Firewall| ポート:123 - RFC1918の遮断: Block | IPv4 * | 送信元:
IOT net| 送信先:RFC1918_Networks(IoT機器からすべてのプライベートサブネットへのアクセスを遮断) - インターネットアクセスの許可: Pass | IPv4 * | 送信元:
IOT net| 送信先:*(外部のパブリックIPへのアウトバウンド通信を許可)
3. Zenarmorによるレイヤー7脅威フィルタリング
標準的なレイヤー4ルールはIPアドレスとポート番号しか検査しません。ポート443を介して通信する不審なアウトバウンドHTTPSビーコンを検知・遮断することは不可能です。Zenarmorは、ディープパケットインスペクション、TLS SNI識別、リアルタイム脅威インテリジェンスフィードを導入することでこの課題を解決します。
System > Firmware > Plugins に移動します。os-sunnyvalley をインストールし、Check for updates をクリックした後、os-sensei と os-sensei-updater をインストールします。
メニューの Zenarmor を選択し、初期設定ウィザードを開始します。
- Database Engine: エンドポイントが50台未満のHomeLab環境であれば SQLite を選択します。長期的なイベントログ分析が必要な場合は、外部のElasticsearchやMongoDBホストを指定してください。
- Deployment Mode: Routed Mode (L3) を選択します。
- Protected Interfaces: 内部VLAN(
vlan0.20、vlan0.30、vlan0.40)を選択します。WANインターフェースはチェックを外したままにしてください。 NAT適用前のトラフィックを検査することで、ログ内に元の内部クライアントIPアドレスをそのまま記録できます。 - Hardware Engine: Netmap(VirtIO Emulated Netmap driver)を選択します。
Zenarmor > Policies > Default > Security を開きます。悪意のあるソフトウェア(Malicious Software)、フィッシング(Phishing)、ボットネット(Botnets)、アグレッシブトラッカー(Aggressive Trackers)のリアルタイム保護ブロックを有効化します。
検証とモニタリング
GUI上のチェックマークだけで安心せず、隔離されたサブネット内部から実際にパケットテストを実行してセキュリティ境界を必ず検証してください。
1. CLIによるサブネット分離の検証
VLAN 40(IoT)にタグ付けされたAlpine Linuxコンテナ(IP: 192.168.40.50)を立ち上げます。境界制御をテストするための診断コマンドを実行します。
# テスト 1: 内部ゲートウェイのDNS解決が機能していることを確認
dig @192.168.40.1 api.weather.com +short
# テスト 2: VLAN 10のProxmoxホストへping(100%パケットロスになることを確認)
ping -c 3 -W 1 192.168.10.2
# テスト 3: 管理ゲートウェイのSSHおよびWebサービスをスキャン(タイムアウトまたはclosedになることを確認)
nc -zvw3 192.168.10.1 22 80 443
pingパケットが完全にドロップし、netcatがタイムアウトするまで応答しなければ、RFC1918遮断ルールによって適切なネットワーク分離が適用されていることが確認できます。
2. Zenarmorのレイヤー7フィルタリングのテスト
VLAN 20(Trusted)の端末にログインし、業界標準の安全性確認用エンドポイントに対してcurlリクエストを送信します。
curl -I http://malware.wicar.org/data/eicar.com
Zenarmorが即座にTCP接続を切断するか、HTTP 403 Forbiddenページを返します。OPNsenseの Zenarmor > Live Sessions を確認し、フラグが設定された通信、送信元クライアントIP、脅威の重大度スコアが記録されていることを確かめます。
3. パフォーマンスベンチマークと耐障害性
4つのvCPUを割り当てたIntel Core i5-12400環境で iperf3 を使用してテストした結果、VLAN 20とVLAN 30の間で持続スループット2.38 Gbpsを記録しました。転送ピーク時のホストハイパーバイザーCPU使用率は6%未満にとどまり、アイドル時のベースラインメモリ使用量は約2.4 GBで推移しました。
ルーティング設定を保護するために、VM > Backup で毎日の自動Proxmox ZFSスナップショットをスケジュールしてください。万が一OPNsenseのカーネルアップグレードで問題が発生した場合でも、ProxmoxのGUIから20秒足らずでファイアウォール全体の構成を復元できます。

