/ Next Hop / Next Hop Group Object データ構造 • Next Hop Group の利点(モチベーション) • Next Hop Group on Linux • History (Multipath Route) • Linux Kernel Data Structures • iproute2 を用いた Multipath 設定方法 • netlink overview • netlink & nexthop (group) 具体例 • Appendix • struct & enum of netlink / rtnetlink Next Hop Group & Netlink on Linux | @ebiken | 2022/12/01 目次
(Netlink の平易な日本語解説BLOG): https://eniyo0.hatenablog.com/entry/2022/11/23/180135 • netlink で利用される Types や Enums の一覧 : https://wiki.slank.dev/book/types.html • Improving Route Scalability: Nexthops as Separate Objects • Linux Plumbers Conf 2019: David Ahern @Cumulus • [nexthop-objects-talk.pdf](https://lpc.events/event/4/contributions/434/attachments/251/436/nexthop-objects-talk.pdf) • https://www.youtube.com/watch?v=HIqvUiwDHGk • lwn.net [net: Improve route scalability via support for nexthop objects](https://lwn.net/Articles/763950/) • Blog: Multipath Routing in Linux - part 1 (Sat 24 June 2017) (歴史や Code Path も載っている) • https://codecave.cc/multipath-routing-in-linux-part-1.html • [RFC5549 Advertising IPv4 Network Layer Reachability Information with an IPv6 Next Hop](https://datatracker.ietf.org/doc/rfc5549/) • [RFC8950 Advertising IPv4 Network Layer Reachability Information (NLRI) with an IPv6 Next Hop](https://datatracker.ietf.org/doc/rfc8950/) • iproute2 man: ip nexthop: https://man.archlinux.org/man/core/iproute2/ip-nexthop.8.en • FRR: Docs: • Nexthop Groups: https://docs.frrouting.org/en/latest/nexthop_groups.html • Multiple nexthop static route: https://docs.frrouting.org/en/latest/static.html#multiple-nexthop-static-route • Resilient Next-Hop Groups in Linux went into Linux 5.13 • NetDevConf 0x15: Resilient Next-Hop Groups in Linux, NVIDIA, Ido Schimmel, Petr Machata • July 2021: https://netdevconf.info/0x15/session.html?Resilient-nexthop-groups • https://www.youtube.com/watch?v=PwWlZGhUgUU&list=PLrninrcyMo3L-hsJv23hFyDGRaeBY1EJO • https://docs.kernel.org/networking/nexthop-group-resilient.html Next Hop Group & Netlink on Linux | @ebiken | 2022/12/01 Reference: Linux Next Hop (Group)
この場合の prefix は Longest Prefix Match に利用されマスク(len)を含む • gw (address) により dev が決定する場合等、dev を指定しなくてもOS等により解 決される場合もあり • gw の MAC アドレスは別途解決され neightbor table に保存される(Linuxの場合) • 実装により様々な保持の仕方(データ構造)が存在する Next Hop Group & Netlink on Linux | @ebiken | 2022/12/01 Route Entry & Next Hop A B C D route prefix: D dev : ens0 gw : B ens0 route ens1
2022/12/01 Route Entry & Next Hop データ構造 route prefix dev gateway route prefix nexthop nexthop dev gateway ip route add <prefix> via <gw> [dev <device>] ip route add <prefix> nexthop via <gw> [dev <device>] route group nexthop nexthop dev gateway nexthop dev gateway nexthop dev gateway nexthop group nexthop[N] ① route entry に nexthop 情報 を内包(Linux 5.2 以前) ② route entry と nexthop object の分離(Linux 5.3 以降) ※ Linux 5.2 は nexthop サポートに向け たリファクタリングが含まれる。但し、 fib_info には fib_nh のみ含まれ nexthop はまだ含まれない Linux コマンド
追加・更新に必要な時間の短縮 • リソース(メモリ・SRAM/TCAM)の節約 • RFC5549, RFC8950 に対応(IPv4 routes with IPv6 nexthops) • Next Hop が無い場合、Route追加時に以下操作が毎回必要となる • gateway address + dev が正しいかの確認(Lookup) • トンネルインターフェースの場合、状態の確認 • Next Hop の比較・検索(既に存在するか?新規か?) • Next Hop Group の利点 • Next Hop Group が無い場合、Next Hop 追加・変更・削除時に、全ての route エントリの更新が必 要 • Linux / Switch ASIC では実装されていないが、将来実現可能性がある利点 • NHGをネストする事による backup nexthop の設定 ⇒ Fast Re-Routing Next Hop Group & Netlink on Linux | @ebiken | 2022/12/01 Next Hop Group の利点(モチベーション)
• ECMP (Equal Cost Multi Path) ... コストが同じ場合 • Linux v5.2 => IPv6 (ip6_info) を中心にリファクタリング • nexthop object サポートのための準備 • IPv4 routes with IPv6 nexthops • (BGP unnumberd に利用可能な機能: RFC5549/RFCC8950) • Linux v5.3 => nexthop object のサポート • Linux v5.15 => Resilient Next-Hop Groups のサポート Next Hop Group & Netlink on Linux | @ebiken | 2022/12/01 History (Multipath Route)
nexthop をサポートしているか確認 • 確認方法 ⇒ $ ip ne [tab] で nexthop が候補として表示される • 2018年9月の以下パッチでサポートされた • [iproute2-next] ip: Add support for nexthop objects • https://patchwork.ozlabs.org/project/netdev/patch/[email protected]/ Next Hop Group & Netlink on Linux | @ebiken | 2022/12/01 iproute2 を用いた Multipath 設定方法 $ ip -V ip utility, iproute2-ss200127 $ ip ne [tab] neigh netconf netns nexthop
2022/12/01 iproute2 を用いた Multipath 設定方法 > nexthop を設定 $ ip nexthop add id 1 via 172.20.105.172 dev eno1 $ ip nexthop add id 2 via 172.20.105.173 dev eno1 > <nh1>/<nh2>/... のように設定済みの nexthop id > を用いて nexthop group を設定 $ ip nexthop add id 3 group 1/2 > group id を nhid <id> に指定し route を追加 $ ip route add 10.99.99.99/32 nhid 3 $ ip route 10.99.99.99 nhid 3 nexthop via 172.20.105.172 dev eno1 weight 1 nexthop via 172.20.105.173 dev eno1 weight 1 > nexthop が設定されている事を確認 $ ip nexthop list id 1 via 172.20.105.172 dev eno1 scope link id 2 via 172.20.105.173 dev eno1 scope link id 3 group 1/2 > nexthop via <gw> dev <dev> を繰り返す $ ip route add 10.11.11.11/32 ¥ nexthop via 172.20.105.174 dev eno1 ¥ nexthop via 172.20.105.175 dev eno1 $ ip route default via 172.20.104.1 dev eno1 proto static 10.11.11.11 nexthop via 172.20.105.174 dev eno1 weight 1 nexthop via 172.20.105.175 dev eno1 weight 1 > nexthop が設定されない事を確認 $ ip nexthop list (何も表示されない) 従来の方法(Next Hop Object 無し) Next Hop Object を利用した方法
2022/12/01 netlink/rtnetlink の具体例 (ip route を設定) 以下4パターン の netlink message を比較 (従来 | Next Hop Object 利用)×(Next Hop 1つ | Multipath) ① nexthop 利用無し(従来) ip route add 10.11.11.99/32 via 172.20.104.1 dev eno1 ② nexthop 利用無し Multipath(従来) ip route add 10.11.11.11/32 ¥ nexthop via 172.20.105.174 dev eno1 ¥ nexthop via 172.20.105.175 dev eno1 ③ nexthop を利用 ip nexthop add id 11 via 172.20.105.173 dev eno1 ip route add 10.11.12.13/32 nhid 11 ④ nexthop group を利用 Multipath ip nexthop add id 1 via 172.20.105.172 dev eno1 ip nexthop add id 2 via 172.20.105.173 dev eno1 ip nexthop add id 3 group 1/2 ip route add 10.11.12.13/32 nhid 3
2022/12/01 strace を用いた netlink message の確認 strace ビルド&インストール方法 (yum / apt コマンドによるアップデートができない場合) download strace-6.0.tar.xz from https://github.com/strace/strace/releases/tag/v6.0 $ tar xf strace-6.0.tar.xz $ cd strace-6.0 $ ./configure --disable-mpers $ make $ sudo make install $ which strace /usr/local/bin/strace $ strace --version strace -- version 6.0 Copyright (c) 1991-2022 The strace developers <https://strace.io>. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Optional features enabled: stack-trace=libunwind no-m32-mpers no-mx32-mpers • コマンドと Kernel 間でやり取りされる netlink message をモニタ可能なツール • Next Hop Object に関するメッセージである RTM_NEWNEXTHOP は strace v5.15 (2021-10-14) から対応