OpenVPNをAmazonLinuxにインストールして、VPN経由で外部ネットワークにアクセスする

AmazonLinuxにOpenVPNを構築する機会があったのでその備忘録

# 構成

内部のネットワーク並びにIP接続指定がされている外部のサイトに接続するために、
VPNサーバを構築し、接続クライアント毎に証明書を発行して接続設定を実施する。

## やりたいこと
- 証明書によるクライアント認証
- VPN経由で外部ネットワークにアクセス

## 環境

- OS
   -  Amazon Linux AMI release 2016.09
- OpenVPN
   -  version 2.4.3

# OpenVPNサーバの構築手順

1. OpenVPNのインストール
1-1. TLS暗号化鍵の発行
2. 証明書の発行
2-1. 証明書発行の事前準備
2-2. 認証局の証明書発行
2-3. サーバの証明書発行
2-4. クライアントの証明書発行
2-5. DHの発行
2-6. 証明書失効時の処理
3. OpenVPNの設定
3-1. configファイルの作成
3-2. 証明書関連のシンボリックリンク
3-3. Configファイルの設定
4. NATの設定
5. AWS セキュリティグループの設定
6. クライアント側の設定

## 1. OpenVPNのインストール

```
sudo yum install openvpn
```

### 1-1. TLS暗号化鍵の発行

OpenVPNにおいてTLSを利用して通信を行うために暗号化鍵を発行しておく

```
#　TLS認証鍵をOpenVPN設定ファイル格納ディレクトリに作成
openvpn --genkey --secret /etc/openvpn/ta.key　
```

## 2. easy-rsaのインストール

```
sudo yum install easy-rsa --enablerepo=epel
```
epelリポジトリがインストールされていない場合は、環境に合わせてインストールしてください。

上記コマンドを実行すると下記フォルダにインストールされます。

/usr/share/easy-rsa

### 2-1. 証明書発行の事前準備

「easy-rsa」を利用して、「認証局証明書」「サーバ証明書」「クライアント証明書」を発行します。
その際に証明書に設定するデフォルト情報の設定を「vars」ファイルに記載します。

```
sudo su
cd /usr/share/easy-rsa/2.0
vi vars
```

64行目付近のKEY_COUNTRYなどのデフォルト情報を記載する

```
export KEY_COUNTRY="JP"              # 国
export KEY_PROVINCE="Tokyo"          # 都道府県
export KEY_CITY="Chiyoda-Ku"         # 市町村
export KEY_ORG="xxxxxxxx"            # 会社名
export KEY_EMAIL="yyy@xxxx.com"      # メールアドレス
export KEY_OU="zzzzz zzzzzz"        # 所属部署
```

その後設定ファイルを読み込み証明書発行のために一度初期化処理を行います。

```
source ./vars
./clean-all
```

なお、「clean-all」を実行すると作成した証明書などは全て消えてしまうため注意が必要です。

### 2-2. 認証局の証明書発行

証明書が正しいかどうかを検証するための認証局の証明書（ルート証明書）を発行します。
（ここではオレオレ証明書の発行となります）

```
$ ./build-ca 

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]:                # 国: JPから変更の必要があれば入力、無ければEnterを押す
State or Province Name (full name) [Tokyo]:       # 都道府県: Tokyoから変更の必要があれば入力、無ければEnterを押す
Locality Name (eg, city) [Chiyoda-Ku]:            # 市区町村: Chiyoda-Kuから変更の必要があれば入力、無ければEnterを押す
Organization Name (eg, company) [xxxxxxxx]:       # 会社名: xxxxxxxxから変更の必要があれば入力、無ければEnterを押す
Organizational Unit Name (eg, section) [zzzzz zzzzzz]: # 所属部署: zzzzz zzzzzzから変更の必要があれば入力、無ければEnterを押す
Common Name (eg, your name or your server's hostname) [xxx]: vpn-ca   #　コモンネーム): 今回はSSLの設定ではないため、vpn-caなどの名称でも良い
Name [EasyRSA]:
Email Address [yyy@xxxx.com]:                     # メールアドレス: yyy@xxxx.comから変更の必要があれば入力、無ければEnterを押す
```

上記コマンドを実行すると下記ファイルが出来上がる。

```
# /usr/share/easy-rsa/2.0/keys 以下
ca.crt    # 認証局の証明書
ca.key    # 認証局の秘密鍵
```

### 2-3. サーバの証明書発行

次に認証局の証明書を元にしてサーバの証明書を発行します。

```
$ ./build-key-server server

[root@management 2.0]# ./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]:                # 国: JPから変更の必要があれば入力、無ければEnterを押す
State or Province Name (full name) [Tokyo]:       # 都道府県: Tokyoから変更の必要があれば入力、無ければEnterを押す
Locality Name (eg, city) [Chiyoda-Ku]:            # 市区町村: Chiyoda-Kuから変更の必要があれば入力、無ければEnterを押す
Organization Name (eg, company) [xxxxxxxx]:       # 会社名: xxxxxxxxから変更の必要があれば入力、無ければEnterを押す
Organizational Unit Name (eg, section) [zzzzz zzzzzz]: # 所属部署: zzzzz zzzzzzから変更の必要があれば入力、無ければEnterを押す
Common Name (eg, your name or your server's hostname) [xxx]: vpn-server   #　コモンネーム): 今回はSSLの設定ではないため、vpn-serverなどの名称でも良い
Email Address [yyy@xxxx.com]:                     # メールアドレス: yyy@xxxx.comから変更の必要があれば入力、無ければEnterを押す

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:       # パスワードを設定するとopenvpnの起動がうまく行かなかったので今回は空白
An optional company name []:   # 特に設定はしない
Using configuration from /usr/share/easy-rsa/2.0/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:'Chiyoda-Ku'
organizationName      :PRINTABLE:'xxxxxxxx'
organizationalUnitName:PRINTABLE:'zzzzz zzzzzz'
commonName            :PRINTABLE:'vpn-server'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'yyy@xxxx.com'
Certificate is to be certified until Aug 12 16:02:49 2027 GMT (3650 days)
Sign the certificate? [y/n]:y   # yを入力


1 out of 1 certificate requests certified, commit? [y/n]y   # yを入力
Write out database with 1 new entries
Data Base Updated
```

上記コマンドを実行すると下記ファイルが出来上がる。

```
# /usr/share/easy-rsa/2.0/keys 以下
server.crt    # サーバ証明書
server.key    # サーバの秘密鍵
server.csr    # サーバの公開鍵に、コモンネームなどの情報を付加したもの
```

### 2-4. クライアントの証明書発行

最後にVPNサーバに接続することが可能なクライアントの証明書を発行します。
なお、パスワードありとなしの設定が可能であり、コマンドが少し違うので注意が必要です。

- パスワードなしの場合

```
$ ./build-key クライアント名（PC名でも名前でもクライアントを識別出来るものであればなんでも可）
```

- パスワードありの場合

```
$ ./build-key-pass クライアント名（PC名でも名前でもクライアントを識別出来るものであればなんでも可）
```

今回はパスワードありで作成します。

```
$ ./build-key-pass hogehoge

Generating a 2048 bit RSA private key
...........................................................................................................+++
............................+++
writing new private key to 'hogehoge.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]:                # 国: JPから変更の必要があれば入力、無ければEnterを押す
State or Province Name (full name) [Tokyo]:       # 都道府県: Tokyoから変更の必要があれば入力、無ければEnterを押す
Locality Name (eg, city) [Chiyoda-Ku]:            # 市区町村: Chiyoda-Kuから変更の必要があれば入力、無ければEnterを押す
Organization Name (eg, company) [xxxxxxxx]:       # 会社名: xxxxxxxxから変更の必要があれば入力、無ければEnterを押す
Organizational Unit Name (eg, section) [zzzzz zzzzzz]: # 所属部署: zzzzz zzzzzzから変更の必要があれば入力、無ければEnterを押す
Common Name (eg, your name or your server's hostname) [xxx]: hogehoge  # コモンネーム): 今回はSSLの設定ではないため、vpn-serverなどの名称でも良い
Email Address [yyy@xxxx.com]:hogehoge@xxxx.com    # メールアドレス: yyy@xxxx.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 /usr/share/easy-rsa/2.0/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:'Chiyoda-Ku'
organizationName      :PRINTABLE:'xxxxxxxx'
organizationalUnitName:PRINTABLE:'zzzzz zzzzzz'
commonName            :PRINTABLE:'hogehoge'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'hogehoge@xxxx.com'
Certificate is to be certified until Aug 12 16:11:01 2027 GMT (3650 days)
Sign the certificate? [y/n]:y    # yを入力

1 out of 1 certificate requests certified, commit? [y/n]y    # yを入力
Write out database with 1 new entries
Data Base Updated
```


上記コマンドを実行すると下記ファイルが出来上がる。

```
# /usr/share/easy-rsa/2.0/keys 以下
hogehoge.crt    # hogehogeクライアントの証明書
hogehoge.key    # hogehogeクライアントの秘密鍵
hogehoge.csr    # hogehogeクライアントの公開鍵に、コモンネームなどの情報を付加したもの
```

### 2-5. DHの発行

Dffie-Hellmanの鍵交換のための共通鍵を生成する。

```
$ ./build-dh

Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
.........................................................................+............................................................................+.......++*++*
```

上記コマンドを実行すると下記ファイルが出来上がる。

```
# /usr/share/easy-rsa/2.0/keys 以下

dh2048.pem # 共通鍵
```

### 2-6. 証明書失効時の処理

接続するクライアントの証明書を失効させたりする場合に必要な処理
なお、失効処理を行うにはクライアント証明書が必要になるため、
ここでは「dummy」用のクライアント証明書を発行後、失効させる処理を記述する


```
$ ./build-key dummy  # 今回はパスワードなしのクライアント証明書を作成する

Generating a 2048 bit RSA private key
.......................+++
.......+++
writing new private key to 'dummy.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]:                # 国: ダミーなのでデフォルトのままでよし
State or Province Name (full name) [Tokyo]:       # 都道府県: ダミーなのでデフォルトのままでよし
Locality Name (eg, city) [Chiyoda-Ku]:            # 市区町村: ダミーなのでデフォルトのままでよし
Organization Name (eg, company) [xxxxxxxx]:       # 会社名: ダミーなのでデフォルトのままでよし
Organizational Unit Name (eg, section) [zzzzz zzzzzz]: # 所属部署: ダミーなのでデフォルトのままでよし
Common Name (eg, your name or your server's hostname) [xxx]:  # ダミーなのでデフォルトのままでよし
Email Address [yyy@xxxx.com]:    # ダミーなのでデフォルトのままでよし

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/share/easy-rsa/2.0/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:'Chiyoda-Ku'
organizationName      :PRINTABLE:'xxxxxxxx'
organizationalUnitName:PRINTABLE:'zzzzz zzzzzz'
commonName            :PRINTABLE:'xxx'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'yyy@xxxx.com'
Certificate is to be certified until Aug 12 16:19:32 2027 GMT (3650 days)
Sign the certificate? [y/n]:y　   # yを入力


1 out of 1 certificate requests certified, commit? [y/n]y   # yを入力
Write out database with 1 new entries
Data Base Updated
```

失効させるコマンドを発行する前にopensslの設定を修正。

```
$ vi openssl-1.0.0.cnf
#[ pkcs11_section ]　←　行頭に#を追加してコメントアウト
#engine_id = pkcs11　←　行頭に#を追加してコメントアウト
#dynamic_path = /usr/lib/engines/engine_pkcs11.so　←　行頭に#を追加してコメントアウト
#MODULE_PATH = $ENV::PKCS11_MODULE_PATH　←　行頭に#を追加してコメントアウト
#PIN = $ENV::PKCS11_PIN　←　行頭に#を追加してコメントアウト
#init = 0　←　行頭に#を追加してコメントアウト
```

これは、下記のようなエラーメッセージの表示を防ぐために設定しておく

```
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
error on line 282 of config file '/etc/openvpn/easy-rsa/openssl.cnf'
```

次に失効させるために下記コマンドを実行

```
$./revoke-full dummy
Using configuration from /usr/share/easy-rsa/2.0/openssl-1.0.0.cnf
Revoking Certificate 03.
Data Base Updated
Using configuration from /usr/share/easy-rsa/2.0/openssl-1.0.0.cnf
dummy.crt: C = JP, ST = Aichi, L = Nagoya-City, O = BRIGHT VIE, OU = Development Division, CN = dummy, name = EasyRSA, emailAddress = core-ml@brightvie.me
error 23 at 0 depth lookup:certificate revoked
```

こうすると下記のファイルが生成される

```
# /usr/share/easy-rsa/2.0/keys 以下

crl.pem   # 証明書廃止リスト
```

以上で関連する証明書の発行は完了です。
接続するクライアントが増える場合には、クライアント証明書を追加発行したり、
証明書の失効をさせたりの繰り返しでユーザ管理を行っていく形となります。

これまで生成した証明書のまとめ

| 実行コマンド | 証明書の種類 | ファイル名 | 備考 | クライアントで利用 |
|:--------:|:--------:|:--------:|:--------:|:-----------:|
| ./build-ca | 認証局 | ca.crt | 認証局の証明書  | 利用する |
| ./build-ca | 認証局 | ca.key | 認証局の秘密鍵  | |
| ./build-key-server server | サーバ | server.crt | サーバ証明書  | |
| ./build-key-server server | サーバ | server.key | サーバの秘密鍵  | |
| ./build-key-server server | サーバ | server.csr | サーバの公開鍵に、コモンネームなどの情報を付加したもの | |
| ./build-key-pass hogehoge | クライアント | hogehoge.crt | クライアント証明書  | 利用する |
| ./build-key-pass hogehoge | クライアント | hogehoge.key | クライアントの秘密鍵  |利用する |
| ./build-key-pass hogehoge | クライアント | hogehoge.csr | クライアントの公開鍵に、コモンネームなどの情報を付加したもの | |
| ./build-dh | Dffie-Hellman | dh2048.pem | 共通鍵 | |
| ./revoke-full xxxx | 証明書失効 | crl.pem | 証明書廃止リスト | |
| openvpn --genkey --secret /etc/openvpn/ta.key　 | TLS | ｔa.key | TLSの暗号化鍵 | 利用する |



## 3. OpenVPNの設定

次にOpenVPNの設定をします。
OpenVPNは/etc/openvpn/に設定ファイルを置きますが、
初期状態では空のため、テンプレートとなる設定ファイルをコピーで取得します。

### 3-1. configファイルの作成

```
$ cp /usr/share/doc/openvpn-2.4.3/sample/sample-config-files/server.conf /etc/openvpn/
```

### 3-2. 証明書関連のシンボリックリンク

OpenVPNの設定ファイルの中で先程作成した証明書関連を読み込んでいる処理があるため、
各証明書や秘密鍵へのシンボリックリンクを発行しておく

```
$ cd /etc/openvpn/
# 認証局の証明書
$ ln -s /usr/share/easy-rsa/2.0/keys/ca.crt .
# サーバ証明書
$ ln -s /usr/share/easy-rsa/2.0/keys/server.crt .
# サーバ秘密鍵
$ ln -s /usr/share/easy-rsa/2.0/keys/server.key .
# 共通鍵
$ ln -s /usr/share/easy-rsa/2.0/keys/dh2048.pem .
# 証明書廃止リスト
$ ln -sf /usr/share/easy-rsa/2.0/keys/crl.pem .

```

### 3-3. Configファイルの設定

Configファイルを下記のように設定する（必要な箇所のみ抜粋）

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

port 1194

proto udp

dev tun

# 証明書関連の読み込み設定
ca ca.crt
cert server.crt
key server.key

# 共通鍵の設定
dh dh2048.pem

# VPNで接続してきたクライアントに割り振るIPアドレスを定義
server 10.8.0.0 255.255.255.0

ifconfig-pool-persist ipp.txt

# 全ての通信をこのVPNサーバ経由に設定する
push "redirect-gateway def1"
# DNSの設定は、一旦外部DNSの設定をしておく
# ここを内部のDNSにして内部ネットワークへの接続を許可する形にする
push "dhcp-option DNS 8.8.8.8"

keepalive 10 120

# TLSで暗号化する
tls-auth ta.key 0 # This file is secret

tls-server
tls-cipher DHE-RSA-AES256-SHA
cipher AES-256-CBC
keysize 256
auth SHA256

comp-lzo

user nobody
group nobody

persist-key
persist-tun

status openvpn-status.log

log         /var/log/openvpn.log
log-append  /var/log/openvpn.log

verb 3

explicit-exit-notify 1


# 証明書廃止リストの有効化
crl-verify crl.pem
```

上記設定をすることで、VPN接続したクライアントは全てVPNサーバを経由して通信を行うことになる。
VPNサーバは通常pushで設定された条件にマッチしたもののみVPNサーバを経由して通信を行う。
下記の場合だと、172.31.0.0/24へのネットワーク接続のみVPN経由で実施するということになる。
[push "route 172.31.0.0 255.255.240.0"]

今回は、全ての通信をVPN経由で実施したかったため、
[push "redirect-gateway def1"]を設定している。

最後にOpenVPNを起動しておく

```
/etc/init.d/openvpn start
```

自動起動設定もついでに

```
chkconfig openvpn on
```

## 4. NATの設定

今回VPNサーバ経由でアクセスすることになるため、
クライアント側はVPNサーバと接続した際に「10.8.0.x」のIPアドレスが割り振られる。
このIPアドレスから外部のネットワークに通信するためにはNATを利用して
VPNサーバのグローバルIPに変換後接続する必要がある。

今回は、iptablesを利用して設定をNATの設定を行う。

なお、今回の環境はAWSを利用しており、通常はAWSのセキュリティグループで対応しているため、
iptablesは基本全許可としている。

```
$ vi /etc/sysconfig/iptables

# Generated by iptables-save v1.4.18 on Mon Aug 14 18:40:10 2017
*filter
:INPUT ACCEPT [239:25640]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [190:23568]

COMMIT
# Completed on Mon Aug 14 18:40:10 2017
# Generated by iptables-save v1.4.18 on Mon Aug 14 18:40:10 2017
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

## 10.8.0.0/24のIPアドレスから受信したパケットをインタフェースeth0を利用してマスカレードを実施する
## -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -o eth0 -s 10.8.0.1/24 -j MASQUERADE

COMMIT
# Completed on Mon Aug 14 18:40:10 2017
```

そして、iptablesの起動または再起動を実施

```
/etc/init.d/iptables restart
```

## 5. AWS セキュリティグループの設定

AWSのセキュリティグループの設定としては、
OpenVPNは、ポート「1149」のUDPで動作しているためこの内容を登録しておく。


## 6. クライアント側の設定

### Macの場合

#### 1. OpeｎVPNクライアントのインストール

OpenVPNクライアントの[Tunnelblick](https://tunnelblick.net/)を利用する。

#### 2. OpenVPNサーバで発行した、証明書関連をダウンロード

接続に必要なファイルは下記の４つ

| ファイル名 | 備考 |
|:-------:|:----:|
|ca.crt | 認証局の証明書 |
| hogehoge.crt | クライアント証明書 |
| hogehoge.key | クライアントの秘密鍵 |
| ｔa.key        | TLSの暗号化鍵 |

今回はTunnelblickの設定ファイルと同じ「~/Documents/VPN/」のフォルダに配置することにする。

#### 3. Tunnelblickの設定ファイルの作成

Tunnelblickの設定ファイルはテキストファイルであるため、
適当なフォルダに設定ファイルを下記のようにovpn拡張子で作成する。
（~/Documents/VPN/ 配下に作成、必要な箇所のみ抜粋）

```
$ vi client.ovpn

client

dev tun

proto udp

remote OpenVPNサーバのIPアドレスを設定 1194

resolv-retry infinite

nobind

persist-key
persist-tun

ca ./ca.crt
cert ./hogehoge.crt
key ./hogehoge.key

ns-cert-type server

tls-client
tls-auth ./ta.key 1

comp-lzo

verb 3

tun-mtu  1350

tls-cipher DHE-RSA-AES256-SHA
cipher AES-256-CBC
keysize 256
auth SHA256
```

#### 4. OpenVPNに接続

client.ovpnファイルをダブルクリックすると、Tunnelblickの設定として更新がされる。
その後OpenVPNに接続し、正常にブラウジングや下記のさいとからIPアドレスがOpenVPNのグローバルIPアドレスになっているのであれば、接続成功。

- [CMAN IPアドレス確認](https://www.cman.jp/network/support/go_access.cgi)


### Windowsの場合

Windowsでは、(vpnux Client)[http://www.plum-systems.co.jp/vpnux-client/]を利用すれば良さそうですね！

手元の環境にWindowsが無いので試すことは出来ていませんが...
下記記事の設定方法がMacで設定している内容と同じなためおそらくうまくいくはず！

(AWSにOpenVPNでVPNを構築してみた)[http://qiita.com/saitoxu/items/b0a265edfb11ac381c89]


# その他ハマったこと

## AWSセキュリティグループでUDPのポートが空いていなかった

　普段UDPを利用することが無かったので間違ってTCPポートを空けていた。
　セキュリティグループでUDPの設定にすることで対応完了

## cipherの設定がおかしい

OpenVPNのログに下記のようなエラーが...

```
Authenticate/Decrypt packet error: cipher final failed
```


暗号化方式の違いかなと思い、ちゃんとした原因は良くわからなかったが
下記のようにサーバとクライアントの設定ファイルに両方指定することで直った。

```
cipher AES-256-CBC
tls-cipher DHE-RSA-AES256-SHA
keysize 256
auth SHA256
```

## TLSの認証キーがおかしい

```
Mon Aug 14 14:32:24 2017 TLS Error: cannot locate HMAC in incoming packet from [AF_INET]xxxxx
```

サーバの設定には下記が記載されていたがクライアント側には設定されていなかったのが原因

```
tls-auth ta.key 0
```

改めてクライアント側にta.keyをコピーし、Configに

```
tls-auth ta.key 1
```
を指定することで対応完了

参考: [OpenVPNが繋がらなくなった（失敗メモ）](https://snowland.net/nucleus/item/2765)


## OpenVPN経由にした際にNATの設定がうまくいっていない

VPNには接続するがその先のグローバルネットワークに接続できなくてかなり悩んだ...
結局NATの設定がうまく言っていなかったのとiptablesでのNATの設定理解が全然出来ていなかったのが原因...

下記記事の2ページ分読むことでかなり理解度は高まった

[Linuxで作るファイアウォール［NAT設定編］ (1/2)](http://www.atmarkit.co.jp/ait/articles/0111/23/news003.html)

「PREROUTINGチェイン」と「POSTROUTINGチェイン」が分かれば、そこからの設定は早かった！

## 2018/01/27追記) NATの設定について

上記にてiptablesによるNATの設定は問題ないのですが、「/etc/sysctl.conf」の「net.ipv4.ip_forward」が0だと、パケットの転送がされないので、この項目を1にする必要がありました。

```/etc/sysctl.conf
# 0 だとIPv4でパケットの転送がされない
# net.ipv4.ip_forward=0
net.ipv4.ip_forward=1
```

- 参考
   - [OpenVPNにてNATの設定をしても、VPN経由でアクセス出来ないとき](https://qiita.com/megadreams14/items/d47df4d022683711a901)


# まとめ

久しぶりにインフラ関連ガッツリ触り、かなりハマって悩んだ１日だったが
こういう機会があるからこそ学べるんだぁなとすごく実感。
同じように困っている人のお助けになれば幸いです。
間違いやもっとこうしたら良いなどありましたらぜひぜひご指摘くださいー

# 参考

- OpenVPN関連
   - [AWS環境にOpenVPNでVPNを構築](　http://qiita.com/hideki/items/657a5701133e713fcf8c)
   - [AWSにOpenVPNでVPNを構築してみた](http://qiita.com/saitoxu/items/b0a265edfb11ac381c89)
   - [OpenVPNのインストールとセットアップからインターネット接続までのガイドブック](http://qiita.com/noraworld/items/2fe6be489e1d93c748b8)
   - [Amazon EC2とOpenVPNでサーバ-多拠点クライアント間通信をセキュアに行う](http://dev.classmethod.jp/cloud/aws/ec2-ssl-vpn-use-openvpn/)
   - [OpenVPN 2.0 HOWTO 日本語訳](http://freescitech.net/2/ovpn2_howto_ja.html)
- NATの設定関連
   - [Linuxで作るファイアウォール［NAT設定編］ (2/2)](http://www.atmarkit.co.jp/ait/articles/0111/23/news003_2.html)
   - [iptablesの設定](http://www.nina.jp/server/redhat/iptables/iptables.html)
   - [natテーブルを利用したLinuxルータの作成 (2/6)](http://www.atmarkit.co.jp/ait/articles/0505/17/news131_2.html)
   - [iptablesでログ出力設定](http://wokowa.net/blog/archives/63)
- 証明書鍵関連
   - [SSL証明書のKEYファイル・CSRファイル・CRTファイルのチェック方法](http://d.hatena.ne.jp/install-memo/20110906/1315291837)