GoBGPを活用して、BGP動作を体験してみる 〜環境準備編〜
[ 2016.4.29修正:gobgp最新版への対応 ]
これまで、RyuBGPSpeakerを活用して、SDN分野におけるBGP技術の有用性を試してきました。
SDN分野におけるBGP新技術を活用したユースケースが、IETF等でいろいろ議論されておりますので、今後も、
SDN分野でBGP新技術を試してみて、いろいろ知見を貯めたいところです。
ただ、Ryu開発コミュニティでは、BGP新機能の議論は、活発に行われていないようです。
いっぽう、golangベースで実装されたオープンソース"GoBGP v1.0"がリリースされました。
GoBGPの提供機能は、SDN分野での活用を見据えて、BGP新機能が実装されているようです。
そこで、GoBGPをいろいろと試してみたいと思います。
◆既存ネットワーク構築
まず、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してみたいです。