AWSと自宅をSite to Site VPN 接続してみる

AWSのSite to Site VPNのサービスを使って、VPCと自宅のネットワークを接続してみた時の備忘録です。

自宅のVPNゲートウェイは、古いPCにvyosをインストールしたものを使いました。2022/06/27現在、AWSが出力するカスタマーゲートウェイ用の設定を使うためには1.3系のvyosが必要です。1.4系ではvyosのコマンドが変わっていて、うまく設定できませんでした。

# ベースとする環境

下記がベースとする環境です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/86f57513-5551-a25e-9544-49a22983ab1b.png)

# 仮想プライベートゲートウェイによるSite to Site VPN接続

仮想プライベートゲートウェイを使って自宅のネットワークとSite to Site VPNをしてみます。
下記が最終的な構成です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/4f74f795-f994-bda6-c819-20f1c064e9bf.png)

## [AWS] 仮想プライベートゲートウェイの作成

- AWSマネコンでVPCを選択します
- 仮想プライベートネットワーク -> 仮想プライベートゲートウェイを選択します
- 仮想プライベートゲートウェイを作成します

![スクリーンショット 2022-06-30 22.05.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/9a7722d7-86c8-a7ea-ccbb-31d6955c21b2.png)


- アクション -> VPCにアタッチ を選択して、作成した仮想プライベートゲートウェイをVPCにアタッチします

## [AWS] カスタマーゲートウェイの作成

- AWSマネコンでVPCを選択します
- 仮想プライベートネットワーク -> カスタマーゲートウェイを選択します
- カスタマーゲートウェイを作成します
- IPアドレスには自宅のグローバルIPアドレスを設定します

![スクリーンショット 2022-06-30 22.01.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/d2da85ea-723c-5508-d83d-e52afa63b5c6.png)


## [AWS] Site to Site VPNの作成

- AWSマネコンでVPCを選択します
- 仮想プライベートネットワーク -> Site to Site VPNを選択してVPNを作成します
- 仮想プライベートゲートウェイと、カスタマーゲートウェイに、先ほど作成したものを設定します
- ルーティングオプションではBGPを有効にしておきます

![スクリーンショット 2022-06-30 22.09.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/1594e266-3a55-48fb-9662-01d11343dec0.png)


## [自宅] vyosのインストール

vyosの1.3系をインストールします。
LTS版は有償なので、下記からRC版のisoイメージをダウンロードします。
https://vyos.net/get/snapshots/

RC版にもいくつかありますが、今回はrc6を選択しました。vyos-1.3.0-rc6-amd64.iso (vyos-1.3.0-rc6)
isoイメージからインストール用のブータブルUSBを作成して、古いPC（Let's note CF-N10 SandyBridge世代）にインストールします。

## [自宅] vyosのネットワーク設定

AWSの仮想プライベートゲートウェイと通信する側のインターフェス（WAN側インタフェース）と内側のインタフェース（LAN側インタフェース）の設定をします。
IPアドレスはWAN側は上位のルーターからDHCPでもらいます。LAN側は固定IPにします。今回はWiFiをWAN側、有線LANをLAN側のインタフェースとして使いました。

### WAN側インタフェースの設定
```bash
configure
set interfaces wireless wlan0 type station
set interfaces wireless wlan0 security wpa mode wpa2
set interfaces wireless wlan0 ssid <WiFi接続先のSSID>
set interfaces wireless wlan0 security wpa passphrase <WiFi接続用のパスワード>
set interfaces wireless wlan0 address dhcp
commit
save
```

### LAN側インタフェースの設定
```bash
configure
set interfaces ethernet eth0 address 172.16.0.1/16
commit
save
```

### LAN側DHCPサーバーの設定
LAN側に接続されたクライアントにIPを払い出すためにDHCPサーバーの設定をします。

```
set service dhcp-server shared-network-name dhcp1
set service dhcp-server shared-network-name dhcp1 subnet 172.16.0.0/16 default-router 172.16.0.1
set service dhcp-server shared-network-name dhcp1 subnet 172.16.0.0/16 range 1 start 172.16.0.2
set service dhcp-server shared-network-name dhcp1 subnet 172.16.0.0/16 range 1 stop 172.16.0.9
```


## [自宅] vyosのVPN設定（vyosをカスタマーゲートウェイにする設定）

AWSマネージメントコンソールのSite to Site VPNの画面から、「設定をダウンロード」を選択して、vyos用のVPN設定ファイルをダウンロードします。

![スクリーンショット 2022-06-27 19.11.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/803c83c0-7fcc-89c7-9500-9a534bb5e40a.png)

設定ファイルの中身は、vyos用のIPSec VPNとBGPを設定するためのコマンドリストです。
IKE設定、IPsec設定、トンネルインタフェース設定、BGP設定に別れているので、内容を確認し、必要に応じて環境に合わせて修正して実行していきます。

VPNトンネルを2本接続して冗長構成にすることが推奨されていますが、お試しなので1本だけの接続にします。設定ファイルの２本目の設定項目は使用しません。

### IKE設定
`<y.y.y.y>`の部分を元の設定から変更します。NAT配下からNATトラバーサル機能を使って接続するため、local-address部はグローバルIPではなく、vyosのWAN側インタフェースのプライベートIPに変更します。

```
set vpn ipsec ike-group AWS lifetime '28800'
set vpn ipsec ike-group AWS proposal 1 dh-group '2'
set vpn ipsec ike-group AWS proposal 1 encryption 'aes128'
set vpn ipsec ike-group AWS proposal 1 hash 'sha1'
set vpn ipsec site-to-site peer <x.x.x.x> authentication mode 'pre-shared-secret'
set vpn ipsec site-to-site peer <x.x.x.x> authentication pre-shared-secret '<事前共有キー>'
set vpn ipsec site-to-site peer <x.x.x.x> description 'VPC tunnel 1'
set vpn ipsec site-to-site peer <x.x.x.x> ike-group 'AWS'
set vpn ipsec site-to-site peer <x.x.x.x> local-address <y.y.y.y>
set vpn ipsec site-to-site peer <x.x.x.x> vti bind 'vti0'
set vpn ipsec site-to-site peer <x.x.x.x> vti esp-group 'AWS'
```

### IPsec設定

WAN側インタフェースにwlan0を使うので、`ipsec-interfaces interface`を`wlan0`に変更します。

```
set vpn ipsec ipsec-interfaces interface 'wlan0'
set vpn ipsec esp-group AWS compression 'disable'
set vpn ipsec esp-group AWS lifetime '3600'
set vpn ipsec esp-group AWS mode 'tunnel'
set vpn ipsec esp-group AWS pfs 'enable'
set vpn ipsec esp-group AWS proposal 1 encryption 'aes128'
set vpn ipsec esp-group AWS proposal 1 hash 'sha1'
```


### BGP設定
BGPの設定コマンドの一部の仕様が変わっているため、新しい仕様に合わせて書き換えます。具体的には、`address-family ipv4-unicat`を追加します。

```
set protocols bgp 65000 neighbor 169.254.92.205 remote-as '64512'
set protocols bgp 65000 neighbor 169.254.92.205 address-family ipv4-unicast soft-reconfiguration 'inbound' 
set protocols bgp 65000 neighbor 169.254.92.205 timers holdtime '30'
set protocols bgp 65000 neighbor 169.254.92.205 timers keepalive '10'
set protocols bgp 65000 address-family ipv4-unicast network 0.0.0.0/0
```

## [自宅] NAT越えのための設定

### vyosでのNAT-Traversal設定

今回はONU + Router配下から接続するので、NAT-Traversalを有効にします。この設定は、AWSからダウンロードする設定ファイルには含まれていません。

```
set vpn ipsec nat-traversal enable
set vpn ipsec nat-networks allowed-network 0.0.0.0/0
```

### ONU + ルータのポートマッピング設定

ONU + ルータのポートマッピング設定に、UDPの500と4500への通信を、vyosが起動しているPCのIPアドレスに転送するルールを追加します。


## [AWS] 仮想プライベートゲートウェイへのルーティング設定

VPCのPrivate Subnetのルーティングテーブルに、自宅側のネットワーク(172.16.0.0/16）向けの通信の宛先を仮想プライベートゲートウェイにするルールを追加します。

![スクリーンショット 2022-06-30 21.49.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/54cb4e52-a651-a232-ebb7-b75002cf2949.png)

## [AWS] EC2のセキュリティグループ設定

Private SubnetのEC2インスタンスのセキュリティグループを変更して、自宅のプライベートIPアドレス（172.16.0.0/16）からI通信を許可します。

## VPN接続状態の確認

以上でIPsecによるVPN接続ができているはずですので、状態を確認していきます。

### AWS上の確認

AWSマネージメントコンソールのSite to Site VPNの設定画面で、トンネルの状態を確認します。vyos側では、２本のうちの１本目の設定しかしていないため、１本目がUpステータスになっていれば、期待通りの動作です。

![スクリーンショット 2022-06-30 21.24.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/76dd9b3d-aaae-8360-df69-9051812811e0.png)

VPCのPrivate Subnet上のEC2から、自宅のvyos配下のchromebookに向けてPingを打ってみます。

```
sh-4.2$ ping 172.16.0.2
PING 172.16.0.1 (172.16.0.2) 56(84) bytes of data.
64 bytes from 172.16.0.2: icmp_seq=1 ttl=64 time=133 ms
```

VPC -> 自宅が疎通しました。

### 自宅のvyosの状態確認

vyosの下記のコマンドを使って、IKEとIPsecのトンネルが貼られていることを確認します。

```
vyos@vyos:~$ show vpn ike sa 
Peer ID / IP                            Local ID / IP               
------------                            -------------
x.x.x.x                                 y.y.y.y                           

    Description: VPC tunnel 1

    State  IKEVer  Encrypt  Hash    D-H Group      NAT-T  A-Time  L-Time
    -----  ------  -------  ----    ---------      -----  ------  ------
    up     IKEv1   aes128   sha1_96 2(MODP_1024)   no     3600    28800  
```

```
vyos@vyos:~$ show vpn ipsec sa 
Connection                   State    Uptime    Bytes In/Out    Packets In/Out    Remote address    Remote ID    Proposal
---------------------------  -------  --------  --------------  ----------------  ----------------  -----------  ----------------------------------
peer-x.x.x.x-tunnel-vti      up       7m46s     6K/6K           100/101           x.x.x.x           N/A          AES_CBC_128/HMAC_SHA1_96/MODP_1024
```

ルーティングテーブルも確認してみます。

```
vyos@vyos:~$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.0.1     0.0.0.0         UG    20     0        0 wlan0
10.60.0.0       169.254.92.205  255.255.0.0     UG    20     0        0 vti0
169.254.92.204  0.0.0.0         255.255.255.252 U     0      0        0 vti0
172.16.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 wlan0
```

自宅のvyosのPCの配下に接続したchromebook(172.16.0.2)からEC2のプライベートIPアドレスを指定してPingを打ってみます。

```
ping 10.60.2.250
64byte from 10.60.2.250: icmp_seq=1 ttl=251 time=139 ms
```

自宅 -> VPCも疎通しました。