CentOS Stream 9でWireGuard VPNを構築:圧倒的な高速化と5分で終わる簡単設定

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

CentOS Stream 9でOpenVPNからWireGuardに乗り換えた理由

数年前まで、CentOS 7でチーム用の社内アクセスをセットアップする際、OpenVPNは私の「定番」でした。しかし正直なところ、大量のCA証明書、証明書(Cert)、鍵(Key)の管理に苦労するのは決して快適な体験ではありませんでした。さらに、OpenVPNはユーザースペース(User-space)で動作するため、スペックの低いVPSでは通信速度がボトルネックになることがよくありました。

CentOS Stream 9に移行した際、WireGuardを試してみて、本当に驚きました。最大の利点はそのコードベースの小ささです。OpenVPNが10万行を超える肥大化したコードであるのに対し、WireGuardは約4,000行しかありません。この少なさはシステムを軽量化するだけでなく、セキュリティ専門家が脆弱性を監査するのも容易にします。実測値では、WireGuardは従来のプロトコルと比較してスループットが約15〜20%向上し、遅延(レイテンシ)も明らかに低下しました。

CentOS Stream 9で「設定したらあとは放置(set and forget)」できるVPNシステムを求めているなら、WireGuardは外せない選択肢です。

実機比較:WireGuard vs 従来型ソリューション

新しいからという理由だけでWireGuardを選ばないでください。従来のプロトコルが抱えていた深刻な問題を解決できるから選ぶのです。

  • OpenVPN: TCPとUDPの両方をサポートしているため、ファイアウォール回避には柔軟です。しかし、設定が非常に複雑で、暗号化処理時のCPU消費が激しいのが難点です。
  • IPsec: セキュリティは高いですが、手動設定はシステム管理者の悪夢です。フェーズ1やフェーズ2でわずかなミスがあるだけで、接続は即座に失敗します。
  • WireGuard: Linuxのカーネル空間(Kernel-space)で直接動作し、ChaCha20などの現代的な暗号化方式を使用します。セットアップはSSHの公開鍵を追加するのと同じくらい簡単です。

クイック比較表

比較項目 WireGuard OpenVPN
パフォーマンス 極めて高速、モバイル端末のバッテリー消費が少ない。 標準的、リソース消費が多い。
暗号化 ChaCha20, Poly1305(現代的)。 OpenSSLベース(レガシーコードが多い)。
設定 基本設定は10行未満。 設定ファイルが数ページに及ぶ。

私の経験上、ファイアウォールでUDPポートが完全に遮断されている場合を除き、WireGuardがほぼすべての面で勝っています。

CentOS Stream 9でのWireGuard導入ステップ

開始する前に、root権限またはsudo権限があることを確認してください。システムを安定した状態にするために、dnf updateを実行しておくのを忘れないでください。

ステップ 1: リポジトリとパッケージのインストール

CentOS Stream 9では、最新のカーネルモジュールビルドを取得するためにEPELリポジトリと、場合によってはELRepoが必要です。

sudo dnf install epel-release elrepo-release -y
sudo dnf install kmod-wireguard wireguard-tools -y

ステップ 2: セキュリティキーペアの生成

WireGuardはSSHと同様のキーペア(鍵ペア)方式を使用します。サーバーとクライアントの双方が、互いを識別するための独自のキーペアを持つ必要があります。

mkdir -p /etc/wireguard
cd /etc/wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey

この際、privatekeyファイルは非常に重要な資産です。絶対に外部に漏らさないでください。publickeyファイルはクライアントデバイスに登録するために使用します。

ステップ 3: サーバー設定の構築

/etc/wireguard/wg0.confファイルを作成します。ここでVPNの内部IPとリスニングポートを定義します。

[Interface]
Address = 10.0.0.1/24
SaveConfig = true
ListenPort = 51820
PrivateKey = <サーバーの秘密鍵の内容>

# Firewall-cmdによるポート開放とNATの自動化
PostUp = firewall-cmd --add-port=51820/udp; firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" masquerade';
PostDown = firewall-cmd --remove-port=51820/udp; firewall-cmd --remove-rich-rule='rule family="ipv4" source address="10.0.0.0/24" masquerade';

ステップ 4: データ転送(Forwarding)の有効化

サーバーがVPNからのデータをインターネットに転送できるように、LinuxカーネルでIPフォワーディングを有効にする必要があります。この手順を忘れると、VPNには接続できてもウェブサイトの閲覧ができなくなります。

echo "net.ipv4.ip_forward = 1" | sudo tee -at /etc/sysctl.conf
sudo sysctl -p

# ファイアウォールの恒久的な設定
sudo firewall-cmd --permanent --add-port=51820/udp
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload

ステップ 5: サービスの起動

インターフェース wg0 を起動し、サーバーの再起動時に自動実行されるように設定します。

sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0

ステップ 6: クライアントからの接続

PC(Windows/macOS)側で、同様の設定ファイルを作成します。重要なのは Endpoint セクションで、サーバーのIPアドレスとポート51820を正しく指定することです。

[Interface]
PrivateKey = <クライアントの秘密鍵>
Address = 10.0.0.2/32
DNS = 1.1.1.1

[Peer]
PublicKey = <サーバーの公開鍵>
Endpoint = <あなたのサーバーIP>:51820
AllowedIPs = 0.0.0.0/0

その後、サーバーに戻ってこのクライアントを登録するのを忘れないでください:sudo wg set wg0 peer <クライアントの公開鍵> allowed-ips 10.0.0.2

運用における3つの重要な注意点

クライアントへの導入時に何度か苦労した経験から、デバッグ時間を節約するためのヒントをいくつか紹介します。

  1. MTUの問題: VPN接続はできているのに、FacebookやYouTubeの読み込みが止まる場合は、クライアントの設定ファイルでMTUを1380または1420に下げてみてください。これはパケットのカプセル化により、通信事業者の許容サイズを超えてしまうことで発生する一般的なエラーです。
  2. 接続の維持(Keepalive): クライアントが厳しいファイアウォールを持つルーターの配下にある場合、アイドル状態が数分続くと接続が切断されることがあります。クライアント設定に PersistentKeepalive = 25 を追加して、トンネルを常に維持するようにしてください。
  3. SELinux: CentOS Stream 9では、SELinuxがWireGuardによる鍵ファイルの読み込みをブロックすることがあります。sudoで実行しているのに Permission denied が発生する場合は、/etc/wireguard ディレクトリのコンテキストを確認してください。

WireGuardはまさにVPNの革命です。最新のLinuxカーネルのサポートにより、CentOS Stream 9でのインストールは非常にスムーズになりました。皆さんもぜひ、自分専用の安全な接続環境を構築してみてください!

Share: