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に対応したそうです。
そこで、Ryu BGPSpeaker機能改善を実際に確認しました。
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経由へのルーティング経路が選択される様子が確認できました。