YAMAHA RTXシリーズとRoute53の仕様不一致による動作不具合
にゃん、ぱす…..zzz
いやー、今回コレで3時間はハマりました。
ウェブ上に情報が無いようなので、YAMAHAさんには申し訳ないですがアップします。
RTXシリーズはTTL:0のレコードを無効なレコードとしてリジェクトする。
さて、一部のルータ(具体的にはYAMAHA RTXシリーズ、NEC IXシリーズ)は、IPSecの宛先にFQDNを指定する事が可能です。
今回、Route53でTTL:0
のDNSラウンドロビンを構成してRTXのipsec ike remote address
に設定した場合、SAが確立せず、ログも表示されませんでした。
再現環境:RTX810 Rev.11.01.19 (Mon Jul 29 15:27:26 2013)
症状:TTL:0
のAレコードを構成した際、ISAKMP
が開始されず、debug logにも表示されない。
従来BINDやdjbdns等では、TTLは短くても120秒程度の設定でとどめていました。
これは慣習的にDNSサーバへの負荷を下げるためでもあったのですが、Route53ではHealthCheckによるFailOverなどが構成可能な為、意図的に短いTTLのレコードが構成可能です。
YAMAHAサポートからの回答
(中略)
早速ではございますが、お問い合わせ内容につきましては誠に申し訳ございませんが、弊社ルーター製品ではDNSTTLが0の場合は無効なレコードとして実装しております。何卒ご理解を賜りますようお願い申し上げます。その他ご不明な点などございましたら、お手数ですがご連絡いただければ幸いです。
今後ともヤマハ製品をよろしくお願い申し上げます。
rtproにも探した限りなかったのと、回答に日数がかかったことから、おそらくマイナーな仕様だったようです。
DNSの仕様として
んじゃ、RFCではどっちが正解かというと、RFC2181に記載があります。
Clarifications to the DNS Specification(DNS仕様書の解釈)
標準13のTTLフィールドの定義は、値が何ビットか、符号付か符合なしかど
んな値が設定できるかはっきりしていません。TTL値は最小0で最大
2147483647で、符号なしの数とここで明記します。すなわち、
2^31-1が最大値です。転送する際に32ビットのTTL値に対して、
有効桁数31ビットで符号化され、最上位ビットはゼロになります。
DNSの実装は最上位ビットが1のTTL値を0と扱うべきです。
DNS実装は受信したTTL値に自由に上限を決めることが出来、大きな値
は全て最大値と同じと扱うことが出来ます。TTLはキャッシュに残してお
く義務を示すのではなく、残せる限界を指定します。
つまるところ、00000000 00000000 00000000 00000000
ではなく、10000000 00000000 00000000 00000000
をTTL:0
として扱ってくれ、と書いてある。
ただ、お互いTTL:0を認識している事から、パケットレベルではあっていて、YAMAHA側がRFCに準拠した実装をしていないように感じます。
ここから先はtcpdumpとWireSharkの世界なので、今日はおあづけ。。。(腹減った。)
結論として
TTLを変更したところ、すぐにisakmp
が上がったので、リトライはしていたようです。
試しにTTL:1のレコードを作った場合、50%の確立で名前解決に失敗する事になるので、挙動は不安定ですがisakmp
は動きました。
最終的に、TTLは10secにしました。これは、Aレコードの制御とOpenSwanの制御により、上手く縮退・再接続の挙動を確認する為に調度良い値だった為です。
また、nslookup
コマンドではTTLに関わらず正常に名前解決できていた事から、nslookup
とipsec
では別の名前解決の実装がなされていると想像します。
えんいー。