BGP Route Injection Tool(1)

はじめに

もともとお仕事的な要求で新人向けに BGP のトレーニングやろうという話があったのですが、自分がもうさっぱり覚えていないという問題がありました。思い出すために環境作ろうかというのでいろいろやったのですが、自宅のネットワークが使いにくいとか諸々あってかなり脇道にそれたりしました……というのでぐちゃぐちゃやった内容をある程度まとめたのが L3スイッチとVRFでつくる自宅ラボ・ネットワーク というあたりのエントリだったりします。


結局、トレーニング自体は他の人が過去資料を元にやったのだけど、せっかくやるなら経路情報たくさん入れてみたりしたいよねーというのがあってちょっと調べたりしていました。タイミング合わず使うことはなかったのだけど、調べたのはもったいないので簡単にまとめておきます。

Route Injection

方法として大きく二つ

  1. 自分で経路情報を定義して注入する
  2. 実際にインターネットで交換されているデータをもらってきて注入する

に絞ります。最初は「自分で経路情報を定義して注入する」から。

ここでは

  • announcer
  • exabgp

というツールを使って経路情報の定義と注入を行います。

    • ログとかの日付がばらばらですが、日を開けて合間合間でやってためたログをつなぎ合わせているからです。日付はあまり気にしないでください。
    • こんな感じの環境で試しています。……IPの振り方とか微妙なところがあるのは前に作った環境を流用しているからなので、そこもあまり気にしない方向で。


announcer

準備

ダウンロード :

python ベースのツールです。展開すると announcer.conf.sample が入っているので、それを元に設定を入れます。追加のパッケージ等は特になかったような記憶。展開して実行するだけ。

コンフィグ作成 :

最小限のコンフィグだと多分こんな感じ。細かい使い方はサンプルコンフィグや README を参照。

[main]
# The peerings keyword specifies a list of BGP peerings
# Each peering specified must have a section in the configuration file
peerings = simplepeering

# The [DEFAULT] section specifies defaults for peerings.
# If a peering does not specify a parameter, announcer looks for it here.
# Note that the name of this section MUST be uppercase!
[DEFAULT]
bgp_id = 172.16.12.16
local_as = 64605
remote_as = 64602
prefixes = 10.5.0.0/16 172.16.12.0/24
aspath = 64605

[simplepeering]
peer = 172.16.12.1
prefixes = 10.5.0.0/16 172.16.12.0/24
実行

announcer.conf がデフォルトで読まれるのでそのまま実行する。(コンフィグファイル明示する際は引数に指定して実行)

$ ./announce.py announce.conf

実行すると announcer.log にログが出力される。

$ tail -f announce.log
(略)
[2012/03/04 14:43:57 JST] Starting announcer
[2012/03/04 14:43:57 JST] Peerings configured: simplepeering
[2012/03/04 14:43:57 JST] Adding new peering simplepeering
[2012/03/04 14:43:57 JST] simplepeering: Starting up peering 10.6.0.1 AS64606 -> 172.16.13.1 AS64603
[2012/03/04 14:43:57 JST] simplepeering: Sending update for 10.6.0.0/16 with AS path 64606

すごく単純な経路情報しか定義していないのですが、サンプルコンフィグとか見るとわかるとおり、複数の経路定義, AS-PATH, Community の設定など結構いろいろやれます。いまのところ個々のツールの機能詳細はまだ追いかけられていません。動かしてみて使いやすそうなのを探しているだけ…。

exabgp

準備

ダウンロード:

インストール :
python ベースのツールです。setup.py というセットアップスクリプトがあるのでそれを実行します。

~/exabgp/exabgp-2.0.6$ python setup.py build
~/exabgp/exabgp-2.0.6$ sudo python setup.py install
(略)
running install_scripts
copying build/scripts-2.7/exabgp -> /usr/local/bin
changing mode of /usr/local/bin/exabgp to 755
running install_data
creating /usr/local/etc/exabgp
copying etc/exabgp/processes/tcp-server -> /usr/local/etc/exabgp
copying etc/exabgp/processes/watchdog-1.sh -> /usr/local/etc/exabgp
copying etc/exabgp/processes/syslog-1.py -> /usr/local/etc/exabgp
copying etc/exabgp/processes/dynamic-1.sh -> /usr/local/etc/exabgp
running install_egg_info
Writing /usr/local/lib/python2.7/dist-packages/exabgp-2.0.6.egg-info
~/exabgp/exabgp-2.0.6$

コンフィグ作成 :

コンフィグは Junos Like になっている。例を元に最小限のコンフィグを作るとこんな感じだろう。

neighbor 172.16.13.1 {
        description "exprtr3/AS646603";
        router-id 172.16.13.16;
        local-address 172.16.13.16;
        local-as 64606;
        peer-as 64603;
        graceful-restart;

        static {
                route 172.16.13.0/24 next-hop 172.16.13.16;
                route 10.6.0.0/16 next-hop 172.16.13.16;
        }
}
実行
~/exabgp$ exabgp exabgp.conf

Sun, 11 Mar 2012 01:55:34 INFO     10456  configuration Performing reload of exabgp 2.0.6
Sun, 11 Mar 2012 01:55:34 INFO     10456  supervisor    New Peer 172.16.13.1
Sun, 11 Mar 2012 01:55:34 INFO     10456  configuration Loaded new configuration successfully

デバッグなどは環境変数定義で行うようになっているので exabgp のヘルプを参照。これもまだ細かい機能とか使い方は見ていないけど、announcer よりはこちらの方が使い勝手がよさそう。

コンフィグの文法とか細かいドキュメントがないような気がするけど、BNF 定義 読めってことですか、もしかして…。