AWSとVPN接続したら応答が無くなる時の対応

おはようございます。インフラ宮下です。

AWSのVPCとオフィスをVPNで接続するケースは良くありますが、構成によってはダウンロードしたconfigではうまく動作しない事があります。
今回は、以下の環境の時に変更しなければいけなかった設定をまとめたいと思います。

1)AWSの接続環境

[shell]リージョン:シンガポール
ルータ:YAMAHA RTX 1200
経路情報:Static[/shell]

2)VPNのconfigを確認

VPN Connectionsを作成した後にconfigをダウンロードすると設定項目として、IKE・IPSec・Tunnel Interface・Static Route
の4項目がありますのでそれぞれの内容について確認しましょう。

・IKE

[shell] tunnel select 1
ipsec ike encryption 1 aes-cbc
ipsec ike group 1 modp1024
ipsec ike hash 1 sha
ipsec ike pre-shared-key 1 text y7Nn93e7fJHWQrUaabbccdd112233[/shell]

IKEについては、configそのまま流用で問題ないでしょう。keyは個々に違いますので正しいKeyにしてください。
トンネル番号は、既に「1」を使っている場合は違う数字にしてください。(以降のID表記も忘れずに変える)

・IPSec

[shell] ipsec tunnel 201
ipsec sa policy 201 1 esp aes-cbc sha-hmac
ipsec ike duration ipsec-sa 1 3600
ipsec ike pfs 1 on
ipsec tunnel outer df-bit clear
ipsec ike keepalive use 1 on dpd 10 3[/shell]

変更必須項目はありません。
環境によっては、keepaliveがdpdだと頻繁に落ちる事がありますので、そんな時はicmpに変えても問題はないと思います。
中にはkeepaliveの設定はoffにする人ももいるようです。
keepaliveをicmpに変更する時は下記のように設定をします。

[shell]ipsec ike keepalive use 1 on icmp-echo 169.xxx.xx.xxx(AWS側のIP)[/shell]

IKE キープアライブ機能の設定
IPsec DPD

ipsec tunnelのIDも使用済の場合は別のIDとしてください。

・Tunnel Interface

[shell] ipsec ike local address 1 aaa.xxx.yyy.xxx(オフィスIP)
ipsec ike remote address 1 aaa.xxx.yyy.xxx(AWSIP)
ip tunnel address 169.254.yy.xz/30
ip tunnel remote address 169.254.yy.xx
ip tunnel tcp mss limit 1387
tunnel enable 1
tunnel select none
ipsec auto refresh on[/shell]

東京-シンガポール間をRTX1200でVPN接続すると、AWSインスタンスにログインして「ps」とか「ls」コマンド実行すると途中で応答がなくなってしいました。

オフィスサーバ→AWSインスタンス 応答不可
オフィスサーバ→AWSインスタンス→AWSインスタンス 応答可
オフィスサーバ→AWS別リージョンインスタンス 応答可
オフィスサーバ→AWSインスタンス(別ZONE) 応答不可

と症状を見る限り、オフィスとVPC間の通信に何か問題を抱えている事が予想されます。
切り分けとしてオフィスからAWSインスタンスに向けてPingしてみるとやはりおかしかったです。

[shell] ping -f -l 1387(MTUサイズ) -n 1 接続先IP(オフィスからAWSインスタンス)
パケットの断片化が必要ですが、DF が設定されています。[/shell]

試しに色々な環境やリージョンでconfigダウンロードしてみましたが全てmss設定値が1387と固定値になっていました。
なるほど、自分の環境に合わせて修正する必要がありました。

MTU/MSSの最適値を探す方法は、地道にPingでMTUサイズを加減して上限値を探す事になります。

[shell] ping -f -l この値を変える(断片化しない最大値) -n 1 接続先IP(オフィスからAWSインスタンス)

最適値ががわかったら下記公式に合せて、

MTU→最適値+8(ICMPヘッダ)+20(IPヘッダ)
MSS→MTU-40(TCP/IPヘッダ)

ルータに設定すべきMTU/MSS値を計算し、その値をconfigに追加します。

[shell] tunnel select 1
ip tunnel mtu 設定するMTU値
ip tunnel tcp mss limit 設置するMSS値[/shell]

改めてリモート接続して同様にコマンド実行をするときちんと表示されていると思います。
(最後に忘れずにsaveをしましょう)

大変参考にさせていただきました。
AWSのVPCにおけるMTUとMSS設定について
MTUが小さいVPN間でファイル共有通信をすると通信できなくなる問題

おすすめ記事