らくがきちょう

なんとなく

GoBGP の基本的な使い方

GoBGP は Go 言語で実装された BGP デーモンです。VIRL 上でネットワーク機器と組み合わせて使うと BGP の検証をする際に便利です。今回は簡単な使い方をメモしておきます。

検証環境

構成

今回は VIRL で以下の構成を作りました。Go 言語や GoBGP をインターネットから取得する為、Linux はインターネットに出られるようにしてあります。

f:id:sig9:20160403162940p:plain

Linux の設定

以下の通り、アドレスを設定しておきます。

sudo ip addr add 192.168.1.100/24 dev eth1
sudo ip link set up dev eth1
sudo ip addr add 192.168.2.100/24 dev eth2
sudo ip link set up dev eth2

尚、後述しますが GoBGP は AS65001 で動作させます。

R1 の設定

AS 65001 で設定し、GoBGP とは iBGP Peer を張らせます。

hostname R1
!
interface GigabitEthernet0/1
 ip address 192.168.1.1 255.255.255.0
 no shutdown
!
router bgp 65001
 bgp router-id 192.168.99.1
 neighbor 192.168.1.100 remote-as 65001
!
end

R2 の設定

AS 65001 で設定し、GoBGP とは eBGP Peer を張らせます。

hostname R2
!
interface GigabitEthernet0/1
 ip address 192.168.2.2 255.255.255.0
 no shutdown
!
router bgp 65002
 bgp router-id 192.168.99.2
 neighbor 192.168.2.100 remote-as 65001
!
end

Go 言語のインストール

GoBGP は Go 言語で実装されているので、まず初めに Go 言語をインストールします。apt で Go 言語 (golang) をインストールすると GoBGP のインストールに失敗する為、apt は使わないことにします。予め、必要となる環境変数を ~/.profile に設定しておきます。

export GOPATH=$HOME/golang
export PATH=$PATH:$GOPATH/bin:/usr/local/go/bin

.profile の変更を反映しておきます。

source ~/.profile

公式サイトから Go 言語をダウンロード&展開します。

curl -k -O https://storage.googleapis.com/golang/go1.6.linux-amd64.tar.gz
sudo tar -C /usr/local -zxvf go1.6.linux-amd64.tar.gz
mkdir ~/golang

GoBGP のインストール

GoBGP は「デーモン部分の gobgpd」と「CLI 部分の gobgp」に分かれており、両者間は gRPC で通信するそうです。GoBGP をインストールするには git が必要になります。

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

gobgpd のインストールには若干、時間がかかりました。「VIRL 上の環境」ということもあると思いますが、今回の環境では 2 分 20 秒程かかりました。

$ time go get github.com/osrg/gobgp/gobgpd

real	2m19.468s
user	0m38.765s
sys	0m5.465s

$ time go get github.com/osrg/gobgp/gobgp

real	0m5.699s
user	0m4.300s
sys	0m0.436s

尚、現時点で Go 言語を apt-get でインストールすると 1.2.1 がインストールされました。この状態で gobgpd をインストールしようとすると、エラーになってしまいました。

$ go version go1.2.1 linux/amd64

$ go get github.com/osrg/gobgp/gobgpd
# golang.org/x/net/http2/hpack
golang/src/golang.org/x/net/http2/hpack/huffman.go:14: undefined: sync.Pool

GoBGP の設定ファイル

~/golang/bin/gobgpd.conf に GoBGP の設定ファイルを以下の内容で新規作成します。

[global.config]
  as = 65001
  router-id = "192.168.99.100"

[[neighbors]]
  [neighbors.config]
    neighbor-address = "192.168.1.1"
    peer-as = 65001

[[neighbors]]
  [neighbors.config]
    neighbor-address = "192.168.2.2"
    peer-as = 65002

GoBGP の起動

これで用意 OK です。GoBGP を起動します。

cd ~/golang/bin
sudo ./gobgpd -f gobgpd.conf

実際の起動ログは以下の通りです。

$ sudo ./gobgpd -f gobgpd.conf
[sudo] password for cisco:
{"level":"info","msg":"gobgpd started","time":"2016-04-03T07:56:28Z"}
{"level":"info","msg":"finished reading the config file","time":"2016-04-03T07:56:28Z"}
{"level":"info","msg":"Peer 192.168.1.1 is added","time":"2016-04-03T07:56:28Z"}
{"level":"info","msg":"Peer 192.168.2.2 is added","time":"2016-04-03T07:56:28Z"}
{"Key":"192.168.1.1","State":4,"Topic":"Peer","level":"info","msg":"Peer Up","time":"2016-04-03T07:56:31Z"}
{"Key":"192.168.2.2","State":4,"Topic":"Peer","level":"info","msg":"Peer Up","time":"2016-04-03T07:56:40Z"}

経路を追加する

経路の追加例は以下の通りです。追加した経路はすぐにアップデートされます。

gobgp global rib add -a ipv4 10.0.1.0/24 community 111:222 med 333 origin igp local-pref 444

R1 で受信経路を確認します。GoBGP から指定した属性を受信出来ています。

R1# show ip bgp 10.0.1.0/24
BGP routing table entry for 10.0.1.0/24, version 26
Paths: (1 available, best #1, table default)
  Not advertised to any peer
  Refresh Epoch 1
  Local
    192.168.1.100 from 192.168.1.100 (192.168.99.100)
      Origin IGP, metric 333, localpref 444, valid, internal, best
      Community: 111:222
      rx pathid: 0, tx pathid: 0x0

同様に、R2 で受信経路を確認します。GoBGP から指定した属性を受信出来ています。こちらは eBGP なので LocalPref が無視されています。

R2# show ip bgp 10.0.1.0/24
BGP routing table entry for 10.0.1.0/24, version 26
Paths: (1 available, best #1, table default)
Flag: 0x820
  Not advertised to any peer
  Refresh Epoch 1
  65001
    192.168.2.100 from 192.168.2.100 (192.168.99.100)
      Origin IGP, metric 333, localpref 100, valid, external, best
      Community: 111:222
      rx pathid: 0, tx pathid: 0x0

経路を削除する

経路の削除は以下の通りです。

gobgp global rib del -a ipv4 10.0.1.0/24