2018.04.04

【実証】OpenVPNサーバーの構築~Linux編~

難易度
3
カテゴリー
やってみよう!

180307-OpenVPN

GMOクラウド株式ユーキです。

今回はクラウド環境にOpenVPNを導入する方法を数回に分けて連載していきます。初回は、LinuxサーバーのOpenVPN導入について紹介していきます。

OpenVPNは、インターネット上に仮想的なプライベートネットワークを構築するためのソフトウェア(無料)です。専用回線や高価なルーター機器を購入する必要がないため、低コストで手軽にセキュアなネットワーク構築ができます。

クラウド上で機密性の高いデータを安全にやり取りするだけでなく、複数の支店や営業所でファイルサーバーや社内システムを共通化したり、外出先から会社のファイルサーバーに置いてある資料を閲覧するなど、いろいろな使い方が期待できます。

ALTUS Isolateシリーズであれば標準でVPN環境をご利用いただけます。ただ「VPNの鍵をより強固なものを試してみたい」など相談を頂くこともあり、今回改めて取り上げてみました。

 

【設定環境について】

下記の環境で、OpenVPNを設定した場合の方法をご紹介します。

[サーバー]OSLinuxWindows LAMP設定を行ったサーバー上に、OpenVPNをインストールします。

[クライアント]OSWindows 複数のPCから接続できます。

※サーバーにWindowsを選択した場合は、基本的に1サーバーに対し1クライアントの接続です。(ただし、Linuxサーバー等でcaファイルを使った証明書を作成し、利用することで、複数クライアントの接続も可能です。)

 【ご注意】

 IPアドレスはOpenVPNのデフォルト設定をご利用ください。クラウドコンソール上で設定したローカルおよびグローバルIPアドレスはご利用にならないよう、ご注意ください

 ・ブリッジモードはご利用できないため、ルーティングモードで構築してください

 

OpenVPNLinuxサーバーで設定する

LinuxサーバーでOpneVPNを導入するにはルートユーザーにて、下記の手順で行います。             

「パッケージの取得」→「インストール」→「キー(証明書)の作成」→「設定」


1-1Linuxサーバーについて

今回OpenVPNをインストールするLinuxサーバーはGMOクラウド ALTUS BasicシリーズのOSテンプレートを利用し構築を行いました。

CentOS 6.8 LAMP 64bit 20170117

小さくていいので、検証用に仮想サーバーを新規構築するのがおすすめです。

1-2、パッケージの取得

『最新バージョンの情報入手』→『ftp取得』→『インストール』→『検証』→『運用』→『次バージョンの情報入手』...

と運用ライフサイクルがあるなかで、ここでは取得について記載します。

 

パッケージの取得にはいくつか方法があります。

(1)rpmパッケージを直接ftpサイトからダウンロード

 ->公式リポジトリから取得するため、実運用向け

 

(2)外部パッケージサイト(EPEL/rpmforgeなど)のリポジトリをパッケージシステムに登録し、インストールと同時に取得

 ->比較的新しいバージョンを試せるため、運用の検証向け

 

(3)自分でソースコードからパッケージを作る

 ->バグの修正や最新技術が早期利用できる反面、手間がかかるためパッケージを利用したシステム開発向け

 

今回は(1)で、入手したrpmパッケージのバージョンは以下のとおりです。

OpenVPN本体  :openvpn-2.4.4-1

RSA設定ツール :easy-rsa-2.2.2

依存パッケージ1lzo(これだけ依存関係をもつため、Baseリポジトリから自動取得)

依存パッケージ2lz4-r131

依存パッケージ3pkcs11-helper-1.11-3

パッケージ ダウンロード:

--------------------------------------------------------------------------------

wget ftp://ftp.kddlabs.co.jp/Linux/packages/fedora/epel/6Server/x86_64/easy-rsa-2.2.2-1.el6.noarch.rpm

wget ftp://ftp.kddlabs.co.jp/pub/Linux/packages/fedora/epel/6Server/x86_64/openvpn-2.4.4-1.el6.x86_64.rpm

wget ftp://ftp.kddlabs.co.jp/pub/Linux/packages/fedora/epel/6Server/x86_64/lz4-r131-1.el6.x86_64.rpm

wget ftp://ftp.kddlabs.co.jp/pub/Linux/packages/fedora/epel/6Server/x86_64/pkcs11-helper-1.11-3.el6.x86_64.rpm

--------------------------------------------------------------------------------

このあとインストールに移りますが、この時点はインストール前のクリーンな環境のため、

ぜひALTUSの仮想マシンスナップショットを作成することをおすすめします。

『インストールに失敗した!』『最初からやりなおしたい!』など再構築の際、仮想マシンの作成からいちいちやりなおす手間が省けるので、楽にやりなおしができます。

仮想マシンスナップショットの使い方はこちら


1-3、インストール

yumコマンドにてインストールを行います。

--------------------------------------------------------------------------------

sudo yum localinstall  ./pkcs11-helper-1.11-3.el6.x86_64.rpm  ./lz4-r131-1.el6.x86_64.rpm ./openvpn-2.4.4-1.el6.x86_64.rpm ./easy-rsa-2.2.2-1.el6.noarch.rpm

--------------------------------------------------------------------------------

lzoだけはbaseリポジトリを利用するため、Insatalling for dependenciesになっているはずです。 

--------------------------------------------------------------------------------

Install       4 Package(s)

 

Total size: 1.4 M

Total download size: 55 k

Installed size: 1.5 M

Is this ok [y/N]: y← yを入力しENTER

(中略) 

Installed:

  easy-rsa.noarch 0:2.2.2-1.el6  lz4.x86_64 0:r131-1.el6  openvpn.x86_64 0:2.4.4-1.el6  pkcs11-helper.x86_64 0:1.11-3.el6

 

Dependency Installed:

  lzo.x86_64 0:2.03-3.1.el6_5.1

 

Complete!

--------------------------------------------------------------------------------

これでインストールは完了しました。


1-4、キーの作成

OpenVPNで使用する各種証明書(キーファイル)の作成を行います。

OpenVPNはインストールすると、証明書発行用のユーティリティーも一緒にインストールされるため、その簡単な設定から行います。

1-4-1、ユーティリティーのコピー 

インストールディレクトリから、一般的に利用しやすい/etc/openvpnディレクトリへツール類を移動します。

cp -r /usr/share/openvpn/easy-rsa/2.0/ /etc/openvpn/easy-rsa

  

1-4-2、設定の変更

証明書に書き込む所属情報などは設定ファイルを編集しておくと、毎回入力する必要がないため、クライアントが多いような場合は編集しておくと便利です。(ここは絶対に必要な工程ではありません。)

vim /etc/openvpn/easy-rsa/vars

ファイルの最後あたりに

ーーーーーーーーーーーーーーーーーーー

export KEY_COUNTRY="US"

export KEY_PROVINCE="CA"

export KEY_CITY="SanFrancisco"

export KEY_ORG="Fort-Funston"

export KEY_EMAIL="me@myhost.mydomain"

ーーーーーーーーーーーーーーーーーーー 

とあるので、以下のように変更します。

 ーーーーーーーーーーーーーーーーーーー

export KEY_COUNTRY="JP" ← サーバー所在地(国名)を指定(:JP)

export KEY_PROVINCE="Tokyo" ← サーバー所在地(都道府県名)を指定

export KEY_CITY="Shibuya-ku" ← サーバー所在地(市区町村名)を指定

export KEY_ORG="GMOCLOUD K.K." ← サーバー名を指定

export KEY_EMAIL="vpn-root@gmocloud.com" ← サーバー管理者メールアドレスを指定

ーーーーーーーーーーーーーーーーーーー

上記は一例です、お客さまの情報に応じて変更してください。

 

キーの作成では、サーバーの証明書、クライアントPCで使用するクライアント証明書、OpenVPNで使用する証明書を3種類作成します。

準備: 設定を有効にするため、以下のコマンドを実行します。

ーーーーーーーーーーーーーーーーーーー 

cd /etc/openvpn/easy-rsa

. ./vars

 ーーーーーーーーーーーーーーーーーーー

これは以下のコマンドと一緒です。

先頭の”.”がコマンドですので忘れないでください。

 ーーーーーーーーーーーーーーーーーーー

source ./vars

 ーーーーーーーーーーーーーーーーーーー

でも同じ効果があります。

実行後ちょっとしたメッセージが出ますがエラーではありません。

次にいったん、キーファイルの出力先を初期化します。今回はインストール直後のため、実行しなくても問題ありませんが、念のため実行します。

 ーーーーーーーーーーーーーーーーーーー

./clean-all

 ーーーーーーーーーーーーーーーーーーー

準備の最後にca(認証局)証明書を作成します。

 ーーーーーーーーーーーーーーーーーーー

./build-ca ← CA証明書・秘密鍵作成

Generating a 1024 bit RSA private key

.......++++++

......++++++

writing new private key to 'ca.key'

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [JP]: ← ENTER

State or Province Name (full name) [Tokyo]: ← ENTER

Locality Name (eg, city) [Shibuta-ku]: ← ENTER

Organization Name (eg, company) [GMOCLOUD K.K.]: ← ENTER

Organizational Unit Name (eg, section) []: ← ENTER

Common Name (eg, your name or your server's hostname) [gmocloud.com CA]: ← ENTER

Name [EasyRSA]: ← ENTER

Email Address [vpn-root@gmocloud.com]: ← ENTER

 ーーーーーーーーーーーーーーーーーーー

設定を変更している場合は上のように変更した情報があらかじめ入力された状態となりますので、必要に応じて変更します。(設定を変更していない場合も、できるだけ自分の組織に合ったものに変更する方がベストです。) ファイルができたか確認しておきます。

 ーーーーーーーーーーーーーーーーーーー

ls ./keys/

 ーーーーーーーーーーーーーーーーーーー

ca.crt ca.key2つのファイルがあること。(他にもファイルができていますが、重要なのはこの2ファイルのみです。)

サーバー証明書: ・サーバー証明書を作成します

 ーーーーーーーーーーーーーーーーーーー

./build-key-server server

 ーーーーーーーーーーーーーーーーーーー

以下のように追加情報の入力を促されるため、入力していきます。

 ーーーーーーーーーーーーーーーーーーー

Generating a 2048 bit RSA private key

..................................+++

.......+++

writing new private key to 'ca.key'

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [JP]: ← ENTER

State or Province Name (full name) [Tokyo]: ← ENTER

Locality Name (eg, city) [Shibuya-ku]: ← ENTER

Organization Name (eg, company) [GMOCLOUD K.K.]: ← ENTER

Organizational Unit Name (eg, section) [MyOrganizationalUnit]: ← ENTER

Common Name (eg, your name or your server's hostname) [GMOCLOUD K.K. CA]: ← ENTER

Name [EasyRSA]: ← ENTER

Email Address [vpn-root@gmocloud.com]: ← ENTER

 

ls keys/

ca.crt  ca.key  index.txt  serial

 

./build-key-server server

Generating a 2048 bit RSA private key

..........................+++

.................+++

writing new private key to 'server.key'

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [JP]:← ENTER

State or Province Name (full name) [Tokyo]:← ENTER

Locality Name (eg, city) [Shibuya-ku]:← ENTER

Organization Name (eg, company) [GMOCLOUD K.K.]← ENTER:

Organizational Unit Name (eg, section) [MyOrganizationalUnit]:← ENTER

Common Name (eg, your name or your server's hostname) [server]:openvpn← ENTER

Name [EasyRSA]:← ENTER

Email Address [vpn-root@gmocloud.com]:← ENTER

 

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf

Check that the request matches the signature

Signature ok

The Subject's Distinguished Name is as follows

countryName           :PRINTABLE:'JP'

stateOrProvinceName   :PRINTABLE:'Tokyo'

localityName          :PRINTABLE:'Shibuya-ku'

organizationName      :PRINTABLE:'GMOCLOUD K.K.'

organizationalUnitName:PRINTABLE:'MyOrganizationalUnit'

commonName            :PRINTABLE:'openvpn'

name                  :PRINTABLE:'EasyRSA'

emailAddress          :IA5STRING:'vpn-root@gmocloud.com'

Certificate is to be certified until Oct 30 01:02:08 2027 GMT (3650 days)

Sign the certificate? [y/n]:y

 

1 out of 1 certificate requests certified, commit? [y/n]y

Write out database with 1 new entries

Data Base Updated

 ーーーーーーーーーーーーーーーーーーー

ここでも設定ファイルを変更した場合、初期値が入力されているため、必要な部分のみ入力を行います。 ファイルができているか確認します。

 ーーーーーーーーーーーーーーーーーーー

ls ./keys/

 ーーーーーーーーーーーーーーーーーーー

server.crt server.csr server.key3ファイルができていること。

OpenVPNの使う各種証明書、キーファイルの作成:

・鍵交換の際に使用される暗号キーファイル(dhファイル)を作成します。

 ーーーーーーーーーーーーーーーーーーー

./build-dh

 ーーーーーーーーーーーーーーーーーーー

しばらく”.”や”+”の文字がたくさん出ますが、しばらくすると、完了します。 ファイルができているか確認します。

 ーーーーーーーーーーーーーーーーーーー

ls keys/

 ーーーーーーーーーーーーーーーーーーー

dh1024.pemができていること。

・最後にTLSキーファイルを作成します。

 ーーーーーーーーーーーーーーーーーーー

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

 ーーーーーーーーーーーーーーーーーーー

TLSキーファイルは直接/etc/openvpnに作成します。

ファイルができているか確認します。

 ーーーーーーーーーーーーーーーーーーー

ls /etc/openvpn/

 ーーーーーーーーーーーーーーーーーーー

ta.keyがあること。

作成したキーを移動します。

OpenVPNの設定ファイルを記述する際にわかりやすいように、各キーファイルを移動します。

(設定ファイルにpath込みで記述する場合は移動は必要ありませんが、今回の活用術では設定ファイルと同じ場所に置く形式とします。)

ーーーーーーーーーーーーーーーーーーー 

cp keys/ca.crt /etc/openvpn/

cp keys/server.crt /etc/openvpn/

cp keys/server.key /etc/openvpn/

cp keys/dh2048.pem /etc/openvpn/

 ーーーーーーーーーーーーーーーーーーー

ユーザー(クライアント)キーファイル(証明書)の作成: クライアントのキーファイルもサーバー側で作成します。

ーーーーーーーーーーーーーーーーーーー

./build-key-pass client_pc1

Generating a 2048 bit RSA private key

...................................+++

.........................+++

writing new private key to 'client_pc1.key'

Enter PEM pass phrase:

Verifying - Enter PEM pass phrase:

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [JP]:← ENTER

State or Province Name (full name) [Tokyo]:← ENTER

Locality Name (eg, city) [Shibuya-ku]:← ENTER

Organization Name (eg, company) [GMOCLOUD K.K.]:← ENTER

Organizational Unit Name (eg, section) [MyOrganizationalUnit]:← ENTER

Common Name (eg, your name or your server's hostname) [client_pc1]:← ENTER

Name [EasyRSA]:← ENTER

Email Address [vpn-root@gmocloud.com]:← ENTER

 

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf

Check that the request matches the signature

Signature ok

The Subject's Distinguished Name is as follows

countryName           :PRINTABLE:'JP'

stateOrProvinceName   :PRINTABLE:'Tokyo'

localityName          :PRINTABLE:'Shibuya-ku'

organizationName      :PRINTABLE:'GMOCLOUD K.K.'

organizationalUnitName:PRINTABLE:'MyOrganizationalUnit'

commonName            :T61STRING:'client_pc1'

name                  :PRINTABLE:'EasyRSA'

emailAddress          :IA5STRING:'vpn-root@gmocloud.com'

Certificate is to be certified until Oct 30 01:15:44 2027 GMT (3650 days)

Sign the certificate? [y/n]:y

 

 

1 out of 1 certificate requests certified, commit? [y/n]y

Write out database with 1 new entries

Data Base Updated

 ーーーーーーーーーーーーーーーーーーー

ファイルができているか確認します。

 ーーーーーーーーーーーーーーーーーーー

ls keys/

 ーーーーーーーーーーーーーーーーーーー

client_pc1.crt client_pc1.key client_pc1.csr3ファイルができていること。 また、複数のクライアントキーファイルを作成する場合は、コマンド実行時の引数につける名前は必ず一意のものにするようにします。


1-5、設定

最後にOpenVPNのサーバーとしての設定を行います。 設定ファイルのサンプル(元)をコピーします。

ーーーーーーーーーーーーーーーーーーー

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

ーーーーーーーーーーーーーーーーーーー

設定ファイルを編集します。

ーーーーーーーーーーーーーーーーーーー

vim /etc/openvpn/server.conf

ーーーーーーーーーーーーーーーーーーー

英文コメントでパラメーターの説明がありますが、ここでは変更点だけに絞って記載します。

";"がついている場合は削除して有効化します。

なお、既に先頭に";"がついていなければ、そのパラメーターは有効化されていることになります。

 ーーーーーーーーーーーーーーーーーーー

tls-auth ta.key 0 # This file is secret

user nobody

group nobody

 ーーーーーーーーーーーーーーーーーーー

変更したらセーブしてエディターを終了します。 以上でサーバー側の設定は完了となります。


1-6、サーバーの起動

まずは実行前にconfigファイルの検査を実施します。

ーーーーーーーーーーーーーーーーーーー

openvpn --config ./server.conf

 ーーーーーーーーーーーーーーーーーーー

Initialization Sequence Completed

となり、待機状態になったらOKです。

Ctrl+copenvpnプロセスを終了してください。

Conpletedの表示が出ない場合は設定ファイルの間違いがないかを見直します。

 

なお、これ以降のデーモン化(サービス化)を実施した場合に問題が起きたときのことを考えて、設定ファイル中の以下の部分

;log openvpn.log

の先頭の”;”を取り有効化して、エラーメッセージ等を残すことができます。


1-7、サーバーの停止

上記ではCtrl+Cで終了しましたが、サービスとしては

OpenVPNサービスの停止は以下のコマンドを実行します。

 ーーーーーーーーーーーーーーーーーーー

service openvpn stop

 ーーーーーーーーーーーーーーーーーーー

1-8、その他

サーバー起動時の自動実行のための設定等については通常のサービスと同じで、

yumrpmパッケージを使ってインストールしたため、chkconfig上は既にaddされているので、起動時の自動起動を設定します。

 ーーーーーーーーーーーーーーーーーーー

chkconfig openvpn on

chkconfig

 ーーーーーーーーーーーーーーーーーーー

次回は、OpenVPNWindowsサーバーで設定する方法を解説します。

この記事を書いた人

GMOクラウドユーキ

GMOクラウドユーキ

GMOクラウド株式会社 営業部プロダクトグループ所属  前職がシステムエンジニア、前々職が組込プログラマ。 インフラもそうだけど、技術はアーリーアダプター。 気が付くと新しい技術で何かできないか?ばっかり考えてます。 オフはFMラジオとバイクをこよなく愛する寂しがり屋。

インタビュー記事

この記事を書いた人

GMOクラウドユーキ

GMOクラウドユーキ

GMOクラウド株式会社 営業部プロダクトグループ所属  前職がシステムエンジニア、前々職が組込プログラマ。 インフラもそうだけど、技術はアーリーアダプター。 気が付くと新しい技術で何かできないか?ばっかり考えてます。 オフはFMラジオとバイクをこよなく愛する寂しがり屋。

IoTの窓口

docker-tips_bnr

writer