naoki86star

インターネットの片隅でなにかしら書いてみる

VPSサービスを使った、自分のPCにフルルートを引き込む一つの方法

動機

 空いている時間に、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と個別ご相談するのがいいのかもしれない