はじめに
この記事は、MicroAd Advent Calendar 2019の18日目の記事です。
現在データセンターの移設を行っていますが、その作業に関連してハマった内容を書いておきたいと思います。
この記事には具体的な機器のメーカー名、機種の情報は記述してません。
また、参考になるようなコンフィグ等も含んでいません。
背景
データセンターの移設に向けて、データセンター間の接続を行うべく、
様々な準備を進めていました。
DC間は、以下のようにBGPで接続しようとしていました。
左側の既存データセンターと、右側の新規データセンター間を、
BGPで接続しルーティングを回そうと計画していました。
※上記の図では実際のAS番号ではなくプライベートAS番号で書いています。
何をしたのか
通常であれば問題にあるようなことはなく、ただBGPを設定して接続するだけのはずでした。
割り振られた4byteのAS番号...
新規データセンター側の機器には今回AS番号を取得して割り振っていた
グローバルなAS番号(4byte)が設定してあります。
この機器は、上流のISPともすでにBGP接続しており4byte AS番号による
不具合などは特に起きていませんでした。
異なるメーカの対向装置...
既存データセンター側は、費用をできるだけ抑えるため既存で使ってるメーカーの機器で
BGPを設定することにしました。
一つだけ注意したことはできるだけ新しいOSを入れておくことでした。
しかし、この機器が厄介な問題を引き起こすことに。
そしてハマった...
新規データセンター側も既存データセンター側も機器の準備が整い、
専用線も開通したのでケーブルを接続。
本来なら、BGPのPeeringが確立して無事終了となるところ、
なぜかステータスが「Established」にならず
原因調査
Peerが上がらない原因の調査を開始。
まずはL2での接続ができているのか、対向の装置にPingを飛ばしてみることに。
→どうやらPingは飛ぶらしい
次に、BGPのネイバーの状態を確認。
一方が、「Open Message Error」となっていることは判明。
→どうやらPeerの確立時にエラーが起きているらしい
メッセージを調べるも何が原因でそうなっているのか分からず。
とりあえず、双方のコンフィグを確認したが複雑な設定は入れておらず、
むしろシンプルすぎて原因となりそうなところが見当たらず。
途方に暮れる
過去に書いた記事の通り、Cumulus LinuxでBGPを使っている程度の知識しか持ち合わせておらず、
BGPに詳しくないがゆえに原因が何なのかさっぱりわからない。
とりあえず、困ったときはtcpdumpでも採ってみようとtcpdumpで状況が見えるか試してみることに。
希望の光
tcpdumpを採ってみると、ちゃんとOpenメッセージのやり取りはしているように見えた。
ただ、直後に既存データセンター側の機器から「Open Message Error subcode unknown」が送られていて、
Peerが確立しないという状況であることは分かりました。
さて、何が原因なのか。
tcpdumpをぼーっと眺めていて、「もしかしてcapabilityの一部が未サポートなのかな??」
試しに新規データセンター側の機器に、「dont-capability-negotiate」のオプションコマンドを使って
既存データセンター側の機器にcapabilityのネゴシエーションをしないように設定してみることにしました。
二つ目のハマリポイント
普通なら、capabilityを無効にすることで**万事解決!**となるはずがPeerが確立しない。
「うーん???」
またしても途方に暮れることに…
このままだとセンター移設にも影響してしまうのではないかという焦り、
ちゃんと接続検証してなかった自身を猛省しつつ、もう一度tcpdumpを取得して状況を見ることに。
今度こそ
ぼーっとtcpdumpを見ていて、ようやく気づいたことが。
それは新規データセンター側から送られてくるAS番号がおかしいということ。
BGPに詳しい人なら常識なのかもしれないが、
BGPの4byteASは、BGPメッセージのオプションcapabilityとして埋め込まれており、
先にAS番号を「23456」として相手に送信しているのです。
そのため、既存データセンター側のneighborで設定しているremote-asが合わず、
エラーになっていたのです。
解決方法
通常なら新規データセンターで使用している機器を2byteAS番号に変えてしまえば解決なのですが、
今回の4byteASはグローバルAS番号であることと、NW構成的に変更できず。
やむを得ず、新規データセンター側の機器でneighborのオプション設定にある「local-as」コマンドを使って
2byteのローカルAS番号であるかのように設定することにしました。
データセンター間のBGP接続設定で、新規データセンター側のASを2byteのプライベートAS(64512)のに設定しました。
これで無事にPeerが確立しました
おわりに
今回の件で、BGPについて少し詳しくなれた気がしました。
特に4byteのAS番号を使う機会がほとんどないので詳しく調べられてよかったと思います。
そして何より学んだことは、事前の接続検証はちゃんとやらなきゃダメだよねってこと…。