GoBGPdでのフルルート注入をGNS3上でやってみた

Cisco

先日のGNS3でDocker使ってJupyter Notebook動かすのに味をしめてなにか他にできないかなーと考えてました。

JANOGで学んだJupyter NotebookをGNS3で動かしてみた
先日のJANOG41@広島に参加してきました。BoFやSPで自動化の話題がいくつも出てたのに興味をひかれ、特にJupyter NotebookっていうPythonコードを実行できるドキュメント環境が面白そうだったので自分も手を付けようと決め...

そこでふと思い出したのが以下のエントリ。

インターネットのフルルートをGoBGPからVyOSに注入してみた - Qiita
インターネットのフルルート(59万経路)をVyOSにGoBGP経由で注入してみました。VyOSとGoBGP間でBGPピアを張り、GoBGPにフルルートを注入し、GoBGPからVyOSにフルルートを広…
  • そういえばフルルートってどんなものか見たことないなぁ
  • VyOSでの記事はあるけど、Cisco機器だとどうなるのかな?

ってことでやってみました。一部ハマりどころがあったけどなんとか解決できました。

環境

前回とほぼ変わんないですね。フルルート受ける仮想ルータが違いますが。

  • Macbook Air(Mid 2013, Core i7, RAM 8GB)
  • macOS High Sierra 10.13.3
  • GNS3 2.1.3
  • GNS3 VM on VMware Fusion
  • gns3/ubuntu Dockerイメージ
  • 何らかCiscoデバイス(GNS3上で動作するやつ。今回はCSR1000vとIOS-XRvを使用)

手順

gns3/ubuntu Dockerイメージの追加

1. “End Device”の【Ubuntu】をトポロジエリアにドロップ

2. 以下のイメージのように表示されていることを確認して Next

※以下のように表示されている場合はDockerではなくQEMUイメージのほうなので、今回は使いません。

3. “Server Type”を”Run this Docker VM on the GNS3 VM”にしてNext

4. そのままNext

5. そのままFinish


6. 「Available Appliance」を「Installed Appliance」にすると、以下のように”Ubuntu”が追加されています。

7. 追加した”Ubuntu”をトポロジエリアにドロップ

8. 登録されたノードを右クリックして「Configure」を選択

9. “Adapters”を「2」に変更後、”Network Configuration”の「Edit」ボタンをクリック

10. 以下のようにネットワーク設定を追加(eth1のアドレスは任意のものでかまいませんが、今回は以下のものを使用します)

auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet static
address 192.168.255.2
netmask 255.255.255.252

11. その他のノードを以下のように接続します。ポイントは以下の2点

  • Ubuntuノードのeth0とNATクラウドを接続
  • Ubuntuノードのeth1とフルルートを注入したいルータを接続

Ubuntuノードの環境作成

UbuntuにGo言語実行環境とGoBGPのインストールを行います。前回同様、NATクラウドを経由してインターネットから必要なパッケージなどを取得してきます。

1. Ubuntuノードを右クリックし”Start”
2. Ubuntuノードを右クリックし”Console”
3. 以下のようにコンソールが開くことを確認する

Ubuntu-1 console is now available... Press RETURN to get started.
udhcpc (v1.24.2) started
Sending discover...
Sending discover...
Sending discover...
Sending select for 192.168.122.201...
Lease of 192.168.122.201 obtained, lease time 3600
root@Ubuntu-1:~#

4. 以下のコマンドでパッケージ群のアップデートと使用するパッケージをインストール

root@Ubuntu-1:~# apt update
root@Ubuntu-1:~# apt -y upgrade
root@Ubuntu-1:~# apt -y install ca-certificates git wget bzip2

5. Go言語の実行環境とGoBGPdおよびGoBGPをインストール
※記事執筆時点で、Go言語をaptでインストールすると1.6がインストールされるが、GoBGPdのインストール時に実行されるコンパイルで”sort.SliceStable()”をサポートしていないと怒られてしまうので、素直に公式サイトからダウンロード、インストールを行うようにしています。

root@Ubuntu-1:~# wget https://dl.google.com/go/go1.9.4.linux-amd64.tar.gz
root@Ubuntu-1:~# tar xzf go1.9.4.linux-amd64.tar.gz -C /usr/local
root@Ubuntu-1:~# echo 'export GOROOT=/usr/local/go' >> ~/.bashrc
root@Ubuntu-1:~# echo 'export GOPATH=$HOME/go' >> ~/.bashrc
root@Ubuntu-1:~# echo 'export PATH=$GOROOT/bin:$GOPATH/bin:$PATH' >> ~/.bashrc
root@Ubuntu-1:~# source ~/.bashrc
root@Ubuntu-1:~# mkdir $HOME/go
root@Ubuntu-1:~# go get github.com/osrg/gobgp/gobgpd
root@Ubuntu-1:~# go get github.com/osrg/gobgp/gobgp

6. 以下のコマンドでGoBGPdの設定ファイルを作成しGoBGPdを起動します。

root@Ubuntu-1:~# cat <<EOF > gobgpd.conf
[global.config]
  as = 65534
  router-id = "254.254.254.254"

[[neighbors]]
[neighbors.config]
  neighbor-address = "192.168.255.1"
  peer-as = 65000
EOF

root@Ubuntu-1:~# gobgpd -f gobgpd.conf &

仮想ルータの設定

フルルートを注入する仮想ルータを起動し、BGPピアリングできるように以下のような設定を行います。なお、フルルート受けるルータはメモリが十分にないと受け取れないので、最低でも4GBはメモリを割り当ててください。
また、上述のkooshinさんのブログでもあるように「ネクストホップに到達できない」を回避するためにLoopback0に同様のアドレス割当を行いました。

■IOS(CSR1000vで確認)

conf t
interface Loopback0
 ip address 202.249.2.1 255.255.255.0
!
interface GigabitEthernet1
 ip address 192.168.255.1 255.255.255.252
 no shutdown
!
router bgp 65000
 bgp router-id 1.1.1.1
 bgp log-neighbor-changes
 neighbor 192.168.255.2 remote-as 65534
!
end

■IOS-XRv

conf
logging console notifications
line console
 exec-timeout 0 0
!
interface Loopback0
 ipv4 address 202.249.2.1 255.255.255.0
!
interface GigabitEthernet0/0/0/0
 ipv4 address 192.168.255.1 255.255.255.252
 no shutdown
!
!
route-policy PASS
  pass
end-policy
!
router bgp 65000
 bgp router-id 1.1.1.1
 address-family ipv4 unicast
 !
 neighbor 192.168.255.2
  remote-as 65534
  address-family ipv4 unicast
   route-policy PASS in
   soft-reconfiguration inbound
  !
 !
!
end

注入できない→できた!

MRTデータからGoBGPdにフルルートを注入し、仮想ルータに広報させます。もととなるデータはWIDEプロジェクトのRouteViewsアーカイブから取ってきます。
今回は記事作成年月(2018年2月)の最初のRIBデータ(rib.20180201.0000.bz2)を使うことにします。

Ubuntuのコンソールで以下のコマンドを実行し、RIBデータの取得とGoBGPへの注入を行いました。

root@Ubuntu-1:~# wget http://archive.routeviews.org/route-views.wide/bgpdata/2018.02/RIBS/rib.20180201.0000.bz2
root@Ubuntu-1:~# bzip2 -d rib.20180201.0000.bz2
root@Ubuntu-1:~# gobgp mrt inject global rib.20180201.0000

しかしこのままではうまく行きません。ピアリングもできてUPDATEメッセージも受けているのですが有効なプレフィックスとなっていないようです。

試しにdebug ip bgp updateをやってみると、以下のようにNEXT_HOPが不正なために仮想ルータ側が拒否していることがわかります。

*Feb 13 12:52:58.215: BGP(0): 192.168.255.2 rcv UPDATE about 66.15.223.0/24 -- DENIED due to: non-connected NEXTHOP;
*Feb 13 12:52:58.215: BGP: 192.168.255.2 Advertised Nexthop 202.249.2.169: Non-local or Nexthop and peer Not on same interface

どうやらVyOSと同じ設定ではCiscoルータはだめみたいです。もう少し調べてみました。

まず、実際のRouteViewsのルータがどのようにピアリングしているのかをログインして見てみました。

$ telnet route-views.wide.routeviews.org
Trying 203.178.141.138...
Connected to route-views.wide.routeviews.org.
Escape character is '^]'.

Hello, this is Quagga (version 0.99.23.1).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

route-views.wide.routeviews.org> show ip bgp summary
BGP router identifier 202.249.2.166, local AS number 6447
RIB entries 1250622, using 134 MiB of memory
Peers 8, using 36 KiB of memory

Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
202.112.60.243  4  4538       0       0        0    0    0 never    Active
202.249.2.20    4  4777 1630240 1614300        0    0    0 43w0d01h        2
202.249.2.83    4  2500 1655831 1614204        0    0    0 51w2d22h      688
202.249.2.86    4  7500 117623596 1614307        0    0    0 41w0d12h   676710
202.249.2.169   4  2497 124907919 1995328        0    0    0 24w0d01h   678562

Total number of neighbors 5

MRTデータはイメージ的には以下のようにピアリングしているルータのBGPテーブルをそのまま持ってきています。受け取る仮想ルータからはGoBGPd(192.168.255.2)より向こうにネクストホップルータがあるように見えているので、EBGPの前提である直接接続を満たしておらず、広報されたプレフィックスを受け取れていないと考えられます。

ですが、VyOSと同じようにLoopback0で広報されたプレフィックスのネクストホップと同じセグメントをLoopbackで直接接続インターフェースとして作れば、ネクストホップへの到達性確保というレベルではできているはずです。

ということは、debugの出力にも出ているとおりネクストホップがプレフィックスを受信したインターフェースと違うところにあるのでNGなのだろうと考え、以下の2つの設定を追加することにしました。
※直接接続ではない、数ホップ先のルータをネクストホップとできるようにするための設定です。

  • 直接接続チェックの無効化
  • EBGPマルチホップの有効化

実際の設定はそれぞれ以下のようになります。

■IOS

conf t
no interface Loopback0
router bgp 65000
 neighbor 192.168.255.2 ebgp-multihop 255
 neighbor 192.168.255.2 disable-connected-check
!
end

■IOS-XR

conf
no interface Loopback0
router bgp 65000
 neighbor 192.168.255.2
  ebgp-multihop 255
  ignore-connected-check
!
end

これで無事フルルートを受けることができるようになりました!(68万経路…!)

Router#show ip bgp summary
BGP router identifier 1.1.1.1, local AS number 65000
BGP table version is 683659, main routing table version 683659
683658 network entries using 169547184 bytes of memory
683658 path entries using 82038960 bytes of memory
122293/122293 BGP path/bestpath attribute entries using 31307008 bytes of memory
109362 BGP AS-PATH entries using 6221320 bytes of memory
462 BGP community entries using 33512 bytes of memory
0 BGP route-map cache entries using 0 bytes of memory
0 BGP filter-list cache entries using 0 bytes of memory
BGP using 289147984 total bytes of memory
BGP activity 683658/0 prefixes, 683658/0 paths, scan interval 60 secs

Neighbor        V           AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
192.168.255.2   4        65534  683677      22   683659    0    0 00:08:52   683658
RP/0/0/CPU0:ios#show bgp ipv4 unicast summary
Mon Feb 12 13:34:02.919 UTC
BGP router identifier 1.1.1.1, local AS number 65000
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0xe0000000   RD version: 683662
BGP main routing table version 683662
BGP NSR Initial initsync version 3 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs

BGP is operating in STANDALONE mode.


Process       RcvTblVer   bRIB/RIB   LabelVer  ImportVer  SendTblVer  StandbyVer
Speaker          683662     683662     683662     683662      683662           0

Some configured eBGP neighbors (under default or non-default vrfs)
do not have both inbound and outbound policies configured for IPv4 Unicast
address family. These neighbors will default to sending and/or
receiving no routes and are marked with '!' in the output below.
Use the 'show bgp neighbor <nbr_address>' command for details.

Neighbor        Spk    AS MsgRcvd MsgSent   TblVer  InQ OutQ  Up/Down  St/PfxRcd
192.168.255.2     0 65534  683672      15   683662    0    0 00:06:14     683658!

まとめ

先人の知恵をお借りすることで、自分の手元でもフルルート環境を用意することができました。しかし2.5GBとかメモリを食うのを見ると、上位機種がメモリをたくさん載せてるとかいう理由もわかる気がしますね…

2018/02/14追記:
ネクストホップについての補足を別記事で書きました。

GoBGPdでのフルルート注入をGNS3上でやってみた(補足)
なんてこった… 前の記事でネクストホップをそのまま受け取る方法で悩んでたけど、あらためて見てるとこんなの見つけてしまった… root@Ubuntu-1:~# gobgp mrt inject global --help Usage: gob...

コメント

タイトルとURLをコピーしました