[Network] BGP4+設定を見つめ直す

先の記事でも書いたことなのですが

JANOG41に出席したことのまとめ記事にも書いたように、結構私ネットワーク方面の無知っぷりを痛感するケースが幾つかあり、特に動的ルーティングに関する知識は本当にないんだなぁ・・・と、ある意味独学の限界(私の技術力の限界とも言う)みたいなものを感じております。

特に響いたのは以下2点、それを受けて色々考えさせられました。

  • 経路は極力まとめて広告するものだよ(Aggregateすべきだと言ってました)
    • 私個人的には、経路は細かく広告するのが良いと考えていました。
    • 冷静に考えてみると、確かに経路が多いことはリソースの無駄な消費につながる上、経路変更が頻発した場合その影響がAS間となると、全世界のルーターに影響が及びますもんね・・・
    • IPv4はクラスレスの概念が入って細かい経路がガンガン作られたことも有り、かなりの経路数があるけど、そう言えばIPv6はちゃんと経路がAggregateされていて、5万経路ぐらいで全体を回れるようになってるなぁ・・・とかおもったなど。
  • ルーティングループはゼッタイ起こしちゃダメだよ
    • 確かにループさせるとその経路間パケットはTTLが尽きるまでぐるぐる回ってしまうので、下手すると帯域輻輳につながるんだなあ・・・
    • でも、未定義のセグメントに対して通信来た場合どのようにガードするんだろう?

で、ウチの場合だと間違いなく危ないのがIHANetの経路で、非トランジットなのが幸いして影響範囲は狭いのですが、細かい経路広告を行ってしまっていて、あー、これはピアつなぐ人によってはうんざりされてしまうかもしれないなぁと思い、設定修正を考えることにしました。

あるべき姿に持っていくには

その際、どうやったらAggregateされた経路を広告し、ルーティングループを回避させることが出来るのかなぁ?とかおもったりしたのですが、調べた所、「割り当てられたセグメント全体に対してstaticでブラックホールルートを組めば良い」と言うところがわかりました。

ルーティングループは上図上側にあるような構成で発生します。サブネット分割可能なネットワークを割り当てられた状態で、このような構成だとaggregateしたルートへR1はパケットを配送するんですが、「2001:xxx:yyy:ddd::/64」は未割り当てで経路が存在しないため、R2側でdefaultルートに乗せられ、結果としてパケットはTTLがExpireするまでR1とR2の間をぐるぐる回ります。

で、やるのがR2側に赤文字の経路をStaticルートとして構成することで、

  • 別途OSPF/RIP等のダイナミックルーティングやStaticルートでよりサブネットのPrefix長の大きなルーティング設定が優先して適用され、割り当て済みセグメントに対しては通信が行われる
  • 割り当てられていないサブネットは赤文字のルーティング情報によって、Nullインタフェースに葬り去られる(これがブラックホールルート)

ということができ、結果として

  • 経路をAggregateして広告できる(広告経路の単純化)
  • ルーティングループの抑制

が可能になるということで。特に私自身、ルーティングテーブルの特性が「ロンゲストマッチが優先される」事をころっと忘れていて、本当にお恥ずかしい限りです・・・コレ自体は大学時代から習っていたはずなのに(苦笑)

設定方針

ちょっとざっくり我が家のIPv6ネットワークの一部を表現してみたのですが、ブラックホールルートを下図のとおり配置してみることにしました。

ブラックホールの実装先は最終的に上図3箇所に定義することにしました。

  • ルーティングループをさせたくない区間の端っこ(RB2011, C1812Jが該当)
  • ルーティングプロトコルが異なり、経路再配送に関連しそうな箇所(RTX-3000が該当)

特にRTX-3000は経路再配送の設定が難しく、何を再配送して何を再配送しないのかの設定が難しいため、ここにstaticでブラックホールルートを組み込み、他プロトコル経路の呼び込みをさせて見る構成にしました。

ブラックホール経路はstaticで組まれるため、Administrative Distance値が低く、他のルーターへ経路伝搬する際に一旦ざっくり経路を呼び込むのにも役立つんですよね。RTX-3000ではそうした使い方を兼ねています。

当初、RTX-3000側で受領しているHomenoc割当Prefixの経路がC1812JのRIPngに伝搬しない問題が置きてたのですが、Homenoc割当のPrefix経路をブラックホールルートとしてStatic構成することでRIPng経路に広告できるようになりました。

C1812Jの設定変更

以下の通り従来設定していました。関連箇所のみ記載します。

router bgp 64664
 network 2001:***:****:100::/64
 network 2001:***:****:230::/64
 network 2001:***:****:239::/64
 network 2403:****:****:100::/64
 network 2403:****:****:105::/64
 network 2403:****:****:220::/64
 network 2403:****:****:FFFF::/64
 exit-address-family

ipv6 prefix-list FILTER_IPv6_OUT seq 10 permit 2403:****:****:100::/64
ipv6 prefix-list FILTER_IPv6_OUT seq 20 permit 2403:****:****:105::/64
ipv6 prefix-list FILTER_IPv6_OUT seq 30 permit 2403:****:****:FFFF::/64
ipv6 prefix-list FILTER_IPv6_OUT seq 40 permit 2403:****:****:220::/64
ipv6 prefix-list FILTER_IPv6_OUT seq 50 permit 2001:***:****:230::/64
ipv6 prefix-list FILTER_IPv6_OUT seq 60 permit 2001:***:****:239::/64
ipv6 prefix-list FILTER_IPv6_OUT seq 70 permit 2001:***:****:100::/64
ipv6 prefix-list FILTER_IPv6_OUT seq 100 deny ::/0

設定修正後の内容は以下の通りとなります。

router bgp 64664
 network 2001:***:****::/48
 network 2403:****:****::/48
 exit-address-family

ipv6 prefix-list FILTER_IPv6_OUT seq 10 permit 2403:****:****::/48
ipv6 prefix-list FILTER_IPv6_OUT seq 20 permit 2001:***:****::/48
ipv6 prefix-list FILTER_IPv6_OUT seq 100 deny ::/0

そして、ブラックホールルートの追加を行います。

ipv6 route 2001:***:****::/48 Null0

RTX-3000の設定変更

RTX-3000側では単純にブラックホールルートの追加だけ行います。

ipv6 route 2001:***:****::/48 gateway null
ipv6 route 2403:****:****::/48 gateway null

RB2011-UiASの設定変更

Routerboardの特性上、ルートタイプを指定してブラックホールにするんですが、CiscoやYAMAHAみたいにNullインタフェースに送る設定がありません。この場合、不到達を応答する「unreachable」を指定します。実際にはGUIで設定したのですが、CLIで設定した後のStaticルートを表示していますので、ご参考までに。

[admin@MikroTik] /ipv6 route> print detail where static
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, o - ospf, b - bgp, U - unreachable
 0 A SU dst-address=2403:****:****::/48 type=unreachable distance=1

これで、一通りの設定は完了です。

動作確認(IHANetの経路広告状況)

C1812Jから、BGP4+での経路広告状況を確認しました。

#show bgp ipv6 unicast neighbors <bgp neighbor address> advertised-routes
BGP table version is 92, local router ID is 192.168.100.10
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
 r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

Network Next Hop Metric LocPrf Weight Path
*> 2001:***:****::/48 :: 0 32768 i
*> 2403:****:****::/48 :: 2 32768 i

Total number of prefixes 2

2経路広告されていることがわかります。(以前は7経路ほど広告してた)

ちなみにHomenoc側に関しては、実は経路広告をしていません。当初IPv6接続時に意図したとおりに経路広告ができなかったため、こちらからの経路広告そのものを止めたためです。その為Homenoc側のルーターであるRB2011-UiAS側は広告状況を確認してもゼロとなります。

[admin@MikroTik] /routing bgp peer> print status
Flags: X - disabled, E - established
 0 E name="Homenoc-IPv6" instance=default remote-address=2403:****:****:a203::1
 remote-as=59105 
     :
 uptime=1w3d20h26m4s prefix-count=47547
 updates-sent=2 updates-received=1548711 withdrawn-sent=0 withdrawn-received=93116
     :
 state=established

RouterboardでのBGP伝送経路数は「routing bgp peer」へ進んだ後にprint statusコマンドで確認ができます。対象は「withdrawn-sent」の値で、0となっていることから、広告経路がゼロであることがわかります。

動作確認(C1812J側のルーティング情報:関連情報のみ記載)

IPv6 Routing Table - 23 entries
Codes: C - Connected, L - Local, S - Static, R - RIP, B - BGP
 U - Per-user Static route, M - MIPv6
 I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea, IS - ISIS summary
 O - OSPF intra, OI - OSPF inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
 ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2
 D - EIGRP, EX - EIGRP external
S 2001:***:****::/48 [1/0]
 via ::, Null0
C 2001:***:****:100::/64 [0/0]
 via ::, Vlan10
R 2001:***:****:230::/64 [120/3]
 via FE80::2A0:DEFF:FE3A:43AC, Vlan10
R 2001:***:****:239::/64 [120/3]
 via FE80::2A0:DEFF:FE3A:43AC, Vlan10
R 2403:****:****::/48 [120/2]
 via FE80::2A0:DEFF:FE3A:43AC, Vlan10

動作確認(RTX-3000側のルーティング情報:関連情報のみ記載)

RTX-3000側のルーティング情報を確認します。内部セグメントの経路は正常に広告されているようです。以下には記載を省略しましたが、IHANet側の経路も正しくRIPngで広告されていました。

Destination Gateway Interface Type
default fe80::250:56ff:fea7:2e14 LAN1/1 OSPFv3 E2 c=20 m=20
2001:***:****::/48 - NULL static
2001:***:****:100::/64 - LAN1/1 implicit
2001:***:****:230::/64 fe80::2a0:deff:fe35:e2c TUNNEL[1] RIPng
2001:***:****:239::/64 fe80::2a0:deff:fe35:e2c TUNNEL[1] RIPng
2403:****:****::/48 - NULL static
2403:****:****:100::/64 - LAN1/1 implicit
2403:****:****:105::/64 fe80::250:56ff:fea7:2e14 LAN1/1 OSPFv3 E2 c=20 m=20
2403:****:****:220::/64 fe80::250:56ff:fea7:2e14 LAN1/1 OSPFv3 E2 c=20 m=20
2403:****:****:ffff::/64 fe80::250:56ff:fea7:2e14 LAN1/1 OSPFv3 c=2

動作確認(SEIL/x86のルーティング情報:関連情報のみ記載)

default 2403:****:****:ffff::fffe lan1 S* 1
2001:***:****::/48 fe80::2a0:deff:fe3a:43ac lan0 O* 110
2403:****:****::/48 fe80::2a0:deff:fe3a:43ac lan0 O* 110

割当セグメントの経路がちゃんとOSPFv3で呼び込みできていました。

己の無知を知ることは大事、改善をすることはもっと大事

JANOG41では、それこそNOC勤めな方が多くいらっしゃることもあるからか、息をするが如く常識としてこのあたりをご存じの方も多いのかなとおもったのですが、言い訳がましくはありますが、畑違いの人間から見るとやっぱり全てが新たな知識であって、同時に己がいかにこの分野において無知であるのかなと言うところを痛感させられました。

ただ、以前は全く読んで理解できなかったJANOG CommentHomenocのセキュリティ説明ブログ記事の内容などが少しだけ読めるようになり、あー、やっぱり勉強って生涯やるもんなんだなーとおもったりしています。

それにしても面白いなーと感じるのは

  • 仕事は休んだが、じっとしてられないことから、仕事と直接関係しないネットワーク分野に手を出した
    • 今まで全く知らなかったBGP+を知りたくてIHANetに接続した
    • 休職に伴い収入が減ったことから、費用負担を抑えること、新しい勉強ネタを求めてHomenocに接続した。
      • もちろんコレに依存する訳にはいかないから、別途Interlinkを1IPで引っ張った
        • 疑似マルチホーミングの仕組みを作り、外部回線に対する可用性向上を図った
      • この時、IHANet接続で得た知識がとても役に立った
  • 別途勉強ネタを探しにOSC福岡へ参加した所、Lagopus Switchの存在を知った
    • Lagopus Switchの存在つながりでSDNコントローラのRyuの存在を知った
      • Lagopus SwitchやRyu、DPDKを実際に触ってみた
        • Ryuを使って作られたスイッチの仕組みを理解するために、Pythonに触れてみることにした
          • Pythonに触れることで、NetmikoやNAPALMの存在を知り、ネットワーク機器の制御が今Pythonで盛り上がってることを知った

こんな風にして、こないだJANOG41に繋がっていってることです。JANOG自体はどんなものなのか明確には分かっておらず、「ネットワークエンジニアの祭典」ぐらいにしか思ってなかったわけですが、そこに向かうお膳立てがまさかねぇ。休職中の勉強からJANOGまで、全てが点と線でつながっていたわけです。

そして、JANOG41を通じて新しい技術や、アプリケーション、自分の弱点を知り、それを自宅環境にフィードバックしているのを通じて知識の定着を図っていて、どっかのスーパーエンジニアさんとかからは「そんなアタリマエのことを何アップしてんのよ」と言われるかもしれませんが、私にとってはすべてが新鮮で面白いし楽しいです。今回も良い学びがあったなーと感じる次第です。

あとはまぁ、コレ自体は備忘録が第一なので、内容が低レベルであってもどうかご容赦を。私、物忘れが多くてですなぁ・・・・たっはっは。