読者です 読者をやめる 読者になる 読者になる

SDN開発エンジニアを目指した活動ブログ

〜SDNなオープンソース製品を実際に使って試してみる〜

GoBGPを活用して、BGP動作を体験してみる 〜環境準備編〜

[ 2016.4.29修正:gobgp最新版への対応 ]
これまで、RyuBGPSpeakerを活用して、SDN分野におけるBGP技術の有用性を試してきました。
SDN分野におけるBGP新技術を活用したユースケースが、IETF等でいろいろ議論されておりますので、今後も、
SDN分野でBGP新技術を試してみて、いろいろ知見を貯めたいところです。
ただ、Ryu開発コミュニティでは、BGP新機能の議論は、活発に行われていないようです。

いっぽう、golangベースで実装されたオープンソース"GoBGP v1.0"がリリースされました。
GoBGPの提供機能は、SDN分野での活用を見据えて、BGP新機能が実装されているようです。
そこで、GoBGPをいろいろと試してみたいと思います。

github.com


◆既存ネットワーク構築

まず、GoBGPを試すには、既存ネットワークを事前に準備する必要があります。
ただし、既存ネットワーク構築準備に、あまり稼働を裂きたくないので、"docker-pseudo-wan"なる構築ツールを活用することとします。
github.com

既存ネットワーク構築は、以下のREADME.mdの記述とおり実行すると、MPLS-VPNが簡単に構築することができます。
https://github.com/ttsubo/docker-pseudo-wan/blob/master/README.md

◆GoBGP検証構成

既存ネットワークが構築できたら、GoBGP側も構築していきます。
今回の検証構成は、こんな感じです。

                                +-----------+               +----------+
host_001_101 container -------+ |  RyuBGP   | +-----------+ |  GoBGP   | +---- ...
host_002_102 container -------+ | container |               |          |
     :                          +-----------+               +----------+
                     < AS65001 >   192.168.0.1             192.168.0.2  < AS65002 >

           <-- 既存ネットワークを事前準備 --->               <-- 今回の構築対象 --->

ただし、今回は、BGPによるルーティング情報の伝播に関わる挙動に特化しますので、エンドエンド通信に関わるD-planeは想定外です。

◆GoBGP構築手順

GoBGPの環境構築は、ライブラリ依存関係を意識したりする必要がなく、至ってシンプルにインストールすることができます。
ちなみに、今回の動作確認では、Ubuntu Server版に、GoBGPをインストールしました。

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.3 LTS"

1. Linuxネットワーク設定

$ sudo vi /etc/network/interfaces
—————————
..(snip)

auto eth1
iface eth1 inet static
address 192.168.0.2
netmask 255.255.255.0

2. golangのインストール

$ vi $HOME/.profile
—————————
export GOPATH=$HOME/golang
export PATH=$GOPATH/bin:/usr/local/go/bin:$PATH

$ wget --no-check-certificate https://storage.googleapis.com/golang/go1.6.2.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.6.2.linux-amd64.tar.gz
$ mkdir $HOME/golang
$ source .profile

$ go version
go version go1.6.2 linux/amd64

3. goBGPのインストール

$ sudo apt-get update
$ sudo apt-get install git
$ go get -u github.com/osrg/gobgp/gobgpd
$ go get -u github.com/osrg/gobgp/gobgp

4. gobgpd設定ファイル

% vi $HOME/golang/bin/gobgpd.conf 
—————————
[global]
 [global.config]
   as = 65002
   router-id = "192.168.0.2"
 [global.mpls-label-range]
   min-label = 1000
   max-label = 2000

[[neighbors]]
 [neighbors.config]
   peer-type = "external"
   neighbor-address = "192.168.0.1"
   peer-as = 65001
   local-as = 65002
[[neighbors.afi-safis]]
 [neighbors.afi-safis.config]
   afi-safi-name = "ipv4-unicast"
[[neighbors.afi-safis]]
 [neighbors.afi-safis.config]
   afi-safi-name = "l3vpn-ipv4-unicast"

◆動作確認

1. gobgpdの起動

$ cd $HOME/golang/bin
$ sudo ./gobgpd -f gobgpd.conf 
{"level":"info","msg":"gobgpd started","time":"2016-04-29T15:37:54+09:00"}
{"level":"info","msg":"finished reading the config file","time":"2016-04-29T15:37:54+09:00"}
{"level":"info","msg":"Peer 192.168.0.1 is added","time":"2016-04-29T15:37:54+09:00"}
{"level":"info","msg":"Add a peer configuration for 192.168.0.1","time":"2016-04-29T15:37:54+09:00"}

2. BGP Peer確認

$ gobgp neighbor 192.168.0.1
BGP neighbor is 192.168.0.1, remote AS 65001
  BGP version 4, remote router ID 10.10.10.1
  BGP state = BGP_FSM_ESTABLISHED, up for 16920d 06:38:02
  BGP OutQ = 0, Flops = 0
  Hold time is 40, keepalive interval is 30 seconds
  Configured hold time is 90, keepalive interval is 30 seconds
  Neighbor capabilities:
    BGP_CAP_MULTIPROTOCOL:
        ipv4-unicast:	advertised and received
        l3vpn-ipv4-unicast:	advertised and received
    BGP_CAP_ROUTE_REFRESH:	advertised and received
    BGP_CAP_FOUR_OCTET_AS_NUMBER:	advertised
    BGP_CAP_ENHANCED_ROUTE_REFRESH:	received
  Message statistics:
                         Sent       Rcvd
    Opens:                  1          1
    Notifications:          0          0
    Updates:                0         33
    Keepalives:             1          1
    Route Refesh:           0          0
    Discarded:              0          0
    Total:                  2         35
  Route statistics:
    Advertised:             0
    Received:              33
    Accepted:              33

3. vrfユーザの登録

$ gobgp vrf add customerA rd 65001:101 rt both 65001:101

vrfユーザを登録すると、RD, RTに値が正しく設定されている様子が確認できます。

$ gobgp vrf
  Name                 RD                   Import RT            Export RT           
  customerA            65001:101            65001:101            65001:101      

4. ルーティング情報の登録

$ gobgp vrf customerA rib add 30.1.0.0/24

ルーティング情報を登録すると、対向BGPルータで保持しているルーティング情報を受信することになります。
その様子を確認してみます。

$ gobgp vrf customerA rib
    Network               Labels     Next Hop             AS_PATH              Age        Attrs
    65001:101:110.1.9.0/24[1001]     192.168.0.1          65001                00:01:30   [{Origin: ?} {Med: 100} {Extcomms: [65001:101]}]
    65001:101:110.1.4.0/24[1001]     192.168.0.1          65001                00:01:30   [{Origin: ?} {Med: 100} {Extcomms: [65001:101]}]
    65001:101:110.1.6.0/24[1001]     192.168.0.1          65001                00:01:30   [{Origin: ?} {Med: 100} {Extcomms: [65001:101]}]
    65001:101:110.1.2.0/24[1001]     192.168.0.1          65001                00:01:30   [{Origin: ?} {Med: 100} {Extcomms: [65001:101]}]
    65001:101:110.1.5.0/24[1001]     192.168.0.1          65001                00:01:30   [{Origin: ?} {Med: 100} {Extcomms: [65001:101]}]
    65001:101:30.1.0.0/24[1000]     0.0.0.0                                   00:00:06   [{Origin: ?} {Extcomms: [65001:101]}]
    65001:101:110.1.8.0/24[1001]     192.168.0.1          65001                00:01:30   [{Origin: ?} {Med: 100} {Extcomms: [65001:101]}]
    65001:101:110.1.1.0/24[1001]     192.168.0.1          65001                00:01:30   [{Origin: ?} {Med: 100} {Extcomms: [65001:101]}]
    65001:101:110.1.0.0/24[1001]     192.168.0.1          65001                00:01:30   [{Origin: ?} {Med: 100} {Extcomms: [65001:101]}]
    65001:101:110.1.7.0/24[1001]     192.168.0.1          65001                00:01:30   [{Origin: ?} {Med: 100} {Extcomms: [65001:101]}]
    65001:101:110.1.3.0/24[1001]     192.168.0.1          65001                00:01:30   [{Origin: ?} {Med: 100} {Extcomms: [65001:101]}]
    65001:101:10.1.0.2/32[1000]     192.168.0.1          65001                00:01:30   [{Origin: ?} {Med: 100} {Extcomms: [65001:101]}]

◆終わりに

GoBGPを動作させて、MPLS-VPNの挙動を確認しました。
次回より、GoBGPの動作原理に、DeepDiveしてみたいです。