Fedora ServerにWireGuard VPNをインストール:firewalldとSELinuxでセキュアなリモート接続を実現

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

FedoraにWireGuardをインストール:10分で完了

私はFedoraをメインの開発マシンとして2年間使ってきました。最大の魅力はパッケージの更新速度です。WireGuardはバージョン5.6からカーネルに直接統合されているため、Fedoraでは外部モジュールをインストールする必要がありません。wireguard-toolsだけで十分です。

FedoraでのWireGuardセットアップはUbuntuと少し異なり、firewalldSELinuxの両方を扱う必要があります。この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は正常に機能しません。

Share: