LoginSignup
5
3

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

Last updated at Posted at 2024-01-27

前回まで

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

構築したい構成

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

image.png

実際のネットワーク構成

SoftetherVPNをローカル側とAWS側双方にインストールし、下図のように実際にネットワークを構成します。
image.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

AWS側の仮想HUBにカスケード接続用のユーザーを追加します。
image.png

image.png

つづいて、ローカルブリッジの設定を行います。
image.png

image.png

image.png

AWS側のVPNSeverインスタンスにSSM Session Managerで接続し、ip address コマンドを実行すると、「tap_awsnic」というネットワークデバイスが追加されていることが確認できます。
image.png

続けて「sudo ip address add 192.168.122.6/24 dev tap_awsnic」と入力し、追加されたNICにIPアドレスを割付ます。
ip address コマンドを実行するとipv4のアドレスが割り当てられています。
image.png

ローカル側

今度はローカル側のVPN Serverの設定です。
ローカルサーバのNICと仮想HUBをブリッジ接続します。
image.png

image.png

image.png

ローカルの仮想HUBからAWSの仮想HUBへカスケード接続します。
image.png

image.png

AWS側のVPNServerのホスト名、ポート番号、仮想HUB名を入力、選択します。
AWS側のVPNServerで作成したユーザー名とパスワードを入力します。
image.png

追加した時点では、接続状態がオフラインとなっているため、オンラインにします。
image.png

ここまでうまく行っていたら、AWS側VPNServerのaws_tapnicにPINGが通ります。ひとまずVPN接続はできていることになります。
image.png

VPNServerのルーター化

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

プライベートサブネットに192.168.122.0/24のルートを追加し、ターゲットをVPNServerにします。
image.png

送信元/送信先チェックを停止します。
image.png

ipv4フォワーディングの設定
VPNServer上で「sudo sysctl -w net.ipv4.ip_forward=1」を実行します。
image.png

VPNServerのセキュリティグループのインバウンド追加
image.png

最後にローカルPCにAWSプライベートサブネットのルートを追加します。
image.png

動作確認

ようやく完成です。

ローカルのWindowsサーバからAWSのプライベートサブネット内のサーバへPingが通りました。
image.png

AWSのプライベートサブネット内のサーバからローカルのWindowsサーバへPingが通りました。
image.png

ローカルのWindowsサーバのIP
image.png

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

CFnテンプレートの更新

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

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

追加後

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サーバはローカル側を利用)を試そうと思います。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3