stunnelとLoad Balancer TLS終端サービスを使って暗号化通信を実施

# 概要
[stunnel](https://www.stunnel.org/)とAWS Network Load Balancer(NLB)等のLoad Balancer TLS終端サービスを使って暗号化通信を行います

# 何がいいの?
既存のアプリケーションを修正することなくTLS暗号化が可能です。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/83f90c35-7193-4d8d-9aa9-cf47074d4947.png">

# 方法1.AWS NLB TLS終端を使用
PC内のクライアントソフトは同じPC内のstunnelと通信します。
PC内のstunnelはNLBを経由して通信を転送します。
以下の例ではサーバーはRedisを使用しています。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/3eb4f96f-7553-afa3-491b-b5ea4f7722bb.png">
## NLB設定
- AWSコンソールからEC2>>ロードバランサー>>ロードバランサーの作成を押下
- ロードバランサーはNLBを選択
- NLBを作成
    - ロードバランサー名
    - スキーム:インターネット向け
    - IPアドレスタイプ:IPv4
    - ネットワークマッピング:既存VPCのパブリックサブネットを指定
    - セキュリティグループ:リスナーポートを許可するセキュリティグループを指定
    - リスナーとルーティング:プロトコルTLS,ポートはリッスンするポートを指定(上図の例では6376),ターゲットグループの作成を選択
        - グループ:インスタンスまたはIPアドレスを選択
        - ターゲットグループ名
        - プロトコル ポート:サーバーアプリケーションのリッスンポート(上図の例ではTCP 6379)
        - IPアドレスタイプ：IPv4
        - VPC:既存VPC
        - ヘルスチェック:TCP
        - 「次へ」を押下
        - インスタンス選択またはIPアドレスを入力して「保留中として以下を含める」を押下
        - 「ターゲットグループの作成」を押下
        - 作成されたターゲットグループの属性を確認してクライアントIPアドレスの保持を確認(オンの場合はクライアントIPが保持され、オフの場合はNLBにてクライアントIPがNATされる)
    - リスナーの編集に戻って作成されたターゲットグループを選択
    - セキュリティポリシー:適切なポリシー(TLS1.3等)を選択
    - デフォルトSSl/TLSサーバー証明書：パブリックドメインのサーバー証明書登録のためACMの登録済み証明書や証明書インポートを選択
    - 「ロードバランサーの作成」を押下
          
## Route53設定
インターネット上からNLBの名前解決できるようAレコードを登録します
- Route53で登録したドメインのAレコードを追加
    - レコードタイプ：A
    - エイリアス：On
    - トラフィックのルーティング先:作成したNLBを選択

## クライアント設定
- [stunnel download](https://www.stunnel.org/downloads.html)からダウンロードしてインストール
- stunnel Service Startを実行しConfiguration>Edit Configurationを選択
- アプリケーション登録
  例)app.example.com
  ```bat
   [example]
    client = yes
    accept = 127.0.0.1:6375
    connect = app.example.com:6376
  ```
- Configuration>Reload Configurationを選択して設定反映

## 接続確認
- PCからtelnetを使用してサーバーに接続確認
  ```bat
  C:\path\to>telnet 127.0.0.1 6375
  ping
  +PONG
  ping
  +PONG 
  ```
- PC-NLB間のIPパケット取得するとTLS1.3で暗号化されたことが確認できます
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/cb0fa38c-e082-e85a-7d3e-d169f819f746.png">


# 方法2.OCI FLB TLS終端を使用
PC内のクライアントソフトは同じPC内のstunnelと通信します。
PC内のstunnelはOCI FLBを経由して通信を転送します。
以下の例ではサーバーはRedisを使用しています。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/e0da9a74-ba4b-e0b4-f5e5-c7c4fff5a9b3.png">

## FLBおよびDNS設定
以下の設定を参考にします。FLBのリッスンポートは上図の例では6378を指定します。

[OCI LoadBalancerを使ってNATとSSL/TLS終端を行う](https://qiita.com/tktk2712/items/b0f208deffb979fadb27)

## クライアント設定
- [stunnel download](https://www.stunnel.org/downloads.html)からダウンロードしてインストール
- stunnel Service Startを実行しConfiguration>Edit Configurationを選択
- アプリケーション登録
  例)app.example.com
  ```bat
   [example]
    client = yes
    accept = 127.0.0.1:6377
    connect = app.example.com:6378
  ```
- Configuration>Reload Configurationを選択して設定反映

## 接続確認
- PCからtelnetを使用してサーバーに接続確認
  ```bat
  C:\path\to>telnet 127.0.0.1 6377
  ping
  +PONG
  ping
  +PONG
  ```

- PC-FLB間のIPパケット取得するとTLS1.3で暗号化されたことが確認できます
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/ddb427e1-9dee-7e3e-cfd5-ef653687fb3e.png">