{"id":2531,"date":"2015-04-06T21:14:12","date_gmt":"2015-04-06T20:14:12","guid":{"rendered":"https:\/\/beufa.net\/?p=2531"},"modified":"2015-04-06T21:16:48","modified_gmt":"2015-04-06T20:16:48","slug":"de-cisco-ios-a-ios-xr","status":"publish","type":"post","link":"https:\/\/beufa.net\/fr\/blog\/de-cisco-ios-a-ios-xr\/","title":{"rendered":"Passer de Cisco IOS \u00e0 IOS-XR, une nouvelle fa\u00e7on de penser !"},"content":{"rendered":"<p>Pour industrialiser des nouveaux \u00e9quipements ASR 99xx sous Cisco IOS-XR, j&#8217;ai \u00e9crit un script pour convertir rapidement la configuration des interfaces L3 IPv4 \/ IPv6, l&#8217;IGP OSPF\/OSPFv3 et ses costs, ainsi que le routage BGP depuis une configuration de Cisco 6K sous IOS. Ceci afin principalement d&#8217;\u00e9viter les erreurs de ctrl+c \/ ctrl+v (ou l &#8216;effet PEBKAC) .<\/p>\n<p>La majorit\u00e9 des changements est facile \u00e0 appr\u00e9hender entre IOS et IOS-XR, m\u00eame si parfois les choix technologiques entrainent de changer sa mani\u00e8re de corr\u00e9ler la technique r\u00e9seau et la configuration des \u00e9quipements. Exemple : la MTU n&#8217;est plus consid\u00e9r\u00e9e au niveau 3 sur un IOS-XR, mais comme la MTU niveau 2, voir <a href=\"https:\/\/supportforums.cisco.com\/document\/59726\/asr9000xr-understanding-mtu-calculations\" target=\"_blank\">ASR9000\/XR: Understanding MTU calculations<\/a> ou<br \/>\n<a href=\"http:\/\/www.cisco.com\/c\/en\/us\/support\/docs\/ios-nx-os-software\/ios-xr-software\/116350-trouble-ios-xr-mtu-00.html\" target=\"_blank\">MTU Behavior on Cisco IOS XR and Cisco IOS Routers<\/a>).<\/p>\n<p>Mais le changement majeur de IOS-XR, c&#8217;est l&#8217;arriv\u00e9e des route-policies. Pour ceux qui ont l&#8217;habitude des SUP720 \/\u00a0 SUP2T, lorsque l&#8217;on configure une session BGP, on configure 3 \u00e9l\u00e9ments communs en IN \/ OUT :<\/p>\n<ul>\n<li>filter-list [AS_PATH] (in|out) : <em>On configure ici la liste des AS \/ AS_PATH BGP autoris\u00e9s ou interdits en in et out<\/em><\/li>\n<li>prefix-list [PFX_LIST] (in|out) : <em>On configure ici la liste des pr\u00e9fixes annonc\u00e9s ou interdits en in et out<\/em><\/li>\n<li>route-map [ROUTEMAP] (in|out) : <em>On configure ici la route-map in et out qui permettra de modifier les attributs BGP, les next-hop &#8230;. Tout un ensemble d\u2019\u00e9l\u00e9ments n\u00e9cessaires pour maitriser la r\u00e9partition de trafic, les commits en fonction des transitaires, l&#8217;acceptation des default routes ou de la DFZ, etc &#8230;.<\/em><\/li>\n<\/ul>\n<p>Sur Cisco IOS-XR, plus besoin de lire 1000 lignes \u00e9parpill\u00e9es dans la configuration pour comprendre la logique de tel ou tel neighbor BGP ! On peut avoir le tableau d&#8217;\u00e9quivalences suivant:<\/p>\n<table border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"10\">\n<tbody>\n<tr>\n<td><\/td>\n<td><strong>Cisco IOS<\/strong><\/td>\n<td><strong>Cisco IOS-XR<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong><em>Sets d&#8217;AS Paths<\/em><\/strong><\/td>\n<td>ip as-path access-list<\/td>\n<td>as-path-set<\/td>\n<\/tr>\n<tr>\n<td><strong><em>Sets de pr\u00e9fixes<\/em><\/strong><\/td>\n<td>ip prefix-list<\/td>\n<td>prefix-set<\/td>\n<\/tr>\n<tr>\n<td><strong><em>Configuration neighbor BGP<\/em><\/strong><\/td>\n<td>filter-list<br \/>\nprefix-list<br \/>\nroute-map<\/td>\n<td>route-policy<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>D\u00e9sormais, les annonces, les filtres et la modification des attributs BGP se r\u00e9alisent dans un seul et m\u00eame endroit : la route-policy.<\/p>\n<p>Ces route-policies sont un peu d\u00e9routantes au d\u00e9but, car il fait penser \u00e0 tout. Plus possible de changer les annonces avec la modification rapide d&#8217;un prefix-list en out avec un clear ip bgp soft.<\/p>\n<p>La logique de ces routes policies est beaucoup plus &#8220;programmatique&#8221; qu&#8217;avant :<\/p>\n<ul>\n<li>Par d\u00e9faut, on interdit tout (deny \/ drop implicite). Il n&#8217;y a donc plus de deny non plus dans les prefix-set ou les as-path-set, car il faut utiliser le mot cl\u00e9 &#8220;not&#8221; avant un test.<\/li>\n<li>Les conditions sont faites par des conditions &#8220;if\u00a0 then&#8221; &gt; &#8220;elseif then&#8221; &gt; &#8220;else&#8221; &gt; &#8220;endif&#8221;, comme en bash. L&#8217;ordre des conditions remplace les num\u00e9ros de s\u00e9quences bien connues des route-maps.<\/li>\n<li>L&#8217;ex\u00e9cution d&#8217;une route-policy se fait \u00e0 l&#8217;aide d&#8217;un &#8220;ticket&#8221; qui peut changer de valeur en fonction des conditions :\n<ul>\n<li>mot cl\u00e9 &#8220;PASS&#8221; : L&#8217;ex\u00e9cution continue et on autorise, tant que le reste de la RPL ne drop pas (le deny implicite ne s&#8217;applique pas)<\/li>\n<li>mot cl\u00e9 &#8220;SET&#8221; : M\u00eame usage que &#8220;PASS&#8221;, mais on ajoute la modification des attributs BGP<\/li>\n<li>mot cl\u00e9 &#8220;DONE&#8221; : L&#8217;ex\u00e9cution s&#8217;arr\u00eate avec un &#8220;PASS&#8221;<\/li>\n<li>mot cl\u00e9 &#8220;DROP&#8221;: L&#8217;ex\u00e9cution s&#8217;arr\u00eate avec un deny explicite.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Exemple simple et stupide !<\/p>\n<pre class=\"brush:shell\">route-policy example\r\n    # On autorise les AS_PATH dans allowed-ases\r\n    # On \u00e9vite la default route dans default-route\r\n    if (as-path in allowed-ases and not destination in default-route) then\r\n         pass\r\n    # On set le local-pref \u00e0 20 si on tombe sur la default-route\r\n    elseif (destination in default-route) then\r\n         set local-preference 20\r\n    # Sinon on laisse passer le reste avec un local-preference a 10\r\n    else \r\n         set local-preference 10\r\n    endif\r\n# Ici, on a un drop implicite, d'o\u00f9 le dernier set\r\nend-policy<\/pre>\n<p>On peut aussi faire un appel \u00e0 des routes-policies de mani\u00e8re imbriqu\u00e9, en passant des variables :<\/p>\n<pre class=\"brush:shell\">route-policy set_localpref($pref)\r\n  set local-pref $pref\r\nend-policy<\/pre>\n<p>Dans la route-policy pr\u00e9c\u00e9dente, il nous suffit donc de faire<\/p>\n<pre class=\"brush:shell\">    else \r\n         apply set_localpref(10)\r\n    endif<\/pre>\n<p>L&#8217;exemple ci-dessus n&#8217;est pas forc\u00e9ment le plus intelligent, mais en \u00e9largissant \u00e0 des exemples concrets, on prend conscience de la puissance des route-policies sous IOS-XR. Il est m\u00eame possible \u00e0 priori d&#8217;appeler une route-policy avec un argument dans la configuration d&#8217;un neighbor BGP.<\/p>\n<p>Cette nouvelle mani\u00e8re de penser \/ \u00e9crire les optimisations et actions sur le routage est tr\u00e8s percutante, m\u00eame si le changement est difficile \u00e0 appr\u00e9hender et n\u00e9cessite de la r\u00e9flexion.<\/p>\n<p>En effet, dans la r\u00e9alisation de mon script de migration, j&#8217;ai pu convertir les as-path access-list, les prefix-list, et les route-maps, mais le nombre de combinaisons possibles pour les neighbors BGP m&#8217;a emp\u00eacher d&#8217;automatiser leur conversion de mani\u00e8re simple. Le changement dans l&#8217;application des param\u00e8tres de configuration du neighbor BGP n\u00e9cessite une revue compl\u00e8te et manuelle des param\u00e8tres de configuration du neighbor BGP.<\/p>\n<p>Pour en savoir plus, je vous engage \u00e0 lire ce tr\u00e8s bon article sur le supportforums cisco, qui m&#8217;a permis de d\u00e9marrer et automatiser la conversion des routes-maps\u00a0: <a href=\"https:\/\/supportforums.cisco.com\/document\/88676\/asr9000xr-understanding-and-using-rpl-route-policy-language\" target=\"_blank\">ASR9000\/XR: Understanding and using RPL (Route Policy Language)<\/a><\/p>\n<p>De nombreux articles sont disponibles sur le net, et la pratique vaut forc\u00e9ment mieux que l&#8217;exemple.<\/p>\n<p>Bon courage \u00e0 ceux qui doivent migrer des milliers de lignes \u00e0 la main \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pour industrialiser des nouveaux \u00e9quipements ASR 99xx sous Cisco IOS-XR, j&#8217;ai \u00e9crit un script pour convertir rapidement la configuration des interfaces L3 IPv4 \/ IPv6,&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/beufa.net\/fr\/blog\/de-cisco-ios-a-ios-xr\/\">Continue reading<span class=\"screen-reader-text\">Passer de Cisco IOS \u00e0 IOS-XR, une nouvelle fa\u00e7on de penser !<\/span><\/a><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16,24],"tags":[105,93,42,102,103,106,108,107,104],"class_list":["post-2531","post","type-post","status-publish","format-standard","hentry","category-cisco","category-reseau","tag-as-path-set","tag-bgp","tag-cisco-2","tag-ios","tag-ios-xr","tag-prefix-set","tag-route-map","tag-route-policy","tag-rpl","entry"],"_links":{"self":[{"href":"https:\/\/beufa.net\/fr\/wp-json\/wp\/v2\/posts\/2531","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/beufa.net\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/beufa.net\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/beufa.net\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/beufa.net\/fr\/wp-json\/wp\/v2\/comments?post=2531"}],"version-history":[{"count":3,"href":"https:\/\/beufa.net\/fr\/wp-json\/wp\/v2\/posts\/2531\/revisions"}],"predecessor-version":[{"id":2534,"href":"https:\/\/beufa.net\/fr\/wp-json\/wp\/v2\/posts\/2531\/revisions\/2534"}],"wp:attachment":[{"href":"https:\/\/beufa.net\/fr\/wp-json\/wp\/v2\/media?parent=2531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/beufa.net\/fr\/wp-json\/wp\/v2\/categories?post=2531"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/beufa.net\/fr\/wp-json\/wp\/v2\/tags?post=2531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}