Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

GoBGP活用によるSD-WANプラクティス

3,435 views

Published on

Trema Day #9 発表スライド「GoBGP活用によるSD-WANプラクティス」

Published in: Technology
  • Be the first to comment

GoBGP活用によるSD-WANプラクティス

  1. 1. GoBGP活用による SD-WANプラクティス 1 2016.7.2 @ttsubo
  2. 2. 2 自己紹介 ⚫ SDN/NFV技術に興味を持ったNWエンジニア ⚫ Ryu SDN Frameworkのコントリビュータをやってました ⚫ 最近は、GoBGPのコントリビュータをやってます @ttsubo
  3. 3. × 発表サブテーマ SD-WAN 3 Raspberry Pi =
  4. 4. GoBGPとは ... https://github.com/osrg/gobgp ● GolangによるオープンソースなBGP実装コード
 - マルチコアCPUでの動作に優位
 - インストールが、とても簡単 ● 最先端なBGP機能が提供 ● BGPエキスパートによる検証事例が豊富 ● gRPCベースの豊富なAPIが公開 � - 利用者独自の拡張が可能 4 gRPC
  5. 5. ところで、SDNネタの発表会などの場で、 pingの動態デモを成功させることが、 SDNエンジニアの醍醐味ですよね。 5 GoBGP基本構成だと ... GoBGP基本構成の場合 FIBが存在しないため... gobgpd 基本構成 RIB gobgpd 基本構成 RIB 不達!! FIB FIB BGP伝搬
  6. 6. pingによるデモが行えない!! 6
  7. 7. GoBGPにD-Planeを ... RIB <-> FIB連携させる手法は、何点か存在します。 7 ● 解決策1「zapiを経由して、FIBに注入する」 ● 解決策2「netlinkで、FIBに注入する」 ● 解決策3「OpenFlowで、FIBに注入する」 BGP伝搬gobgpd Linux Networking Subsystem FIB 基本構成 RIB RIB <-> FIB連携させるには?
  8. 8. 8 ● 解決策1「zapiを経由して、FIBに注入する」 GoBGPにD-Planeを ... zebra Linux Networking Subsystem Linux User Space Linux Kernel Space zapi netlink gobgpd FIB GoBGPのオプション機能”FIB manipulation”により、 gobgpdとzebra間のzapiをgolangから制御できる仕組み が活用できます。 RIB
  9. 9. 9 ちなみに、Quaggaの場合だと ... zebra Linux Networking Subsystem Linux User Space Linux Kernel Space zapi netlink bgpd ospfd ripd RIB <-> FIB連携は、zapi方式が採用されています
  10. 10. 10 Qiita記事 「GoBGPのオプション機能"FIB manipulation” を活用して、BGPルータ動作を試してみる」 を参考にしてください。 http://qiita.com/ttsubo/items/1bdced59f5c99bb548fa
  11. 11. GoBGPにD-Planeを ... 11 ● 解決策2「netlinkで、FIBに注入する」 Linux Networking Subsystem Linux User Space Linux Kernel Space netlink gobgpd FIB RIB gobgpdが、netlink経由で、FIBにBGP経路を注入してしまう 方法です。ただし、現時点では、gobgpdが直接、FIBに注入 するやり方を許容しておりません。 許容されていない
  12. 12. 12 https://github.com/osrg/goplane なお、goplane経由で、FIB注入が可能です GoBGP開発チームでは、RIB <-> FIB連携を担う仕組みとして、 goplaneを提供しています。ただし、goplaneリポジトリは、実験 的要素が高いので、実装形態も急速に変化するかもしれません。 Linux Networking Subsystem Linux User Space Linux Kernel Space netlink gobgpd FIB RIB goplane gRPC
  13. 13. GoBGPにD-Planeを ... 13 ● 解決策3「OpenFlowで、FIBに注入する」 実は、まだ実装がありません。 (‾Д‾;) ガーン Open vSwitch�等 OpenFlow gobgpd FlowTable (FIB) RIB gRPC OpenFlowコントローラ or gRPCベースの豊富なAPIをうまく活用すれば、業界初の GoBGP/OpenFlowコントローラも実現可能ですね。
  14. 14. 14 ● Golangで動作するOpenFlowコントローラが オープンソースで提供されると素敵だと思います ● 今のところ、該当しそうなものが見当たらないん ですよね オープンソースなGolang版 OpenFlowコントローラって、 ニーズあるのかな?
  15. 15. 15 ここから、SD-WANの話です ...
  16. 16. 本当なら、ネットワーク機器向けOS「Cumulus Linux」 とかを準備したいところだが、個人活動だと資金面と かの敷居が高いです ... orz 16 SD-WAN機器 ... お手軽に自宅で 動作させることが できる機材として ... 財布にやさしく、ファンレスで、省スペース、 省電力なRaspberry Piでチャレンジします!!
  17. 17. ... というわけで、SD-WAN機器を揃えてみました 17
  18. 18. (1) GoBGP on Raspberry Pi Raspberry Pi2 × 2 - Ubuntu Server - USB LAN Adapter(10/100M) 18 Raspberry Pi3 × 1 ファンレスで、省スペース、省電力なところがGood !!
  19. 19. (2) JUNOS on SRX100 root@SRX-2> show security flow status Flow forwarding mode: Inet forwarding mode: packet based Inet6 forwarding mode: packet based MPLS forwarding mode: packet based ISO forwarding mode: drop Flow trace status Flow tracing status: off Flow session distribution Distribution mode: RR-based packet based modeで動作 SD-WAN構成に、JUNOSルータも配備してみた 19
  20. 20. (3) Quagga on OpenWRT BusyBox v1.19.4 (2014-03-30 18:50:39 JST) built-in shell (ash) Enter 'help' for a list of built-in commands. _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ----------------------------------------------------- BARRIER BREAKER (Bleeding Edge, r40300) ----------------------------------------------------- * 1/2 oz Galliano Pour all ingredients into * 4 oz cold Coffee an irish coffee mug filled * 1 1/2 oz Dark Rum with crushed ice. Stir. * 2 tsp. Creme de Cacao ----------------------------------------------------- root@Quagga-2:~# root@Quagga-2:~# vtysh Hello, this is Quagga (version 0.99.22.3). Copyright 1996-2005 Kunihiro Ishiguro, et al. さらに、オープンソースBGPルータも配備してみた 20
  21. 21. 21 SD-WAN Orchestratorを作ってみました。 SD-WAN構成のBGPルータを一元管理できると いいですよね。さらに、SD-WANで故障が発生した 場合、検出できる仕組みがあるといいですよね。 SD-WANプラクティス ... そこで ... Quagga-1 SRX-1 SRX-2 Quagga-2GoBGP-1 GoBGP-2 GoBGP-3 すなわち、トータルなBGP監視制御がしたい !!
  22. 22. 22 Quagga-1 SRX-1 SRX-2 Quagga-2 vrrp GoBGP-1 GoBGP-2 GoBGP-3 SD-WAN Orchestrator 一元管理 GoBGPの設定情報を、バラバラで管理すると作業効率が 悪いので、SD-WAN Orchestratorで一元管理したい (チャレンジ1) SD-WANコンフィグ構成の一元管理
  23. 23. 23 gobgp-config-worker GoBGP-1 GoBGP-2 GoBGP-3 etcd Gohan (server mode) sqlite3 Gohan (client) gobgp (cli) gRPC SD-WAN Orchestrator REST(POST)
  24. 24. 24 Quagga-1 SRX-1 SRX-2 Quagga-2 vrrp GoBGP-1 GoBGP-2 GoBGP-3 状態通知 BGP Peer断が発生した場合に、発生箇所を即座に把握 できるように、SD-WAN Orchestratorで一元監視したい Peer断 (チャレンジ2)�SD-WAN BGP Peer断の即時検知 SD-WAN Orchestrator
  25. 25. etcd Gohan (server mode) sqlite3 Gohan (client) SD-WAN Orchestrator REST(GET) 25 GoBGP-1 GoBGP-2 GoBGP-3 Peer断 gobgp-monitoring-worker gobgp (cli) 検出 gRPC 検出
  26. 26. https://youtu.be/S38mZxHtRZo https://github.com/ttsubo/ sdwan_orchestrator_with_gobgp/blob/master/ TremaDay/Scenario_of_Sdwan_Demo.md ■ github ■ YouTube 26 今回のSD-WANプラクティスでのチャレンジテーマが 期待通りに動作している様子を、以下のサイトから、 ご覧いただけます 動態デモコンテンツ公開中 ...
  27. 27. 27 GoBGPには、最先端なBGP機能が盛り込まれていて、 日進月歩、進化しております。さらに、Slackなどを通じて、 Community活動が共有されております。 GoBGPは、本当、お手軽にはじめることができますので、 いっしょに、GoBGPの活動に、貢献してみませんか? 最後に ... Join Us ♪
  28. 28. 28 以下、 解決策1「zapiを経由して、FIBに注入する」 の補足スライド
  29. 29. 29 golangのSampleCodeからzapi経由で、Linux Kernel 上のFIBにBGP経路を注入する様子を確認してみます。 zebra Linux Networking Subsystem zapi netlink Sample Code Linux User Space Linux Kernel Space FIB RIB ● 解決策1「zapiを経由して、FIBに注入する」 GoBGPにD-Planeを ...
  30. 30. 30 $ cat sample_zclient.go package main import ( log "github.com/Sirupsen/logrus" "github.com/osrg/gobgp/zebra" "net" "os" "strconv" "strings" "time" ) func zclient(ipaddress, nexthop, metric string) { var prefix net.IP nexthops := []net.IP{} l := strings.SplitN(ipaddress, "/", 2) prefix = net.ParseIP(l[0]).To4() nexthops = []net.IP{net.ParseIP(nexthop).To4()} plen, _ := strconv.Atoi(l[1]) metric_int, _ := strconv.Atoi(metric) cli, err := zebra.NewClient("unix", "/var/run/quagga/zserv.api", zebra.ROUTE_BGP) if err != nil { log.Errorf("Failed: %s", err) } cli.SendHello() time.Sleep(1000 * time.Millisecond) b := &zebra.IPRouteBody{ Type: zebra.ROUTE_BGP, SAFI: zebra.SAFI_UNICAST, Message: zebra.MESSAGE_NEXTHOP | zebra.MESSAGE_DISTANCE | zebra.MESSAGE_METRIC, Prefix: prefix, PrefixLength: uint8(plen), Nexthops: nexthops, Metric: uint32(metric_int), Api: zebra.IPV4_ROUTE_ADD, } if e := cli.SendCommand(zebra.IPV4_ROUTE_ADD, b); e != nil { log.Errorf("Failed: %s", err) } time.Sleep(10000 * time.Millisecond) cli.Close() } func main() { log.SetLevel(log.DebugLevel) log.SetOutput(os.Stdout) ipaddress := os.Args[1] nexthop := os.Args[2] metric := os.Args[3] zclient(ipaddress, nexthop, metric) } zapi経由でzebraにBGP経路を登録するSample Code ←zapiライブラリ
  31. 31. $ telnet localhost zebra Connected to localhost. Escape character is '^]'. Hello, this is Quagga (version 0.99.22.4). Copyright 1996-2005 Kunihiro Ishiguro, et al. User Access Verification Password: Router> show ip route bgp Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, I - IS-IS, B - BGP, A - Babel, > - selected route, * - FIB route B>* 192.168.100.0/24 [20/200] via 192.168.0.1, eth1, 00:00:01 31 $ sudo ./sample_zclient 192.168.100.0/24 192.168.0.1 200 DEBU[0000] send command to zebra Body=&{RedistDefault:ROUTE_BGP} Header={Len:6 Marker: 255 Version:2 Command:HELLO} Topic=Zebra DEBU[0001] send command to zebra Body=type: ROUTE_BGP, flags: , message: 13, prefix: 192.168.100.0, length: 24, nexthop: 192.168.0.1, distance: 0, metric: 200 Header={Len:6 Marker:255 Version: 2 Command:IPV4_ROUTE_ADD} Topic=Zebra zapiサンプルコードから、BGP経路をzebraに登録して ... route情報を確認してみると ... BGP経路が登録されました。 $ route -n | grep 192.168.100.0 192.168.100.0 192.168.0.1 255.255.255.0 UG 200 0 0 eth1 さらに、FIB情報を確認してみると ... netlinkでLinuxのFIBに登録されました。
  32. 32. 32 // API Types. type API_TYPE uint16 const ( _ API_TYPE = iota INTERFACE_ADD INTERFACE_DELETE INTERFACE_ADDRESS_ADD INTERFACE_ADDRESS_DELETE INTERFACE_UP INTERFACE_DOWN IPV4_ROUTE_ADD IPV4_ROUTE_DELETE IPV6_ROUTE_ADD IPV6_ROUTE_DELETE https://github.com/osrg/gobgp/blob/master/zebra/zapi.go#L69-L98 REDISTRIBUTE_ADD REDISTRIBUTE_DELETE REDISTRIBUTE_DEFAULT_ADD REDISTRIBUTE_DEFAULT_DELETE IPV4_NEXTHOP_LOOKUP IPV6_NEXTHOP_LOOKUP IPV4_IMPORT_LOOKUP IPV6_IMPORT_LOOKUP INTERFACE_RENAME ROUTER_ID_ADD ROUTER_ID_DELETE ROUTER_ID_UPDATE HELLO MESSAGE_MAX ) なお、zapiは、ipv4, ipv6しか対応していないようです (MPLSラベルとか、FIBに注入することはできません。)

×