外出先からVPNを通じて自宅のNASに接続する(1. ConohaのVPSにOpenVPNサーバーを立てる)

つい最近NASを購入しました。QNAPのTS-231Pというモデルです。

私はよくGoogleDriveにファイルを置いておいて、外出先で端末(主にiPhone)からそれらを利用できるようにしています。クラウドストレージは大変便利なんですけど、あえてNASでこれと同じようなことをできるようにしたいなと思いました。

というわけで外出先でiPhoneから自宅のNASに接続できるようにしました!iPhoneNASのコネクションにはOpenVPNによるVPNネットワークを利用します。OpenVPNのサーバーはConohaのVPS上に立てます。簡単に図にするとこんな感じの環境を作りました。オレンジ色の線はVPNのトンネルだと思ってください。

f:id:etogen:20180326190546p:plain

環境の作成については複数の記事にまとめたいと思います。今回はOpenVPNサーバーの構築編です。

使用するアプリケーションのバージョン等

OpenVPNVPS(Ubuntu16.04)

インストールするパッケージ

  • openvpn: 2.3.10-1ubuntu2.1
  • libssl-dev: 1.0.2g-1ubuntu4.10
  • openssl: 1.0.2g-1ubuntu4.10
  • easy-rsa: 2.2.2-2

iPhoneiOS 11.2.6)

インストールするアプリ

  • OpenVPN Connect: 1.2.9
  • Qfile: 2.7.4

TS-231P(4.3.4)

インストールするアプリ

  • QVPN Service: 1.1.172

1. OpenVPNのインストール

OpenVPNのサーバー構築では以下2つの記事を参考にしました。

ちなみにConohaのマシンはプライベートネットワークには繋がっておらず、パブリックIPで外部から直接アクセスできる状態です。

まずは必要なパッケージをインストールします。

$ sudo apt-get update
$ sudo apt-get install openvpn libssl-dev openssl easy-rsa

2. 簡易CAの作成

$ sudo -s
# make-cadir /etc/openvpn/easy-rsa
# cd /etc/openvpn/easy-rsa

easy-rsa環境変数の設定

# vim ./vars
...
export KEY_COUNTRY="JP"
export KEY_PROVINCE="Tokyo"
export KEY_CITY="Tokyo"
export KEY_ORG="Etogen"
export KEY_EMAIL="hogehoge@fuga.com"
export KEY_OU="Etogen-Lab"
...

環境変数をシステムに反映

# source ./vars

この時「NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys」というメッセージが出てくると思いますが気にしなくていいです。

証明書や鍵を置くためのディレクトリを初期化します。

# ./clean-all

3. CA証明書・秘密鍵 の作成

# ./pkitool --initca
Using CA Common Name: Etogen CA
Generating a 2048 bit RSA private key
..............................................................+++
........................................+++
writing new private key to 'ca.key'
-----

これを実行すると/etc/openvpn/easy-rsa/keysの下にCAの証明書と秘密鍵のファイルが作られます。

# ls keys
ca.crt  ca.key  index.txt  serial

ちなみに./clean-allをやってないと./pkitool --initcaを実行した時このようなメッセージが表示されます。 

# ./pkitool --initca
Using CA Common Name: Etogen CA
  Please edit the vars script to reflect your configuration,
  then source it with "source ./vars".
  Next, to start with a fresh PKI configuration and to delete any
  previous certificates and keys, run "./clean-all".
  Finally, you can run this tool (pkitool) to build certificates/keys.

DHパラメータ作成

# ./build-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
......................................+............+...............................................................................................................................................+.....................................................+........................................................................................................+...........................................+.........................................
...

4. OpenVPNサーバーの証明書作成

# ./pkitool --server conoha
Generating a 2048 bit RSA private key
....................................................................+++
............+++
writing new private key to 'conoha.key'
-----
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:'Tokyo'
organizationName      :PRINTABLE:'Etogen'
organizationalUnitName:PRINTABLE:'Etogen-Lab'
commonName            :PRINTABLE:'conoha'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'hogehoge@fuga.com'
Certificate is to be certified until Mar 18 12:55:20 2028 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

tls-authで使用するためのTLS鍵を作成。tls-authを有効にするとDoS攻撃に対抗できるようです。(参考: OpenVPN TLS-Auth とは?

# openvpn --genkey --secret ta.key

ここまでで作成したファイルを/etc/openvpnにコピー

# cp keys/*.crt keys/*.key keys/dh2048.pem ta.key /etc/openvpn

5. OpenVPNクライアントの証明書作成

今回OpenVPNのクライアントとなるのはiPhoneNASです。よって2つのクライアント用の証明書を作成します。(OpenVPNでは同じ証明書を複数のクライアントで使用することはできないようになっています。必ずクライアントの数だけ作りましょう)

まずiPhone用のものを作成。

# ./pkitool client
Generating a 2048 bit RSA private key
.........................................+++
...............................................+++
writing new private key to 'client.key'
-----
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:'Tokyo'
organizationName      :PRINTABLE:'Etogen'
organizationalUnitName:PRINTABLE:'Etogen-Lab'
commonName            :PRINTABLE:'client'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'hogehoge@fuga.com'
Certificate is to be certified until Mar 18 12:57:01 2028 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

次にNAS用の証明書を作成。

# ./pkitool client2
Generating a 2048 bit RSA private key
.........................................+++
...

6. OpenVPNサーバーの起動

OpenVPNサーバーの設定ファイルを作成・編集します。サンプルの設定ファイルが用意されているので、それを編集するといいかもしれません。

# gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
# cd ..
# vim ../server.conf

変更点を以下に示します。

;client-to-client
↓
client-to-client

ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
↓
ca ca.crt
cert conoha.crt
key conoha.key  # This file should be kept secret

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

特にclient-to-clientの設定は必ずやっておきましょう。これをやらないとiPhoneNASVPNクライアント同士)の通信ができません。

編集が完了したらこの設定ファイルを指定してOpenVPNサーバーを起動します。

# openvpn server.conf

今回はこれで終わります。「外出先からVPNを通じて自宅のNASに接続する(2. iPhoneOpenVPNに接続する)」へ続きます...。

etogen.hatenablog.com