アットランタイム

YAMAHA RTX830 で AWS と VPN

概要

YAMAHA RTX830 を買ったので、AWS と VPN 接続をしたのでその備忘録です。 基本的には次の公式とクラメソのを見てもらえれば解決すると思います。

CFn テンプレート

VPN 接続するに当たって AWS 側の必要なリソースは次が挙げられます。

  • プライベートゲートウェイ
    • AWS 側のマネージドな VPN エンドポイント(冗長化のためトンネルが 2 つ作成される)
  • カスタマーゲートウェイ
    • クライアント側の VPN エンドポイント
  • AmazonVPCReadOnlyAccess ポリシーがアタッチされた IAM ユーザ
    • RTX830 の簡単設定で使用する

本テンプレートでは、VPC、プラベートサブネット、ルートテーブルまで作成しています。そのため、YAMAHA RTX830 と AWS 側で VPN 接続が完了した場合には、EC2 インスタンスを立てるだけで接続可能となっています。(ルートテーブルなどベット作成不要!) パラメータの CustomerGatewayIpAddress に RTX830 側のグローバル IP アドレスを指定ください。

AWSTemplateFormatVersion: "2010-09-09"
Description: YAMAHA RTX830

Parameters:
  CustomerGatewayIpAddress:
    Type: String
    AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})
  VpcCidr:
    AllowedPattern: ^(\d|[01]?\d\d|2[0-4]\d|25[0-5])\.(\d|[01]?\d\d|2[0-4]\d|25[0-5])
    Default: "10.0"
    Description: VPC CIDR (*.*.0.0/16)
    Type: String

Resources:
  ### VPC AND SUBNETS RESOURCES
  Vpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Sub ${VpcCidr}.0.0/16
      Tags:
        - Key: Name
          Value: !Ref AWS::StackName
  PrivateSubnet01:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: !Sub ${VpcCidr}.1.0/24
      AvailabilityZone: !Select
        - 0
        - !GetAZs
          Ref: AWS::Region
      VpcId: !Ref Vpc
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-private-subnet-1
  PrivateSubnet02:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: !Sub ${VpcCidr}.2.0/24
      AvailabilityZone: !Select
        - 1
        - !GetAZs
          Ref: AWS::Region
      VpcId: !Ref Vpc
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-private-subnet-2
  RouteTableForPrivateSubnets:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref Vpc
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-route-table
  PrivateSubnetRouteTableAssociation01:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTableForPrivateSubnets
      SubnetId: !Ref PrivateSubnet01
  PrivateSubnetRouteTableAssociation02:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTableForPrivateSubnets
      SubnetId: !Ref PrivateSubnet02

  ### VPN RESOURCES
  VpnGateway:
    Type: AWS::EC2::VPNGateway
    Properties:
      Type: ipsec.1
      Tags:
        - Key: Name
          Value: !Ref AWS::StackName
  VpnGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref Vpc
      VpnGatewayId: !Ref VpnGateway
  CustomerGateway:
    Type: AWS::EC2::CustomerGateway
    Properties:
      Type: ipsec.1
      BgpAsn: 65000
      IpAddress: !Ref CustomerGatewayIpAddress
      Tags:
        - Key: Name
          Value: !Ref AWS::StackName
  VpnConnection:
    Type: AWS::EC2::VPNConnection
    Properties:
      Type: ipsec.1
      CustomerGatewayId: !Ref CustomerGateway
      VpnGatewayId: !Ref VpnGateway
      Tags:
        - Key: Name
          Value: !Ref AWS::StackName
  VpnGatewayRoutePropagation:
    DependsOn: VpnConnection
    Type: AWS::EC2::VPNGatewayRoutePropagation
    Properties:
      RouteTableIds:
        - !Ref RouteTableForPrivateSubnets
      VpnGatewayId: !Ref VpnGateway

  ### VPN IAM USER AND SECRETKEY RESOURCES
  VpnUser:
    Type: AWS::IAM::User
    Properties:
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonVPCReadOnlyAccess
  AccessKey:
    Type: AWS::IAM::AccessKey
    Properties:
      UserName: !Ref VpnUser

Outputs:
  AccessKeyID:
    Description: IAM User Access Key
    Value: !Ref AccessKey
  SecretAccessKey:
    Description: IAM User Access Secret Key
    Value: !GetAtt AccessKey.SecretAccessKey
  VpnConnectonID:
    Description: VPN Connection ID
    Value: !Ref VpnConnection
  VpcID:
    Description: VPC ID, Private Gawateay exists
    Value: !Ref Vpc
    Export:
      Name: !Sub ${AWS::StackName}-vpcid

デプロイ

グルーバル IP の確認

curl inet-ip.info
xxx.xxx.xxx.xxx

デプロイ

aws cloudformation deploy --stack-name rtx830-vpn --template template.yaml --capabilities CAPABILITY_IAM --parameter-overrides CustomerGatewayIpAddress=xxx.xxx.xxx.xxx

テスト

作成した VPC のプライベートサブネットに EC2 インスタンスを立てる(パブリック IP アドレスなし)。セキュリティグループに自宅のローカル LAN からのアクセスのみ許可します。 きっと EC2 インスタンスのプライベート IP アドレスに対して ssh できるはずです。