さくらのVPS512(月々税抜635円)で固定IPアドレスをゲットする(OpenVPNサーバを作る)

## はじめに
固定IPサービスといえば[マイIP](http://www.interlink.or.jp/service/myip/)([株式会社インターリンク](http://www.interlink.or.jp/))が有名でしょうか。
1アカウント1,000円(税抜)/月ですので、リーズナブルです。

しかし、**もっと安価に使いたい＆複数アカウントでも使いたい**、というニーズもあると思います。
自分でサーバを管理していくという手間は発生しますが、
安価かつ柔軟に(≒複数人で)固定IPアドレスを使えるよう、
VPNサーバを立ち上げる手順をまとめます。

手順を作るにあたり詰まってしまった部分は、以下のWebページで解消できました(順不同)。
感謝申し上げます。
- [VPNサーバー構築(OpenVPN)](http://centossrv.com/openvpn.shtml) (サイト:[CentOSで自宅サーバー構築](http://centossrv.com/))
- [OpenVPNで通信が遅い場合](http://vogel.at.webry.info/201504/article_10.html) (サイト:[パソコン鳥のブログ](http://vogel.at.webry.info/))

## 作業前提(自己責任でご判断ください)
- 今回は「[さくらのVPS](https://vps.sakura.ad.jp/) 512プラン(月々税抜635円 2016/02/06現在)」を使う
- CentOS7.1
- OpenVPN
- ほかの機能(Webサーバ等)は一切設けない
- 複数人で使えるようにする
- クレジットカード決済にすると2週間お試しが可能(2016/02/06現在)
- お試し期間中は[回線速度制限など](http://vps.sakura.ad.jp/flow/#target_trial)があり充分には評価できない可能性がある
- 説明の簡略化のため、ほぼすべてrootで作業
- コマンドの入力、viによるファイルの編集などがあり、漏れなく作業が必要
- 契約・請求・キャンセル方法等については、さくらインターネット株式会社からの案内に従ってください

問題なければ始めましょう。

## 作業手順
### 申込の開始
[さくらのVPS](https://vps.sakura.ad.jp/)の「**2週間お試し無料!お申込みはこちら>**」から申込を開始します。
![VPS（仮想専用サーバ）｜さくらインターネット - 無料お試し実施中.png](https://qiita-image-store.s3.amazonaws.com/0/111947/b0552493-2de3-8f26-a586-01af210cf999.png)

**さくらの会員ID**がない場合には新規登録してください。
![SAKURA.AD.JP -- お申込み.png](https://qiita-image-store.s3.amazonaws.com/0/111947/2177e0b3-29fe-5aa6-3190-308b30369361.png)

リージョンとスペックの選択では、**512プラン**を選択してください。
![SAKURA.AD.JP -- お申込み.png](https://qiita-image-store.s3.amazonaws.com/0/111947/c02e3d35-2725-d2f2-f472-63857b3eb612.png)

支払方法は、**毎月払い＋クレジットカード**がおすすめです。
![SAKURA.AD.JP -- お申込み.png](https://qiita-image-store.s3.amazonaws.com/0/111947/6a6c834d-2b29-53c5-bc89-22617ccc34e9.png)

確認画面にも記載がありますが、無料期間中に解約すれば料金はかかりません(2016/02/06現在)。
![SAKURA.AD.JP -- お申込み.png](https://qiita-image-store.s3.amazonaws.com/0/111947/c690af03-d937-4b38-15f5-7715d888b428.png)

### 仮登録完了通知の受信・コントロールパネルへのログイン
申込が確定してしばらく経過すると、「**仮登録完了のお知らせ**」という件名のメールが届きます。
VPSコントロールパネルにログインして状態を確認してみましょう。

```
 ▼サーバ情報

  [サーバ基本情報]
   IPアドレス：XXX.XXX.XXX.XXX

  [管理用ユーザ]
   ユーザ名      ：XXXXXXXXXX
   初期パスワード：XXXXXXXXXX

  [VPSコントロールパネル ログイン情報]
     URL       ：https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
     IPアドレス：XXX.XXX.XXX.XXX
     パスワード：XXXXXXXXXX

  ※ご提供時の初期状態ではサーバは停止状態になっていますので、利用を開始
    する際は「VPSコントロールパネル」にログインしサーバを起動して下さい。
```
![さくらのVPSコントロールパネル.png](https://qiita-image-store.s3.amazonaws.com/0/111947/0085b256-4103-06c0-789f-0e80d7e2ddee.png)

会員IDとパスワードを入力してログインします。
![会員メニュー｜さくらインターネット.png](https://qiita-image-store.s3.amazonaws.com/0/111947/d5901128-a58c-aa00-d77c-bf393bcaa280.png)

### サーバ一覧の確認
サーバ一覧に、作られたばかりのサーバが表示されています。初期状態は「**停止中**」です。
<img width="418" alt="サーバ一覧 - さくらのVPSコントロールパネル.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/06e63bfa-e3d2-49c3-0d8d-fae00ec13d8f.png">

### カスタムOSインストールの開始
サーバをクリックすると詳細な情報を表示する画面に遷移しますので、
「**OSインストール**」のプルダウンから「**カスタムOSインストール**」を選択してください。
<img width="444" alt="名称未設定 - さくらのVPSコントロールパネル.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/48ab10ed-fb06-dc8f-0cd4-ad2bd85ec670.png">

インストールOSに「**CentOS7 x86_64**」を選択して次に進みます。
![カスタムOSインストール(名称未設定) - さくらのVPSコントロールパネル.png](https://qiita-image-store.s3.amazonaws.com/0/111947/80b34ee7-9038-2bec-18cd-667daeca5333.png)

インストールが開始されると、コンソールを開いて作業を進めるように指示されます。
「**VNCコンソール(HTML5版)を起動**」で次に進みます。
![名称未設定3 - さくらのVPSコントロールパネル.png](https://qiita-image-store.s3.amazonaws.com/0/111947/8389c9dc-4518-6120-1914-28564da868a5.png)

インストール初期画面が表示されていますので、エンターキーで次に進みます。
<img width="562" alt="d7e6ec51-98f7-e144-f01e-3ce27670ca45.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/2dc4fea6-52df-f08a-299e-df5a738138af.png">

ここから先の画面は少し広くなりますので、ウィンドウを適宜広げてください。
まずは「**LANGUAGE SUPPORT**」で言語選択画面に入り、**日本語**を追加して確定(Done)します。
<img width="979" alt="ff9289af-73d4-fac3-1b5c-a3d017b2391e.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/4a2f9f11-cab2-ed9b-1d51-1c06f748cdf0.png">
<img width="978" alt="8dddfffe-99a8-eaca-012d-64a7f3ce0eb1.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/59ee3992-95a5-fb5d-4d1a-381bf54feb32.png">

次に「**INSTALLATION DESTINATION**」でインストール先のディスク選択画面に入ります。
<img width="979" alt="3f202718-b315-c200-a97b-e2da878aab8d.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/b27729ae-e61c-9745-7165-afd43402effb.png">

ここで、追加できるディスクはありませんのでいったん確定(Done)してください。
次のような画面が表示されます。
<img width="978" alt="84de3fec-dcf2-7cff-f9cb-4e6ad411754b.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/a6ab6989-c7f1-bd80-3e2d-4aba36d2f9c2.png">

もともとインストールされていた別のバージョンのCentOSがディスクを消費していて、
このままではインストールできません。「**Reclaim space**」で次に進みます。

今回は細かい設定をせず、「**Delete all**」を実行します。
<img width="975" alt="a1bbe664-9a12-ecd8-6c33-4b26ace4eb0c.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/4db5ae6f-9893-4388-7170-3e6b401afcbf.png">

すべてのディスクのActionが「**Delete**」に変わったのを確認したら、「**Reclaim space**」を実行します。
<img width="976" alt="d18ad7fb-2599-0e1e-c225-2628b26a063d.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/f5f7781b-a856-b66f-3f17-dbe11a1f99e4.png">

元の画面に戻ったら、「**Begin Installation**」で次に進みます。
<img width="975" alt="d03b7a57-bd44-9d1c-8115-e99a240c2a33.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/c10716f4-264d-7dc2-cf19-a3d610560950.png">

インストールが始まります。待っている間に、「**ROOT PASSWORD**」を設定しておきましょう。
<img width="971" alt="5b217d6f-a841-03ae-bd75-eb4def2bb1ef.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/080e6b8f-335f-660b-5999-067564e7ec28.png">
<img width="975" alt="5f614bf8-6e10-cbc8-7fc3-46024ad3de78.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/d905b48a-1351-eac4-d5d2-b6bd90451478.png">

インストールが終わると、自動的にシャットダウンしますので、サーバの一覧に戻り、
サーバの左側にあるチェックボックスにチェックを入れて「**起動**」しましょう。
状態が「**稼働中**」に変化します。
<img width="418" alt="サーバ一覧 - さくらのVPSコントロールパネル.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/e1ffb8dd-a0ed-a731-0690-b7c64c770c56.png">

### SSHログイン
ここから先は**SSH**経由で作業します。
Windowsなら**TeraTerm**など、Macなら**ターミナル**などでログインしてください。
ログイン先のサーバはメールに記載されているIPアドレス、ユーザはroot、パスワードはインストール中に設定したパスワードです。

### rootパスワードの設定
ここから先はすべてrootで作業します。
先ほど設定したrootのパスワードが気に入らない場合は修正しておきましょう。

```
$ passwd root
Changing password for user root.
New password:パスワード入力
Retype new password:パスワード再入力
passwd: all authentication tokens updated successfully.
```

### SELinuxの無効化
"**SELINUX=disabled**"となっている場合は変更の必要がありません。先に進みましょう。

```
$ vi /etc/selinux/config
```

```conf:/etc/selinux/config(抜粋)
#SELINUX=enforcing
SELINUX=disabled
```

### SSHログイン用ユーザの追加
SSHでログインする際、最初からrootでログインするのはセキュアではないため、
別のユーザを作り、パスワードを設定します。
今後は、別ユーザでログインしてからrootになる、という流れを作るわけです。

```
$ useradd sshuser
$ passwd sshuser
Changing password for user sshuser.
New password:パスワード入力
Retype new password:パスワード再入力
passwd: all authentication tokens updated successfully.
```

### rootでのSSHログインの無効化
SSHでログインする際、rootでのログインを許可しないように設定します。

```
$ vi /etc/ssh/sshd_config
```

```conf:/etc/ssh/sshd_config(抜粋)
#PermitRootLogin yes
PermitRootLogin no
```
変更を反映します。

```
$ systemctl restart sshd.service
```

次回以降のログインの流れについて触れておきます。
先ほど作ったsshuserでログインした後、rootになるには以下のように入力します。

```
$ su -
Password:パスワード入力
```
sshuserでログインする流れを確認したところで、
SELinuxの設定変更の反映もしておきたいので、サーバを再起動します。

```
$ reboot
```
再度SSHでアクセスできるようになったら、sshuserでログインし、rootになります。

### IPフォワーディングの有効化

```
$ vi /etc/sysctl.d/10-ipv4.conf
```

```conf:/etc/sysctl.d/10-ipv4.conf(抜粋)
#追記
net.ipv4.ip_forward = 1
```
変更を反映します。

```
$ sysctl -p /etc/sysctl.d/10-ipv4.conf
net.ipv4.ip_forward = 1
```

### openssl設定の編集

```
$ vi /etc/pki/tls/openssl.cnf
```

```conf:/etc/pki/tls/openssl.cnf(抜粋)
#default_days   = 365                   # how long to certify for
default_days    = 3650                  # how long to certify for
#default_crl_days = 30                  # how long before next CRL
default_crl_days = 3650                 # how long before next CRL
```

### openvpnのインストール

```
$ yum -y install epel-release
$ yum -y install openvpn
$ yum -y install wget
```
この後、設定をしていくわけですが、先にパスワードを1つ決めておいてください。
各種証明書の作成時などに使います。
**パスワード(A)**とします。

### CA証明書・秘密鍵の作成

```
$ cd /usr/local/src/
$ wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
$ unzip master.zip
$ cp -r easy-rsa-master/easyrsa3/ /etc/openvpn/
$ rm -fr easy-rsa-master/
$ cd /etc/openvpn/easyrsa3/
$ ./easyrsa init-pki

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/easyrsa3/pki

$ ./easyrsa build-ca
Generating a 2048 bit RSA private key
............................................................................................+++
.................................................+++
writing new private key to '/etc/openvpn/easyrsa3/pki/private/ca.key.XXXXXXXXXX'
Enter PEM pass phrase:パスワード(A)入力
Verifying - Enter PEM pass phrase:パスワード(A)再入力
-----
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.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:サーバ名入力(例: vpnserver)

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/easyrsa3/pki/ca.crt

$ cp pki/ca.crt /etc/openvpn/
```

### サーバ証明書・秘密鍵の作成

```
$ ./easyrsa build-server-full server nopass
Generating a 2048 bit RSA private key
...................................................+++
...............................................................................+++
writing new private key to '/etc/openvpn/easyrsa3/pki/private/server.key.e7omRJmwXu'
-----
Using configuration from /etc/openvpn/easyrsa3/openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:パスワード(A)入力
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :PRINTABLE:'server'
Certificate is to be certified until Feb  3 04:11:41 2026 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

$ cp pki/issued/server.crt /etc/openvpn/
$ cp pki/private/server.key /etc/openvpn/
```

### DHパラメータの作成

```
$ ./easyrsa gen-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
(省略)

DH parameters of size 2048 created at /etc/openvpn/easyrsa3/pki/dh.pem

$ cp pki/dh.pem /etc/openvpn/
```

### クライアント証明書(ダミー)の作成

```
$ ./easyrsa build-client-full dmy nopass
Generating a 2048 bit RSA private key
..................+++
..................+++
writing new private key to '/etc/openvpn/easyrsa3/pki/private/dmy.key.XXXXXXXXXX'
-----
Using configuration from /etc/openvpn/easyrsa3/openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:パスワード(A)入力
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :PRINTABLE:'dmy'
Certificate is to be certified until Feb  3 04:14:46 2026 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

$ ./easyrsa revoke dmy


Please confirm you wish to revoke the certificate with the following subject:

subject=
    commonName                = dmy


Type the word 'yes' to continue, or any other input to abort.
  Continue with revocation: yes
Using configuration from /etc/openvpn/easyrsa3/openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:パスワード(A)入力
Revoking Certificate 02.
Data Base Updated

IMPORTANT!!!

Revocation was successful. You must run gen-crl and upload a CRL to your
infrastructure in order to prevent the revoked cert from being accepted.
```

### CRLの作成

```
$ cp vars.example vars
$ vi vars
```

```text:/etc/openvpn/easyrsa3/vars(抜粋)
#set_var EASYRSA_CRL_DAYS       180
set_var EASYRSA_CRL_DAYS       3650
```

```
$ ./easyrsa gen-crl
Using configuration from /etc/openvpn/easyrsa3/openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:パスワード(A)入力

An updated CRL has been created.
CRL file: /etc/openvpn/easyrsa3/pki/crl.pem

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

### OpenVPNの設定

```
$ vi /etc/openvpn/server.conf
```

```conf:/etc/openvpn/server.conf(全体)
port 1194
proto udp
dev tun

ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh.pem

server 192.168.100.0 255.255.255.0

ifconfig-pool-persist ipp.txt

push "redirect-gateway def1"
push "dhcp-option DNS 133.242.0.3" # sakura DNS1
push "dhcp-option DNS 133.242.0.4" # sakura DNS2

# iOSで使う場合、fragmentは非対応のためコメントアウトしてください
fragment 1280

mssfix 1280
link-mtu 1400

client-to-client

keepalive 10 120

comp-lzo

user nobody
group nobody

persist-key
persist-tun

status openvpn-status.log

log-append  /var/log/openvpn.log

verb 3

crl-verify crl.pem
```

### サービスの登録・起動

```
$ systemctl enable openvpn@server.service
Created symlink from /etc/systemd/system/multi-user.target.wants/openvpn@server.service to /usr/lib/systemd/system/openvpn@.service.

$ systemctl start openvpn@server.service
```

### Firewallの設定

```
$ firewall-cmd --permanent --zone=public --add-masquerade
$ firewall-cmd --permanent --zone=public --add-port=1194/udp
$ firewall-cmd --reload
$ firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh
  ports: 1194/udp
  masquerade: yes
  forward-ports:
  icmp-blocks:
  rich rules:
```

### クライアント証明書・秘密鍵の作成
複数ユーザ分を作る場合は繰り返してください。

```
$ cd /etc/openvpn/easyrsa3/
$ ./easyrsa build-client-full ユーザ名
Generating a 2048 bit RSA private key
...............................................................+++
...................................+++
writing new private key to '/etc/openvpn/easyrsa3/pki/private/ユーザ名.key.XXXXXXXXXX'
Enter PEM pass phrase:ユーザ個別のパスワード入力
Verifying - Enter PEM pass phrase:ユーザ個別のパスワード再入力
-----
Using configuration from /etc/openvpn/easyrsa3/openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:パスワード(A)入力
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :T61STRING:'ユーザ名'
Certificate is to be certified until Feb  3 04:25:02 2026 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

$ cp /etc/openvpn/ca.crt /home/sshuser/
$ cp /etc/openvpn/easyrsa3/pki/issued/ユーザ名.crt /home/sshuser/
$ cp /etc/openvpn/easyrsa3/pki/private/ユーザ名.key /home/sshuser/
$ chown sshuser:sshuser /home/sshuser/ca.crt
$ chown sshuser:sshuser /home/sshuser/ユーザ名.crt
$ chown sshuser:sshuser /home/sshuser/ユーザ名.key
```

### 各証明書・秘密鍵のユーザへの配布
一つ前の手順で/home/sshuser以下に設置しましたので、
SFTPなどでログインしてダウンロードするとよいでしょう。

```
ca.crt
ユーザ名.crt
ユーザ名.key
```
また、下記の情報も伝えます。

```
ユーザ名
ユーザ個別のパスワード
```

### クライアントの接続設定
ユーザの端末上でOpenVPNへの接続設定をします。
ここではWindows向けOpenVPNクライアントである[vpnux Client](http://www.vpnux.jp/)を使った例を記載します。

プロファイルを新規に作成します。
<img width="319" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/29fa8188-92ff-6313-6585-bde8c02d8e98.png">
<img width="345" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/cdb15edf-4881-ac41-68ee-a3bbf7422911.png">

下記の画面のように入力します。
<img width="450" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/87c994c2-88a0-31b6-8a01-20f5c294e9bf.png">

「CA証明書」の「...」を選択し、「ファイルから読み込み」を選択し、ca.crtを選択して「保存」します。
<img width="450" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/e18ebcaf-2434-e347-44ca-d567e9b81f7d.png">

「証明書」の「...」を選択し、「ファイルから読み込み」を選択し、ユーザ名.crtを選択して「保存」します。
<img width="450" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/99dbdc72-9f21-8c7e-5a0c-35d516d77e63.png">

「秘密鍵」の「...」を選択し、「ファイルから読み込み」を選択し、ユーザ名.keyを選択して「保存」します。
<img width="450" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/4db3370a-528b-47a6-4b7b-a4bc3400883b.png">

「詳細設定」を選択し、以下のように設定します。
<img width="450" alt="vpnux2.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/e2bac3f9-ecbe-6e63-8430-07f33f034d7d.png">

設定を保存したら最初の画面に戻り、いよいよ接続です。
<img width="319" alt="e35934e3-57c4-55f6-65cd-d31f9eddc495.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/2fb90195-d106-8e0b-8ec9-cb32751eb57c.png">

### 接続の確認
接続が完了したら、自分のIPアドレス確認用のサイトに行って確認してみましょう。
さくらのVPSで与えられたサーバのIPアドレスになっていたら成功です。
[IPアドレス確認｜Web便利ツール@ツールタロウ](http://tool-taro.com/request_info/)
<img width="304" alt="IPアドレス確認｜Web便利ツール@ツールタロウ.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/dcffa2af-664e-06bd-b7da-7b09917c0fab.png">

なお、お試し期間中のサーバで回線速度制限がかかった状態でしたが、
Webサイトを閲覧する分には支障はありませんでした。
今もVPN接続している状態で編集作業をしています。

## さいごに
必要最小限の作業にとどめたつもりでいるのですが、課題は色々あると思います。

例えば、

- SSHはどこからでも接続できてしまう(→Firewallで閉じ、普段はさくらのコンソールから作業する等の対応は可能)
- このサーバの状態を監視する手段がない

などです。

適宜、環境に合わせて追加・変更していただき、快適な運用をしていただければ幸いです。
ここまでお付き合いいただきましてありがとうございました。

##環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)