CentOS7でVPNサーバを作ってみた（tun編）・・・サーバ起動まで

外出先から自宅のルータの設定を変更できると便利だなと思い、自宅の**CentOS7.4**で**OpenVPN+easy-rsa**を使ったVPN環境を作ってみたので、再作成するときのために手順を残します。

# 準備作業
## ルータの設定変更
### ポートフォワードの設定
自宅ルータのポートフォワード設定で、ルータの1194ポートに来たパケットを、サーバ(CentOS)の1194ポートへフォワードするように設定変更しておきます。
※設定方法は、ルータによる
##Firewallの設定変更
CentOSのfirewallの設定を変更します。
対象となるZone(僕の自宅の場合はZone=external)になっているので、そこに1194/udpの通信許可を追加します。

```console:firewallへ1194/udpの通信許可を設定
# firewall-cmd --add-port=1194/udp --zone=external --permanent
# firewall-cmd --reload
```

# 導入作業
## パッケージのインストール
### epelリポジトリの追加

今回はepelリポジトリ経由でインストールするので、まずはyumにリポジトリの追加を行います。

```console:epelリポジトリの追加
# yum install epel-release -y
```

### パッケージのインストール
OpenVPNとeasy-rsaをepelリポジトリからインストールします。

```console:パッケージのインストール
# yum --enablerepo=epel -y install openvpn easy-rsa
```

*※2018/3/31：openvpn2.4.5とeasy-rsa3.0.3がインストールされました。*

## 認証局の設置
### 認証局の設置
(1)ファイルのコピー
バージョンアップ等で書き換えられると困るので、/etc/openvpn/easy-rsa/にコピーしておきます。

```console:設定ファイルのコピー
# mkdir /etc/openvpn/easy-rsa
# cp /usr/share/easy-rsa/3.0.3/* /etc/openvpn/easy-rsa/ -R
```

(2)作業ディレクトリの移動

```console:/etc/openvpn/easy-rsa/へ移動
# cd /etc/openvpn/easy-rsa
```

(3)初期化

```console:初期化
# ./easyrsa init-pki
```

*※pkiディレクトリが作成されます*

(4)認証局の作成

```console:認証局の作成
# ./easyrsa build-ca
Generating a 2048 bit RSA private key
.......................................+++
.............................................................................+++
writing new private key to '/etc/openvpn/easy-rsa/pki/private/ca.key.UzE5bd0SCu'
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.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]: <任意の名前を入力>

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/easy-rsa/pki/ca.crt
```
*※ca証明書(ca.crt)およびca秘密鍵(ca.key)が作成されます*
*※※入力したパスフレーズは、ca秘密鍵(ca.key)のパスフレーズになります*

(5)DHパラメータの作成

```console:DHパラメータの作成
# ./easyrsa gen-dh
```
*※DHパラメータ(dh.pem)が作成されます。*

(6)サーバ用の証明書と秘密鍵の作成
VPNサーバ「server_r」用の証明書と秘密鍵をパスフレーズ無しで作成します。

```console:サーバ用の証明書と秘密鍵の作成
# ./easyrsa build-server-full server_r nopass
Generating a 2048 bit RSA private key
....+++
.......................................................+++
writing new private key to '/etc/openvpn/easy-rsa/pki/private/server_r.key.O3l2ARzsse'
-----
Using configuration from ./openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: <ca秘密鍵(ca.key)のパスフレーズを入力>
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server_r'
Certificate is to be certified until Mar 28 17:05:59 2028 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated
```
*※サーバ用の証明書(server_r.crt)および秘密鍵(server_r.key)が作成されます*

(7)クライアント用の証明書と秘密鍵の作成
クライアント「client1」用の証明書と秘密鍵をパスフレーズ無しで作成します。

```console:クライアント用の証明書と秘密鍵の作成
# ./easyrsa build-client-full client1 nopass
Generating a 2048 bit RSA private key
................+++
..............................................................................................................+++
writing new private key to '/etc/openvpn/easy-rsa/pki/private/client1.key.MY2YPyBgBr'
-----
Using configuration from ./openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key:<ca秘密鍵(ca.key)のパスフレーズを入力>
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'client1'
Certificate is to be certified until Mar 28 17:17:18 2028 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated
```
*※クライアント用の証明書(client1.crt)および秘密鍵(client1.key)が作成されます*

##OpenVPNの設定
###サーバ設定
(1)作業ディレクトリの変更

```console:作業ディレクトリの変更
cd /etc/openvpn/
```

(2)サーバのコンフィグファイルのひな型をコピー

```console:コンフィグファイルのコピー
# cp /usr/share/doc/openvpn*/sample/sample-config-files/server.conf server_r.conf
```

(3)コンフィグファイル(server_r.conf)の編集
確認および変更した部分は下記の通り

```text:server_r.conf
[32行目：使用するポート番号]
　port 1194
[36行目：使用するプロトコル]
　proto udp
[53行目：TAP/TUNデバイス指定]
　dev tun
[78,79,80行目(変更)：ca証明書、サーバ証明書、秘密鍵の指定]
　ca /etc/openvpn/easy-rsa/pki/ca.crt
　cert /etc/openvpn/easy-rsa/pki/issued/server_r.crt
　key /etc/openvpn/easy-rsa/pki/private/server_r.key  # This file should be kept secret
[85行目(変更)：乱数(DH)パラメータの指定]
　dh /etc/openvpn/easy-rsa/pki/dh.pem
[101行目：仮想ネットワークの指定(TUNモードの時に指定)]
　server 10.8.0.0 255.255.255.0
[108行目：配布用IPアドレスのテーブル(固定IPを使用する場合、ipp.txtを編集)]
　ifconfig-pool-persist ipp.txt
[142行目(変更)：サーバ側のLANセグメント(TUNモードの時に指定)]
　push "route 192.168.0.0 255.255.255.0"
[209行目(変更)：クライアント間通信の許可]
　client-to-client
[231行目：キープアライブ設定（10秒ごとに生存確認、120秒無応答でダウン）]
　keepalive 10 120
[244行目：TLS認証キーの指定]
　tls-auth ta.key 0 # This file is secret
[263行目(変更)：圧縮の有効可]
　comp-lzo
[274,275行目(変更)：ユーザ権限の設定]
　user nobody
　group nobody
[281,282行目：役割不明だけど大事なものらしい]
　persist-key
　persist-tun
[287行目(変更)：ステータスログ]
　status /var/log/openvpn-status.log
[296行目(変更)：稼働ログ]
　log         /var/log/openvpn.log
[306行目：ログレベル]
　verb 3
```

(4)TLS認証キーの作成

```console:TLS認証キーの作成
# openvpn --genkey --secret /etc/openvpn/ta.key
```
*※TLS認証キー(ta.key)が作成される

## サーバの起動
### テスト起動

```console:テスト起動
# openvpn server_r.conf
Sun Apr  1 03:28:46 2018 OpenVPN 2.4.5 x86_64-redhat-linux-gnu [Fedora EPEL patched] [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Mar  1 2018

(省略)

Sun Apr  1 03:28:46 2018 Initialization Sequence Completed
```
*※こんな感じのログが出ればOK*

### サービスとして起動

```console:サービスとして起動
# systemctl start openvpn@server_r
```

```console:サービス状態確認
# systemctl status openvpn@server_r
```

自動起動にする場合は・・・

```console:サービス自動起動
# systemctl enable openvpn@server_r
```



次は、構築したVPNサーバへ、WindowsとAndroidから接続しようと思います。
[CentOS7でVPNサーバを作ってみた（tun編）・・・クライアントから接続](https://qiita.com/horus19761108/items/86c4ae1f44707d5d847e)へ続きます。