FedoraにWireGuardをインストール:10分で完了
私はFedoraをメインの開発マシンとして2年間使ってきました。最大の魅力はパッケージの更新速度です。WireGuardはバージョン5.6からカーネルに直接統合されているため、Fedoraでは外部モジュールをインストールする必要がありません。wireguard-toolsだけで十分です。
FedoraでのWireGuardセットアップはUbuntuと少し異なり、firewalldとSELinuxの両方を扱う必要があります。この2つは多くのガイドで省略されがちですが、この記事ではそこを重点的に解説します。
動作環境
- Fedora Server 40/41(VPSまたは物理サーバー)
- パブリックIP: 例
203.0.113.10 - WireGuardサブネット:
10.8.0.0/24 - WireGuardポート:
51820/udp
クイックスタート — 今すぐ10分で構築
ステップ1:WireGuard toolsのインストール
sudo dnf install wireguard-tools -y
ステップ2:サーバー用キーペアの生成
cd /etc/wireguard
sudo umask 077
sudo wg genkey | sudo tee server_private.key | sudo wg pubkey | sudo tee server_public.key
この2つの値を記録しておきましょう。プライベートキーは厳重に秘密にし、パブリックキーはピアの設定時に使用します。
ステップ3:サーバー設定ファイルの作成
sudo nano /etc/wireguard/wg0.conf
ファイルの内容:
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <server_private.keyの内容>
# インターフェースが起動した際にIPフォワーディングを有効化
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = firewall-cmd --zone=public --add-interface=wg0
PostUp = firewall-cmd --zone=public --add-masquerade
PostDown = firewall-cmd --zone=public --remove-interface=wg0
PostDown = firewall-cmd --zone=public --remove-masquerade
# --- ピア1(クライアントラップトップ)---
[Peer]
PublicKey = <クライアントのパブリックキー>
AllowedIPs = 10.8.0.2/32
ステップ4:WireGuard用にfirewalldのポートを開放
# UDP 51820ポートを永続的に開放
sudo firewall-cmd --permanent --add-port=51820/udp
sudo firewall-cmd --reload
ステップ5:IPフォワーディングの永続的な有効化
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl -p /etc/sysctl.d/99-wireguard.conf
ステップ6:WireGuardの起動と自動起動の有効化
sudo systemctl enable --now wg-quick@wg0
簡単な確認:
sudo wg show
wg0インターフェースとlistening port: 51820が表示されていれば、サーバー側の設定は完了です。
詳細解説 — なぜこうするのか?
firewalldとWireGuard:なぜmasqueradeが必要なのか?
Fedoraはfirewalldをzoneの概念で使用しており、従来のiptablesとは全く異なります。クライアントがWireGuardに接続してサーバー経由でインターネットにアクセスしたい場合、トラフィックにNAT(マスカレード)が必要です。つまり、サーバーがクライアントの代わりにパケットの送信元として振る舞います。
PostUp/PostDownコマンドはwg0.conf内で設定され、インターフェースの起動・停止時に自動的に実行されます。再起動のたびに手動で操作する必要はありません。
WireGuardをサーバーへのSSHアクセスだけに使い、全トラフィックのルーティングが不要な場合は、masquerade部分を削除してください。設定がかなりシンプルになります。
SELinuxとwg-quick:意外と知られていないこと
ここは初めてセットアップした際に30分ほどデバッグに費やした箇所です。FedoraでSELinuxがEnforcingモードになっている場合、PostUpから実行されるsysctlコマンドがコンテキストの不一致でSELinuxにブロックされることがあります。
AVCのdenialが発生していないか確認します:
sudo ausearch -m avc -ts recent | grep wireguard
最もクリーンな解決方法は、sysctl.dを使ってIPフォワーディングを永続的に有効化すること(ステップ5で実施済み)です。その後、wg0.confからPostUp = sysctl...の行を削除します:
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <server_private.key>
PostUp = firewall-cmd --zone=public --add-interface=wg0
PostUp = firewall-cmd --zone=public --add-masquerade
PostDown = firewall-cmd --zone=public --remove-interface=wg0
PostDown = firewall-cmd --zone=public --remove-masquerade
よりクリーンで、スクリプトのSELinuxコンテキストに依存しません。
クライアントの設定(ラップトップ/PC)
クライアント用キーの生成
# クライアントマシン(Linux/Mac)で実行
wg genkey | tee client_private.key | wg pubkey | tee client_public.key
client_public.keyをサーバーにコピーし、wg0.confの[Peer]セクションに追加します(ステップ3で既に記載済み)。
クライアント側の設定ファイル
[Interface]
Address = 10.8.0.2/32
PrivateKey = <client_private.key>
DNS = 1.1.1.1
[Peer]
PublicKey = <server_public.key>
Endpoint = 203.0.113.10:51820
# すべてのトラフィックをVPN経由でルーティング
AllowedIPs = 0.0.0.0/0
# 内部トラフィックのみルーティング(インターネットはVPN経由にしない)
# AllowedIPs = 10.8.0.0/24
PersistentKeepalive = 25
Linuxクライアントの場合、以下のコマンドで接続します:
sudo wg-quick up ./client.conf
Windows/Mac/iOS/Androidでは、公式WireGuardアプリを使って設定ファイルをインポートするか、QRコードをスキャンするだけで完了です。
応用編 — 複数のピア追加と管理を簡単に
サービスを再起動せずに新しいピアを追加
WireGuardにはOpenVPNにはない優れた特徴があります:サービスを再起動せず、既存の接続を中断することなく、途中でピアを追加できます。
# 実行中のインターフェースに新しいピアを直接追加
sudo wg set wg0 peer <新しいクライアントのパブリックキー> allowed-ips 10.8.0.3/32
# 再起動後も設定を維持するためにファイルに保存
sudo wg-quick save wg0
新しいクライアント設定を自動生成するスクリプト
#!/bin/bash
# gen-client.sh — WireGuardクライアント設定を素早く生成
CLIENT_NAME="$1"
CLIENT_IP="$2" # 例:10.8.0.3
SERVER_PUBKEY=$(cat /etc/wireguard/server_public.key)
SERVER_ENDPOINT="203.0.113.10:51820"
CLIENT_PRIVKEY=$(wg genkey)
CLIENT_PUBKEY=$(echo "$CLIENT_PRIVKEY" | wg pubkey)
# サーバー設定に追加
echo -e "\n[Peer]\nPublicKey = $CLIENT_PUBKEY\nAllowedIPs = $CLIENT_IP/32" \
| sudo tee -a /etc/wireguard/wg0.conf
# クライアント用設定ファイルを作成
cat > "${CLIENT_NAME}.conf" <<EOF
[Interface]
Address = $CLIENT_IP/32
PrivateKey = $CLIENT_PRIVKEY
DNS = 1.1.1.1
[Peer]
PublicKey = $SERVER_PUBKEY
Endpoint = $SERVER_ENDPOINT
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
EOF
echo "設定ファイルを作成しました:${CLIENT_NAME}.conf"
echo "クライアントパブリックキー:$CLIENT_PUBKEY"
sudo bash gen-client.sh macbook 10.8.0.3
実践で得たWireGuard活用のコツ
1. 接続の素早いデバッグ
# wg0インターフェースのリアルタイムトラフィックを確認
sudo tcpdump -i wg0
# 各ピアのパケット数を確認
watch -n 1 sudo wg show
# クライアントからの接続テスト
ping 10.8.0.1 # VPN経由でサーバーにpingテスト
2. 本当に必要な場合以外は0.0.0.0/0をルーティングしない
多くの人が内部サーバーへのアクセスだけが目的なのに、AllowedIPs = 0.0.0.0/0(フルトンネル)のサンプル設定をそのままコピーしています。スプリットトンネル(AllowedIPs = 10.8.0.0/24)の方が明らかに速いです。カフェのWi-Fiでテストしたところ、スプリットトンネルに切り替えるとレイテンシが約80msから約25msに低下しました。クライアントのインターネットトラフィックは直接流れ、VPNサーバーを経由しません。
3. PersistentKeepalive — どんな時に必要?
クライアントがNATの背後にある場合(自宅やカフェでラップトップを使用するほとんどのケース)は、クライアント側でPersistentKeepalive = 25を設定してください。サーバー側には設定不要です。25秒という値はほとんどのルーターで問題ありませんが、それでも接続が切れる場合は15に下げてみてください。
4. 今すぐプライベートキーをバックアップ
# キーを別の場所にバックアップ(サーバー外)
sudo cat /etc/wireguard/server_private.key
プライベートキーを紛失すると、すべてのピアの設定をゼロからやり直さなければなりません。VPSのスナップショットが壊れた際にこの状況に陥ったことがあり、全デバイスの設定を更新するのに2時間かかりました。あれは本当に辛かったです。
5. Firewalldゾーン — 複数インターフェースがある場合の注意点
複数のNICがあるサーバーでは、firewalldゾーンに注意が必要です。masqueradeを追加する前に、各インターフェースがどのゾーンに属しているか確認してください:
sudo firewall-cmd --get-active-zones
サーバーのパブリックインターフェース(eth0またはens3)がpublicゾーンに属していなければ、masqueradeは正常に機能しません。

