Upload
toshiki-tsuboi
View
1.887
Download
3
Embed Size (px)
Citation preview
GoBGP活用による SD-WANプラクティス
1
2016.7.2 @ttsubo
2
自己紹介
⚫ SDN/NFV技術に興味を持ったNWエンジニア ⚫ Ryu SDN Frameworkのコントリビュータをやってました ⚫ 最近は、GoBGPのコントリビュータをやってます
@ttsubo
×
発表サブテーマ
SD-WAN
3
Raspberry Pi
=
GoBGPとは ...
https://github.com/osrg/gobgp
● GolangによるオープンソースなBGP実装コード - マルチコアCPUでの動作に優位 - インストールが、とても簡単
● 最先端なBGP機能が提供 ● BGPエキスパートによる検証事例が豊富 ● gRPCベースの豊富なAPIが公開 � - 利用者独自の拡張が可能
4
gRPC
ところで、SDNネタの発表会などの場で、 pingの動態デモを成功させることが、 SDNエンジニアの醍醐味ですよね。
5
GoBGP基本構成だと ...
GoBGP基本構成の場合 FIBが存在しないため...
gobgpd基本構成
RIB gobgpd基本構成
RIB
不達!!FIB FIB
BGP伝搬
pingによるデモが行えない!!
6
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
● 解決策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
ちなみに、Quaggaの場合だと ...
zebra
Linux Networking Subsystem
Linux User Space
Linux Kernel Space
zapi
netlink
bgpd ospfd ripd
RIB <-> FIB連携は、zapi方式が採用されています
10
Qiita記事 「GoBGPのオプション機能"FIB manipulation”を活用して、BGPルータ動作を試してみる」 を参考にしてください。
http://qiita.com/ttsubo/items/1bdced59f5c99bb548fa
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に注入するやり方を許容しておりません。
許容されていない
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
GoBGPにD-Planeを ...
13
● 解決策3「OpenFlowで、FIBに注入する」
実は、まだ実装がありません。 (‾Д‾;) ガーン
Open vSwitch�等
OpenFlow
gobgpd
FlowTable (FIB)
RIB
gRPC
OpenFlowコントローラ or
gRPCベースの豊富なAPIをうまく活用すれば、業界初のGoBGP/OpenFlowコントローラも実現可能ですね。
14
● Golangで動作するOpenFlowコントローラがオープンソースで提供されると素敵だと思います
● 今のところ、該当しそうなものが見当たらないんですよね
オープンソースなGolang版OpenFlowコントローラって、
ニーズあるのかな?
15
ここから、SD-WANの話です ...
本当なら、ネットワーク機器向けOS「Cumulus Linux」とかを準備したいところだが、個人活動だと資金面とかの敷居が高いです ... orz
16
SD-WAN機器 ...
お手軽に自宅で 動作させることが
できる機材として ...
財布にやさしく、ファンレスで、省スペース、 省電力なRaspberry Piでチャレンジします!!
... というわけで、SD-WAN機器を揃えてみました
17
(1) GoBGP on Raspberry Pi
Raspberry Pi2 × 2
- Ubuntu Server - USB LAN Adapter(10/100M)
18
Raspberry Pi3 × 1
ファンレスで、省スペース、省電力なところがGood !!
(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
(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
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
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
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
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
etcd
Gohan (server mode)sqlite3
Gohan (client)
SD-WAN Orchestrator
REST(GET)
25
GoBGP-1
GoBGP-2
GoBGP-3Peer断
gobgp-monitoring-workergobgp (cli) 検出
gRPC
検出
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
GoBGPには、最先端なBGP機能が盛り込まれていて、 日進月歩、進化しております。さらに、Slackなどを通じて、Community活動が共有されております。 GoBGPは、本当、お手軽にはじめることができますので、いっしょに、GoBGPの活動に、貢献してみませんか?
最後に ...
Join Us ♪
28
以下、 解決策1「zapiを経由して、FIBに注入する」
の補足スライド
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を ...
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ライブラリ
$ 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
// 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に注入することはできません。)