はじめに:なぜCentOS Stream 9とOpenVPNを選ぶのか?
CentOS 7が正式にサポート終了(EOL)を迎えて以来、私は50人のリモートスタッフを抱えるチームのVPN基盤として、CentOS Stream 9で6ヶ月間の運用試験を行ってきました。その結果は非常に印象的でした。稼働率99.9%を維持し、アイドル時のメモリ消費量は200MB未満、そして最新のセキュリティパッチとの互換性も完璧です。
本番環境向けのVPN構築は、単にパッケージをインストールするだけでは不十分です。証明書認証、ファイアウォール管理、そしSELinuxの設定に細心の注意を払う必要があります。多くの管理者はトラブルを避けるためにSELinuxを無効(disable)にしがちですが、それはおすすめしません。この記事では、OpenVPNとSELinuxを「共存」させるための正しい設定方法を解説します。
クイックスタート:5分でOpenVPNをインストール
もし急ぎで予備のVPNサーバーが必要な場合は、コミュニティが提供しているスクリプトを利用するのが最適です。Angristan氏のスクリプトはGitHubで2万以上のスターを獲得しており、非常に信頼性が高くクリーンです。
curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh
sudo ./openvpn-install.sh
スクリプトを実行すると、IPアドレス、プロトコル(UDPを推奨)、DNSについて自動的に質問されます。Easy-RSAの処理からクライアント用の .ovpn ファイルの出力まで、すべて自動で行われます。より詳細な企業向けカスタマイズを行いたい場合は、以下の手動手順に進みましょう。
ステップ1:環境準備とパッケージのインストール
CentOS Stream 9のデフォルトリポジトリにはOpenVPNが含まれていません。インストール前にEPEL(Extra Packages for Enterprise Linux)リポジトリを有効にする必要があります。この手順をスキップすると、インストールコマンドで No package available エラーが発生します。
sudo dnf install epel-release -y
sudo dnf update -y
sudo dnf install openvpn easy-rsa -y
ステップ2:Easy-RSAによるPKIの初期化
OpenVPNはセキュリティを高めるため、通常のパスワードではなくデジタル証明書を使用して認証を行います。ここではEasy-RSAを使って独自の認証局(CA)を構築します。管理を容易にするため、ディレクトリを /etc/openvpn/easy-rsa に作成します。
mkdir -p /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa
./easyrsa init-pki
./easyrsa build-ca nopass
次に、サーバー用証明書とDiffie-Hellman(DH)パラメータを生成します。注意:gen-dh のプロセスは、CPUの性能によって数分かかる場合があります。
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh
openvpn --genkey --secret ta.key
ta.key (TLS-Auth) は追加の保護レイヤーです。これにより、サーバーは不正なパケットを即座に拒否できるようになり、DoS攻撃やポートスキャンに対して効果的な防御を実現します。
ステップ3:OpenVPNサーバーの設定
生成した重要な証明書ファイルをOpenVPNの実行ディレクトリに移動します。
cp pki/ca.crt pki/issued/server.crt pki/private/server.key pki/dh.pem ta.key /etc/openvpn/server/
設定ファイル /etc/openvpn/server/server.conf を作成します。ここでは AES-256-GCM 暗号化を使用します。これは現代的な暗号化規格であり、AES-NI命令セットをサポートするCPUでは処理速度が向上します。
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls-auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
cipher AES-256-GCM
user nobody
group nobody
persist-key
persist-tun
verb 3
ステップ4:ネットワークとファイアウォールの設定
クライアントがVPN経由でインターネットにアクセスできるようにするには、IPフォワーディングを有効にする必要があります。CentOS 7から9に移行した際、この1行を忘れて午前中を丸ごと無駄にしたことがあります。
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-openvpn.conf
sudo sysctl -p /etc/sysctl.d/99-openvpn.conf
次に、ポート1194を開放し、FirewalldでNAT(マスカレード)機能を有効にします。
sudo firewall-cmd --permanent --add-port=1194/udp
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload
ステップ5:SELinuxへの対応 — 無効化せず、正しく理解する
このままOpenVPNを起動すると、Permission denied エラーが発生します。リスクの高い setenforce 0 を使う代わりに、設定ファイルに正しいコンテキストを割り当てましょう。これには10秒もかかりませんが、サーバーの安全性は格段に向上します。
sudo chcon -R -t openvpn_etc_t /etc/openvpn/server/
sudo restorecon -Rv /etc/openvpn/server/
起動と動作確認
サービスを有効化し、システム起動時に自動実行されるようにします。
sudo systemctl enable --now openvpn-server@server
systemctl status openvpn-server@server コマンドで状態を確認します。active (running) が緑色で表示されていれば、サーバーの準備は完了です。
現場からの実践的なアドバイス
1. TCPではなくUDPを優先する
VPNでTCPを使用すると「TCP Meltdown」現象が発生しやすくなります。パケットロスが発生した際、再送メカニズムが重複して速度が極端に低下するためです。UDPであれば遅延(レイテンシ)が大幅に抑えられ、オンライン会議やリモートワークに適しています。
2. クライアント証明書の厳格な管理
1つの証明書を複数人で使い回さないでください。従業員が退職した際、その人の証明書だけを失効(revoke)させることで、会社全体の接続を止めることなく安全にアクセスを遮断できます。
3. リアルタイムログの監視
接続に関する問題はすべて /etc/openvpn/server/openvpn-status.log に記録されます。クライアントでエラーが出た場合は、まずこのログを確認して、証明書の不一致なのかファイアウォールによるブロックなのかを特定しましょう。
CentOS Stream 9とOpenVPNは、企業にとって強力な組み合わせです。SELinuxに少し注意を払うだけで、ライセンス費用ゼロで高度に保護されたVPNシステムを構築できます。

