{"id":1595,"date":"2009-03-22T13:14:46","date_gmt":"2009-03-22T12:14:46","guid":{"rendered":"http:\/\/www.corelan.be:8800\/index.php\/2009\/03\/22\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\/"},"modified":"2009-03-22T13:14:46","modified_gmt":"2009-03-22T12:14:46","slug":"juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations","status":"publish","type":"post","link":"https:\/\/www.corelan.be\/index.php\/2009\/03\/22\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\/","title":{"rendered":"Juniper ScreenOS : defeating iBGP full mesh requirement using route reflectors and confederations"},"content":{"rendered":"<p>As explained in <a href=\"\/index.php\/2008\/11\/15\/juniper-screenos-bgp-basics-a-simple-ibgp-test-case\/\" target=\"_blank\" rel=\"noopener\">one of my earlier posts<\/a>, one of the requirements to successfully setup and operate an iBGP configuration is that all iBGP clients need to have a BGP connection to all other iBGP clients. (= full mesh). This is required because an iBGP device only exchanges information about its own networks and it does not pass on BGP updates from other peers to other peers.<\/p>\n<p>Suppose you have 4 devices in the same AS, exchanging prefix information over BGP, then you would need 6 iBGP connections.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2009\/03\/image3.png\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"image\" style=\"border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px\" height=\"151\" alt=\"image\" src=\"\/wp-content\/uploads\/2009\/03\/image-thumb3.png\" width=\"230\" border=\"0\" \/><\/a><\/p>\n<p>If you add one more router in the AS, you need 4 more iBGP connections <\/p>\n<p><a href=\"\/wp-content\/uploads\/2009\/03\/image4.png\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"image\" style=\"border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px\" height=\"115\" alt=\"image\" src=\"\/wp-content\/uploads\/2009\/03\/image-thumb4.png\" width=\"236\" border=\"0\" \/><\/a> <\/p>\n<p>In other words, adding more devices increases the number of peers exponentially. It is clear that this does not scale very well. Of course, you can use peer-groups to somewhat simplify the configuration of the peers, but you still need to configure neighbors to all other routers on all devices.<\/p>\n<p>Basically, the setup on each device (screenos) would look something like this :<\/p>\n<div>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none\">set vrouter trust-vr\nset protocol bgp 65500\nset enable\nset neighbor peer-group <span style=\"color: #006080\">&quot;iBGPPeers&quot;<\/span>\nset neighbor peer-group <span style=\"color: #006080\">&quot;iBGPPeers&quot;<\/span> remote-<span style=\"color: #0000ff\">as<\/span> 65500\nset neighbor peer-group <span style=\"color: #006080\">&quot;iBGPPeers&quot;<\/span> md5-authentication <span style=\"color: #006080\">&quot;iBGPTest&quot;<\/span>\nset neighbor 192.168.0.30 peer-group iBGPPeers\nset neighbor 192.168.3.10 peer-group iBGPPeers\nset neighbor 192.168.21.15 peer-group iBGPPeers<\/pre>\n<\/div>\n<p>so you basically need to create a peer group, set the parameters that will be applied to all peers in this group (remote-as and md5-authentication parameters) and then you define the peers into the peer group.&#160; If you are using route-maps, you can either define the route-map in the peer group, and\/or directly on a specific peer.&#160; If you define a route-map directly on a peer, it will take precedence over the global route-map in the peer-group.<\/p>\n<p>Nice, but using peer-groups only limits the number of lines of screenos statements, it does not defeat the full mesh requirement.&#160; Some critics might even say that using peer-groups makes it more difficult when you are using multiple route-maps.<\/p>\n<p>A lots of work, risk of making mistakes\u2026. there are numerous reasons to consider when designing your network.&#160; But if using iBGP is your only option, how can you make your life easier ?<\/p>\n<p>There are 2 solutions. You can use route reflectors and confederations to decrease the number of peer relationships you need to configure and maintain. Both solutions have some drawbacks too, but we\u2019ll talk about that when we get there.<\/p>\n<p>&#160;<\/p>\n<h3>Route reflectors<\/h3>\n<p>A route reflector is a router that acts as a hub between various iBGP clients. These clients peer with the RR (Route reflector) and exchange information with it.&#160; The RR reflects the information to other BGP peers (iBGP and eBGP)<\/p>\n<p>Route reflectors introduce the concept of \u2018clients\u2019 and \u2018non-clients\u2019.&#160; When a host is connected to a RR, it becomes a client.&#160; The RR and the clients now form a cluster.&#160; Peers of the RR that are not part of the cluster are non-clients.<\/p>\n<p>Non-clients still need to be configured to form a full mesh with the RR and the other iBGP speakers (but not with the other clients that are part of the RR cluster)<\/p>\n<p>So in other words, if we look back at the example of 5 routers, and now assume that router5 is a RR, and router 2 and 4 are RR clients, then the iBGP setup would look like this :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2009\/03\/image5.png\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"image\" style=\"border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px\" height=\"197\" alt=\"image\" src=\"\/wp-content\/uploads\/2009\/03\/image-thumb5.png\" width=\"349\" border=\"0\" \/><\/a> <\/p>\n<p>router 1 and 3 now only have to peer with each other and with the RR.&#160; RR clients 2 and 4 only need to peer with router5 (the RR).&#160;&#160; So instead of having to configure 10 iBGP peers, you only need to set up 5 relationships.<\/p>\n<p>The drawbacks of using a RR are clear : the RR is now a sinle point of failure and the RR process will put somewhat more load on the router.&#160; Of course, you can set up multiple RR\u2019s for added redundancy (you just need to set up all clients and non-clients to peer with all RRs)\u2026 and as long as you don\u2019t have thousands of routes exchange via BGP, the extra load should not be a big issue either.&#160; And if you have more routes, you may need to reconsider the design and split up the network (AS)&#160; into smaller networks (ASs) and use eBGP to exchange information between the various networks.<\/p>\n<p>Example :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2009\/03\/image6.png\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"image\" style=\"border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px\" height=\"164\" alt=\"image\" src=\"\/wp-content\/uploads\/2009\/03\/image-thumb6.png\" width=\"499\" border=\"0\" \/><\/a><\/p>\n<p><em>(Note : a RR will only reflect the routes within the same AS. So if you peer RR\u2019s from multiple ASs with each other using eBGP, you will still need to redistribute prefixes from ebgp into ibgp on the RRs in order to get the information exchanged to the other routers in the AS.)<\/em><\/p>\n<p>Route reflectors will preserve all iBGP attributes, however some implementations still allow attributes to be changed or filtering to be applied.&#160; I would not recommend changing attributes unless you really know what you are doing. If, for example, you start playing with the next_hop attribute, you may introduce a routing loop. On the other hand, it may be nice to be able to play with the local_pref or med values in order to prefer one path over another.<\/p>\n<p>It\u2019s also good to know that changing from a topology without a RR to a RR topology does not introduce a major design or configuration change. AS numbers still remain the same. You only need to set up the RR, set up the RR clients, and then you can start removing iBGP peer relationships.<\/p>\n<p>To a non-client, the RR just acts as a regular BGP peer, so even if the non-client is not RR aware of cannot handle RR configurations, as long as it can speak iBGP it will work. It will never know that the peer is a RR.<\/p>\n<p>This is how a RR network is set up in screenos :<\/p>\n<p><u>1. The route reflector<\/u><\/p>\n<div>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none\">set vrouter trust-vr\nset proto bgp\nset reflector\nset reflector cluster-id 1<\/pre>\n<\/div>\n<p>That\u2019s it. Enable the reflector and set the cluster-id (to 1 in this example).&#160; You can get the reflector settings using the \u201cget vrouter trust-vr proto bgp reflector\u201d statement :<\/p>\n<div>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none\">get vrouter trust-vr proto bgp reflector\n\nRoute reflector:       enable\nCluster ID<\/pre>\n<\/div>\n<p>Now change the iBGP relationship with the RR clients (and add a statement to make them reflector client) :<\/p>\n<div>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none\">set vrouter trust-vr\nset proto bgp\nset neighbor &lt;ip_of_RR_client&gt; reflector-client<\/pre>\n<\/div>\n<div>(if you were already using peer-groups, you can set the reflector-client configuration on the peer-group and it will be applied to all neighbors)<\/div>\n<div>&#160;<\/div>\n<p><u>2. RR clients<\/u><\/p>\n<p>There\u2019s nothing special to configure on the RR clients. Just set up the iBGP peer relationship with the RR and that\u2019s it. You can remove the peer relationships with the other RR clients and with the non-RR clients.&#160; RR clients only need to talk to the RR.<\/p>\n<p>When the client has been configured to peer with the RR, it becomes a reflector client. You can get query this info by running the following command on the client:<\/p>\n<div>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none\">get vrouter trust-vr protocol bgp neighbor &lt;ip of RR&gt; | include reflector\n\n    reflector client: yes<\/pre>\n<\/div>\n<p>On the RR, you can also get the same info by running :<\/p>\n<div>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none\">get vr trust-vr proto bgp neighbor 192.168.0.127\n\npeer: 192.168.0.127,  remote AS: 65000, admin status: enable, PeerID 2, CBAfi 0\ntype: IBGP\nconnection state: ACTIVE, connection id: 0 retry interval: node <span style=\"color: #0000ff\">default<\/span>(120s), cur retry time 120s\nconfigured hold time: node <span style=\"color: #0000ff\">default<\/span>(20s), configured keepalive: node <span style=\"color: #0000ff\">default<\/span>(6s)\ndesignated local IP: n\/a\n--------------------------------------------------------------------------------------\nFor address family: IPv4 unicast\nroute map(ipv4) <span style=\"color: #0000ff\">in<\/span> name: , route map(ipv4) <span style=\"color: #0000ff\">out<\/span> name: \nweight(ipv4): 100 (<span style=\"color: #0000ff\">default<\/span>)\nself <span style=\"color: #0000ff\">as<\/span> next hop(ipv4): disable\nsend <span style=\"color: #0000ff\">default<\/span> route to peer(ipv4): disable\nignore <span style=\"color: #0000ff\">default<\/span> route from peer(ipv4): disable\nsend community path attribute(ipv4): no\nreflector client(ipv4): yes\nconfigured adv-interval(ipv4): <span style=\"color: #0000ff\">default<\/span>(5s)\n--------------------------------------------------------------------------------------\nFor address family: IPv6 unicast\nroute map(ipv6) <span style=\"color: #0000ff\">in<\/span> name: , route map <span style=\"color: #0000ff\">out<\/span>(ipv6) name: \nweight(ipv6): 100 (<span style=\"color: #0000ff\">default<\/span>)\nself <span style=\"color: #0000ff\">as<\/span> next hop(ipv6): disable\nsend <span style=\"color: #0000ff\">default<\/span> route to peer(ipv6): disable\nignore <span style=\"color: #0000ff\">default<\/span> route from peer(ipv6): disable\nsend community path attribute(ipv6): no\nreflector client(ipv6): no\nconfigured adv-interval(ipv6): <span style=\"color: #0000ff\">default<\/span>(5s)\n--------------------------------------------------------------------------------------\nNeighbor Capabilities: \n  Route refresh: advertised \n  Address family IPv4 Unicast:  advertised \nforce reconnect <span style=\"color: #0000ff\">is<\/span> disable\ntotal messages to peer: 234, from peer: 206 \nupdate messages to peer: 30, from peer: 5\nTx queue length 0, Tx queue HWM: 5\nroute-refresh messages to peer: 0, from peer: 0 \ncurrent packets from peer number: 1, length: 21 \nlast reset 00:29:24 ago, due to BGP recv Notification(Cease: Admin stopped)(code 6 : subcode 3)\nnumber of total successful connections: 5\npeer down elapsed time: 1 minutes 53 seconds<\/pre>\n<\/div>\n<p>(the RR client is at 192.168.0.127, the RR is 192.168.0.8).&#160; In fact, this client is a linux router running quagga.&#160; <\/p>\n<p>As opposed to screenOS, on Cisco (or quagga) you do need to specify that the client is a route reflector. You can set up the reflector-client using the following commands :<\/p>\n<div>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none\">router bgp 65000\n   bgp router-id 1.1.1.1\n   neighbor &lt;ip_of_rr&gt; remote-<span style=\"color: #0000ff\">as<\/span> 65000\n   neighbor &lt;ip_of_rr&gt; route-reflector-client<\/pre>\n<\/div>\n<p>In quagga (and Cisco), you can verify that the client is a rr-client using the sh ip bgp neighbors command :<\/p>\n<div>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none\">[root@linuxrouter-1 ~]# telnet localhost 2605\nTrying 127.0.0.1...\nConnected to localhost.\nEscape character <span style=\"color: #0000ff\">is<\/span> <span style=\"color: #006080\">'^]'<\/span>.\n\nHello, <span style=\"color: #0000ff\">this<\/span> <span style=\"color: #0000ff\">is<\/span> Quagga (version 0.99.10).\nCopyright 1996-2005 Kunihiro Ishiguro, et al.\n\n\nUser Access Verification\n\nPassword: \nlinuxrouter-1&gt; en\nPassword: \n\n\nlinuxrouter-1# sh ip bgp neighbors\nBGP neighbor <span style=\"color: #0000ff\">is<\/span> 192.168.0.8, remote AS 65000, local AS 65000, <span style=\"color: #0000ff\">internal<\/span> link\n  BGP version 4, remote router ID 192.168.0.8\n  BGP state = Established, up <span style=\"color: #0000ff\">for<\/span> 00:04:34\n  Last read 00:00:03, hold time <span style=\"color: #0000ff\">is<\/span> 20, keepalive interval <span style=\"color: #0000ff\">is<\/span> 6 seconds\n  Neighbor capabilities:\n    4 Byte AS: advertised\n    Route refresh: advertised and received(old &amp; <span style=\"color: #0000ff\">new<\/span>)\n    Address family IPv4 Unicast: advertised and received\n  Message statistics:\n    Inq depth <span style=\"color: #0000ff\">is<\/span> 0\n    Outq depth <span style=\"color: #0000ff\">is<\/span> 0\n                         Sent       Rcvd\n    Opens:                  1          1\n    Notifications:          0          0\n    Updates:                1          6\n    Keepalives:            47         45\n    Route Refresh:          0          0\n    Capability:             0          0\n    Total:                 49         52\n  Minimum time between advertisement runs <span style=\"color: #0000ff\">is<\/span> 5 seconds\n\n For address family: IPv4 Unicast\n  Route-Reflector Client\n  4 accepted prefixes\n\n  Connections established 1; dropped 0\n  Last reset never\nLocal host: 192.168.0.127, Local port: 53411\nForeign host: 192.168.0.8, Foreign port: 179\nNexthop: 192.168.0.127\nNexthop global: fe80::a00:27ff:fe6f:9ac\nNexthop local: ::\nBGP connection: non shared network\nRead thread: on  Write thread: off<\/pre>\n<\/div>\n<div>&#160;<\/div>\n<div>&#160;<\/div>\n<p><u>3. non-RR clients<\/u><\/p>\n<p>There\u2019s nothing special to configure. Just remove the peer relationships with the RR clients. non-RR clients only need to peer with each other and with the RR.<\/p>\n<p>&#160;<\/p>\n<p>&#160;<\/p>\n<h3>Confederations<\/h3>\n<p>BGP confederations offer a second way to limit the number of peer relationships in a iBGP environment. This technique is based on the concept of breaking an AS into smaller sub-ASs.&#160; Peers in the sub-AS need to form a full mesh. Information between multiple sub-ASs is exchanged via eBGP (so you can dedicate one router in one sub-AS to exchange information with one router in the other sub-AS). To the outside world, the entire set of sub-ASs still look like one AS.<\/p>\n<p>Although eBGP is used between sub-ASs, BGP attributes are preserved while crossing the sub-AS boundary. So attributes such as med, local_pref, next_hop are not changed (as if you were doing iBGP)<\/p>\n<p>There are 2 major drawbacks in this scenario : <\/p>\n<p>1. Migrating from iBGP full mesh to confederations require a major reconfiguration of all routers<\/p>\n<p>2. BGP uses the shortest path to determine the best route. Because an AS can consist of multiple sub-ASs, but looks like one AS path hop to external BGP peers, you can get suboptimal routing. (after all, the sub-ASs do not influence the AS path length to external BGP peers). You can overcome this by manually setting the local_pref and med attributes on the eBGP peers.<\/p>\n<p>This is how confederations are set up in screenos :<\/p>\n<p>If BGP was already running, you need to break it down entirely. After all, you will need to put the bgp instance in a new AS (a sub-AS)<\/p>\n<p>When BGP is entirely gone from the config, you need to set 3 different AS numbers :<\/p>\n<ul>\n<li>Local AS (= the local sub-AS number). This number must be used as the local bgp AS number <\/li>\n<li>Confederation ID = the real (parent or public) AS number (the AS that is used to the outside world) <\/li>\n<li>Confederation peers : list of other sub-ASs within the same confederation. <\/li>\n<\/ul>\n<p>So if you want to break down AS 65000 into 2 smaller sub-ASs (65100 and 65200), you need to set the following parameters :<\/p>\n<div>\n<pre style=\"padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none\">set vrouter trust-vr proto bgp 65100\nset vrouter trust-vr proto bgp confederation id 65000\nset vrouter trust-vr proto bgp confederation peer 65200\nset vrouter trust-vr proto bgp enable<\/pre>\n<\/div>\n<p>You need to perform the same config on all devices in the same confederation and sub-AS<\/p>\n<p>Next, you need to set up the bgp neighbors, using the sub-AS numbers (65100 and 65200). Within the sub-AS, there must be a full mesh. <\/p>\n<p>If you want to interconnect the various sub-ASs, you can use one router in Sub-AS 65100 and one router in Sub-AS 65200 and set up a eBGP relationship between the two.<\/p>\n<p>eBGP hosts (in another AS than confederation AS 65000) can peer with one of the hosts in the confederation using AS number 65000. These external hosts are not aware of the sub-ASs.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2009\/03\/image7.png\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"image\" style=\"border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px\" height=\"207\" alt=\"image\" src=\"\/wp-content\/uploads\/2009\/03\/image-thumb7.png\" width=\"520\" border=\"0\" \/><\/a> <\/p>\n<p>&#160;<\/p>\n<h3>Route reflectors versus Confederations<\/h3>\n<p>As you probably have deducted by now, it is recommended to use route reflectors over confederations.&#160; On the other hand, confederations may help increasing stability. If you are running an IGP (OSPF, \u2026) in one sub-AS, you can run it independently from other sub-ASs and you can use summarization when exchanging routing information between sub-ASs\u2026 This will help decreasing the number of route updates between subASs (and thus stabilize the parent AS) in case the networks connected via the OSPF are not 100% stable.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As explained in one of my earlier posts, one of the requirements to successfully setup and operate an iBGP configuration is that all iBGP clients need to have a BGP connection to all other iBGP clients. (= full mesh). This is required because an iBGP device only exchanges information about its own networks and it &hellip; <a href=\"https:\/\/www.corelan.be\/index.php\/2009\/03\/22\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> \"Juniper ScreenOS : defeating iBGP full mesh requirement using route reflectors and confederations\"<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[554,164],"tags":[3742,3735,1408,1308,1307,1007,998,131],"class_list":["post-1595","post","type-post","status-publish","format-standard","hentry","category-juniper","category-networking","tag-networking","tag-juniper-netscreen-screenos","tag-routing","tag-bgp","tag-autonomous-system","tag-ios","tag-cisco","tag-linux"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Juniper ScreenOS : defeating iBGP full mesh requirement using route reflectors and confederations - Corelan | Exploit Development &amp; Vulnerability Research<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.corelan.be\/index.php\/2009\/03\/22\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Juniper ScreenOS : defeating iBGP full mesh requirement using route reflectors and confederations - Corelan | Exploit Development &amp; Vulnerability Research\" \/>\n<meta property=\"og:description\" content=\"As explained in one of my earlier posts, one of the requirements to successfully setup and operate an iBGP configuration is that all iBGP clients need to have a BGP connection to all other iBGP clients. (= full mesh). This is required because an iBGP device only exchanges information about its own networks and it &hellip; Continue reading &quot;Juniper ScreenOS : defeating iBGP full mesh requirement using route reflectors and confederations&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.corelan.be\/index.php\/2009\/03\/22\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\/\" \/>\n<meta property=\"og:site_name\" content=\"Corelan | Exploit Development &amp; Vulnerability Research\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/corelanconsulting\" \/>\n<meta property=\"article:published_time\" content=\"2009-03-22T12:14:46+00:00\" \/>\n<meta name=\"author\" content=\"corelanc0d3r\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@corelanc0d3r\" \/>\n<meta name=\"twitter:site\" content=\"@corelanc0d3r\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2009\\\/03\\\/22\\\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2009\\\/03\\\/22\\\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\\\/\"},\"author\":{\"name\":\"corelanc0d3r\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#\\\/schema\\\/person\\\/3be5542b9b0a0787893db83a5ad68e8f\"},\"headline\":\"Juniper ScreenOS : defeating iBGP full mesh requirement using route reflectors and confederations\",\"datePublished\":\"2009-03-22T12:14:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2009\\\/03\\\/22\\\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\\\/\"},\"wordCount\":1682,\"publisher\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#organization\"},\"keywords\":[\"networking\",\"juniper netscreen screenos\",\"routing\",\"bgp\",\"autonomous system\",\"ios\",\"Cisco\",\"Linux and Unix\"],\"articleSection\":[\"Juniper\",\"Networking\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2009\\\/03\\\/22\\\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\\\/\",\"url\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2009\\\/03\\\/22\\\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\\\/\",\"name\":\"Juniper ScreenOS : defeating iBGP full mesh requirement using route reflectors and confederations - Corelan | Exploit Development &amp; Vulnerability Research\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#website\"},\"datePublished\":\"2009-03-22T12:14:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2009\\\/03\\\/22\\\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2009\\\/03\\\/22\\\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2009\\\/03\\\/22\\\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.corelan.be\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Juniper ScreenOS : defeating iBGP full mesh requirement using route reflectors and confederations\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#website\",\"url\":\"https:\\\/\\\/www.corelan.be\\\/\",\"name\":\"Corelan CyberSecurity Research\",\"description\":\"Corelan publishes in-depth tutorials on exploit development, Windows exploitation, vulnerability research, heap internals, reverse engineering and security tooling used by professionals worldwide.\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.corelan.be\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#organization\",\"name\":\"Corelan CyberSecurity Research\",\"url\":\"https:\\\/\\\/www.corelan.be\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.corelan.be\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/corelanlogo2_small-20.png\",\"contentUrl\":\"https:\\\/\\\/www.corelan.be\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/corelanlogo2_small-20.png\",\"width\":200,\"height\":200,\"caption\":\"Corelan CyberSecurity Research\"},\"image\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/corelanconsulting\",\"https:\\\/\\\/x.com\\\/corelanc0d3r\",\"https:\\\/\\\/x.com\\\/corelanconsulting\",\"https:\\\/\\\/instagram.com\\\/corelanconsult\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#\\\/schema\\\/person\\\/3be5542b9b0a0787893db83a5ad68e8f\",\"name\":\"corelanc0d3r\",\"pronouns\":\"he\\\/him\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3783bed6acd72d7fa5bb2387d88acbb9a3403e7cada60b2037e1cbb74ad451f9?s=96&d=mm&r=x\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3783bed6acd72d7fa5bb2387d88acbb9a3403e7cada60b2037e1cbb74ad451f9?s=96&d=mm&r=x\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3783bed6acd72d7fa5bb2387d88acbb9a3403e7cada60b2037e1cbb74ad451f9?s=96&d=mm&r=x\",\"caption\":\"corelanc0d3r\"},\"description\":\"Peter Van Eeckhoutte is the founder of Corelan and a globally recognized expert in exploit development and vulnerability research. With over two decades in IT security, he built Corelan into a respected platform for deep technical research, hands-on training, and knowledge sharing. Known for his influential exploit development tutorials, tools, and real-world training, Peter combines a strong research mindset with a passion for education\u2014helping security professionals understand not just how exploits work, but why.\",\"sameAs\":[\"https:\\\/\\\/www.corelan-training.com\",\"https:\\\/\\\/instagram.com\\\/corelanc0d3r\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/petervaneeckhoutte\\\/\",\"https:\\\/\\\/x.com\\\/corelanc0d3r\"],\"url\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/author\\\/admin0\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Juniper ScreenOS : defeating iBGP full mesh requirement using route reflectors and confederations - Corelan | Exploit Development &amp; Vulnerability Research","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.corelan.be\/index.php\/2009\/03\/22\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\/","og_locale":"en_US","og_type":"article","og_title":"Juniper ScreenOS : defeating iBGP full mesh requirement using route reflectors and confederations - Corelan | Exploit Development &amp; Vulnerability Research","og_description":"As explained in one of my earlier posts, one of the requirements to successfully setup and operate an iBGP configuration is that all iBGP clients need to have a BGP connection to all other iBGP clients. (= full mesh). This is required because an iBGP device only exchanges information about its own networks and it &hellip; Continue reading \"Juniper ScreenOS : defeating iBGP full mesh requirement using route reflectors and confederations\"","og_url":"https:\/\/www.corelan.be\/index.php\/2009\/03\/22\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\/","og_site_name":"Corelan | Exploit Development &amp; Vulnerability Research","article_publisher":"https:\/\/www.facebook.com\/corelanconsulting","article_published_time":"2009-03-22T12:14:46+00:00","author":"corelanc0d3r","twitter_card":"summary_large_image","twitter_creator":"@corelanc0d3r","twitter_site":"@corelanc0d3r","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.corelan.be\/index.php\/2009\/03\/22\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\/#article","isPartOf":{"@id":"https:\/\/www.corelan.be\/index.php\/2009\/03\/22\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\/"},"author":{"name":"corelanc0d3r","@id":"https:\/\/www.corelan.be\/#\/schema\/person\/3be5542b9b0a0787893db83a5ad68e8f"},"headline":"Juniper ScreenOS : defeating iBGP full mesh requirement using route reflectors and confederations","datePublished":"2009-03-22T12:14:46+00:00","mainEntityOfPage":{"@id":"https:\/\/www.corelan.be\/index.php\/2009\/03\/22\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\/"},"wordCount":1682,"publisher":{"@id":"https:\/\/www.corelan.be\/#organization"},"keywords":["networking","juniper netscreen screenos","routing","bgp","autonomous system","ios","Cisco","Linux and Unix"],"articleSection":["Juniper","Networking"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.corelan.be\/index.php\/2009\/03\/22\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\/","url":"https:\/\/www.corelan.be\/index.php\/2009\/03\/22\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\/","name":"Juniper ScreenOS : defeating iBGP full mesh requirement using route reflectors and confederations - Corelan | Exploit Development &amp; Vulnerability Research","isPartOf":{"@id":"https:\/\/www.corelan.be\/#website"},"datePublished":"2009-03-22T12:14:46+00:00","breadcrumb":{"@id":"https:\/\/www.corelan.be\/index.php\/2009\/03\/22\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.corelan.be\/index.php\/2009\/03\/22\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.corelan.be\/index.php\/2009\/03\/22\/juniper-screenos-defeating-ibgp-full-mesh-requirement-using-route-reflectors-and-confederations\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.corelan.be\/"},{"@type":"ListItem","position":2,"name":"Juniper ScreenOS : defeating iBGP full mesh requirement using route reflectors and confederations"}]},{"@type":"WebSite","@id":"https:\/\/www.corelan.be\/#website","url":"https:\/\/www.corelan.be\/","name":"Corelan CyberSecurity Research","description":"Corelan publishes in-depth tutorials on exploit development, Windows exploitation, vulnerability research, heap internals, reverse engineering and security tooling used by professionals worldwide.","publisher":{"@id":"https:\/\/www.corelan.be\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.corelan.be\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.corelan.be\/#organization","name":"Corelan CyberSecurity Research","url":"https:\/\/www.corelan.be\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.corelan.be\/#\/schema\/logo\/image\/","url":"https:\/\/www.corelan.be\/wp-content\/uploads\/2026\/03\/corelanlogo2_small-20.png","contentUrl":"https:\/\/www.corelan.be\/wp-content\/uploads\/2026\/03\/corelanlogo2_small-20.png","width":200,"height":200,"caption":"Corelan CyberSecurity Research"},"image":{"@id":"https:\/\/www.corelan.be\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/corelanconsulting","https:\/\/x.com\/corelanc0d3r","https:\/\/x.com\/corelanconsulting","https:\/\/instagram.com\/corelanconsult"]},{"@type":"Person","@id":"https:\/\/www.corelan.be\/#\/schema\/person\/3be5542b9b0a0787893db83a5ad68e8f","name":"corelanc0d3r","pronouns":"he\/him","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/3783bed6acd72d7fa5bb2387d88acbb9a3403e7cada60b2037e1cbb74ad451f9?s=96&d=mm&r=x","url":"https:\/\/secure.gravatar.com\/avatar\/3783bed6acd72d7fa5bb2387d88acbb9a3403e7cada60b2037e1cbb74ad451f9?s=96&d=mm&r=x","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3783bed6acd72d7fa5bb2387d88acbb9a3403e7cada60b2037e1cbb74ad451f9?s=96&d=mm&r=x","caption":"corelanc0d3r"},"description":"Peter Van Eeckhoutte is the founder of Corelan and a globally recognized expert in exploit development and vulnerability research. With over two decades in IT security, he built Corelan into a respected platform for deep technical research, hands-on training, and knowledge sharing. Known for his influential exploit development tutorials, tools, and real-world training, Peter combines a strong research mindset with a passion for education\u2014helping security professionals understand not just how exploits work, but why.","sameAs":["https:\/\/www.corelan-training.com","https:\/\/instagram.com\/corelanc0d3r","https:\/\/www.linkedin.com\/in\/petervaneeckhoutte\/","https:\/\/x.com\/corelanc0d3r"],"url":"https:\/\/www.corelan.be\/index.php\/author\/admin0\/"}]}},"views":6927,"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/posts\/1595","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/comments?post=1595"}],"version-history":[{"count":0,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/posts\/1595\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/media?parent=1595"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/categories?post=1595"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/tags?post=1595"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}