32
GoBGP活用による SD-WANプラクティス 1 2016.7.2 @ttsubo

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

Embed Size (px)

Citation preview

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

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

1

2016.7.2 @ttsubo

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

2

自己紹介

⚫ SDN/NFV技術に興味を持ったNWエンジニア ⚫ Ryu SDN Frameworkのコントリビュータをやってました ⚫ 最近は、GoBGPのコントリビュータをやってます

@ttsubo

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

×

発表サブテーマ

SD-WAN

3

Raspberry Pi

=

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

GoBGPとは ...

https://github.com/osrg/gobgp

● GolangによるオープンソースなBGP実装コード - マルチコアCPUでの動作に優位 - インストールが、とても簡単

● 最先端なBGP機能が提供 ● BGPエキスパートによる検証事例が豊富 ● gRPCベースの豊富なAPIが公開 � - 利用者独自の拡張が可能

4

gRPC

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

ところで、SDNネタの発表会などの場で、 pingの動態デモを成功させることが、 SDNエンジニアの醍醐味ですよね。

5

GoBGP基本構成だと ...

GoBGP基本構成の場合 FIBが存在しないため...

gobgpd基本構成

RIB gobgpd基本構成

RIB

不達!!FIB FIB

BGP伝搬

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

pingによるデモが行えない!!

6

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

GoBGPにD-Planeを ...

RIB <-> FIB連携させる手法は、何点か存在します。

7

● 解決策1「zapiを経由して、FIBに注入する」 ● 解決策2「netlinkで、FIBに注入する」 ● 解決策3「OpenFlowで、FIBに注入する」

BGP伝搬gobgpd

Linux Networking Subsystem FIB

基本構成

RIB

RIB <-> FIB連携させるには?

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

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

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

9

ちなみに、Quaggaの場合だと ...

zebra

Linux Networking Subsystem

Linux User Space

Linux Kernel Space

zapi

netlink

bgpd ospfd ripd

RIB <-> FIB連携は、zapi方式が採用されています

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

10

Qiita記事 「GoBGPのオプション機能"FIB manipulation”を活用して、BGPルータ動作を試してみる」 を参考にしてください。

http://qiita.com/ttsubo/items/1bdced59f5c99bb548fa

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

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に注入するやり方を許容しておりません。

許容されていない

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

12https://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

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

GoBGPにD-Planeを ...

13

● 解決策3「OpenFlowで、FIBに注入する」

実は、まだ実装がありません。 (‾Д‾;) ガーン

Open vSwitch�等

OpenFlow

gobgpd

FlowTable (FIB)

RIB

gRPC

OpenFlowコントローラ or

gRPCベースの豊富なAPIをうまく活用すれば、業界初のGoBGP/OpenFlowコントローラも実現可能ですね。

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

14

● Golangで動作するOpenFlowコントローラがオープンソースで提供されると素敵だと思います

● 今のところ、該当しそうなものが見当たらないんですよね

オープンソースなGolang版OpenFlowコントローラって、

ニーズあるのかな?

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

15

ここから、SD-WANの話です ...

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

本当なら、ネットワーク機器向けOS「Cumulus Linux」とかを準備したいところだが、個人活動だと資金面とかの敷居が高いです ... orz

16

SD-WAN機器 ...

お手軽に自宅で 動作させることが

できる機材として ...

財布にやさしく、ファンレスで、省スペース、 省電力なRaspberry Piでチャレンジします!!

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

... というわけで、SD-WAN機器を揃えてみました

17

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

(1) GoBGP on Raspberry Pi

Raspberry Pi2 × 2

- Ubuntu Server - USB LAN Adapter(10/100M)

18

Raspberry Pi3 × 1

ファンレスで、省スペース、省電力なところがGood !!

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

(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

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

(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

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

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監視制御がしたい !!

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

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コンフィグ構成の一元管理

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

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)

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

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

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

etcd

Gohan (server mode)sqlite3

Gohan (client)

SD-WAN Orchestrator

REST(GET)

25

GoBGP-1

GoBGP-2

GoBGP-3Peer断

gobgp-monitoring-workergobgp (cli) 検出

gRPC

検出

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

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プラクティスでのチャレンジテーマが期待通りに動作している様子を、以下のサイトから、ご覧いただけます

動態デモコンテンツ公開中 ...

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

27

GoBGPには、最先端なBGP機能が盛り込まれていて、 日進月歩、進化しております。さらに、Slackなどを通じて、Community活動が共有されております。 GoBGPは、本当、お手軽にはじめることができますので、いっしょに、GoBGPの活動に、貢献してみませんか?

最後に ...

Join Us ♪

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

28

以下、 解決策1「zapiを経由して、FIBに注入する」

の補足スライド

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

29

golangのSampleCodeからzapi経由で、Linux Kernel上のFIBにBGP経路を注入する様子を確認してみます。

zebra

Linux Networking Subsystem

zapi

netlink

Sample Code

Linux User Space

Linux Kernel SpaceFIB

RIB

● 解決策1「zapiを経由して、FIBに注入する」GoBGPにD-Planeを ...

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

30

$ cat sample_zclient.go package mainimport (

log "github.com/Sirupsen/logrus""github.com/osrg/gobgp/zebra""net""os""strconv""strings""time"

)func zclient(ipaddress, nexthop, metric string) {

var prefix net.IPnexthops := []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ライブラリ

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

$ 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に登録されました。

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

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に注入することはできません。)