🚀 はじめに:この記事でできること
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-toolsにwg/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は外向きインターフェースの一例。環境によりens3やwlan0等に置換してください(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_publickeyとEndpointを控えている
# 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
- クライアント
AllowedIPs:192.168.1.0/24(家庭LANのみ) - ルーターで UDP 51820 を自宅サーバーへポートフォワード
- B)公共Wi-Fiで「すべての通信」をVPNへ
- サーバー:クラウドVPS(近いリージョン)
- クライアント
AllowedIPs:0.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
- 例:拠点A=
- それぞれにサーバーを立て、双方の
🔍 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_forwardが1になっている - UFWやクラウドSGで UDP 51820 が許可されている
- ルーターのポートフォワード先が 正しい内部IP(固定DHCP推奨)
-
wg0.confのPostUp/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 pages(
wg/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-holeやUnboundに切り替える
目的
- 広告・トラッカー遮断、名前解決の一元管理、プライバシー強化
結果(この時点でできること)
- VPN接続中のすべての端末に、統一したDNSポリシーを適用できる
補足
client.confのDNS=を VPN内DNS(例:10.8.0.1)に変更します。
2. IPv6対応(デュアルスタック化)
操作
AddressやAllowedIPsに 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"
