ローカルPCとAWSをVPNで接続した

### 前回まで
前回、VPNServerのCFnテンプレートを作成しました。今回はVPNserverの設定を行って、ローカルPCとAWSをVPN接続してみようと思います。

https://qiita.com/mirutaro/items/131474af950c8b0a4ad4

### 構築したい構成

ローカルPCの仮想環境にテスト用のLinuxやWindowsサーバを作成しています。VPN経由でこれらのサーバと、AWS上のプライベートネットワークにあるEC2サーバと相互通信可能な環境を構築します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/6f3e953b-6dba-7118-b905-7cc90d528248.png)

### 実際のネットワーク構成
SoftetherVPNをローカル側とAWS側双方にインストールし、下図のように実際にネットワークを構成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/61db6952-1b85-da5b-004f-8496bb8ea027.png)


AWS側
* CFnテンプレートを使用し、パブリックサブネットにSoftetherVPNサーバを設置
* 仮想HUBにカスケード接続用のユーザとパスワードを設定
* 仮想HUBとTAPデバイスをブリッジ接続
* TAPデバイスにローカル環境と同じサブネットのネットワークアドレスを設定

ローカル側
* 仮想環境のWindowsサーバに、SoftetherVPN(Bridge)をインストールし、仮想HUBとサーバのNICをブリッジ接続
* AWS側のSoftetherVPNの仮想HUBとカスケード接続


さらにVPNサーバをルーターとして機能させるための設定として
* 送信元/送信先チェックの停止
* ipv4フォワーディングの設定
* プライベートサブネットのルートテーブルにローカルネットワークのサブネットを追加
* VPNServerのセキュリティグループのインバウンドにプライベートサブネットの通信を許可

最後にローカルPCのルートを追加


### 設定内容

#### AWS側
Windowsサーバにインストールした管理ツールでAWSとローカルのVPN Serverを設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/bddb8743-2d69-b5dd-890a-8a0b8bb6cbb4.png)

AWS側の仮想HUBにカスケード接続用のユーザーを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/13b3e80a-5e9f-114a-73db-57f20ff35737.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/fab92284-cd03-0b00-4d8d-fb3dc2eab542.png)

つづいて、ローカルブリッジの設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/3250ca2c-6df3-e31e-a9aa-8f64d5419292.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/e0bebee8-15ed-461b-a94b-93145c0255ab.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/0d7caff3-4be6-19d7-3614-13f432e40ae4.png)

AWS側のVPNSeverインスタンスにSSM Session Managerで接続し、ip address コマンドを実行すると、「tap_awsnic」というネットワークデバイスが追加されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/dccf1306-764c-bd67-5fd9-bb3a09b57061.png)

続けて「sudo ip address add 192.168.122.6/24 dev tap_awsnic」と入力し、追加されたNICにIPアドレスを割付ます。
ip address コマンドを実行するとipv4のアドレスが割り当てられています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/1ccb667e-30f8-eec8-66da-9e77a73659bb.png)



#### ローカル側
今度はローカル側のVPN Serverの設定です。
ローカルサーバのNICと仮想HUBをブリッジ接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/dd29bd41-5d30-323e-bc51-9eb218f0d0a6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/e0164688-d6d6-3536-71d8-ce223c5dd024.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/5db703d1-ad77-417d-2e88-f17f58e8530b.png)

ローカルの仮想HUBからAWSの仮想HUBへカスケード接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/1bdc59bd-8112-cc45-f8ef-a86ff43582e0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/98d09bdf-ddc9-b60f-2f93-8737aeec074d.png)

AWS側のVPNServerのホスト名、ポート番号、仮想HUB名を入力、選択します。
AWS側のVPNServerで作成したユーザー名とパスワードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/74328b84-09df-6017-0fd4-84d6e3e149d6.png)

追加した時点では、接続状態がオフラインとなっているため、オンラインにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/065b0f32-f986-20ba-759d-8bc0e168496b.png)

ここまでうまく行っていたら、AWS側VPNServerのaws_tapnicにPINGが通ります。ひとまずVPN接続はできていることになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/898cc78f-414b-58e8-850b-a371eae3bf03.png)

#### VPNServerのルーター化
このままではプライベートサブネットとローカルPC環境はまだ通信ができません。ルーティングに関する設定を追加していきます。

プライベートサブネットに192.168.122.0/24のルートを追加し、ターゲットをVPNServerにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/be9df5e4-fc2b-d58f-41c0-367729b36d99.png)

送信元/送信先チェックを停止します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/fe8686a8-0cd0-1065-b22c-3e03e304e302.png)

ipv4フォワーディングの設定
VPNServer上で「sudo sysctl -w net.ipv4.ip_forward=1」を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/ae232554-e6ac-cf7d-2532-f48eb7718500.png)

VPNServerのセキュリティグループのインバウンド追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/7c8fe4e3-581b-a929-f7cd-8967e6f17204.png)

最後にローカルPCにAWSプライベートサブネットのルートを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/dee21348-54e8-0103-a856-892872b1c751.png)


### 動作確認
ようやく完成です。


ローカルのWindowsサーバからAWSのプライベートサブネット内のサーバへPingが通りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/3fc13488-53e0-262b-f423-354c5e3031c1.png)


AWSのプライベートサブネット内のサーバからローカルのWindowsサーバへPingが通りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/2355d68f-fb16-e96d-c3e7-f9b2c834a2e3.png)

ローカルのWindowsサーバのIP
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/e73d059a-d5cb-0016-4927-a22d75a9cc46.png)

相互に通信できています！

### CFnテンプレートの更新
最後に前回作成したVPNServerのCFnテンプレートに、ルーター化に必要な定義を追加します。

```yaml:EC2のプロパティに追加
      SourceDestCheck: false
```
```yaml:UserDataにipv4フォワーディングの設定追加
          sysctl -w net.ipv4.ip_forward=1 | tee -a /etc/sysctl.conf
```
```yaml:プライベートサブネットのルートテーブルのターゲットにVPNServerを追加
  PrivateSubnetRoute:
    Type: AWS::EC2::Route
    Condition: EnableVPNServer
    Properties:
      RouteTableId: rtb-xxxxxxxxxxxxxxxx
      DestinationCidrBlock: 192.168.122.0/24
      InstanceId: !Ref VPNServer
```

追加後
```yaml:sample.yaml
AWSTemplateFormatVersion: "2010-09-09"

Parameters:
  EnableVPNServer:
    Description: Enable VPN Server Instance.
    Type: String
    Default: false
    AllowedValues: [true, false]

Conditions:
  EnableVPNServer:
    !Equals [true, !Ref EnableVPNServer]

Resources:
  VPNServer:
    Type: AWS::EC2::Instance
    Condition: EnableVPNServer
    Properties:
      KeyName: "EC2 キーペア名"
      ImageId: ami-0dfa284c9d7b2adad
      InstanceType: t3.nano
      IamInstanceProfile: "インスタンスプロファイル名"
      NetworkInterfaces: 
        - AssociatePublicIpAddress: true
          DeviceIndex: "0"
          SubnetId: subnet-xxxxxxxxxxxxxx VPNServerを配置するパブリックサブネットのID
          GroupSet:
            - sg-xxxxxxxxxxxxxxxx VPNServer用のセキュリティグループ
      SourceDestCheck: false
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeType: gp3
            VolumeSize: 8
            DeleteOnTermination: true
      Tags:
        - Key: Name
          Value: "VPNServer"
      UserData:
        Fn::Base64: |
          #!/bin/bash
          sudo su
          sysctl -w net.ipv4.ip_forward=1 | tee -a /etc/sysctl.conf
          # efs-utils インストール
          yum update -y
          yum install amazon-efs-utils -y
          # efsマウント
          file_system_id_01=fs-xxxxxxxxxxxxxxx
          efs_mount_point=/mnt/efs
          mkdir -p $efs_mount_point
          echo "${file_system_id_01}:/ ${efs_mount_point} efs _netdev,noresvport,tls,iam 0 0" >> /etc/fstab
          # dockerインストール
          yum install -y docker
          systemctl enable docker
          service docker start
          # 初期設定後は以下はコメントアウトしてください。
          docker run -d -e SPW=任意のパスワード --hostname my-vpnserver-container --name softether-server --cap-add NET_ADMIN --network host --privileged siomiz/softethervpn
          # 初期設定後は以下のコメントを外す
          # docker run -d --hostname my-vpnserver-container --name softether-server --cap-add NET_ADMIN --network host --privileged -v $efs_mount_point/vpn_server.config:/usr/vpnserver/vpn_server.config siomiz/softethervpn
          ## ipaddressを自動設定する場合（※再起動には対応していません。）
          ## sleep 2m
          ## ip address add {your device ipaddress CIDR} dev tap_{your tap device id}
  
  PrivateSubnetRoute:
    Type: AWS::EC2::Route
    Condition: EnableVPNServer
    Properties:
      RouteTableId: rtb-xxxxxxxxxxxxxxxxx
      DestinationCidrBlock: {your local network block}
      InstanceId: !Ref VPNServer
```

### 感想
だいぶ苦労しましたが、ようやく自分のやりたいテスト環境のネットワーク構成ができました。
次はAWSのディレクトリサービス（ADサーバはローカル側を利用）を試そうと思います。