オンプレサーバから Active Directory を AWS 上に移行するべく、拠点間 IPsec VPN を張りたい。

ヤマハルータ RTX1210 を購入した話で書いたように、先代 RTX1200 で AWS VPN (Amazon Virtual Private Cloud) に接続しようとしたところ、定義を書き換えないとうまくいかないのと、BGP による動的ルーティング情報の交換にも失敗していました。

オンプレサーバから少しずつクラウド上に移行

2009年時点では、Nire.Com は自宅 LAN にある、自作 PC による、100% オンプレサーバでした。

  • VM ホスト: 自作 PC 2台 + VMware ESXi
  • VM として DNS, メール, Web サーバ (CentOS), Active Directory サーバ (Windows Server) などを並べる

すべて二重化されており、1台がダウンしてもサービスを継続可能という、企業が考えそうな冗長化構成なんだぜと。あくまで自宅で趣味の話ですよ。

これが、何年かかけて DNS は AWS Route 53, メールサーバは G-Suite (Google Apps)、Web サーバも…とクラウド上に段階的に移行済ですが、最後の最後に Windows Server 上で稼働する
Active Directory が残っていました。

Windows Server は DNS, LDAP, Kerberos, そして SMB など色々なプロトコルサーバをかき集めてきてマイグレートしたものです。自宅と DC (AWS) 間に必要な分のポートを開けるのも面倒だし、暗号化されているプロトコルとされていないものが混在しているので、VPN を張った方が手っ取り早く安全と。

拠点間 VPN ネットワーク構成と AD 移行手順

そこで以下のような構成にしようとしていました。

AWS - 自宅 LAN 間の VPN

  1. AWS VPC 側の LAN と、自宅 LAN を VPN (IPsec) で結び、その中で必要なプロトコルを通す
  2. AWS VPC 側はインターネットに出るゲートウェイを持たない。自宅 LAN の出島状態。
  3. AWS 上の EC2 インスタンスをリージョンに 1つずつ作成
  4. 自宅 LAN 側の ads-local (仮称) と AWS 上の ads-ap-northeast1, ads-us-west1 を同期させる
  5. AD x 3台体制で安定したら、ads-local を降格させ ads-ap-northeast1, ads-us-west1 の 2台構成にして完了

ヤマハルータ RTX1210 側の設定は苦難の歴史

AWS の場合ウィザードが手厚く、カスタマーゲートウェイが Yamaha RTX シリーズであることを指定すると、tunnel select 〜の設定が自動生成されます。

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

ところがそのまま設定しても動作しない代物だったりします。

実際に修正した後の設定です。tunnel は 1つめだけ掲載。tunnel select 2 は割愛。

tunnel 設定

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
  ipsec ike pfs 1 on
  ipsec ike pre-shared-key 1 text 
  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 1460
 tunnel enable 1

NAT 設定

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

BGP 設定

bgp use on
bgp autonomous-system 65000
bgp log neighbor packet
bgp neighbor 1 10124 169.254.77.88 hold-time=30 local-address=169.254.33.44
bgp router id 192.168.0.1
bgp preference 10001
bgp import filter 1 equal 0.0.0.0/0
bgp import 10124 static filter 1

AWS 側の定義から書き換えが必要な箇所

書き換えた箇所は以下の通り。

AWS からダウンロードした定義:

ipsec ike local address 1 11.22.33.44

書き換え後:

ipsec ike local address 1 192.168.0.1
ipsec ike local id 1 192.168.0.1

グローバル IP アドレスなのですが、NAT Traversal が間に入っている場合は、ローカル側の IP アドレスを lan 側、プライベート IP アドレスにしないと動作しませんでした。

AWS による定義:

ip tunnel tcp mss limit 1379

書き換え後:

ip tunnel tcp mss limit 1460

MTU (MSS) を適切に設定しないと VPN 通信ができないといったブログをいくつか見かけるので、手動で設定。

ip tunnel tcp mss limit auto

でも大丈夫なはずです。

BGP セッションが確立せず

この状態で VPN セッション自体は確立するのですが、ルーティング情報を交換する BGP ((Border Gateway Protocol)) のセッションが確立しないのです。BGP にはセッションが確立するまでにいくつかの状態が存在します。RTX1200 側のログを確認すると、Idle / Active を繰り返していることは分かるのですが、Established にならない。

ヤマハルータの課題として、VPN セッションの接続状態が分かりにくかったり、コマンドでセッションを再確立させるのがやりにくかったりします。

セッション切れてるんじゃない? ということで、keepalive も見直しました。

AWS による定義:

ipsec ike keepalive use 1 on dpd 10 3

書き換え後 (非推奨):

ipsec ike keepalive use 1 on icmp-echo

これは効果なし。

この後

  • プロバイダを変更 (ASAHI-NET を interlink に)
  • ヤマハルータ RTX1200 を RTX1210 に変更し、最新ファームウェアでトライ

の順に試してみましたが、BGP はやっぱりだめ。

結局、BGP 部分の定義をバッサリ削り、静的ルーティングに直して事なきを得ましたが、

ip route 10.0.0.0/16 gateway tunnel 1

同時に GCP (Google Computing Platform) での VPN を同時に試しており、GCP VPN の方が実はいいんじゃないかと思い始めました 🙂

まあそれは別エントリで。
つづく。