WireGuard インストール [RHEL9系]
WireGuardについて
WireGuardは、シンプルで高速かつ強固なセキュリティを持つオープンソースのVPNプロトコルおよびソフトウェアです。主な特徴は以下のとおりです
- 高速なパフォーマンス: Linuxカーネルに直接統合されており、従来のOpenVPNやIPsecに比べて処理が軽く低遅延です。
- シンプルな設計: ソースコードの行数が非常に少なく(約4,000行)、設定ファイルも短いため、保守やセキュリティ監査が容易です。
- モダンな暗号技術: Curve25519、ChaCha20、Poly1305などの最新の暗号方式のみを採用しています。
- クロスプラットフォーム対応: Linux、Windows、macOS、iOS、Androidなど、多様なOSで動作します。
- 使用プロトコル: 通信にはUDP(デフォルトポート:
51820)を使用します
OpenVPNと比較してデメリットと注意点は以下になります
- UDP限定: WireGuardは通信にUDPしか使用できません。
- 固定のIP割り当て:WireGuardは設計上、接続するピア(クライアント)に対して静的なIPアドレスを紐付ける仕様となっているので、OpenVPNのようにDHCPを利用できません
- ログが基本出力なし:WireGuardではデフォルトではログの出力がありません。Syslog(dmesg)経由で、ログが出力されますが開発やトラブルシューティング目的のでバックログとなり、接続状況などのログ出力がないので監査用のログとしてしようできません
- 複数のクライアントを同じ設定ファイルで利用できない:OpenVPNのようにサーバー側の設定(
duplicate-cnオプションなど)を有効にすればクライアントが同じ設定ファイルでも接続できましたが、WireGuardはクライアントに対して固定IPとなるので、このように同じ設定ファイルを使い回すことはできません。100台のクライアントがある場合は100個の鍵ペアを作成する必要があります
WireGuardのインストール方法
RedHat9系のRockyLinux 9 にWireGuardをインストールした手順は以下のようになります
WireGuardをインストール
dnfコマンドで「WireGuard」をインストールします。コマンドは下記のようになります
$ sudo dnf install epel-release $ sudo dnf install wireguard-tools
秘密鍵・公開鍵の生成(サーバー側)
サーバーで利用する秘密鍵と公開鍵を生成します。生成する鍵は以下となります
- 秘密鍵:/etc/wireguard/server_private.key
- 公開鍵:/etc/wireguard/server_public.key
秘密鍵・公開鍵の生成に移動します
$ cd /etc/wireguard
umask について
作成する鍵のセキュリティを考慮して「umask 077」を設定します。また、下記のようなになります
umaskの解除を忘れてそのままCUI操作を実施すると生成されるファイル・ディレクトリは以下のパーミッションになります。
umaskの解除忘れが怖い場合は鍵の生成後にchmod 600に設定します。筆者はこちらの方法で構築しています
- 新規ファイル:
600(rw-------/ 所有者のみ読み書き可能) - 新規ディレクトリ:
700(rwx------/ 所有者のみ読み書き・実行可能)
$ sudo umask 077 # umask を使用しない場合は不要。あとでchmod 600 ~ でパーミッション変更する # 解除方法 $ sudo umask 022
サーバー秘密鍵生成
$ sudo wg genkey > server_private.key $ sudo cat server_private.key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # umaskを設定している場合は不要 $ sudo chmod 600 server_private.key
サーバー公開鍵生成
$ sudo wg pubkey < server_private.key > server_public.key $ sudo cat server_public.key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # umaskを設定している場合は不要 $ sudo chmod 600 server_public.key
クライアントと鍵作成
クライアントの鍵ペアを作成します。使用するクライアント毎に作成する必要があります。今回記事では2つのクライアントで想定して作成しています
[client1]
- 秘密鍵:/etc/wireguard/client1_private.key
- 公開鍵:/etc/wireguard/client1_public.key
[client2]
- 秘密鍵:/etc/wireguard/client2_private.key
- 公開鍵:/etc/wireguard/client2_public.key
クライアント秘密鍵生成
# 1つめ(client1) $ sudo wg genkey > client1_private.key Warning: writing to world accessible file. Consider setting the umask to 077 and trying again. $ sudo cat client1_private.key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # 2つめ(client2) $ sudo wg genkey > client2_private.key $ sudo cat client1_private.key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # umaskを設定している場合は不要 $ sudo chmod 600 client1_private.key $ sudo chmod 600 client1_private.key
クライアント公開鍵生成
# 1つめ(client1) $ sudo wg pubkey < client1_private.key > client1_public.key $ cat client1_public.key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # 2つめ(client2) $ sudo wg pubkey < client2_private.key > client2_public.key $ cat client1_public.key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # umaskを設定している場合は不要 $ sudo chmod 600 client1_public.key $ sudo chmod 600 client1_public.key
umaskの解除
# umaskを設定していない場合は不要 $ sudo umask 022
サーバー設定ファイル作成
$ sudo vim /etc/wireguard/wg0.conf [Interface] PrivateKey = XXXXXXXXXXXXXXXXXXXXXXXX #サーバーの秘密鍵 Address = 172.16.0.1/24 ListenPort = 51820 # クライアント設定(例) # front1 [Peer] PublicKey = XXXXXXXXXXXXXXXXXXXXXXXX # クライアント(client1)公開鍵 AllowedIPs = 172.16.0.11/32 # front2 [Peer] PublicKey = XXXXXXXXXXXXXXXXXXXXXXXX # クライアント(client2)公開鍵 AllowedIPs = 172.16.0.12/32 # keepalived の間隔 PersistentKeepalive = 20
サービス起動、自動起動の設定
$ sudo systemctl start wg-quick.target@wg0
$ sudo systemctl status wg-quick@wg0.service
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
Loaded: loaded (/usr/lib/systemd/system/wg-quick@.service; disabled; preset: disabled)
Active: active (exited) since Thu 2026-10-15 15:17:30 JST; 11s ago
Docs: man:wg-quick(8)
man:wg(8)
Process: 4040 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
Main PID: 4040 (code=exited, status=0/SUCCESS)
CPU: 46ms
・自動起動
$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl is-enabled wg-quick@wg0
enabled
クライアントファイル
接続用のクライアントファイルを作成します。SCP、FTP等でダウンロードするか、コピペでローカルのPC等に作成します
[Interface] PrivateKey = XXXXXXXXXXXXXXXX = #クライアント(client1)の秘密鍵 Address = 172.16.0.11/24 MTU = 1400 DNS = 8.8.8.8 [Peer] PublicKey = XXXXXXXXXXXXXXXX = #サーバーの公開鍵 Endpoint = x.x.x.x:51820 # [サーバーのグローバルIPまたはドメイン]:51820 AllowedIPs = 172.16.0.0/24 PersistentKeepalive = 20
RHELのネットワーク設定(Firewalldとルーティング)
RHELでVPNサーバー(ルーター)として通信を中継させるため、FirewalldとSysctlの設定を変更します。
・パケット転送(ルーティング)の有効化
$ echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf $ sudo sysctl -p
・Firewalld(ファイアウォール)の設定
RHELでは iptables の代わりに firewalld を使用して、ポートの開放とマスカレード(NAT)を設定するのが標準です
# WireGuardのUDPポートを開放 $ sudo firewall-cmd --add-port=51820/udp --permanent # マスカレード(NAT転送)を有効化 $ sudo firewall-cmd --add-masquerade --permanent # 変更を反映 $ sudo firewall-cmd --reload
VPNの接続状況の確認
ログも基本はないのでVPNで接続しているクライアントの状況は「wg show」で確認できます
$ sudo wg show interface: wg0 public key: uX8B... #サーバーの公開鍵 private key: (hidden) listening port: 51820 peer: bK9Z...#相手の公開鍵 endpoint: 203.0.113.50:51820 # 接続しているIPが表示されている allowed ips: 10.0.0.2/32 latest handshake: 14 seconds ago # 数秒〜2分前なら接続されている transfer: 4.12 KiB received, 6.85 KiB sent # データが送受信
1. interface: ブロック(自分のVPN設定)
あなた自身の仮想ネットワークインターフェース(例:wg0)の状態です。 [1, 2]
interface: 使用しているWireGuardのインターフェース名。public key: あなたの公開鍵です。相手に登録してもらうための文字列です。private key: あなたの秘密鍵です。セキュリティのため、通常は(hidden)(非表示)と表示されます。listening port: WireGuardが通信を待ち受けているUDPポート番号です(デフォルトは51820がよく使われます)
peer: ブロック(接続相手の情報)
接続先(サーバー、または他のクライアント)ごとの状態です。ここがどう表示されているかで接続状況が分かります。
peer: 接続相手の公開鍵です。この文字列で相手を識別します。endpoint: 相手の実際のグローバルIPアドレスとポート番号です。allowed ips: この相手(トンネル)を通過することを許可されたVPN内のIPアドレス、またはネットワーク範囲です。latest handshake: 最重要項目
相手と最後に「お互いを確認し合えた(ハンドシェイクが成功した)」時間です。12 seconds ago(12秒前)などのように、数秒〜約2分以内の時間が表示されていれば、現在リアルタイムで通信が確立されています。- この項目自体が表示されていない、または数分〜数時間以上前になっている場合は、接続が切れているか、一度も繋がっていません。
transfer: この相手との間でやり取りされたデータ量(受信 / 送信)です。2.45 KiB received, 1.23 KiB sentなどのように表示されます。ネットサーフィンなどをした際に、この数値がリアルタイムで増えていれば、実際に正しくデータが流れています。

