読者です 読者をやめる 読者になる 読者になる

SDN開発エンジニアを目指した活動ブログ

〜SDNなオープンソース製品を実際に使って試してみる〜

Ryu SDN FrameworkのBGP機能を試してみた(4) 〜Ryu BGPSpeaker再検証〜

前回は、Ryu BGPSpeakerを活用したInterAS MPLS-VPN環境において、BGP基本動作を確認しました。

当時の動作確認では、i-BGPまわりの基本パラメータ未対応など、実用面での課題が判明しました。

◆最近のRyu BGPSpeaker機能改善

最近のSDN的な仮想ネットワークでは、マルチテナント対応を前提とした柔軟なトラフィックフロー制御技術を活用したServiceChainingに注目があつまっております。
Ryu BGPSpeakerでは、もともと、VRFを活用したMPLS-VPN構築機能が備わっておりますが、最近の機能改善としては、mp-BGPまわりの基本パラメータ対応に加えて、LocalPrefereceに対応したそうです。

f:id:ttsubo:20141020210048j:plain

そこで、Ryu BGPSpeaker機能改善を実際に確認しました。
f:id:ttsubo:20141020205703j:plain
Ryu BGPSpeakerの動作確認にあたっては、前回同様に、GNS3を活用しました。

◆Ryu BGPSpaker動作確認で使用したサンプルコード

1. Ryu BGP1のサンプルコード

対向ASからのトラフィックフローは、すべて、Ryu BGP1を経由するようにLocalPreferenceによるポリシー・ルーティングを設定しました。

import eventlet
import time

eventlet.monkey_patch()

import logging
logging.basicConfig(level=logging.INFO)

from ryu.services.protocols.bgp.bgpspeaker import BGPSpeaker
from ryu.services.protocols.bgp.info_base.base import ASPathFilter
from ryu.services.protocols.bgp.info_base.base import AttributeMap

def dump_remote_best_path_change(event):
    print 'the best path changed:', event.remote_as, event.prefix,\
        event.nexthop, event.is_withdraw

if __name__ == "__main__":
    speaker = BGPSpeaker(as_number=65011, router_id='10.0.1.1',
                         best_path_change_handler=dump_remote_best_path_change, ssh_console=True,
                         label_range=(1000,1999))

    speaker.neighbor_add('192.168.101.101', 65010, enable_ipv4=True, enable_vpnv4=True, multi_exit_disc=100)
    speaker.neighbor_add('10.0.1.2', 65011, enable_ipv4=True, enable_vpnv4=True, is_next_hop_self=True, local_address='10.0.1.1', local_port=50001)
    speaker.neighbor_add('10.0.1.3', 65011, enable_ipv4=True, enable_vpnv4=True, is_next_hop_self=True, local_address='10.0.1.1', local_port=50002)
    speaker.vrf_add('65010:101', ['65010:101'], ['65010:101'])
    speaker.prefix_add('192.168.4.0/30', next_hop='0.0.0.0', route_dist='65010:101')
    speaker.prefix_add('10.10.10.4/32', next_hop='192.168.4.2', route_dist='65010:101')
    speaker.prefix_add('192.168.204.0/30', next_hop='192.168.4.2', route_dist='65010:101')
    as_path_filter = ASPathFilter(65010,policy=ASPathFilter.POLICY_TOP)
    attribute_map = AttributeMap([as_path_filter], AttributeMap.ATTR_LOCAL_PREF, 200)
    speaker.attribute_map_set('10.0.1.3', [attribute_map], route_dist='65010:101', route_family='ipv4')
    eventlet.sleep(5)

    while True:
        eventlet.sleep(5)

2. Ryu BGP2のサンプルコード

import eventlet
import time

eventlet.monkey_patch()

import logging
import sys
logging.basicConfig(level=logging.INFO)

from ryu.services.protocols.bgp.bgpspeaker import BGPSpeaker

def dump_remote_best_path_change(event):
    print 'the best path changed:', event.remote_as, event.prefix,\
        event.nexthop, event.is_withdraw

if __name__ == "__main__":
    speaker = BGPSpeaker(as_number=65011, router_id='10.0.1.2',
                         best_path_change_handler=dump_remote_best_path_change, ssh_console=True,
                         label_range=(2000,2999))

    speaker.neighbor_add('192.168.102.101', 65010, enable_ipv4=True, enable_vpnv4=True, multi_exit_disc=200)
    speaker.neighbor_add('10.0.1.1', 65011, enable_ipv4=True, enable_vpnv4=True, is_next_hop_self=True, local_address='10.0.1.2', local_port=60001)
    speaker.neighbor_add('10.0.1.3', 65011, enable_ipv4=True, enable_vpnv4=True, is_next_hop_self=True, local_address='10.0.1.2', local_port=60002)
    speaker.vrf_add('65010:101', ['65010:101'], ['65010:101'])
    eventlet.sleep(5)
    speaker.prefix_add('192.168.5.0/30', next_hop='0.0.0.0', route_dist='65010:101')
    speaker.prefix_add('10.10.10.5/32', next_hop='192.168.5.2', route_dist='65010:101')
    speaker.prefix_add('192.168.205.0/30', next_hop='192.168.5.2', route_dist='65010:101')

    while True:
        eventlet.sleep(5)

◆Ryu BGPSpaker動作結果

Ryu BGPSpeaker間では、i-BGP Peeringを構築するにあたり、ループバックInterfaceを指定することができるようになりました。通常のRouterの場合には、ループバックInterface間でルーティングが可能となるようにOSPFに参加させる必要があります。しかしながら、Ryu BGPSpeakerにはOSPF制御機能が備わっていませんので、別途、対応が必要となります。
(今回の動作確認では、ループバックInterface間でルーティングは、Staticで対応しました。)

(1) 通常時のPE3でのBGPテーブル内容

RyuBGP1経由で受信したBGP経路については、LocalPreference値が"200"と設定されており、RyuBGP2経由で受信したBGP経路については、LocalPreference値がデフォルト"100"と設定されています。よって、PE3では、BGP最適パス計算によって、RyuBGP1経由のルーティング経路が選択される様子が確認できました。

PE3#sh bgp vpnv4 unicast all
BGP table version is 151, local router ID is 10.0.1.3
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
              x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
Route Distinguisher: 65010:101 (default for vrf customerA)
 * i 10.10.10.1/32    10.0.1.2                      100      0 65010 65001 ?
 *>i                  10.0.1.1                      200      0 65010 65001 ?
 * i 10.10.10.2/32    10.0.1.2                      100      0 65010 65002 ?
 *>i                  10.0.1.1                      200      0 65010 65002 ?
 *>  10.10.10.3/32    192.168.3.2              0         32768 ?
 *>i 10.10.10.4/32    10.0.1.1                      100      0 ?
 *>i 10.10.10.5/32    10.0.1.2                      100      0 ?
 * i 192.168.1.0/30   10.0.1.2                      100      0 65010 ?
 *>i                  10.0.1.1                      200      0 65010 ?
 * i 192.168.2.0/30   10.0.1.2                      100      0 65010 ?
 *>i                  10.0.1.1                      200      0 65010 ?
 *>  192.168.3.0/30   0.0.0.0                  0         32768 ?
 *>i 192.168.4.0/30   10.0.1.1                      100      0 ?
 *>i 192.168.5.0/30   10.0.1.2                      100      0 ?
 * i 192.168.201.0    10.0.1.2                      100      0 65010 65001 i
 *>i                  10.0.1.1                      200      0 65010 65001 i
 * i 192.168.202.0    10.0.1.2                      100      0 65010 65002 i
 *>i                  10.0.1.1                      200      0 65010 65002 i
 *>  192.168.203.0    192.168.3.2              0         32768 ?
 *>i 192.168.204.0/30 10.0.1.1                      100      0 ?
 *>i 192.168.205.0/30 10.0.1.2                      100      0 ?

(2) Ryu BGP1障害時の迂回ルート時のPE3でのBGPテーブル内容

Ryu BGP1とのi-BGPピア断に伴い、BGP最適パス再計算が行われて、Ryu BGP2経由へのルーティング経路が選択される様子が確認できました。
f:id:ttsubo:20141020205629j:plain

◆おわりに

Ryu BGPSpeakerを活用することにより、InterAS MPLS-VPN構成を作成できることが確認できました。
また、前回の技術課題は、ひととおり改修対応が行われていることも確認できました。
これからのNFV的な仮想ネットワーク環境には、柔軟なトラフィック制御を可能とするポリシー・ルーティングに注目が集まっていくものと推測されます。Ryu SDN Framework活用によるOpenFlow/BGP連携機能は、NFV実現に直結可能な技術だと考えておりますので、今後も、いろいろなユースケースを考案していきたいと思います。