CentOS 8でWireGuard VPNを構築する手順

イントロダクション
WireGuardは最先端の暗号化を採用したオープンソースのクロスプラットフォームVPN実装です。IPSecやOpenVPNに比べて高速でシンプル、かつ機能的です。組み込み機器からスーパーコンピュータまで、Linux、Windows、macOS、iOS、Android、BSDなど多くのプラットフォームで利用できます。
このチュートリアルでは、CentOS 8ベースのサーバーへWireGuardをインストールし、Linuxクライアントから接続する手順を説明します。用語定義:
- WireGuard: 軽量なVPNプロトコルと実装。1行で定義すると「公開鍵ベースで認証するUDPベースのVPN」です。
前提条件
- CentOS 8 が稼働するサーバー(root権限またはsudoが使えるユーザー)
- パブリックIPv4アドレス(例: 203.1.114.98)
- クライアント側はLinuxベース(手順は一般的なものです)
重要: CentOS 8は公式サポートの終了(EOL)を迎えています。長期運用する場合はRocky LinuxやAlmaLinuxなどの後継ディストリビューションへ移行することを検討してください。移行の簡単なヒントは本文後半に記載します。
目次
- システムの更新
- EPEL と PowerTools の有効化
- WireGuard のインストール
- サーバー設定(鍵、wg0.conf)
- ファイアウォール設定
- IPv4 フォワーディングの有効化
- WireGuard サービスの起動
- クライアント設定
- サーバーへのクライアント追加
- テスト
- セキュリティ強化 & トラブルシューティング
- 運用チェックリスト
Step 1 - システムを更新する
まずシステムを最新に更新します。
$ sudo dnf update
Step 2 - EPEL リポジトリと PowerTools を有効化する
WireGuardパッケージはEPELにあるため、EPELをインストールして有効化します。
$ sudo dnf install epel-release
$ sudo dnf config-manager --set-enabled PowerTools
補足: EPELパッケージはPowerToolsに依存することがあるため有効化しています。
Step 3 - WireGuard をインストールする
WireGuardのCoprリポジトリを有効化します。
$ sudo dnf copr enable jdoss/wireguard
WireGuard本体をインストールします(カーネルモジュールをビルドするためにGCC等が入ります)。
$ sudo dnf install wireguard-dkms wireguard-tools
Step 4 - WireGuard サーバーを設定する
まず設定ファイル用にディレクトリとファイルを作り、適切な権限を設定します。
$ sudo mkdir /etc/wireguard
$ sudo sh -c 'umask 077; touch /etc/wireguard/wg0.conf'
鍵ペアを生成します。
$ cd /etc/wireguard
$ sudo sh -c 'umask 077; wg genkey | tee privatekey | wg pubkey > publickey'
生成されたプライベートキーを確認します。
$ sudo cat privatekey
メモして後ほど設定に使います。
設定ファイルを編集します。
$ sudo nano /etc/wireguard/wg0.conf
以下を追加します(例)。PrivateKeyは先ほどのファイルの中身に置き換えてください。
[Interface]
## VPN server private IP address ##
Address = 192.168.10.1/24
## VPN server port - You can choose any port ##
ListenPort = 37822
## VPN server's private key i.e. /etc/wireguard/privatekey - the one from above ##
PrivateKey = GCEXafeZKqSsuLfvuHE+zLzMYwoH4qQyBh7MZ4f/3kM=
## Save and update this config file when a new peer (vpn client) added ##
SaveConfig = true
解説: [Interface] セクションはローカル側の設定です。PrivateKey、ListenPort、Address を定義し、SaveConfig=true にするとシャットダウン時にアクティブな設定がファイルへ保存されます。
保存してエディタを閉じます(Nano: Ctrl + X、Y で保存)。
Step 5 - ファイアウォールを設定する
WireGuard用のサービス定義を作成します。
$ sudo nano /etc/firewalld/services/wireguard.xml
以下をファイルに貼り付けます(ポートは先に設定した ListenPort に合わせてください)。
wireguard
WireGuard open UDP port 37822 for client connections
保存したらWireGuardサービスをfirewalldに追加します。
$ sudo firewall-cmd --permanent --add-service=wireguard
次にNAT(マスカレード)を有効にします。ここではプライベートネットワーク192.168.10.0/24のトラフィックをサーバーのパブリックIP(例: 203.1.114.98)経由でルーティングする想定です。
$ sudo firewall-cmd --permanent --add-masquerade
最後にfirewalldをリロードしてルールを反映します。
$ sudo firewall-cmd --reload
状態を確認します。
$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: wireguard ssh
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
注意: 実環境では interfaces の値を実環境に合わせてください(eth0 など)。
Step 6 - IPv4 フォワーディングを有効にする
永続的にsysctl設定を追加します。
$ sudo nano /etc/sysctl.d/99-custom.conf
次を貼り付けます。
## Turn on bbr ##
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
## for IPv4 ##
net.ipv4.ip_forward = 1
## Turn on basic protection/security ##
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
## for IPv6 ##
net.ipv6.conf.all.forwarding = 1
保存後、設定をリロードします。
$ sudo sysctl -p /etc/sysctl.d/99-custom.conf
firewalld上でwg0を内部ゾーンに追加し、インターフェースに対してマスカレードを有効にします。
$ sudo firewall-cmd --add-interface=wg0 --zone=internal
$ sudo firewall-cmd --permanent --zone=internal --add-masquerade
Step 7 - WireGuard サービスを有効化して起動する
$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl start wg-quick@wg0
動作確認:
$ sudo wg
interface: wg0
public key: VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
private key: (hidden)
listening port: 37822
$ sudo ip a show wg0
3: wg0: mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 192.168.10.1/24 scope global wg0
valid_lft forever preferred_lft forever
Step 8 - WireGuard クライアントをインストールして設定する
各ディストリビューション向けの公式インストール手順はWireGuardのページを参照してください。クライアント側での基本的な手順を示します。
$ sudo mkdir /etc/wireguard
$ sudo sh -c 'umask 077; touch /etc/wireguard/wg0.conf'
$ cd /etc/wireguard/
$ sudo sh -c 'umask 077; wg genkey | tee privatekey | wg pubkey > publickey'
$ sudo cat privatekey
生成されたクライアントのプライベートキーをメモし、wg0.conf を編集します。
$ sudo nano /etc/wireguard/wg0.conf
例(PrivateKey と Endpoint は環境に合わせて置き換えてください)。
[Interface]
## client private key ##
PrivateKey = OEM6D/zt2fVWOepVv3iEDD430V0gAshKp4+5oVVt5EE=
## client ip address ##
Address = 192.168.10.2/24
[Peer]
## CentOS 8 server public key ##
PublicKey = VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
## set ACL ##
AllowedIPs = 192.168.10.0/24
## Your CentOS 8 server's public IPv4/IPv6 address and port ##
Endpoint = 203.1.114.98:37822
## Key connection alive ##
PersistentKeepalive = 15
解説: AllowedIPs はクライアントが到達できる範囲を制限します。NAT環境越しに接続を維持したい場合は PersistentKeepalive を設定します。
クライアント側サービスを有効化・起動します。
$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl start wg-quick@wg0
$ sudo systemctl status wg-quick@wg0
Step 9 - サーバーにクライアント情報を追加する
サーバー側でクライアントの公開鍵と割り当てIPを追記します。まずWireGuardを停止します。
$ sudo systemctl stop wg-quick@wg0
wg0.conf を編集して、クライアント用の [Peer] を追加します。
$ sudo nano /etc/wireguard/wg0.conf
末尾に以下を追加します(PublicKey と AllowedIPs はクライアントの情報に置き換えてください)。
[Peer]
## client VPN public key ##
PublicKey = dmfO9pirB315slXOgxXtmrBwAqPy07C57EvPks1IKzA=
## client VPN IP address (note /32 subnet) ##
AllowedIPs = 192.168.10.2/32
保存後、WireGuardを再起動します。
$ sudo systemctl start wg-quick@wg0
重要: 受け入れ側(サーバー)はクライアントの公開鍵を持っている必要があります。WireGuardは公開鍵認証なので、未登録の鍵からの接続要求は無視されます。
Step 10 - 接続テスト
クライアントからサーバーへpingを実行して基本的な疎通を確認します。
$ ping -c 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=44.2 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=45.8 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=46.7 ms
64 bytes from 192.168.10.1: icmp_seq=4 ttl=64 time=44.1 ms
--- 192.168.10.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2800ms
rtt min/avg/max/mdev = 41.729/47.829/48.953/5.046 ms
$ sudo wg
interface: wg0
public key: dmfO9pirB315slXOgxXtmrBwAqPy07C57EvPks1IKzA=
private key: (hidden)
listening port:
peer: VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
endpoint: 203.1.114.98:37822
allowed ips: 192.168.10.0/24
latest handshake: 1 minute, 40 seconds ago
transfer: 938 B received, 45.67 KiB sent
persistent: keepalive: every 15 seconds
セキュリティ強化(推奨)
- 鍵管理: プライベートキーは決して公開しない。必要であれば定期的にローテーションする。鍵ローテーション手順をドキュメント化すること。
- 最小権限: AllowedIPs を必要最小限に設定してアクセス範囲を制限する。
- ポートの変更: デフォルト以外のUDPポートを使うことでスキャンノイズを減らせることがある(セキュリティではなく「ノイズ低減」)。
- OSとカーネル更新: DKMSでカーネルモジュールをビルドするため、カーネル更新後はモジュールを再ビルド/再起動する。常にセキュリティパッチを適用する。
- ログ監視: wgコマンドやsystemdログを監視して不審な再接続やエラーを検出する。
トラブルシューティング(よくあるケース)
- 接続できない
- サーバー側で ListenPort がファイアウォールで開いているか確認する。
- サーバーの public key / クライアントの public key を間違えていないか確認する。
- AllowedIPs の設定でルーティングが正しいか確認する(/32 か /24 の誤り)。
- NAT越しの場合はクライアント側の PersistentKeepalive を設定すると改善することが多い。
- ハンドシェイクが行われない
- サーバーの wg 出力で最新ハンドシェイク時刻を確認。数秒以内に更新されない場合はパケットが届いていない。
- IP フォワーディングは有効か
- sysctl net.ipv4.ip_forward の値を確認する。
運用チェックリスト(役割別)
- サーバー管理者(初期セットアップ)
- EPEL と PowerTools を有効化した
- WireGuard をインストールした
- wg0.conf にサーバー側設定を書いた
- firewall-cmd でサービスとマスカレードを追加した
- sysctl で ip_forward を有効にした
- systemd で wg-quick@wg0 を有効化した
- クライアント管理者
- クライアント鍵ペアを生成した
- クライアント設定でEndpointとPublicKeyを正しく設定した
- AllowedIPs を必要最小限に設定した
- 接続テストを実施した(ping/tcp dump)
運用のヒューリスティックス(メンタルモデル)
- 「鍵が本人確認、AllowedIPsがアクセスポリシー、ポートが玄関」: 鍵は認証、AllowedIPsはネットワークアクセスの範囲、ポートは外部との接点(玄関口)だと考えると設定が整理しやすい。
CentOS 8 のサポート終了と移行のヒント
- CentOS 8 は公式サポート終了済みのため、長期運用にはRocky LinuxやAlmaLinux、RHELへの移行を検討してください。移行の基本戦略:
- テスト環境で移行手順を検証する。
- そのまま移行ツールやイメージで置換できる場合は短時間で切り替える。
- 生産系はバックアップとロールバック手順を準備してから実施する。
よくある質問(簡易)
Q: WireGuardはどのくらい安全ですか? A: WireGuardは公開鍵暗号と現代的な暗号スイートを使用しており、設計自体もシンプルで監査しやすい構造です。とはいえ運用面(鍵保護、OS更新、ファイアウォール)も重要です。
Q: モバイルクライアントはどうすれば接続できますか? A: iOS/Android向けに公式アプリがあり、QRコードや設定ファイル(.conf)をインポートして接続できます。
受け入れ基準(接続が成功と見なす条件)
- サーバーとクライアントの wg ハンドシェイクが発生していること
- クライアントからサーバーのVPNアドレスへpingが通ること
- 必要に応じてサーバー経由で外部へNATできること(マスカレードの確認)
参考プレイブック(簡易)
- 事前チェック: パブリックIP、ポート、リポジトリ確認
- サーバーでWireGuardをインストール・鍵生成
- ファイアウォールとsysctlを設定
- wg-quickでインターフェースを起動し接続確認
- クライアント設定を作成して接続
- サーバーにクライアントの公開鍵を追加
- 監視とログ確認、定期的な鍵ローテーション
まとめ
- WireGuardはシンプルで高速なVPNソリューションです。CentOS 8での導入は上記の手順で行えます。
- セキュリティのための鍵管理、AllowedIPsの最小化、OSの更新は必須です。
- CentOS 8のEOLを踏まえ、長期運用時は後継ディストロへ移行を検討してください。
重要: この記事中のサンプルIPアドレスと鍵は例示用です。本番環境では必ず固有の鍵と実IPで設定してください。