🚀 はじめに:この記事でできること

WireGuardベースのVPNサーバーを最短手順で構築し、ノートPC/スマホから自宅ネットワークへ安全に接続できる状態を作ります。公共Wi-Fi利用時もクラウドVPS経由で通信を保護できるように、操作→目的→結果→注意/補足の順で迷わず進められる構成です。

対象読者

  • 技術初心者〜中級者(Linuxを触り始めた方を含む)
  • 「エラーで詰まりたくない」「確実に動く手順が欲しい」方
  • 自宅NAS、Raspberry Pi、Ubuntu/Debianサーバー、クラウドVPSを活用したい方

🧭 前提:環境・用語・成功の条件

この章では、以降の設定がスムーズに進むよう、環境差・用語・ネットワーク前提を整理します。

操作

  • 対象OSと必要権限、ネットワーク要件を確認する

目的

  • 以降の手順で「設定は正しいのに繋がらない」を防ぐ土台を作る

前提

  • 対象OS:Ubuntu 22.04/24.04、Debian 12、Raspberry Pi OS(Bullseye/Bookworm)
  • サーバー:自宅機 or クラウドVPS
  • 管理者権限:sudo が使えること
  • 自宅用はルーターで UDP 51820 をサーバーへポートフォワード可能

結果(この時点でできること)

  • 自分の環境に必要な準備物(ポート開放、権限、OS対応)を把握できる

用語メモ

  • Peer:VPNの参加者(サーバー/クライアント)
  • AllowedIPs:VPN経由で通す宛先プレフィックス(ルーティングの要)
  • Endpoint:接続先のグローバルIP/ドメインとポート(例:vpn.example.com:51820

注意

  • CGNAT(一部ISP)でグローバルIPが割り当てられないと自宅側ポートフォワード不可。対策:クラウドVPS経由で構築、または管理型WireGuard(例:Tailscale等)を検討。

🧩 準備:インストールとベース設定

この章では、WireGuardと周辺設定(IPフォワーディング・UFW)を安全に適用します。

1-1. パッケージのインストール(Ubuntu/Debian)

操作

  • パッケージ更新と WireGuard / UFW をインストールする

目的

  • WireGuardのコマンド群(wg/wg-quick)とファイアウォールを導入

前提

  • apt が利用可能、ネットワーク接続がある
# パッケージ更新とWireGuard/UFWのインストール
sudo apt update
sudo apt install -y wireguard wireguard-tools ufw

結果(この時点でできること)

  • wg/wg-quick が使えるようになり、UFWでポート制御できる

補足
wireguard-toolswg / wg-quick が含まれます。

1-2. IPv4フォワーディングの有効化

操作

  • IPフォワーディングを永続化し、現在値を確認する

目的

  • VPN内クライアントと外部ネットワークの疎通を成立させるための転送を許可

前提

  • sysctl でカーネルパラメータを設定可能
# フォワーディングの永続化
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-wireguard-ipforward.conf
sudo sysctl --system  # 設定の読み直し
# 現在値の確認(1になっていればOK)
sysctl net.ipv4.ip_forward

結果(この時点でできること)

  • net.ipv4.ip_forward=1 により、パケット転送が可能な状態になる

注意
一部クラウドでは追加のルーティングやセキュリティ設定が必要な場合があります(VPCルート等)。

1-3. UFW(ファイアウォール)の基本設定

操作

  • SSHを許可し、WireGuardのUDP 51820を許可した後、UFWを有効化する

目的

  • リモート管理を失わずにVPN用ポートを安全に開ける

前提

  • サーバーにSSHで接続中、UFWが未設定または設定変更可能
# SSHは必ず許可(リモートから閉め出されないように)
sudo ufw allow OpenSSH
# WireGuardの標準ポート(UDP 51820)を許可
sudo ufw allow 51820/udp
# UFWを有効化
sudo ufw enable
# ステータス確認
sudo ufw status verbose

結果(この時点でできること)

  • SSH継続しつつ、WireGuard待受ポートが外部から到達可能

注意
クラウドVPSではプロバイダ側のセキュリティグループ(例:Lightsail/AWS/GCP/Azure)でも UDP 51820 を開放してください。


⚙️ Step 2:サーバー設定と起動

WireGuardの鍵生成、wg0.conf の作成、起動〜自動起動の設定までを行います。

2-1. 鍵の作成(サーバー)

操作

  • /etc/wireguard を作成・権限設定し、秘密鍵/公開鍵を生成する

目的

  • 安全な鍵ペアを用意し、設定ファイルに組み込む準備をする

前提

  • sudo で管理者操作が可能、ファイル保存先の権限管理を理解している
# サーバー鍵を作成(権限に注意)
sudo mkdir -p /etc/wireguard
sudo chmod 700 /etc/wireguard
cd /etc/wireguard
# 秘密鍵と公開鍵を生成(umaskで安全に)
sudo bash -c 'umask 077; wg genkey | tee server_privatekey | wg pubkey > server_publickey'
# 値確認(後で設定ファイルに貼り付けます)
sudo cat server_privatekey
sudo cat server_publickey

結果(この時点でできること)

  • サーバー用の鍵ペアが生成され、wg0.conf に貼り付け可能

注意
鍵ファイルは 権限600、ディレクトリは 700 を徹底。秘密情報の流出を防止します。

2-2. サーバー設定ファイル(/etc/wireguard/wg0.conf

操作

  • インターフェース、鍵、待受ポート、NAT/フォワード設定を記述する

目的

  • サーバーがクライアントからのトンネルを受け付け、LAN/インターネットへルーティングできるようにする

前提

  • 外向きインターフェース名(例:eth0/ens3/enp0s3/wlan0)を把握している
# /etc/wireguard/wg0.conf
[Interface]
# サーバー側のVPN内アドレス(例:10.8.0.1/24)
Address = 10.8.0.1/24
# 秘密鍵(先ほど生成した server_privatekey の中身)
PrivateKey = <ここに server_privatekey の内容を貼り付け>
# 待受ポート(ルーター/クラウド側もUDPで開放)
ListenPort = 51820

# NATとフォワード(iptables版)
PostUp   = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; \
           iptables -A FORWARD -i wg0 -j ACCEPT; \
           iptables -A FORWARD -o wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; \
           iptables -D FORWARD -i wg0 -j ACCEPT; \
           iptables -D FORWARD -o wg0 -j ACCEPT

# クライアント(Peer)はこの下に追記していく
# 例は Step 3 で解説

結果(この時点でできること)

  • サーバーがWireGuardトンネルを受け付け、必要なNAT/フォワードが適用される

補足
eth0 は外向きインターフェースの一例。環境により ens3wlan0 等に置換してください(ip -o link show で確認)。
nftables派iptables の代わりに nft -f で同等ルールを適用できます。

2-3. 起動と自動起動設定

操作

  • インターフェースを起動し状態確認、再起動後も自動起動を設定する

目的

  • サーバー再起動時もVPNが自動的に立ち上がるようにする

前提

  • wg-quick と systemd が利用可能
# 起動(エラーが出たら設定ファイルの綴りや鍵を再確認)
sudo wg-quick up wg0
# 状態確認(Peerの有無、インターフェースなど)
sudo wg show
# 再起動後も自動起動させる
sudo systemctl enable wg-quick@wg0
# 停止/再起動方法
sudo wg-quick down wg0
sudo systemctl restart wg-quick@wg0

結果(この時点でできること)

  • wg0 が起動し、次章のクライアント登録に進める状態になる

🖥️ Step 3:クライアント登録と用途別設定

クライアント鍵と設定ファイルを作成し、目的に応じてルーティングを選びます。

3-1. クライアント鍵の生成(サーバー側で管理)

操作

  • サーバーでクライアント用の鍵ペアを生成して控える(例:client1)

目的

  • クライアント設定を安全・統一的に配布しやすくする

前提

  • /etc/wireguard の権限管理が適切
# クライアント鍵の生成(client1)
cd /etc/wireguard
sudo bash -c 'umask 077; wg genkey | tee client1_privatekey | wg pubkey > client1_publickey'
sudo cat client1_privatekey
sudo cat client1_publickey

結果(この時点でできること)

  • client1_privatekey / client1_publickey が用意でき、サーバー/クライアントに設定可能

注意
鍵の配布は安全な経路(SSH/scp/一時暗号化など)で行い、秘密鍵の取り扱いに注意。

3-2. サーバー側へ Peer を追記(wg0.conf

操作

  • クライアント情報を wg0.conf に追記し、設定を反映する

目的

  • サーバーがクライアントを認識し、適切なアドレス/ルートを付与する

前提

  • クライアント用IP割当を決めている(例:10.8.0.2/32
# wg0.conf に追記(サーバー側)
[Peer]
# クライアントの公開鍵
PublicKey = <client1_publickey の内容>
# このクライアントに割り当てるVPN内アドレス
# ここはクライアント側の設定に合わせる(10.8.0.2/32)
AllowedIPs = 10.8.0.2/32
# 必要に応じて NAT越えで安定させる
PersistentKeepalive = 25

結果(この時点でできること)

  • サーバーが client1 を受け付ける準備が完了し、再起動で反映可能

操作(反映)
sudo systemctl restart wg-quick@wg0

3-3. クライアント設定ファイル(PC/macOS/Windows)

操作

  • クライアント側の client1.conf を作成し、接続先・ルーティング方針を設定する

目的

  • 自宅LANのみ通す/全トラフィックをVPNへ通す等、目的に応じたルートを選択

前提

  • server_publickeyEndpoint を控えている
# client1.conf(PC向け)
[Interface]
Address = 10.8.0.2/32
PrivateKey = <client1_privatekey の内容>
DNS = 1.1.1.1

[Peer]
PublicKey = <server_publickey の内容>
# 自宅やVPSのグローバルIP/ドメインとポート
Endpoint = vpn.example.com:51820
# ルーティング方針:
# - 自宅ネットワークだけ通したい → 例: 192.168.1.0/24
# - すべての通信をVPN経由にしたい → 0.0.0.0/0, ::/0
AllowedIPs = 192.168.1.0/24
# AllowedIPs = 0.0.0.0/0, ::/0
# NAT越えで安定接続(家庭用ルーター経由なら推奨)
PersistentKeepalive = 25

結果(この時点でできること)

  • 目的に合ったルートでクライアントからサーバーへ接続可能

補足
Windows は公式「WireGuard」クライアント、macOS は App Store/公式サイト、Linux は wg-quick、スマホは iOS/Android の WireGuard アプリを利用。スマホは QR 読み込み対応。

3-4. 目的別の設定例

操作

  • 目的に応じて AllowedIPs とネットワーク側設定を調整する

目的

  • 自宅NASだけ/公共Wi-Fiで全通信保護/小規模拠点間を柔軟に実現

前提

  • サーバーが起動済み、UFW/ルーター/クラウドSGでUDP 51820が開放済み

結果(この時点でできること)

  • 代表的ユースケースに即した設定で多様な接続が可能

  • A)自宅NASだけ安全アクセス
    • サーバー:自宅側Raspberry Pi/Ubuntu
    • クライアント AllowedIPs192.168.1.0/24(家庭LANのみ)
    • ルーターで UDP 51820 を自宅サーバーへポートフォワード
  • B)公共Wi-Fiで「すべての通信」をVPNへ
    • サーバー:クラウドVPS(近いリージョン)
    • クライアント AllowedIPs0.0.0.0/0, ::/0(全トラフィックをVPNへ)
    • UFW/クラウドSGで UDP 51820 を開放
  • C)Site-to-Site(小規模拠点間)
    • それぞれにサーバーを立て、双方の AllowedIPs に相手拠点LANを記載
      • 例:拠点A=192.168.10.0/24、拠点B=192.168.20.0/24

🔍 Step 4:動作確認とトラブルシュート

接続状態の確認、典型的な詰まりの切り分けを行います。

操作

  • wg show、ログ、名前解決、MTUの順で確認する

目的

  • 「Handshakeはするのに通信が通らない」等の典型事象を迅速に解消

前提

  • サーバー/クライアントで基本設定が完了している
# 状態を見る(ハンドシェイク、転送バイト数など)
sudo wg show
# ログ確認(設定反映や起動失敗時)
journalctl -u wg-quick@wg0 --since "1 hour ago"

結果(この時点でできること)

  • 接続可否・疎通状況・原因の当たりが取れる

補足
DNSが未設定だと「接続はできるが名前解決できない」事象になりがち。DNS=1.1.1.1 等を設定し、社内DNSを使う場合はVPN内のDNSへ向ける。


⚠️ 注意・補足(初心者がハマりやすい点)

操作

  • インターフェース名、ポート開放、CGNAT、AllowedIPs、DNSを再確認する

目的

  • 典型的な詰まりを事前に回避

前提

  • ひと通り構築済み

結果(この時点でできること)

  • よくある落とし穴を未然に防ぎ、安定運用へ移行できる

注意

  • インターフェース名の違いeth0 ではなく ens3/enp0s3 の場合あり(ip -o link show で確認)。
  • ポート未開放:ルーター/クラウド側の UDP 51820 が閉じていると接続不可。
  • CGNAT問題:自宅側でグローバルIPがなくポートフォワード不可。クラウドVPS経由に切替。
  • AllowedIPsの設定ミス:Handshake成功でも通信不可の典型原因。目的に合う宛先を指定。
  • DNS未設定:名前解決できず「ネットが見えない」状態に。

補足(安全な進め方)

  • 鍵ファイルは 600、ディレクトリは 700
  • wg0.conf のバックアップは秘密情報を除外してバージョン管理。
  • 変更は小さく段階的に、ログで確認(journalctl -u wg-quick@wg0)。

✅ つまずきポイントのチェックリスト

  • sysctl net.ipv4.ip_forward1 になっている
  • UFWやクラウドSGで UDP 51820 が許可されている
  • ルーターのポートフォワード先が 正しい内部IP(固定DHCP推奨)
  • wg0.confPostUp/PostDownインターフェース名 が正しい
  • クライアントの Endpoint(ドメイン/IP・ポート)が正しい
  • AllowedIPs が目的に合致(LANのみか、全トラフィックか)
  • PersistentKeepalive=25 をNAT環境で設定している
  • wg show最新Handshake時刻 が更新されている
  • DNS設定(例:DNS=1.1.1.1)が有効で名前解決できる
  • MTUの問題が疑わしい場合、クライアントで MTU = 1280 を試した

📚 参考リンク(公式優先)

  • WireGuard 公式:https://www.wireguard.com/
  • Linux man pageswg / wg-quick):https://man7.org/linux/man-pages/
  • Debian Wiki(WireGuard):https://wiki.debian.org/WireGuard
  • Ubuntu Community Help(UFW):https://help.ubuntu.com/community/UFW
  • Arch Wiki(WireGuard 実践情報):https://wiki.archlinux.org/title/WireGuard
  • Tailscale(Managed WireGuardの代替/補完):https://tailscale.com/

🔧 拡張案(次にやると良いこと)

基本構築が完了したあとに取り組むと、セキュリティ・安定性・運用効率を一段引き上げられる施策です。

1. DNSを自前運用(広告ブロック・プライバシー向上)

操作

  • VPN内のDNSを Pi-holeUnbound に切り替える

目的

  • 広告・トラッカー遮断、名前解決の一元管理、プライバシー強化

結果(この時点でできること)

  • VPN接続中のすべての端末に、統一したDNSポリシーを適用できる

補足
client.confDNS= を VPN内DNS(例:10.8.0.1)に変更します。


2. IPv6対応(デュアルスタック化)

操作

  • AddressAllowedIPs に IPv6 プレフィックス(例:fd00::/64)を追加

目的

  • IPv6環境でもVPNを透過的に利用可能にする

結果(この時点でできること)

  • IPv4/IPv6の両方で一貫したVPN接続を提供できる

注意
ルーター・ISP・クラウド側がIPv6に対応している必要があります。


3. 管理の自動化(Peer追加を省力化)

操作

  • Ansibleなどで wg0.conf をテンプレート管理する

目的

  • クライアント追加・削除時のミスを減らし、作業時間を短縮

結果(この時点でできること)

  • ワンコマンドでPeer管理が可能になり、属人化を防げる

4. 可観測性の向上(監視・可視化)

操作

  • prometheus-node-exporter+Grafanaでメトリクスを収集

目的

  • トラフィック量・稼働状況・異常の早期検知

結果(この時点でできること)

  • VPNの状態をダッシュボードで把握し、安定運用につなげられる

5. 管理型WireGuardの併用・代替

操作

  • Tailscale / Headscale を検討する

目的

  • NAT越えやデバイス管理を簡略化し、運用負荷を下げる

結果(この時点でできること)

  • ポート開放不要で、多拠点・多デバイスを容易に接続できる

補足
自前構築のWireGuardと併用し、用途別に使い分けるのも有効です。


🎯 まとめ

  • WireGuardは 速い・軽い・簡単 で初心者に最適。
  • 手順は「インストール → 設定 → 起動 → クライアント登録」の4点を押さえればOK。
  • 多くの詰まりは フォワーディング/ポート/UFW/AllowedIPs/DNS の設定不備。
  • 自宅アクセス・安全な外出先利用・拠点間接続まで 用途に応じて拡張可能

📝 付録:よく使うコマンド早見表

操作

  • 状態確認、インターフェース操作、自動起動、ログ確認を素早く行う

目的

  • 日常の運用・障害対応を効率化

前提

  • wg-quick@wg0 を用いた構成
# 状態を見る(ハンドシェイク、転送バイト数など)
sudo wg show

# インターフェースを立ち上げ/下げる
sudo wg-quick up wg0
sudo wg-quick down wg0

# 自動起動設定
sudo systemctl enable wg-quick@wg0
sudo systemctl status wg-quick@wg0

# ログ確認(設定反映や起動失敗時)
journalctl -u wg-quick@wg0 --since "1 hour ago"