ホームラボは、たいていフラットなネットワークから始まります。Pi-hole を動かす Raspberry Pi、NAS、Proxmox と十数個のコンテナを載せたミニ PC が、プロバイダのルーターが配る 192.168.1.0/24 にすべてつながっている状態です。スマートテレビやファームウェア更新の止まったカメラが NAS の管理ページと同じネットワークにいて、2 年前に設定した Jellyfin のポートフォワードも開いたままです。
この記事では、IoT とゲストを分離し、サービスを安全に公開でき、復旧しやすいホームラボのネットワークを設計して、図に描きます。
ネットワークに求められること
- 分離。 テレビ、カメラ、ゲストのスマートフォンはインターネットには届きますが、NAS やハイパーバイザーには届きません。
- 安全な公開。 サービスごとにポートを開けるのではなく、認証と暗号化のある入口を 1 つだけ用意します。
- 復旧しやすさ。 ディスクが壊れたら、記憶ではなくバックアップと図から再構築します。
ハードウェアは次のとおりです。二重 NAT を避けるためブリッジモードにしたプロバイダのモデム。VLAN 間のルーティングと DHCP、DNS、VPN を担う OPNsense または pfSense CE ファイアウォール(どちらもオープンソース)。802.1Q VLAN に対応したマネージドスイッチ。SSID を VLAN に対応付けるアクセスポイント。VM と LXC コンテナ用の Proxmox VE ホスト。そして NAS です。
VLAN 設計
RFC 1918 のプライベート範囲(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)から /16 を 1 つ選び、各 VLAN に /24 を割り当てます。外出先から自宅につなぐ元のネットワークでよく使われる 192.168.0.0/24 と 192.168.1.0/24、さらに 172.17.0.0/16(Docker の通常のデフォルトブリッジ)と 100.64.0.0/10(Tailscale のアドレス)は避けてください。この例では 10.23.0.0/16 を使い、VLAN ID を第 3 オクテットにしています。
| VLAN | 名前 | サブネット | 置くもの | 許可する外向き通信 |
|---|---|---|---|---|
| 10 | Management | 10.23.10.0/24 | ファイアウォール、スイッチ、AP、Proxmox の管理インターフェース | 更新のみ |
| 20 | Trusted | 10.23.20.0/24 | 自分のノート PC とスマートフォン | インターネット、プロキシ、管理用端末から Management へ |
| 30 | Servers | 10.23.30.0/24 | VM、コンテナ、NAS、プロキシ、Pi-hole | 更新用のインターネット |
| 40 | IoT | 10.23.40.0/24 | テレビ、スピーカー、カメラ、スマートプラグ | インターネットのみ |
| 50 | Guest | 10.23.50.0/24 | 来客 | インターネットのみ |
ファイアウォールからスイッチ、スイッチからアクセスポイント、スイッチから Proxmox はタグ付きトランクです。OPNsense のドキュメントは、ファイアウォールのトランクにタグなしの VLAN を混在させないよう警告しています。それ以外の機器にはタグなしのアクセスポートを割り当てます。
Proxmox ではブリッジを VLAN 対応にし、Proxmox VE のネットワークのドキュメントのとおり、ホストの管理アドレスを VLAN 10 に置きます。すると各 VM に個別の VLAN タグを付けられます。
auto vmbr0
iface vmbr0 inet manual
bridge-ports eno1
bridge-stp off
bridge-fd 0
bridge-vlan-aware yes
bridge-vids 2-4094
auto vmbr0.10
iface vmbr0.10 inet static
address 10.23.10.5/24
gateway 10.23.10.1
無線の VLAN ごとに SSID を 1 つ作ります。Trusted、IoT、Guest の 3 つです。Cisco Meraki は推奨しています。アクセスポイント 1 台あたり最大 3 つまでです。各 SSID が最低データレートで 100 ms ごとに独自のビーコンを送るためです。
VLAN 間のファイアウォールルール
OPNsense と pfSense は、トラフィックが入ってくるインターフェースで、ルールを上から順に評価します。最初に一致したルールが適用され、どれにも一致しないものはデフォルト拒否に当たります。どちらもステートフルなので、Trusted からプロキシへの 443 を許可すれば、応答も戻れます。
各 VLAN について、必要な通信を許可し、RFC1918 という名前のエイリアスですべてのプライベート範囲をブロックし、そのあとでインターネットを許可します。IoT インターフェースでは次のようになります。
| # | アクション | 送信元 | 宛先 | ポート | 理由 |
|---|---|---|---|---|---|
| 1 | Pass | IoT net | Pi-hole、10.23.30.53 | 53 | フィルタ済みの DNS |
| 2 | Block | IoT net | ファイアウォール自身のアドレス | any | 管理ページを見せない |
| 3 | Block | IoT net | RFC1918 エイリアス | any | 他の VLAN へは行かせない |
| 4 | Pass | IoT net | any | any | インターネット |
ルール 2 は、エイリアスに含まれないファイアウォールのパブリック WAN アドレスをカバーします。pfSense ではこの宛先を This firewall (self) と呼びます。限定的な例外はブロックより上に置きます。Trusted からプロキシへの 443、管理用ノート PC から Proxmox の Web UI への 8006、Home Assistant から IoT への通信などです。エイリアスは IPv4 専用なので、VLAN に IPv6 プレフィックスを割り当てる場合は、そちらもブロックしてください。
キャストは毎回のように驚かされる点です。AirPlay と Google Cast は、224.0.0.251 のマルチキャスト DNS でデバイスを見つけますが、Apple によれば、これは通常サブネットをまたいでルーティングされません。OPNsense の os-mdns-repeater プラグインなどの mDNS リピーターを Trusted と IoT の間で動かし、Trusted からテレビへの通信を許可します。
リバースプロキシの背後のサービス
Servers VLAN に置いた 1 台のリバースプロキシ(Caddy、Traefik、Nginx Proxy Manager など)が TLS を終端し、ホスト名でルーティングします。そのためファイアウォールが 443 を許可する宛先は 1 つのアドレスだけです。
jellyfin.home.example.com のように、自分で所有するドメイン配下の名前を使います。.local は避けてください。RFC 6762 がマルチキャスト DNS 用に予約しています。.internal や home.arpa 配下の名前はローカルでは動きますが、公開 CA はそれらの証明書を発行しません。
証明書は DNS-01 チャレンジで Let's Encrypt から取得します。ACME クライアントが DNS プロバイダの API を通じて _acme-challenge.<name> に TXT レコードを作るので、インターネットから到達できる必要はありません。ワイルドカードを発行できるのもこの方式だけで、ワイルドカードは必要です。Let's Encrypt はすべての証明書を公開の Certificate Transparency ログに送信するため、*.home.example.com なら公開されるのはサービス一覧ではなく 1 つの名前だけです。Caddy 2.10 以降は、ほかのサイトが一致するワイルドカード証明書を再利用します。
*.home.example.com {
tls {
dns cloudflare {env.CF_API_TOKEN}
}
abort
}
jellyfin.home.example.com {
reverse_proxy 10.23.30.21:8096
}
これには caddy-dns/cloudflare モジュール入りの Caddy ビルドと、Zone.Zone:Read と Zone.DNS:Edit に限定したトークンが必要です。証明書の有効期間は現在 90 日で、2028 年 2 月までに 45 日になるため、更新は自動化してください。
リモートアクセスの選択肢
| 選択肢 | インターネットから見えるもの | 手間 | トレードオフ |
|---|---|---|---|
| 443 をプロキシにポートフォワード | 自分の IP と各アプリのログインページ | 低 | 各アプリのログインが唯一の防壁。キャリアグレード NAT の内側では使えない |
| ファイアウォール上の WireGuard | 認証されていないパケットを無視する UDP ポート 1 つ | 中 | 到達可能なグローバル IP と、デバイスごとの鍵ペアが必要 |
| Tailscale | 受信はなし | 低 | Tailscale の調整サービス、またはセルフホストの Headscale に依存。無料の Personal プランは執筆時点(2026 年 11 月)のもの |
| Cloudflare Tunnel | 受信はなし | 低〜中 | Cloudflare が TLS を終端してトラフィックを見る。ドメインが Cloudflare 上にある必要がある |
自分用なら WireGuard が良い既定値です。WireGuard の論文によれば、認証されていないパケットには決して応答しないため、スキャナーからは見えません。それでも受信ポートが必要で、キャリアグレード NAT ではそれができません。WAN アドレスが RFC 6598 の共有範囲である 100.64.0.0/10 にあれば、その兆候です。
Tailscale と Cloudflare Tunnel は、代わりに外向きに接続します。Tailscale の DERP リレーは WireGuard で暗号化されたままのパケットを転送するだけで、サブネットルーターを使えば、すべての VM にクライアントを入れなくても Servers VLAN に届きます。VPN を入れてもらえない相手と共有するサービスには、トンネルが向いています。Cloudflare Access でログインを追加できます。ゼロトラストアーキテクチャ図では、ネットワーク上の位置よりアイデンティティが重要な理由を説明しています。
VLAN ごとの DNS と DHCP
ファイアウォールが各 VLAN で DHCP を提供し、サーバーには予約を割り当てます。OPNsense は、検証機能を持つ再帰リゾルバーの Unbound を既定で有効にしています。Trusted と IoT 向けに、Servers VLAN で Pi-hole か AdGuard Home を動かします。どちらも広告とトラッカーをフィルタし、*.home.example.com をプロキシに向けるローカルレコードを持ち、それ以外のクエリを Unbound に転送します(DNS の仕組みでは 1 回の名前解決を最初から最後まで追います)。ゲストはファイアウォールを直接使います。2 つ目のフィルタ用インスタンスを別のマシンで動かしてください。唯一のインスタンスが止まると、それらの VLAN は名前解決を失います。
バックアップと電源
3-2-1 に従います。3 つのコピー、2 種類のストレージ、1 つはオフサイトです。VM が 1 つ目のコピー、NAS または Proxmox Backup Server への夜間バックアップが 2 つ目、クラウドバケット上の暗号化コピーが 3 つ目です。Proxmox Backup Server は、増分、重複排除、暗号化されたバックアップを作成し、Proxmox は完全には信頼できない保存先でも安全だとしています。RAID とスナップショットはバックアップではありません。ファイアウォールの設定(OPNsense と pfSense では XML ファイル 1 つ)をエクスポートしてこの図と一緒に保管し、リストアをテストしてください。ディザスタリカバリアーキテクチャ図では RPO と RTO を扱っています。
ファイアウォール、スイッチ、Proxmox ホスト、NAS は UPS につなぎます。Network UPS Tools (NUT) では、UPS に接続したマシンがネットワーク経由でほかのマシンにシャットダウンを指示するため、スイッチも UPS につなぐ必要があります。容量は、コンセントでの消費電力とデータシートの稼働時間グラフから決めます。必要なのは数時間ではなく数分です。
ホームラボのネットワーク図
ダイアグラムの内容
- Internet
- OPNsense or pfSense
- Managed switch
- Access point
- VLAN 20 · Trusted
- Laptops and phones
- VLAN 40 · IoT
- TV, cameras, plugs
- VLAN 50 · Guest
- VLAN 30 · Servers
- Reverse proxy (Caddy)
- Proxmox VE host
- NAS (backups)
- Links
- deny inbound
- WireGuard UDP 51820
- trunk: 10–50
- trunk: 10, 20, 40, 50
- trunk: 10, 30
- HTTPS 443 from Trusted and VPN
- HTTP to apps
- nightly backups
- SSID home
- SSID iot
- SSID guest
図の読み方は次のとおりです。
- 最上段: インターネット、ファイアウォール、スイッチ。WAN は UDP 51820 の WireGuard(破線)を除くすべての受信を拒否します。
- トランクはタグ付き VLAN を運びます: スイッチへは 10〜50、アクセスポイントへは PoE 経由で 10、20、40、50、Proxmox へは 10 と 30 です。
- 枠は VLAN で、ID、名前、CIDR が付いています。VLAN 10 の Management は、スイッチの下のラベルです。
- ティール色のエッジは許可された通信です: Trusted と VPN クライアントからプロキシへの HTTPS 443、そこからアプリへの HTTP です。灰色の破線は夜間バックアップです。
- アクセスポイント は、SSID の home、iot、guest を VLAN 20、40、50 に対応付けます。
- Markdown ブロック には VLAN 設計と設定が入っています。凡例はリンクの色を説明します。
ホームラボのネットワーク図をわかりやすく描くには
- すべての VLAN に ID、名前、CIDR を付けて、枠そのものに書きます。
- トランクには運ぶ VLAN を明記します。 あるトランクだけ VLAN が欠けているのは典型的なバグです。
- ファイアウォールを VLAN 間の唯一の経路として描き、許可された通信にはポートを書きます。
- 外からの入口を示します。 UDP ポート 1 つだけの場合でも同じです。
- 省くもの: コンテナ、MAC アドレス、スイッチのポート番号。これらは物理図に属します。詳しくはネットワークトポロジー図のガイドを参照してください。
- 設定のバックアップと一緒に保管し、ルールが変わったら更新します。
Archboard で作る
- Google または GitHub でサインインし、ダイアグラムを作成します。
- ネットワーク パックから、インターネット、OPNsense または pfSense というラベルの ファイアウォール、スイッチ を横一列に追加し、その右下にアクセスポイント用の 無線 ノードを追加します。
- VLAN 20、30、40、50 用に サブネット フレームを 4 つ追加し、それぞれに名前と CIDR を付けます。
- Servers の中に、リバースプロキシとして ロードバランサー(パックにはプロキシ型がありません)、Proxmox 用に サーバー、種類を NAS にした デバイス を追加します。Trusted にはノート PC の デバイス、IoT には IoT の デバイス を追加します。
- それらを接続し、各リンクの接続タイプを WAN、Ethernet、PoE、Wi-Fi のいずれかにして、VLAN または SSID をラベルに書きます。許可された通信はティールで、WireGuard とバックアップは破線で描きます。
- ネットワーク パックから ネットワーク凡例、基本 パックから VLAN 設計を書いた Markdown ブロック、基本の テキスト ラベルで各 VLAN のルールを追加します。
アプリが compose.yaml にあるなら、Docker Compose からダイアグラムへのツールがサービス側の下書きを作ります。ネットワーク図のページではパック全体を見られます。この例で使うダイアグラムノードは 15 個で、Free プランの範囲に収まります。これは Free のダイアグラムあたりの上限でもあります。
よくある質問
ホームラボにはどの VLAN が必要ですか? 通常は 5 つです。management、trusted、servers、IoT、guest です。デバイスごとに別のルールが必要なときだけ増やしてください。VLAN を増やすごとにルールが増え、SSID も増えることが多いです。
VLAN にはマネージドスイッチが必要ですか? はい。802.1Q 対応のマネージドまたはスマートスイッチと、SSID を VLAN に対応付けるアクセスポイントが必要です。アンマネージドスイッチではポートを VLAN に割り当てられません。
OPNsense や pfSense は Proxmox 上の VM で動かすべきですか? 機器が 1 台減りますが、ホストを再起動するたびに家全体がオフラインになります。小型の専用ファイアウォールのほうが復旧しやすいです。仮想化する場合は、WAN に専用の NIC を割り当て、設定のエクスポートをホストの外に置いてください。
セルフホストのサービスのためにポートを開けても安全ですか? アプリのログインページをインターネットに出すことになるため、そのセキュリティ更新があなたの防御になります。VPN をおすすめします。どうしても転送する場合は、443 だけをリバースプロキシに送り、前段に認証を追加してください。
内部だけのサービスに Let's Encrypt を使えますか? はい、DNS-01 を使います。TXT レコードでドメインの管理を証明するので、サービスがインターネットから到達できる必要はありません。ワイルドカードを使えば、サービス名を Certificate Transparency ログに載せずに済みます。