この文章はgpt-5.2によって生成し、人間がレビューしました。

概要

この文書では、WireGuardを用いて「VPNネットワーク内のみ通信可能(インターネット経由はしない)」な環境を構築する方法を解説します。
本例では、サーバーと複数のクライアント(例:Raspberry Piを含む)がVPN内で相互通信可能な「ハブ&スポーク型」(全クライアントがサーバー経由で通信)を構築します。


前提

  • サーバー: Ubuntuサーバー(例:vpnserver.example.com
  • クライアント: Raspberry PiやPCなど
  • VPN内アドレス: 10.100.0.0/24
  • サーバーのグローバルIP/ドメイン: vpnserver.example.com

1. 鍵の生成

各ノードで秘密鍵・公開鍵を生成する。

umask 077
wg genkey | tee privatekey | wg pubkey > publickey

備考:秘密鍵ファイル(privatekey)と公開鍵ファイル(publickey)は厳密な権限(600)で管理推奨。


2. サーバー側設定(例:/etc/wireguard/wg0.conf

[Interface]
Address = 10.100.0.1/24
ListenPort = 51820
PrivateKey = <サーバーの秘密鍵>

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

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

# 追加のクライアントも同様...

3. クライアント側設定(例:/etc/wireguard/wg0.conf, クライアント1の場合)

[Interface]
PrivateKey = <クライアント1の秘密鍵>
Address = 10.100.0.2/24

[Peer]
PublicKey = <サーバーの公開鍵>
Endpoint = vpnserver.example.com:51820
AllowedIPs = 10.100.0.0/24
PersistentKeepalive = 25
  • 他のクライアントも同様、Address/PrivateKey/公開鍵をそれぞれ変えて作成。

4. ポート開放

サーバーのUDP 51820ポートを必ず開放する(例: UFWの場合):

sudo ufw allow 51820/udp

5. サービス起動・自動起動設定

全ノードで下記のコマンドを実施。

sudo systemctl start wg-quick@wg0
sudo systemctl enable wg-quick@wg0

6. 接続テスト

  • サーバー/クライアント間でVPN内アドレス宛にpingを実行。
    • 例:ping 10.100.0.1
    • 例:ping 10.100.0.2
  • すべてのクライアントがサーバーを経由して相互通信できることを確認。

7. サーバーの設定上の注意点

  • サーバーの[Peer]セクションには全クライアントのPublicKeyとIP(/32)を1エントリずつ追加すること。
  • クライアントの設定AllowedIPsサブネット全体(例: 10.100.0.0/24を含めて、VPN内通信がサーバーへ流れるようにする。

8. ルーティング・フォワーディング設定

  • VPN内通信のみの場合、サーバーでのnet.ipv4.ip_forward等のパケット転送設定は不要
  • VPN経由でインターネット転送をしたい場合のみ、追加でiptables/NAT設定が必要となる(本例では不要)。

9. トラブルシューティング

  • サーバー/クライアントともsudo wgでハンドシェイクや通信量が増えているかを確認。
  • FirewallでVPNサブネットの通信がブロックされていないか注意。
    • UFW等を使う場合は sudo ufw allow from 10.100.0.0/24 も忘れずに。