自宅に 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 と世代が新しく、ホームラボ構築に有利
目次
- ホームラボネットワークの全体設計
- 前提環境・必要なパッケージ
- VLAN でネットワークを分割する
- DMZ ブリッジを作成する
- nftables でファイアウォールを設定する
- WireGuard VPN を設定する
- SSH 鍵認証を設定する
- Ubuntu 22.04 vs 24.04 パッケージ比較
- よくあるエラーと解決策
- まとめ
ホームラボネットワークの全体設計
ホームラボでよく使われる構成が「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つの言葉が出てきましたが、この後それぞれ実際にコマンドで作っていくので心配いりません。
前提環境・必要なパッケージ
本記事は次の環境で検証しています。
- 検証環境:
ubuntu:24.04公式Dockerイメージ(--privileged/ arm64) - 実機・VPS では Ubuntu 24.04 LTS 推奨。NIC が VLAN タギング(802.1Q)に対応している必要があります
- 実行日:2026-06-14
VLAN(仮想LAN)は、1本の物理ネットワークを論理的に複数に分ける技術です。まず必要なパッケージをまとめてインストールします。iproute2 は ip コマンド本体、nftables はファイアウォール、wireguard-tools は VPN、openssh-server は SSH サーバーです。
$ 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 で確認できる eth0 や enp3s0 など)に置き換えてください。実際に VLAN 10/20/30 を作成した結果がこちらです。

$ 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 show で vlan protocol 802.1Q が確認できました。ip route show にも3セグメントが追加されています。これは ubuntu:24.04(iproute2 6.1.0)コンテナで実際に実行した出力です。
手順3:再起動後も設定を維持する(Netplan)
上記の ip link コマンドは再起動すると消えます。永続化するには Netplan(Ubuntu の標準ネットワーク設定)に記述します。link には実機の物理NIC名を指定してください。
# 以下を記述して保存(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 を接続します。実際に作成した結果がこちらです。

$ 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 で出力した実結果が次です。

$ 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コマンドで生成します。実際に生成した公開鍵と、鍵の長さを確認した結果がこちらです。

$ 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 で確認しました。
# サーバー側の設定ファイル(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 と比べてみました。

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.04 と ubuntu:24.04 の両方で apt-cache policy を叩き、ネットワーク関連パッケージの Candidate バージョンを実測比較しました。

| パッケージ | 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 で解決します。
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 系コマンドも使えます。
$ sudo ip link add name br-dmz type bridge
# 解決
③ WireGuard で「Key length is not 32 bytes」
鍵にスペースや改行が混入した場合のエラーです。wg genkey で生成した秘密鍵は必ず Base64 44文字(=32バイト)になります。長さを確認しましょう。
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 ruleset に tcp 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 のネットワーク設定の基礎は ネットワーク設定ガイド も合わせてご覧ください。



コメント