前回まで
前回、VPNServerのCFnテンプレートを作成しました。今回はVPNserverの設定を行って、ローカルPCとAWSをVPN接続してみようと思います。
構築したい構成
ローカルPCの仮想環境にテスト用のLinuxやWindowsサーバを作成しています。VPN経由でこれらのサーバと、AWS上のプライベートネットワークにあるEC2サーバと相互通信可能な環境を構築します。
実際のネットワーク構成
SoftetherVPNをローカル側とAWS側双方にインストールし、下図のように実際にネットワークを構成します。
AWS側
- CFnテンプレートを使用し、パブリックサブネットにSoftetherVPNサーバを設置
- 仮想HUBにカスケード接続用のユーザとパスワードを設定
- 仮想HUBとTAPデバイスをブリッジ接続
- TAPデバイスにローカル環境と同じサブネットのネットワークアドレスを設定
ローカル側
- 仮想環境のWindowsサーバに、SoftetherVPN(Bridge)をインストールし、仮想HUBとサーバのNICをブリッジ接続
- AWS側のSoftetherVPNの仮想HUBとカスケード接続
さらにVPNサーバをルーターとして機能させるための設定として
- 送信元/送信先チェックの停止
- ipv4フォワーディングの設定
- プライベートサブネットのルートテーブルにローカルネットワークのサブネットを追加
- VPNServerのセキュリティグループのインバウンドにプライベートサブネットの通信を許可
最後にローカルPCのルートを追加
設定内容
AWS側
Windowsサーバにインストールした管理ツールでAWSとローカルのVPN Serverを設定していきます。
AWS側の仮想HUBにカスケード接続用のユーザーを追加します。
AWS側のVPNSeverインスタンスにSSM Session Managerで接続し、ip address コマンドを実行すると、「tap_awsnic」というネットワークデバイスが追加されていることが確認できます。
続けて「sudo ip address add 192.168.122.6/24 dev tap_awsnic」と入力し、追加されたNICにIPアドレスを割付ます。
ip address コマンドを実行するとipv4のアドレスが割り当てられています。
ローカル側
今度はローカル側のVPN Serverの設定です。
ローカルサーバのNICと仮想HUBをブリッジ接続します。
ローカルの仮想HUBからAWSの仮想HUBへカスケード接続します。
AWS側のVPNServerのホスト名、ポート番号、仮想HUB名を入力、選択します。
AWS側のVPNServerで作成したユーザー名とパスワードを入力します。
追加した時点では、接続状態がオフラインとなっているため、オンラインにします。
ここまでうまく行っていたら、AWS側VPNServerのaws_tapnicにPINGが通ります。ひとまずVPN接続はできていることになります。
VPNServerのルーター化
このままではプライベートサブネットとローカルPC環境はまだ通信ができません。ルーティングに関する設定を追加していきます。
プライベートサブネットに192.168.122.0/24のルートを追加し、ターゲットをVPNServerにします。
ipv4フォワーディングの設定
VPNServer上で「sudo sysctl -w net.ipv4.ip_forward=1」を実行します。
最後にローカルPCにAWSプライベートサブネットのルートを追加します。
動作確認
ようやく完成です。
ローカルのWindowsサーバからAWSのプライベートサブネット内のサーバへPingが通りました。
AWSのプライベートサブネット内のサーバからローカルのWindowsサーバへPingが通りました。
相互に通信できています!
CFnテンプレートの更新
最後に前回作成したVPNServerのCFnテンプレートに、ルーター化に必要な定義を追加します。
SourceDestCheck: false
sysctl -w net.ipv4.ip_forward=1 | tee -a /etc/sysctl.conf
PrivateSubnetRoute:
Type: AWS::EC2::Route
Condition: EnableVPNServer
Properties:
RouteTableId: rtb-xxxxxxxxxxxxxxxx
DestinationCidrBlock: 192.168.122.0/24
InstanceId: !Ref VPNServer
追加後
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サーバはローカル側を利用)を試そうと思います。