WireGuardは、こうした悩みを解決するために開発されたモダンなVPNプロトコルです。OpenVPNと比べてコードベースが圧倒的に小さく、設定ファイルは数十行で書けます。Linuxカーネル5.6以降には標準で取り込まれており、RHEL9/Rocky Linux・Ubuntu 24.04では追加パッケージ1つでインストールできます。
この記事では、WireGuardをLinuxサーバーに構築する実践手順を解説します。動作確認環境はRHEL9/Rocky Linux 9・Ubuntu 24.04 LTS。鍵ペアの生成から/etc/wireguard/wg0.confの設定、wg-quickでの起動、firewalldとsysctlの設定まで、実際のコマンド出力を交えてステップバイステップで説明します。
この記事のポイント
・ WireGuardはOpenVPNより設定が大幅にシンプルで、速度も高速なVPNプロトコル
・ wg genkey / wg pubkeyコマンドで鍵ペアを生成し、wg0.confに記述する
・ wg-quickコマンドでVPNインターフェースを起動・停止でき、systemdで自動起動も設定できる
・ firewalldのMasqueradeとsysctlのIPフォワーディング有効化がサーバー必須設定
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
WireGuardとは何か(OpenVPNとの違い)
WireGuardは2016年にJason A. Donenfeldが開発を始めたVPNプロトコルです。2020年にLinuxカーネル5.6へ正式マージされ、現在ではRHEL9/Rocky Linux 9・Ubuntu 24.04など主要ディストリビューションで標準的に利用できます。OpenVPNと比較したときの最大の違いは、コードの規模です。OpenVPNが約70,000行のコードで構成されているのに対し、WireGuardは約4,000行しかありません。コードが少ないほどセキュリティ上の問題が起きにくく、審査もしやすいという原則があります。
| 比較項目 | WireGuard | OpenVPN |
|---|---|---|
| コード規模 | 約4,000行 | 約70,000行 |
| 設定ファイル | 数十行のシンプルなINI形式 | 数百行、証明書管理が必要 |
| カーネル統合 | Linux 5.6以降で標準 | ユーザー空間で動作 |
| 暗号方式 | ChaCha20/Poly1305(固定) | 複数の暗号スイートから選択 |
| 接続確立速度 | 高速(ハンドシェイクが少ない) | やや遅い(TLSネゴシエーション) |
WireGuardはUDPのみを使用し、デフォルトポートは51820番です。TCPを使わないためNATやファイアウォール越えで問題が起きることがありますが、その分スループットは高く、スマートフォンのモバイルネットワーク切替時の再接続も高速です。
主なユースケースは以下の2つです。
・リモートアクセスVPN:自宅PCやノートPCからLinuxサーバーのプライベートネットワークに接続する
・サイト間VPN:複数の拠点サーバーを仮想的に同一ネットワークに接続する
この記事では「リモートアクセスVPN」の構成を前提に手順を進めます。
動作環境とWireGuardのインストール
1. 動作環境の確認
WireGuardはLinuxカーネル5.6以降でカーネルモジュールとして利用できます。カーネルバージョンは以下のコマンドで確認してください。# カーネルバージョンの確認 uname -r # 出力例(RHEL9の場合) 5.14.0-427.31.1.el9_4.x86_64 # 出力例(Ubuntu 24.04の場合) 6.8.0-41-generic
2. RHEL9/Rocky Linux 9へのインストール
# wireguard-toolsをインストール(カーネルモジュールはEPEL不要・標準リポジトリで提供) sudo dnf install wireguard-tools -y # インストールの確認 wg --version # wireguard-tools v1.0.20210914 - https://git.zx2c4.com/wireguard-tools/
3. Ubuntu 24.04へのインストール
# wireguardパッケージをインストール(wireguard-toolsを含む) sudo apt install wireguard -y # インストールの確認 wg --version # wireguard-tools v1.0.20210914 - https://git.zx2c4.com/wireguard-tools/
鍵ペアを生成する
WireGuardは公開鍵暗号方式(Curve25519)を使います。サーバーとクライアントそれぞれに秘密鍵と公開鍵のペアが必要です。秘密鍵は絶対に外部に漏らさないこと。設定ファイルへの記述後も適切なパーミッション管理が必要です。1. サーバーの鍵ペアを生成する
サーバー上(Linuxサーバー)で実行します。# /etc/wireguard/ ディレクトリに鍵を生成 sudo wg genkey | sudo tee /etc/wireguard/server_private.key | sudo wg pubkey | sudo tee /etc/wireguard/server_public.key # 秘密鍵は他のユーザーから読めないようにする sudo chmod 600 /etc/wireguard/server_private.key # 確認(それぞれ44文字のBase64文字列が表示される) sudo cat /etc/wireguard/server_private.key # mNbvAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx= sudo cat /etc/wireguard/server_public.key # fGzKhyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy=
2. クライアントの鍵ペアを生成する
クライアントとなるPC(Linux)でも同様に鍵を生成します。クライアントがWindowsやmacOSの場合はWireGuardアプリから生成できますが、ここではLinuxクライアントでの手順を示します。# クライアント用の鍵を生成(ホームディレクトリ等の任意の場所) wg genkey | tee ~/client_private.key | wg pubkey > ~/client_public.key chmod 600 ~/client_private.key # 公開鍵の内容を確認(サーバーのwg0.confに記述する) cat ~/client_public.key # Qp1mZzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=
サーバー設定(/etc/wireguard/wg0.conf)
1. wg0.confを作成する
WireGuardの設定ファイルはINI形式で、[Interface]セクションと[Peer]セクションに分かれています。# サーバー上で設定ファイルを作成 sudo nano /etc/wireguard/wg0.conf
[Interface] # WireGuardインターフェースに割り当てるIPアドレス(VPN内のサーバーIP) Address = 10.0.0.1/24 # WireGuardが待ち受けるUDPポート番号 ListenPort = 51820 # サーバーの秘密鍵(/etc/wireguard/server_private.key の内容をそのまま貼る) PrivateKey = mNbvAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx= [Peer] # クライアントの公開鍵(client_public.key の内容) PublicKey = Qp1mZzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= # このクライアントに割り当てるVPN内IPアドレス AllowedIPs = 10.0.0.2/32
・ListenPort:WireGuardがUDPで待ち受けるポートです。ファイアウォールでこのポートの通信を許可する必要があります。
・PrivateKey:server_private.keyの内容をそのままコピーします。
・[Peer] の PublicKey:接続を許可するクライアントの公開鍵です。クライアントを追加するたびに[Peer]セクションを追加します。
・AllowedIPs:このクライアントに割り当てるVPN内IPアドレスです。クライアントごとに異なるアドレスを割り当てます。
設定ファイルのパーミッションも制限しておきます。
sudo chmod 600 /etc/wireguard/wg0.conf
2. wg-quickでVPNインターフェースを起動する
# VPNインターフェースを起動 sudo wg-quick up wg0 # 起動の確認(インターフェース一覧にwg0が表示されればOK) sudo wg show # 出力例 interface: wg0 public key: fGzKhyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy= private key: (hidden) listening port: 51820 # IPアドレスの確認 ip addr show wg0 # 4: wg0:
mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 # link/none # inet 10.0.0.1/24 scope global wg0 # valid_lft forever preferred_lft forever
3. systemdで自動起動を設定する
サーバーを再起動しても自動でWireGuardが起動するよう、systemdに登録します。# wg-quick@wg0 サービスを有効化して即座に起動 sudo systemctl enable --now wg-quick@wg0 # 状態確認 sudo systemctl status wg-quick@wg0 # 出力例 * wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0 Loaded: loaded (/usr/lib/systemd/system/wg-quick@.service; enabled; preset: disabled) Active: active (exited) since Mon 2026-08-11 10:00:00 JST; 5s ago
firewalldとsysctlの設定(NATフォワーディング)
クライアントからVPN経由でサーバーを通りインターネットにアクセスする構成(フルトンネル)や、サーバー背後のネットワークにアクセスする場合は、以下の2つの設定が必要です。VPN内(10.0.0.0/24)でのサーバー↔クライアント通信のみ行う場合はこの手順は不要ですが、設定しておくことを推奨します。1. IPv4フォワーディングの有効化
パケットのルーティング(転送)を有効にします。これをしないとWireGuardを通過したパケットがサーバー自身で止まります。# sysctl設定ファイルを作成 sudo tee /etc/sysctl.d/99-wireguard.conf << 'EOF' net.ipv4.ip_forward = 1 EOF # 設定を即時反映 sudo sysctl --system # 確認(1が表示されればOK) sysctl net.ipv4.ip_forward # net.ipv4.ip_forward = 1
2. firewalldでMasqueradeを設定する
WireGuard用のUDPポート開放と、NATマスカレードを設定します。# WireGuardのUDP 51820番を許可(permanent = 再起動後も有効) sudo firewall-cmd --zone=public --add-port=51820/udp --permanent # MasqueradeでVPN内のIPをサーバーのIPに変換(NATの設定) sudo firewall-cmd --zone=public --add-masquerade --permanent # 設定を再読み込み sudo firewall-cmd --reload # 設定確認 sudo firewall-cmd --zone=public --list-all # public # target: default # icmp-block-inversion: no # interfaces: # sources: # services: cockpit dhcpv6-client ssh # ports: 51820/udp # masquerade: yes # ...
なお、ポートの疎通確認方法についてはLinux ポート確認の全コマンドの記事も参考にしてください。
クライアント設定(LinuxクライアントからVPNに接続する)
1. クライアントのwg0.confを作成する
クライアント機(自分のPC)で設定ファイルを作成します。# クライアント用の設定ファイル sudo nano /etc/wireguard/wg0.conf
[Interface] # VPN内でクライアントが使うIPアドレス(サーバーのwg0.confのAllowedIPsと一致させる) Address = 10.0.0.2/24 # クライアントの秘密鍵 PrivateKey =
# クライアントが使用するDNSサーバー(任意) DNS = 8.8.8.8 [Peer] # サーバーの公開鍵(server_public.keyの内容) PublicKey = fGzKhyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy= # サーバーの実IPアドレス(グローバルIPまたはドメイン名)とポート番号 Endpoint = 203.0.113.10:51820 # VPN経由でルーティングするIPアドレス範囲 # 0.0.0.0/0 にするとすべての通信がVPN経由になる(フルトンネル) # 10.0.0.0/24 にするとVPN内のみVPN経由(スプリットトンネル) AllowedIPs = 10.0.0.0/24 # NAT環境やファイアウォール越えのためのキープアライブ(25秒ごとにパケット送信) PersistentKeepalive = 25
・AllowedIPs:0.0.0.0/0にするとすべての通信がVPN経由になります。VPN内のみ転送する場合は10.0.0.0/24など対象ネットワークだけを指定します。
・PersistentKeepalive:NAT環境下では接続が切れやすいため、25秒ごとにキープアライブパケットを送ることで接続を維持します。
2. wg-quickで接続する
# クライアント側でVPN接続を開始 sudo wg-quick up wg0 # 接続状態の確認 sudo wg show # 出力例(接続成功後) interface: wg0 public key: Qp1mZzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= private key: (hidden) listening port: 56789 peer: fGzKhyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy= endpoint: 203.0.113.10:51820 allowed ips: 10.0.0.0/24 latest handshake: 3 seconds ago transfer: 1.23 KiB received, 2.34 KiB sent
VPNを設定できる力は、セキュアなサーバー構築の「基礎」から来ます
WireGuardのような現代的なVPN構築には、Linuxの鍵管理・ネットワーク設計・firewalldの扱いを体系的に理解することが重要です。独学で断片的に覚えるより、現場で通用する設計の「型」を一度身につけることで、トラブル時の対処も早くなります。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
接続確認(wg showとpingで疎通テスト)
1. サーバー側でピアの接続状況を確認する
クライアントからwg-quick up wg0を実行した後、サーバー側でwg showを実行するとクライアントが接続されているかどうか確認できます。# サーバー側で実行 sudo wg show # 出力例(クライアント接続後) interface: wg0 public key: fGzKhyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy= private key: (hidden) listening port: 51820 peer: Qp1mZzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz= endpoint: 203.0.113.20:56789 allowed ips: 10.0.0.2/32 latest handshake: 12 seconds ago transfer: 2.45 KiB received, 1.23 KiB sent
2. クライアントからpingで疎通確認
# クライアント側で実行(VPN内のサーバーIPへping) ping -c 3 10.0.0.1 # 出力例(成功) PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. 64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=12.3 ms 64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=11.8 ms 64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=12.1 ms --- 10.0.0.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 11.8/12.0/12.3/0.2 ms
よくあるトラブルと対処法
「latest handshake」が表示されない・接続できない
wg showでピアの情報は表示されるが「latest handshake」が表示されない場合、クライアントからサーバーへのUDPパケットが届いていない可能性があります。・サーバー側のfirewalldで51820/udpが許可されているか確認する
・クラウド環境(AWS/GCP等)の場合はセキュリティグループやVPCのネットワークACLでUDP51820を許可しているか確認する
・サーバーのグローバルIPアドレスがEndpointに正しく記述されているか確認する
# サーバー側でポートの待ち受け状況を確認 sudo ss -lunp | grep 51820 # 出力例(正常) UNCONN 0 0 0.0.0.0:51820 0.0.0.0:* users:(("wireguard",pid=1234,fd=3))
pingが通らない(handshakeは成功している)
wg showでlatest handshakeは表示されるがpingが通らない場合は、ルーティングかNATの問題が多いです。・
sysctl net.ipv4.ip_forwardを実行して「1」になっているか確認する(0の場合はIPフォワーディングが無効)・
sudo firewall-cmd --zone=public --list-allでmasqueradeが「yes」になっているか確認するwg-quickでERROR: Unable to modify system routing tableが出る
# 既存のwg0インターフェースが残っている場合はまず削除 sudo wg-quick down wg0 # その後で再起動 sudo wg-quick up wg0
設定変更後に反映されない
wg0.confを変更してもwg showに反映されない場合は、インターフェースを一旦停止してから再起動します。sudo wg-quick down wg0 sudo wg-quick up wg0
# ピアをオンラインで追加(wg0を止めずに適用) sudo wg set wg0 peer <新しいクライアントの公開鍵> allowed-ips 10.0.0.3/32 # 設定ファイルに保存(これをしないと再起動で消える) sudo wg-quick save wg0
本記事のまとめ
WireGuardはOpenVPNと比べてシンプルな設定で高速なVPNを構築できます。鍵ペアの生成からwg0.confの設定、wg-quickでの起動、firewalld・sysctlの設定まで、作業のポイントをまとめます。| やりたいこと | コマンド・設定 |
|---|---|
| WireGuardをインストールする(RHEL9) | sudo dnf install wireguard-tools -y |
| WireGuardをインストールする(Ubuntu) | sudo apt install wireguard -y |
| サーバーの鍵ペアを生成する | sudo wg genkey | sudo tee /etc/wireguard/server_private.key | sudo wg pubkey | sudo tee /etc/wireguard/server_public.key |
| VPNインターフェースを起動する | sudo wg-quick up wg0 |
| VPNインターフェースを停止する | sudo wg-quick down wg0 |
| 接続状況を確認する | sudo wg show |
| 自動起動を設定する | sudo systemctl enable --now wg-quick@wg0 |
| IPv4フォワーディングを有効化する | sudo sysctl --system(/etc/sysctl.d/99-wireguard.confに設定後) |
| UDPポートを開放する | sudo firewall-cmd --zone=public --add-port=51820/udp --permanent |
| NATマスカレードを有効化する | sudo firewall-cmd --zone=public --add-masquerade --permanent |
WireGuardの運用ポイントは3つです。第一に、秘密鍵(PrivateKey)を設定ファイルや画面に出力しないよう注意すること(chmod 600で管理)。第二に、クライアントを追加するたびにwg0.confの[Peer]セクションを追加し、wg-quickを再起動するか
wg set wg0 peerでオンライン追加すること。第三に、サーバーのグローバルIPが変わる場合はクライアントのEndpointを更新する必要があることです。WireGuardを使いこなすとリモートアクセスだけでなく、複数サーバーを仮想的な同一ネットワークに接続するサイト間VPNの設計もできるようになります。
VPN構築の先にある「セキュアなサーバー設計」を体系的に学びたい方へ
WireGuardを正しく設定するには、Linuxのネットワーク設計・鍵管理・ファイアウォール設計を総合的に理解することが必要です。現場では「動いた」だけでなく「なぜ動くのか」「障害時にどう切り分けるか」を説明できることが求められます。
現場で通用するLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:ioniceコマンドでLinuxのI/O優先度を設定する方法|バックアップ処理がサーバーを圧迫する問題を解決する
- この記事の属するカテゴリ:Linuxtips・セキュリティへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます