自宅とAWSをVPN接続してみた (Ciscoルータ編)

2019.07.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

コンサルティング部の川原です。

我が家ではインターネット接続用のルータとして Cisco C841M を使っています。 (Amazon などで案外お手軽に購入できます。)

AWS VPNサービス( + CloudFormation) のお勉強と個人的な興味を兼ねて、 今回は オンプレ環境(自宅) のCiscoルータと AWSのサイト間VPN接続環境 を構築してみます。

※なお、オンプレ(自宅)とAWSのサイト間VPN記事自体は下記の通り、先人がいらっしゃいます。 違いとしては、「オンプレ側がCiscoルータ」、「BGPを使用しない」ぐらいです。

自宅とAWSをVPN接続してみた

YAMAHA RTX830でお手軽VPN接続

概要

構成図

家の回線は 2セッションまで PPPoE接続ができるので、 余りの 1セッションを AWSとのVPN接続に使用します。

  • オンプレ(自宅)側 のサブネット: 192.168.10.0/24
  • AWS側 のサブネット: 172.20.0.0/24

手順

  1. CloudFormation でAWS側のネットワークリソースを作成
  2. オンプレ側 CiscoルータのVPN設定
  3. VPN接続確認

CloudFormationでリソース作成

AWS側のネットワークリソースを CloudFormationで作成します。 CustomerGateway の IpAddress には自宅のグローバルIPを記入します。

  • VPC
  • Subnet
  • CustomerGateway
  • VPNGateway
  • VPNConnection
  • RouteTable
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  SystemName:
    Description: "System name of each resource names."
    Type: String
    Default: "devio"
  EnvironmentName:
    Description: "Environment name of each resource names."
    Type: String
    Default: "test"

Resources:
  # VPC
  VPC1:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 172.20.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value:
            Fn::Sub: "${SystemName}-${EnvironmentName}-vpc-1"
  # Subnet
  PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: VPC1
      CidrBlock: 172.20.0.0/24
      AvailabilityZone: "ap-northeast-1a"
      MapPublicIpOnLaunch: False
      Tags:
        - Key: Name
          Value:
            Fn::Sub: "${SystemName}-${EnvironmentName}-private-subnet-1"
  # CustomerGateway
  CustomerGateway1: 
    Type: AWS::EC2::CustomerGateway
    Properties: 
      Type: ipsec.1
      BgpAsn: 65000
      IpAddress: XXX.XXX.XXX.XXX
      Tags:
        - Key: Name
          Value:
            Fn::Sub: "${SystemName}-${EnvironmentName}-cgw-1"
  # VPNGateway
  VPNGateway1: 
    Type: AWS::EC2::VPNGateway
    Properties: 
      Type: ipsec.1
      Tags: 
        - Key: Name
          Value:
            Fn::Sub: "${SystemName}-${EnvironmentName}-vgw-1"
  AttachVpnGateway1:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId:
        Ref: VPC1
      VpnGatewayId:
        Ref: VPNGateway1
  # VPNConnection
  VPNConnection1: 
    Type: AWS::EC2::VPNConnection
    Properties: 
      Type: ipsec.1
      StaticRoutesOnly: true
      CustomerGatewayId: 
        Ref: CustomerGateway1
      VpnGatewayId: 
        Ref: VPNGateway1
      Tags: 
        - Key: Name
          Value:
            Fn::Sub: "${SystemName}-${EnvironmentName}-vpn-connection-1"
  VPNConnectionRoute1: 
    Type: AWS::EC2::VPNConnectionRoute
    Properties: 
      DestinationCidrBlock: 192.168.10.0/24
      VpnConnectionId: 
        Ref: VPNConnection1
  # RouteTable
  PrivateRouteTable1:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:
        Ref: VPC1
      Tags: 
        - Key: Name
          Value:
            Fn::Sub: "${SystemName}-${EnvironmentName}-private-rtb-1"
  PrivateRoute1:
    Type: AWS::EC2::Route
    DependsOn: AttachVpnGateway1
    Properties:
      RouteTableId:
        Ref: PrivateRouteTable1
      DestinationCidrBlock: 192.168.10.0/24
      GatewayId:
        Ref: VPNGateway1
  PrivateRtbAssociation1:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId:
        Ref: PrivateRouteTable1
      SubnetId:
        Ref: PrivateSubnet1

次にAWS CLI上でスタック作成のコマンドを実行します。

aws cloudformation create-stack\
 --stack-name vpnteststack\
 --template-body file://(作成した YAMLファイルパス)\
 --parameters ParameterKey="SystemName",ParameterValue="vpntest" ParameterKey="EnvironmentName",ParameterValue="network"

マネジメントコンソール上でリソースが作成されていることを確認します。

Ciscoルータ設定

マネジメントコンソールの VPN → サイト間のVPN接続 から作成されたVPN接続を選択します。 設定のダウンロード から Cisco ルータに投入するConfig情報を取得します。

Config情報は以下のようなテキストファイルで、 IPsec Tunnel を2本作成する Configです。

このConfigを自宅Ciscoルータに流し込みます。

加えて VPCに向かう静的ルーティングを追加します。

ip route 172.20.0.0 255.255.255.0 Tunnel1 track 100 
ip route 172.20.0.0 255.255.255.0 Tunnel2 track 200

VPN接続確認

VPN接続確認のため、自宅・AWS側それぞれにマシンを配置します。 EC2インスタンスには 自宅側(192.168.10.0/24) からの ICMP通信、SSH通信 を許可 する セキュリティグループを適用させます。

  • 自宅側: ノートPC (192.168.10.30)
  • AWS側: Linux EC2インスタンス (172.20.0.10)

AWSマネジメントコンソール上で確認

作成したVPN接続のステータスが アップ となっていることを確認します。

Ciscoルータ コンソール上で確認

IPsec通信を構成する 2つのフェーズ (IKEフェーズ1, IKEフェーズ2) が成功しているか確認します。

  • IKEフェーズ1

    Ciscoルータ コンソールで show crypto isakmp sa を実行します。

        RO#show crypto isakmp sa
        IPv4 Crypto ISAKMP SA
        dst                 src                 state             conn-id status
        (AWS側 GlobalIP#1)  (自宅側 GlobalIP)   QM_IDLE           2002 ACTIVE
        (AWS側 GlobalIP#2)  (自宅側 GlobalIP)   QM_IDLE           2001 ACTIVE

    2つの コネクションの stateが QM_IDLE となっていれば OKです。

  • IKEフェーズ2

    次は show crypto ipsec sa を実行します。

        RO#show crypt ipsec sa
        
        interface: Tunnel1
            ︙
            #pkts encaps: 463, #pkts encrypt: 463, #pkts digest: 463 <--
            #pkts decaps: 201, #pkts decrypt: 201, #pkts verify: 201 <--
            ︙
             inbound esp sas:
                ︙
                Status: ACTIVE(ACTIVE) <--
        
             outbound esp sas:
                ︙
                Status: ACTIVE(ACTIVE) <--
                  
        interface: Tunnel2
            ︙
            #pkts encaps: 197, #pkts encrypt: 197, #pkts digest: 197 <--
            #pkts decaps: 375, #pkts decrypt: 375, #pkts verify: 375 <--
            ︙
             inbound esp sas:
                ︙
                Status: ACTIVE(ACTIVE) <--
        
             outbound esp sas:
                ︙
                Status: ACTIVE(ACTIVE) <--

    2つの Tunnelのステータスを確認します。

    • #pkts encaps: X, #pkts encrypt: X, #pkts digest: XX がカウントされていること
    • #pkts decaps: Y, #pkts decrypt: Y, #pkts verify: YY がカウントされていること
    • inbound/outbound esp sas: のステータスが ACTIVE になっていること

Pingで確認

Pingで各マシン間の疎通を確認します。

  • 自宅側ノートPCから AWS側EC2インスタンスに Pingが通る
  • AWS側EC2インスタンスから 自宅側ノートPCに Pingが通る

おわりに

以上、AWSと自宅のサイト間VPN構築でした。 NAT + PPPoE の環境である場合はNATトラバーサル設定など、いくつか注意が必要です。

AWSへのVPN接続におけるサンプルコンフィグの注意点:Cisco IOS編

IPsecのセッションがうまく張れない、といったときは下記サイトが参考になります。