動機
空いている時間に、gobgpapiのlistPathをclojureで実装してみるべくラフに動くコードを書いてる最中なのですが、full route持たせたgobgpdにつないでテストしてみようかと思い立ちました。以前gobgpd+fullrouteは廉価スペックVPSだと厳しいなぁみたいなこと思ったのですが、家で8G-mem積んでるPC(Ubuntu18.04)が使えるようになったので、それでgobgpd動かしてVPSで動いているbirdのほうからupdate流してやろうと思いつきました。こういうテストは普通はmrtっての使って用意したデータを流し込むのが真っ当なやり方なんでしょうけども、exportはできないにせよ、リアルなデータのほうがやる気がでます。
やったこと
vultr.comのvps*1では、利用できるサービス機能のひとつとしてBGP接続ができます。これを利用する場合には、アカウントを作成してから一度、チケットシステムで「BGP使いたいです」と依頼を発行する必要があります。*2
先方の設定が終わった後で、立ち上がっているcloud computeのインスタンスの管理画面(Server Information)にBGPというタブが現れます。ちなみに、ユーザーが所有するASNを持ち込んでupdateを流すことも可能らしいのですが、*3メッセージを受け取るだけであれば、プライベートASNを指定してくれます。それはBGPタブで、接続先、MD5パスワード、マルチホップ数とともに確認できます。
BGPタブがでていれば、そのインスタンスで任意のbgpデーモン立ち上げてメッセージ受け取れるようになります。vultr.comの推し(?というか最も説明が容易)はbirdのようで、birdの場合はメモリもコンパクトにIPv4/v6両方フルルートでも300M程度に収まってくれます。
VPSでbgpデーモンが動くようなれば、あとはこれをネクストホップにした、自分のbgpデーモンを起動します。大抵VPS側ではfirewallかけてると思うので利用するポート開けておきます。
VPS側のbgpデーモンとして一度birdを起動できたときのそのconfigurationに、つなぎ先のPCの情報を追加して立ち上げなおします。*4ちなみにVPSで動かしているOSはubuntu18.04です。*5
(以下のテキストでは次の置き換えしてます)
VPSインスタンスのIPv4アドレス: v.v.v.v
自分のPCのWAN側のIPv4アドレス:w.w.w.w
VPSのbird.confに追加したもの
protocol bgp client1 { local as 64939; source address "v.v.v.v"; import none; export all; multihop; passive on; neighbor "w.w.w.w" as 64939; }
自分のPC側ではgobgpdを起動する。
設定はこれ。NATによってローカルアドレスはPCのもの。
[global.config] as = 64939 router-id = "w.w.w.w" [[neighbors]] [neighbors.config] neighbor-address = "v.v.v.v" peer-as = 64939 [neighbors.transport.config] passive-mode = false local-address = "192.168.0.100" [neighbors.ebgp-multihop.config] enabled = true [[neighbors.afi-safis]] [neighbors.afi-safis.config] afi-safi-name = "ipv4-unicast"
これでgobgpdを起動して、
VPS側
nao@Tokyo:~/bird$ birdc show protocols BIRD 1.6.4 ready. name proto table state since info Tokyo BGP master up 2020-03-26 Established client1 BGP master up 22:36:41 Established
自分のPC側で
nao@pc1:~/gobgp$ ./gobgp nei v.v.v.v BGP neighbor is v.v.v.v, remote AS 64939 BGP version 4, remote router ID v.v.v.v BGP state = ESTABLISHED, up for 11:47:21 BGP OutQ = 0, Flops = 0 Hold time is 90, keepalive interval is 30 seconds Configured hold time is 90, keepalive interval is 30 seconds Neighbor capabilities: multiprotocol: ipv4-unicast: advertised and received route-refresh: advertised and received graceful-restart: received 4-octet-as: advertised and received enhanced-route-refresh: received Message statistics: Sent Rcvd Opens: 1 1 Notifications: 0 0 Updates: 0 225535 Keepalives: 1415 1601 Route Refresh: 0 0 Discarded: 0 0 Total: 1416 227137 Route statistics: Advertised: 0 Received: 784915 Accepted: 784915
届いてくれているようです、フルルート。
あとがき
vultr.comの宣伝をしたいわけではないのですけど、BGPつなげられるところ他に多くもなく、知っている範囲で一番簡単に実現できるということで書きました。
ちなみに、このBGP接続サービス、自分の興味・勉強で利用してますが、ごくたまに妙に安定しないというかフルルートが入ってこないようなことが起きたりしているの経験しています。vultr.comのサービスは例えばネットワーク障害とかでアラートメールとか送ってきてくれますが、このBGPの自分の経験するあれっと思う状況は、vultr側では認識・把握していなさそうです。自分の利用の仕方プロセスの状態にもよると思うのでなにが悪いとはいいきれないですけども、サービスレベルとして盤石ではなさそうな感じと思っています。*6
*1:vultr.comでの呼び方・プロダクト名はcloud compute、だと思う。それに、時間課金で使えるのでクラウドと呼ぶほうが通念的にはしっくりくるのかも。
*2:自分のときはそうで、もしかしたら今は不要になった可能性あり
*3:その時はもっと承認プロセスが厳しいのかもしれませんが
*4:というかbirdの場合はbirdc configureで行けますね。
*5:vultr.comのドキュメントではFreeBSDでの手順例も解説してくれていて、IPsecまわりの追加手順とかふむふむこうなっていたのかと読んでしまいました
*6:まあ確固たる用途あればvultr.comと個別ご相談するのがいいのかもしれない