VPNサーバの構築(OpenVPN)
この記事では、OpenVPNによるVPNサーバの構築方法を紹介します。
外出している際に、自宅内LANで提供しているサービスにアクセスしたくなる時があります。 ですが、セキュリティ上何でもかんでも外部にサービスを公開するわけにもいきません。 そこで、OpenVPNを使って自宅外のネットワークから自宅内LANへVPNを張って、セキュアな暗号化した通信を実現します。 自宅外のネットワークに接続しているクライアント(iPhoneやPC)とVPNサーバ間でVPNを張ると、自宅外にいても自宅内LANに接続しているように、プライベートIPアドレスでアクセス可能となります。
なお、今回はArchLinuxにおけるOpenVPNの設定として、セキュリティ上の理由から認証局(CA)サーバとVPNサーバは分離して構築します。機器としては、以下の通りです。
- CAサーバ:クライアントとVPNサーバの証明書へ署名を行う認証局サーバ
- VPNサーバ:自宅外のネットワークに接続しているクライアントとVPNを張るサーバ
- クライアント:自宅外のネットワークに接続しているクライアント端末(iPhoneやPC等)
CAサーバの構築
easy-rsaのインストール
CAサーバにて以下のコマンドでeasy-rsaをインストールします。
sudo pacman -S easy-rsa
CAの構築
CAサーバにて以下のコマンドでPKIを初期化し、CAを構築します。
cd /etc/easy-rsa
sudo easyrsa init-pki
sudo easyrsa build-ca
上記の実行途中で、「Enter New CA Key Passphrase:」と表示されますので、CAのパスフレーズを任意に決めて、入力します。 Common Nameも聞かれますが、デフォルト値のままとします。
VPNサーバの構築
OpenVPNとeasy-rsaのインストール
VPNサーバにて以下のコマンドでOepnVPNとeasy-rsaをインストールします。
sudo pacman -S openvpn easy-rsa
CA公開証明書のコピー
CAの構築で作成したCAサーバのCA公開鍵/etc/easy-rsa/pki/ca.crtをVPNサーバの/etc/openvpn/server/配下に保存します。保存時のca.crtのアクセス権はrootとしてください。
サーバ証明書の作成
VPNサーバにて以下のコマンドでPKIを初期化し、サーバ証明書を作成します。
cd /etc/easy-rsa
sudo easyrsa init-pki
sudo easyrsa gen-req server nopass
sudo cp /etc/easy-rsa/pki/private/server.key /etc/openvpn/server/
上記の実行途中にCommon Nameを聞かれますが、デフォルト値のままとします。 上記を実行すると、以下のファイルが作成されます。
- /etc/easy-rsa/pki/reqs/server.req
- /etc/easy-rsa/pki/private/server.key
Diffie-Hellman (DH) パラメータファイルの作成
VPNサーバにて以下のコマンドを実行して、DHパラメータファイルを作成します。
sudo openssl dhparam -out /etc/openvpn/server/dh.pem 2048
Hash-based Message Authentication Code (HMAC) 鍵の作成
VPNサーバにて以下のコマンドを実行して、HMAC鍵を作成します。
sudo openvpn --genkey --secret /etc/openvpn/server/ta.key
上記のコマンドで全てのSSL/TLSハンドシェイクパケットにHMAC署名が追加され、適切なHMAC署名が存在しないUDPパケットが拒否されるため、以下の攻撃を防ぎます。
- ポートスキャン
- OpenVPN の UDP ポートに対する DOS 攻撃
- 未権限のマシンからの SSL/TLS ハンドシェイク
- SSL/TLS 実装のバッファオーバーフロー脆弱性に対する攻撃
OpenVPNクライアントファイルの作成
クライアント用のOpenVPNクライアントファイルを作成します。easy-rsaがインストールされていれば作成できますので、今回はVPNサーバ上で作成します。 VPN サーバにて以下のコマンドを実行して、クライアント証明書を作成します。
cd /etc/easy-rsa
sudo easyrsa gen-req client1 nopass
上記の実行途中にCommon Nameを聞かれますが、デフォルト値のままとします。 上記を実行すると、以下のファイルが作成されます:
- /etc/easy-rsa/pki/reqs/client1.req
- /etc/easy-rsa/pki/private/client1.key
サーバ/クライアント証明書への署名
サーバー証明書とクライアント証明書に、CAによる署名を加えてVPNサーバとクライアントに送付する必要があります。