VPSにVPNサーバを構築したお話・サーバサイド編

VPSVPNサーバを構築して自宅サーバと接続したときの構築手順を連々と。
今回はOpenVPNを使ってSSL-VPNを作るよ!

環境

回線はマンションの共有回線でグローバルIPアドレスがない(お金払えばもらえるけど)のでVPS側をサーバとして構築する。

また、VPN機能を持ったルーターはないので自宅サーバをクライアントとした。

サーバ構築

OpenVPNのインストールとeasy-rsaの準備

今回はOpenVPN 2.3.6を使った。最新版は公式サイトのダウンロードページで確認。ダウンロードに使うのでダウンロードURLもコピーしておくこと。

依存パッケージのインストール。lzo-develはLZO圧縮を使うなら入れる。
# yum -y install openssl-devel lzo-devel pam-devel
OpenVPNをダウンロード
# curl -LO http://swupdate.openvpn.org/community/releases/openvpn-2.3.6.tar.gz
RPMパッケージを生成※。rpmbuildが入っていない場合はyum install rpm-build
# rpmbuild -tb --clean openvpn-2.3.6.tar.gz
生成したRPMパッケージをインストール
# yum localinstall ~/rpmbuild/RPMS/x86_64/openvpn-2.3.6-1.x86_64.rpm

インストールしたら生成したRPMパッケージとダウンロードしたソースは消しちゃってOK。

rpm-buildはrootでやんなよ!って書いてあったりするけどとりあえず…

OpenVPNがインストールできたら次はeasy-rsa

# curl -LO https://github.com/OpenVPN/easy-rsa/archive/master.zip
# unzip master.zip
作業にいろいろ便利だから移動する
# cp -r easy-rsa-master/easyrsa3/ /etc/openvpn/

ダウンロードしたzipファイルや解凍したディレクトリは消しちゃってOK。

証明書・秘密鍵類を作る

必要な証明書と秘密鍵を作るよ。

CA証明書・秘密鍵

まずはCA(認証局)と秘密鍵を作るよ。クソ高いお値段の証明書やプライベート認証局を正規に作るための面倒な手順やお金はいらない。オレオレ認証局を作る。ちなみにオレオレ認証局を作るとウェブサイトで使えるSSL証明書も発行できるけど絶対にオススメしない。特にパブリックで提供するサービスにはオレオレ認証局で認証されたオレオレ証明書なんて論外。

# cd /etc/openvpn/easyrsa3/
easyrsaを使う最初の1回だけ初期化のために以下のコマンドを投入
# ./easyrsa init-pki
CAの証明書を作る
# ./easyrsa build-ca
Enter PEM pass phrase: [CA秘密鍵の任意のパスフレーズ。安易なものは絶対に付けないこと。]
Verifying - Enter PEM pass phrase: [もう1度同じパスフレーズを入力]
(いろいろ出てくる)
Common Name (eg: your user, host, or server name) [Easy-RSA CA]: [任意の名前を入力]

成功すれば証明書が./pki/ca.crt, 秘密鍵pki/private/ca.keyにそれぞれ作られるが証明書のみを/etc/openvpnにコピーする。
CAの秘密鍵サーバ証明書秘密鍵とクライアント証明書・秘密鍵を作る時だけ使うのでコピー不要。

# cp pki/ca.crt /etc/openvpn

サーバ証明書秘密鍵を作る

CAができたら今度はサーバ証明書秘密鍵を作る。

./easyrsa build-server-full server nopass
Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key: [CA秘密鍵のパスフレーズ]

オプションの説明をしておくと、buid-server-(ryはサーバの証明書と鍵を作るよ、Common Nameは「server」、パスフレーズはなし(nopass)。

サーバ証明書秘密鍵ができたらそれぞれ/etc/openvpnにコピー

# cp pki/issued/server.crt /etc/openvpn
# cp pkl/private/server.key /etc/openvpn

DHパラメータを生成する

サーバ証明書ができたらDH(Diffie-Hellman)パラメータを生成するよ。

# ./easyrsa gen-dh

結構時間掛かる場合があるのでそのときは待ち続ける。
生成できたらこれも/etc/openvpnにコピーしておく。

# cp pki/dh.pem /etc/openvpn/

証明書廃止リストを作る

このあと作るクライアント証明書や秘密鍵をなくした、パスフレーズを忘れたときにその証明書は信頼出来ないことを宣言する。
これに使うのが証明書失効リスト(CRL)。これは実際廃止しないと作れないのでダミーの証明書を作って廃止して生成する。

まずはダミークライアントの証明書を作る

# ./easyrsa build-client-full dummy nopass
Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key: [CA秘密鍵のパスフレーズ]

作ったら廃止する

./easyrsa revoke dummy
途中でホントに廃止していい?と聞いてくるのでyes.
Type the word 'yes' to continue, or any other input to abort.
  Continue with revocation: yes

廃止できたらCRLを生成する

# ./easyrsa gen-crl

生成できたら/etc/openvpnにコピーしてリード権を付与

# cp pki/crl.pem /etc/openvpn
# chmod o+r /etc/openvpn/crl.pem

ちなみにCRLはとりあえず無くてもいいけどいざという時にコンフィグから漏れてて使えていませんでしたーな事故を防ぐためにも最初に作っておくことをすすめる。

OpenVPNの設定

CA、サーバ証明書、CRLを準備したらいよいよOpenVPNの設定をする。

まずはTLSの鍵を作る

# openvpn --genkey --secret /etc/openvpn/ta.key

サンプルのコンフィグファイルをコピー。置いてある場所はバージョンやOSによって微妙に違う。

# cp /usr/share/doc/openvpn-2.3.6/sample/sample-config-files/server.conf /etc/openvpn

設定ファイルを編集する

# vim /etc/openvpn/server.conf
TUNを使うようになっていることを確認
dev tun
DHパラメータファイル名を確認
dh dh.pem
先頭のコメントアウト(;)を削除してTLS認証を有効にする
tls-auth ta.key 0
OpenVPNサーバの実行権限を下げる
user nobody
group nobody
ログファイルのパスを確認
log-append  /var/log/openvpn.log
最終行へ追加(CRLを有効にする)
crl-verify crl.pem

OpenVPNのログローテション

放置しておくとログが溜まり続けていいことがないのでローテーションを設定する

# vim /etc/logrotate.d/openvpn
/var/log/openvpn.log {
  daily
  missingok
  compress
  rotate 2
  notifempty
  sharedscripts
  postrotate
    /etc/init.d/openvpn restart 2>&1 > /dev/null
  end
}

オプションについてはココでは書かない。各自の環境に合わせて適切なローテションを設定する。

OpenVPNサーバの起動

# /etc/init.d/openvpn start

あとはiptablesとか適切に設定。VPN起動時にiptablesを自動設定するとかあるけど省略。

次回予告

次回はクライアント側の設定を書くよ!