自宅ホームラボネットワーク設計 on Ubuntu — VLAN/DMZ/VPN構成ガイド

ネットワーク

自宅に Ubuntu サーバーを置いて「ホームラボ」を作るとき、最大の難関がネットワーク設計です。何も考えずに全機器を同じセグメントに入れると、安いスマート家電が1台乗っ取られただけで、同じネットワークにいる PC やサーバーまで一気に危険にさらされます。本記事では Ubuntu 24.04 LTS を使い、VLAN でネットワークを3つに分割し、DMZ を設けて公開サービスを隔離し、WireGuard VPN でリモートアクセスを安全にする構成を、実際にコマンドを動かして確認しながら解説します。

結論から言うと、Ubuntu 24.04(iproute2 6.1.0)では ip link add type vlan で VLAN を、ip link add type bridge で DMZ ブリッジを作れます。検証はすべて ubuntu:24.04 の公式Dockerイメージ(--privileged)で実行し、返ってきた実出力をそのまま載せています(2026-06-14 実測)。

この記事のポイント

  • Ubuntu 24.04(iproute2 6.1.0)の ip link add type vlan で VLAN 10/20/30 を作成し、/proc/net/vlan/config で 802.1Q を実確認した
  • nftables v1.0.9 の forward チェインで DMZ→LAN を drop し、横断侵害(ラテラルムーブメント)を遮断する
  • WireGuard の鍵は wg genkey | wg pubkey で生成。公開鍵は44文字(=32バイト)で、wg-quick@.service がパッケージに同梱されている
  • SSH は ed25519 鍵が最適。公開鍵はわずか101バイトで、RSA-3072(571バイト)の約1/5.7だった(実測)
  • Ubuntu 22.04 → 24.04 で nftables は 1.0.2 → 1.0.9、iproute2 は 5.15 → 6.1 と世代が新しく、ホームラボ構築に有利

目次

  1. ホームラボネットワークの全体設計
  2. 前提環境・必要なパッケージ
  3. VLAN でネットワークを分割する
  4. DMZ ブリッジを作成する
  5. nftables でファイアウォールを設定する
  6. WireGuard VPN を設定する
  7. SSH 鍵認証を設定する
  8. Ubuntu 22.04 vs 24.04 パッケージ比較
  9. よくあるエラーと解決策
  10. まとめ

ホームラボネットワークの全体設計

ホームラボでよく使われる構成が「3セグメント分離」です。ルーターと Ubuntu サーバーの間で VLAN を張り、用途ごとにトラフィックを分けます。全体像は次のイメージです。

自宅ホームラボ ネットワーク全体構成(概念図)
自宅ホームラボ ネットワーク全体構成(概念図)

この構成のポイントは次の3つです。

  • VLAN 10(LAN):PC・スマホなど信頼できる自分のデバイスのみ。192.168.10.0/24
  • VLAN 20(DMZ):外部に公開するサービス(Nginx・Nextcloud など)を置く非武装地帯。192.168.20.0/24
  • VLAN 30(IoT):スマート家電・監視カメラなど信頼できないデバイス。192.168.30.0/24

DMZ から LAN への直接通信は nftables の forward チェインで drop します。WireGuard VPN(UDP 51820)経由でなら、外出先から LAN に安全にアクセスできます。VLAN・DMZ・VPN という3つの言葉が出てきましたが、この後それぞれ実際にコマンドで作っていくので心配いりません。

著者アイコン
著者アイコン

正直、最初からここまで作らなくても大丈夫です。まず VLAN 10(LAN)と VLAN 20(DMZ)の2セグメントだけ作って慣れてから、IoT 用の VLAN 30 を足す流れがおすすめです。いきなり全部やると、どこで詰まったか分からなくなります。

前提環境・必要なパッケージ

本記事は次の環境で検証しています。

  • 検証環境:ubuntu:24.04 公式Dockerイメージ(--privileged / arm64)
  • 実機・VPS では Ubuntu 24.04 LTS 推奨。NIC が VLAN タギング(802.1Q)に対応している必要があります
  • 実行日:2026-06-14

VLAN(仮想LAN)は、1本の物理ネットワークを論理的に複数に分ける技術です。まず必要なパッケージをまとめてインストールします。iproute2ip コマンド本体、nftables はファイアウォール、wireguard-tools は VPN、openssh-server は SSH サーバーです。




ubuntu@homelab: ~
$ sudo apt update
$ sudo apt install -y iproute2 bridge-utils wireguard-tools nftables openssh-server
# インストール後にバージョンを確認
$ ip -V
ip utility, iproute2-6.1.0, libbpf 1.3.0
$ nft –version
nftables v1.0.9 (Old Doc Yak #3)
$ wg –version
wireguard-tools v1.0.20210914 – https://git.zx2c4.com/wireguard-tools/

Ubuntu 24.04 では iproute2 が 6.1.0、nftables が v1.0.9、wireguard-tools が 1.0.20210914-1ubuntu4 でした。これらはすべて公式Dockerイメージで実際に apt install 後に取得したバージョンです。22.04 との具体的な差分は後半の比較表でまとめます。

VLAN でネットワークを分割する

VLAN(Virtual LAN)は1本の物理ネットワークを論理的に複数に分ける技術です。Ubuntu では ip link add type vlan コマンドで VLAN インターフェースを作成します。

手順1:8021q カーネルモジュールを確認する

VLAN を使うには 8021q というカーネルモジュールが必要です。実機やVPSでは sudo modprobe 8021q で読み込みます。今回の検証環境(Docker)ではカーネルに最初から組み込まれており、modprobe は「すでにロード済み」と返しました。

実機・VPS では永続化を忘れずに

再起動後も自動で読み込むには echo "8021q" | sudo tee /etc/modules-load.d/8021q.conf を実行しておきます。これを忘れると、再起動後に VLAN 作成が Operation not supported で失敗します。

手順2:VLAN インターフェースを作成する

検証では親NICとして lab0 という名前の検証用インターフェースを使いました。実機では lab0 をあなたの物理NIC名(ip link show で確認できる eth0enp3s0 など)に置き換えてください。実際に VLAN 10/20/30 を作成した結果がこちらです。

VLAN インターフェース作成の実測結果(Ubuntu 24.04)
VLAN インターフェース作成の実測結果(Ubuntu 24.04)



ubuntu@homelab: ~
# VLAN 10(LAN)を親NIC lab0 上に作成
$ sudo ip link add link lab0 name lab0.10 type vlan id 10
$ sudo ip link set lab0.10 up
$ sudo ip addr add 192.168.10.1/24 dev lab0.10
# VLAN 20(DMZ)・VLAN 30(IoT)も同様に作成
$ sudo ip link add link lab0 name lab0.20 type vlan id 20
$ sudo ip link add link lab0 name lab0.30 type vlan id 30

# VLAN 設定を確認する
$ cat /proc/net/vlan/config
VLAN Dev name | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
lab0.10 | 10 | lab0
lab0.20 | 20 | lab0
lab0.30 | 30 | lab0

# 802.1Q タグが付いていることを確認
$ ip -d link show lab0.20
vlan protocol 802.1Q id 20 <REORDER_HDR>

# ルーティングテーブルに3セグメントが追加された
$ ip route show
192.168.10.0/24 dev lab0.10 proto kernel scope link src 192.168.10.1
192.168.20.0/24 dev lab0.20 proto kernel scope link src 192.168.20.1
192.168.30.0/24 dev lab0.30 proto kernel scope link src 192.168.30.1

cat /proc/net/vlan/config に VLAN ID 10/20/30 が並び、ip -d link showvlan protocol 802.1Q が確認できました。ip route show にも3セグメントが追加されています。これは ubuntu:24.04(iproute2 6.1.0)コンテナで実際に実行した出力です。

手順3:再起動後も設定を維持する(Netplan)

上記の ip link コマンドは再起動すると消えます。永続化するには Netplan(Ubuntu の標準ネットワーク設定)に記述します。link には実機の物理NIC名を指定してください。




ubuntu@homelab: ~
$ sudo nano /etc/netplan/99-homelab.yaml
# 以下を記述して保存(link はあなたのNIC名に変更):
network:
version: 2
vlans:
vlan10:
id: 10
link: eth0
addresses: [192.168.10.1/24]
vlan20:
id: 20
link: eth0
addresses: [192.168.20.1/24]
vlan30:
id: 30
link: eth0
addresses: [192.168.30.1/24]
$ sudo netplan apply
# エラーが出なければ設定完了

DMZ ブリッジを作成する

DMZ(非武装地帯)は外部に公開するサービスを置くセグメントです。Ubuntu では Linux ブリッジを使って DMZ 用の仮想スイッチを作れます。ip link add type bridge でブリッジを作り、そこに DMZ の VLAN を接続します。実際に作成した結果がこちらです。

DMZ 用ブリッジ br-dmz 作成の実測(Ubuntu 24.04)
DMZ 用ブリッジ br-dmz 作成の実測(Ubuntu 24.04)



ubuntu@homelab: ~
# DMZ 用ブリッジ br-dmz を作成
$ sudo ip link add name br-dmz type bridge
$ sudo ip link set br-dmz up
$ sudo ip addr add 10.10.0.1/24 dev br-dmz
# DMZ VLAN(lab0.20)をブリッジに接続
$ sudo ip link set lab0.20 master br-dmz

$ ip link show master br-dmz
6: lab0.20@lab0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500
master br-dmz state UP mode DEFAULT group default

$ ip -d link show type bridge
4: br-dmz: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
bridge … vlan_protocol 802.1Q stp_state 0

ip link show master br-dmz で、DMZ VLAN が master br-dmz として state UP で接続されていることを実確認しました。実際のホームラボでは、Docker コンテナの公開サービス(Nginx・Nextcloud など)をこの br-dmz に接続します。Docker では --network オプションか Docker Compose の networks セクションで指定できます。

nftables でファイアウォールを設定する

nftables は Ubuntu 標準のパケットフィルタで、iptables の後継です。VLAN セグメント間のトラフィック制御に使います。Ubuntu 24.04 では nftables v1.0.9 が入ります。テーブルとチェインを作り、ルールを投入したあと nft list ruleset で出力した実結果が次です。

nftables でホームラボ用ファイアウォールを設定(Ubuntu 24.04 実測)
nftables でホームラボ用ファイアウォールを設定(Ubuntu 24.04 実測)



ubuntu@homelab: ~
# テーブルとチェインを作成(input は policy drop でデフォルト拒否)
$ sudo nft add table inet homelab
$ sudo nft add chain inet homelab input ‘{ type filter hook input priority 0; policy drop; }’
$ sudo nft add chain inet homelab forward ‘{ type filter hook forward priority 0; policy drop; }’
# 必要な通信だけ許可
$ sudo nft add rule inet homelab input tcp dport 22 accept
$ sudo nft add rule inet homelab input tcp dport { 80, 443 } accept
$ sudo nft add rule inet homelab input udp dport 51820 accept
# DMZ(eth0.20)から LAN(eth0.10)・IoT(eth0.30)への通信を遮断
$ sudo nft add rule inet homelab forward iifname “eth0.20” oifname “eth0.10” drop
$ sudo nft add rule inet homelab forward iifname “eth0.20” oifname “eth0.30” drop

$ sudo nft list ruleset
table inet homelab {
chain input {
type filter hook input priority filter; policy drop;
tcp dport 22 accept
tcp dport { 80, 443 } accept
udp dport 51820 accept
}
chain forward {
type filter hook forward priority filter; policy drop;
iifname “eth0.20” oifname “eth0.10” drop
iifname “eth0.20” oifname “eth0.30” drop
}
}

上の出力はコンテナで実際に nft list ruleset を叩いた結果です(VLAN名は実機例として eth0.20 表記にしています)。input は policy drop で、SSH(22)・HTTP/HTTPS(80,443)・WireGuard(51820) だけ通します。forward では DMZ から LAN・IoT への通信を drop しています。

注意:policy drop の前に SSH の許可ルールを入れること

policy drop を設定した後に SSH の許可ルールを追加すると、その瞬間にロックアウトされてサーバーに入れなくなります。必ず先に tcp dport 22 accept を追加してから policy drop にするか、コンソール(VNC/シリアル)アクセスが使える状態で作業してください。ここだけは順番を間違えると致命的です。

DMZ から LAN への直接通信を遮断すると、たとえば DMZ の Nextcloud が侵害されても、攻撃者は LAN 内の PC へ横移動できません。これがDMZ 分離の最大のメリットです。設定を永続化するには sudo nft list ruleset | sudo tee /etc/nftables.conf で保存し、sudo systemctl enable nftables を実行します。

WireGuard VPN を設定する

WireGuard は Ubuntu 標準の VPN プロトコルで、設定ファイルが20行程度で完成するのが特徴です。外出先のスマホから自宅 LAN にアクセスする構成を作ります。

手順1:鍵ペアを生成する

鍵は wg genkey | wg pubkey の2コマンドで生成します。実際に生成した公開鍵と、鍵の長さを確認した結果がこちらです。

WireGuard 鍵ペア生成の実測(Ubuntu 24.04)
WireGuard 鍵ペア生成の実測(Ubuntu 24.04)



ubuntu@homelab: ~
# サーバーの鍵ペアを生成(秘密鍵は表示しない)
$ SERVER_PRIV=$(wg genkey)
$ echo “$SERVER_PRIV” | wg pubkey
XlGFLCzTPT8EVd7NZgFiaBpNyWsyT6ll75mPP7g2sCo=
# 秘密鍵の長さを確認(Base64 44文字 = 32バイト = 256bit)
$ echo -n “$SERVER_PRIV” | wc -c
44
$ echo -n “$SERVER_PRIV” | base64 -d | wc -c
32
# 秘密鍵をファイルに保存(権限 600 で保護)
$ echo “$SERVER_PRIV” | sudo tee /etc/wireguard/server_private.key
$ sudo chmod 600 /etc/wireguard/server_private.key

wg genkey が生成する秘密鍵は Base64 で44文字、デコードすると32バイト(256bit)でした。これは ubuntu:24.04 で実際に生成・計測した値です。

手順2:wg0.conf を作成してサービスを起動する

設定ファイル /etc/wireguard/wg0.conf を作り、wg-quick で起動します。wireguard-tools をインストールすると wg-quick@.service が自動で同梱されるので、systemctl enable だけで自動起動にできます。これも実際に dpkg -L で確認しました。




ubuntu@homelab: ~
$ sudo nano /etc/wireguard/wg0.conf
# サーバー側の設定ファイル(20行ほど):
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <server_private.key の内容>

[Peer]
PublicKey = <クライアントの公開鍵>
AllowedIPs = 10.0.0.2/32

# パッケージが wg-quick の systemd ユニットを同梱している
$ dpkg -L wireguard-tools | grep wg-quick@.service
/usr/lib/systemd/system/wg-quick@.service
# 起動して自動起動を有効化
$ sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] ip -4 address add 10.0.0.1/24 dev wg0
$ sudo systemctl enable wg-quick@wg0
Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service

wg-quick@wg0.service として systemd に登録すれば、再起動後も自動で VPN が立ち上がります。クライアント(スマホ・ノートPC)側でも同じく wg genkey | wg pubkey で鍵を作り、サーバーの公開鍵と Endpoint(自宅のグローバルIPまたはDDNS:51820)を設定すれば接続できます。

SSH 鍵認証を設定する

ホームラボの管理アクセスは必ず SSH 鍵認証にします。パスワード認証は総当たり攻撃のリスクがあるためです。ed25519 鍵は RSA より圧倒的に短くて安全で、ホームラボ用途に最適です。実際にどれくらい短いのか、RSA-3072 と比べてみました。

SSH ed25519 鍵生成とサイズ比較の実測(Ubuntu 24.04)
SSH ed25519 鍵生成とサイズ比較の実測(Ubuntu 24.04)



admin@homelab: ~
$ ssh -V
OpenSSH_9.6p1 Ubuntu-3ubuntu13.16, OpenSSL 3.0.13 30 Jan 2024
# ed25519 鍵ペアを生成
$ ssh-keygen -t ed25519 -f ~/.ssh/homelab_key -N “” -C “admin@homelab.local”
$ ssh-keygen -l -f ~/.ssh/homelab_key.pub
256 SHA256:866trKTiDwso2z+n3lgqxq4XzKsA2iFT5VajcmdO3Uk admin@homelab.local (ED25519)
# 公開鍵のバイト数を RSA-3072 と比較
$ wc -c < ~/.ssh/homelab_key.pub # ed25519
101
$ wc -c < ~/.ssh/rsa_key.pub # RSA-3072 (default)
571
# 公開鍵をサーバーにコピー
$ ssh-copy-id -i ~/.ssh/homelab_key.pub admin@192.168.10.10
# パスワード認証を無効化
$ sudo sed -i ‘s/#PasswordAuthentication yes/PasswordAuthentication no/’ /etc/ssh/sshd_config
$ sudo systemctl restart ssh

OpenSSH_9.6p1 で生成した ed25519 の公開鍵はわずか101バイト。一方 RSA-3072 のデフォルト鍵は571バイトで、ed25519 は約1/5.7の大きさでした。それでいて ed25519 は256bit のセキュリティ強度を持つので、短さと安全性を両立できます。フィンガープリント SHA256:866trKTiDwso2z+n3lgqxq4XzKsA2iFT5VajcmdO3Uk は実際に ssh-keygen -l で取得した値です。

Ubuntu 22.04 vs 24.04 パッケージ比較

ホームラボを新規に構築するなら Ubuntu 24.04 LTS が有利です。ubuntu:22.04ubuntu:24.04 の両方で apt-cache policy を叩き、ネットワーク関連パッケージの Candidate バージョンを実測比較しました。

Ubuntu 22.04 vs 24.04 ネットワーク関連パッケージ比較(実測)
Ubuntu 22.04 vs 24.04 ネットワーク関連パッケージ比較(実測)
パッケージ Ubuntu 22.04 LTS Ubuntu 24.04 LTS 主な変化
iproute2 5.15.0-1ubuntu2.1 6.1.0-1ubuntu6.3 5.15 → 6.1 にメジャー更新
wireguard-tools 1.0.20210914-1ubuntu2 1.0.20210914-1ubuntu4 Ubuntuパッチのみ
nftables 1.0.2-1ubuntu3.1 1.0.9-1ubuntu0.1 1.0.2 → 1.0.9(セット操作改善)
openvpn 2.5.11-0ubuntu0.22.04.3 2.6.19-0ubuntu0.24.04.2 2.5 → 2.6 系(DCO対応)
bridge-utils 1.7-1ubuntu3 1.7.1-1ubuntu2 マイナー更新

特に nftables が 1.0.2 → 1.0.9 と7マイナー分新しいのが大きいです。新しい nftables はセット操作やエラーメッセージが分かりやすく、複雑なルールを書くときに楽になります。iproute2 も 5.15 → 6.1 とメジャー更新されており、ip コマンドの挙動が安定しています。なお WireGuard はどちらも同じ 1.0.20210914 系で、機能差はほぼありません。

よくあるエラーと解決策

①「RTNETLINK answers: Operation not supported」

VLAN 作成時に出るエラーです。8021q モジュールが読み込まれていないのが原因です。実機・VPSでは次のように modprobe で解決します。




ubuntu@homelab: ~
$ sudo ip link add link eth0 name eth0.10 type vlan id 10
RTNETLINK answers: Operation not supported
# 解決策: 8021q モジュールを読み込む
$ sudo modprobe 8021q
$ sudo ip link add link eth0 name eth0.10 type vlan id 10
# エラーなしで作成完了

② ブリッジ作成で「Error: Unknown device type.」

古いカーネルや、iproute2 がブリッジ機能を持たない環境で起きます。Ubuntu 24.04 標準の iproute2 6.1.0 なら ip link add type bridge がそのまま使えます。念のため bridge-utils を入れておくと brctl 系コマンドも使えます。




ubuntu@homelab: ~
$ sudo apt install -y bridge-utils
$ sudo ip link add name br-dmz type bridge
# 解決

③ WireGuard で「Key length is not 32 bytes」

鍵にスペースや改行が混入した場合のエラーです。wg genkey で生成した秘密鍵は必ず Base64 44文字(=32バイト)になります。長さを確認しましょう。




ubuntu@homelab: ~
$ cat /etc/wireguard/server_private.key | wc -c
45
# 44文字 + 改行 = 45 が正常。45以外なら鍵が壊れている
$ wg genkey | sudo tee /etc/wireguard/server_private.key
$ sudo chmod 600 /etc/wireguard/server_private.key

④ SSH ロックアウトを防ぐ

nftables で policy drop を設定した後、SSH ポート22の許可ルールを入れ忘れるとサーバーに入れなくなります。設定前に必ず次をチェックしてください。

チェックリスト:nftables の policy drop 前に確認

nft list rulesettcp dport 22 accept があること ② VPS のコンソール(VNC/シリアル)アクセスが使える状態であること ③ 別ターミナルで自分のIPからの SSH 接続が生きていることを確認済みであること。この3点が揃ってから policy drop にしましょう。

まとめ

自宅ホームラボのネットワーク設計として、Ubuntu 24.04 LTS で以下の構成を実測しました。

  • ip link add type vlan で VLAN 10/20/30 を作成し、/proc/net/vlan/config と 802.1Q proto を確認
  • ip link add type bridge で DMZ 用ブリッジ br-dmz を作成し、VLAN を master 接続(state UP)
  • nftables v1.0.9 で input を policy drop にし、forward で DMZ→LAN/IoT を drop して横断侵害を遮断
  • WireGuard で 44文字(32バイト)の鍵を生成。wg-quick@.service の同梱を dpkg -L で確認
  • SSH は ed25519 鍵に限定。公開鍵101バイトと RSA-3072(571バイト)の差を実測
  • Ubuntu 24.04 は iproute2 6.1.0 / nftables 1.0.9 と新しく、ホームラボ構築に有利

この構成は VPS 上でもそのまま再現できます。自宅に固定IPがなくても、VPS を1台借りれば同等のホームラボ環境を持てます。まずは Vultr などの安価なプランで試してみるのがおすすめです。

VPS の選び方については VPS速度比較ベンチマーク記事 も参考にしてください。Ubuntu のネットワーク設定の基礎は ネットワーク設定ガイド も合わせてご覧ください。

コメント

タイトルとURLをコピーしました