2年前に、自宅環境で RTX1210 と AWS とで拠点間 VPN セッションを貼る記事を書きましたが、当時は正常に接続できていませんでした。

AWS - 自宅 LAN 間の VPN
AWS – 自宅 LAN 間の VPN

AWS 上の [サイト間の VPN 接続] メニューで見ると、

AWS VPN: トンネル詳細
AWS VPN: トンネル詳細画面

[トンネル詳細] 画面でステータスとして “アップ” と表示されていて、見た目接続できているようですが、実際には RTX1210 から AWS VPC 内のサーバに接続できないと。

Google のクラウドプラットフォーム GCP であれば、ほとんど問題なく VPN 接続できるので、GCP 上にインスタンス (GCE) を立て、 Active Directory サーバを置いて今まで運用してきています。

GCP - 自宅 LAN 間の VPN

ところが AWS 上でマネージドな Directory Service である Simple AD (Simple Active Directory) や Microsoft AD といったサービスが出てきています。つまり自分でインスタンスを立てて、サーバの死活監視をしなくても、必要な機能を提供してくれるわけですね。

AWS VPN にリベンジ!ってことで、接続できない理由を調べてみることにしました。それこそ 1行ずつ変えてみてログを取り、挙動を延々と確認してみたところ、どうも複数の問題があることが分かってきました。

なお、前回と今回で使用しているプロバイダが異なるので念のため書いておきます。

  • 前回 … フレッツ光 + ASAHI-NET + ASAHI-NET 自身の固定 IP メニュー
  • 今回 … フレッツ光 (ソフトバンク光のベースに使われている) + Interlink の ZOOT NEXT サービス (固定 IP サービス)

原因その1: IKEv1 と IKEv2 の設定が混在

IPsec のセッションを貼る際に IKE というプロトコルで接続方式のネゴシエーションを行いますが、この IKE には v1 と v2 が存在します。

GCP / AWS ともに両バージョンとも利用できるのですが、GCP では IKEv2 でつながったというブログが多いために v2 を、AWS では公式で IKEv1 が推奨されていたために v1 で設定しようとしていました。

そうすると Yamaha RTX ルータ上の設定も IKE v1 / v2 で変えなくてはいけないのに、お互いに項目をコピペしようとしたのが敗因。具体的には次の 2行は AWS IKEv1 には不要でした。

ipsec ike local name 1 192.168.0.1 ipv4-addr
ipsec ike local id 1 192.168.0.1

原因2: L2TP 用のポート 1701 は不要

むろん上記の 2行をコメントアウトしただけでは通信はできません。

AWS / GCP の他に L2TP / IPsec で接続する設定を試している関係で、その設定が混じっていました。L2TP の場合 UDP ポート 1701 を透過させる設定が必要だったため、その設定を持ってくると中途半端に IPsec トンネルが張れるように見えますが、根本的な問題の解決にはなっていません。具体的には次の記述は不要でした。

nat descriptor masquerade static 2 18 192.168.0.1 udp 1701
ipsec transport 1 201 udp 1701
ipsec transport 2 202 udp 1701

原因3: bgp route id の設定は不要

あって実害はないかもしれませんが、下記の設定も不要でした。

bgp router id 192.168.5.1

bgp に関しては、AWS からダウンロードした設定ものをそのまま追加も変更もせずにコピペ、で良さそうです。

AWS VPN 上からルータの設定をダウンロード

原因3: nat-traversal の実装が Yamaha 標準と違う

これが最重要ポイント! です。

自宅 LAN 環境 192.168.0.0/24 は NAT の背後にあるため、IPsec でセッションを張る際には NAT 関連の記述が必要です。

AWS からダウンロードした設定には下記のような記述があり、おなじみの nat descriptor 設定を書けば十分のように見えますが、

# If you are using NAT(IP masquerade) on this device, then you should specify the private IP address for the argument:
# ipsec ike local address  <CGW local IP address>
# Please specify the same local IP address for the 'nat descriptor masquerade' commands:
# nat descriptor address inner 1  <CGW local IP address range>  
# nat descriptor masquerade static 1 1 <CGW local IP address>  udp 500 
# nat descriptor masquerade static 1 2 <CGW local IP address>  esp * 

BGP のない静的ルーティングでは、上記で IPsec のセッションが張れ、AWS 上もステータスが “アップ” になって接続したように見えますが、実際には ping すら通りません

結論として、次の 1行が必要です。

ipsec ike nat-traversal 1 on type=2

nat-traversal の設定が必要なんですが、type=2 と書いてあるところが超重要で、このオプションなしには正しく通信できませんでした。

Yamaha 公式サイトによると、どうも NAT トラバーサルの実装を Yamaha 以外の「何か」にあわせる設定があります。実際に試してみたらビンゴだったと。

type=TYPE

1 … ヤマハルーターの従来の動作との互換性を保持する
2 … NATトラバーサル使用時に交換するペイロードを一部の実装に合わせる

なんで気づいたのかですが、Yamaha RTX シリーズにはその後、自動的に AWS API に接続し設定をダウンロードしてくる「クラウドサービスとのVPN接続設定機能」が実装されたらしく。 (cloud vpn set go)

私の場合は、GUI は一切使わずに 1から設定を書いているのと、既存の設定とのコンフリクトが起きてはいけないので cloud vpn set go 自体は使いませんが、上記ページの下に

<ご参考>自動的に設定される CONFIG

というセクションがあり、そこに type=2 の設定がしれっと出てきます。一部の実装といいつつ、ぶっちゃけ AWS の実装に合わせるための設定じゃないんですかね。 🙂

この設定で無事に動きました

ということで説明が長くなりましたが、まとめると以下の設定を行った状態で、BGP ありで、問題なく IPsec トンネルが張れて自宅 LAN – AWS VPC とで疎通もできています。

tunnel select 1
ipsec tunnel 201
  ipsec sa policy 201 1 esp aes-cbc sha-hmac
  ipsec ike duration ipsec-sa 1 3600
  ipsec ike encryption 1 aes-cbc
  ipsec ike group 1 modp1024
  ipsec ike hash 1 sha
  ipsec ike keepalive use 1 on dpd 10 3
  ipsec ike local address 1 192.168.0.1
  ipsec ike local id 1 192.168.0.1
  ipsec ike nat-traversal 1 on type=2
  ipsec ike pfs 1 on
  ipsec ike pre-shared-key 1 text xxxxxxxxxxxxxxxxxxx
  ipsec ike remote address 1 55.66.77.88
 ipsec tunnel outer df-bit clear
  ip tunnel address 169.254.33.44/30
  ip tunnel remote address 169.254.77.88
 ip tunnel tcp mss limit auto
 tunnel enable 1

nat descriptor type 2 masquerade
nat descriptor address inner 2 192.168.0.1-192.168.0.254
nat descriptor masquerade static 2 16 192.168.0.1 udp 500
nat descriptor masquerade static 2 17 192.168.0.1 udp 4500
nat descriptor masquerade static 2 18 192.168.0.1 esp *


bgp use on
bgp autonomous-system 65000
bgp neighbor 1 10124 169.254.77.88 hold-time=30 local-address=169.254.33.44
bgp import filter 1 include 192.168.0.0/24
bgp import 10124 static filter 1

ようやくまとまった。type=2 ですよ皆さん。いやこれね、清々しく説明してますが、大変ですよ。IPsec と NAT の組み合わせなんて本当にやるもんじゃないw

引き続き Directory Service をいろいろ試してみたいと思います。