Step 4. BGP Scenario with I-BGP over directly-connected BGP speakers¶
Goals¶
This step introduces Internal BGP (I-BGP). The topology consists of three Autonomous Systems: AS 64500 (RA), AS 64600 (RB), and AS 64700 (RC).
The key setup is as follows:
E-BGP sessions: RA4 <-> RB1 and RB2 <-> RC1.
I-BGP session: RB1 <-> RB2.
RB1 and RB2 are directly connected via their
eth1interfaces.
The goal is to demonstrate how I-BGP is used to carry routing information across
an AS. However, this step also highlights a common issue with I-BGP: the
NEXT_HOP attribute behavior.
Configuration¶
This step uses the following network:
network BGP_Topology_2
{
@display("bgb=1238.76,594.405");
submodules:
configurator: Ipv4NetworkConfigurator {
@display("p=93,44");
}
visualizer: IntegratedMultiCanvasVisualizer {
@display("p=243.2025,43.536247");
}
routingTableRecorder: RoutingTableRecorder {
@display("p=426,43");
}
pcapRecorder: PcapRecorder {
@display("p=636,42");
}
RB2: Router {
@display("p=699.3,174.825");
}
RC1: Router {
@display("p=872.46,392.94");
}
RC2: Router {
@display("p=964.035,344.655");
}
RC3: Router {
@display("p=964.035,444.555");
}
RB1: Router {
@display("p=491.175,174.825");
}
RA4: Router {
@display("p=349.79123,400.83374");
}
RA2: Router {
@display("p=244.70375,342.285");
}
RA3: Router {
@display("p=244.70375,442.86874");
}
RA1: Router {
@display("p=153.1275,393.32748");
}
RC4: Router {
@display("p=1048.95,392.94");
}
switch1: EthernetSwitch {
@display("p=54.045,391.82623");
}
switch2: EthernetSwitch {
@display("p=244.70375,250.70874");
}
switch3: EthernetSwitch {
@display("p=244.70375,534.445");
}
switch4: EthernetSwitch {
@display("p=964.035,246.42");
}
switch5: EthernetSwitch {
@display("p=964.035,527.805");
}
switch6: EthernetSwitch {
@display("p=1158.84,391.275");
}
host0: StandardHost {
@display("p=53.28,251.415");
}
host1: StandardHost {
@display("p=1158.84,261.405");
}
connections:
RC1.ethg++ <--> Eth100M <--> RC2.ethg++;
RC1.ethg++ <--> Eth100M <--> RC3.ethg++;
RB2.ethg++ <--> Eth100M <--> RC1.ethg++;
RB1.ethg++ <--> Eth100M <--> RA4.ethg++;
RA4.ethg++ <--> Eth100M <--> RA2.ethg++;
RA3.ethg++ <--> Eth100M <--> RA4.ethg++;
RA2.ethg++ <--> Eth100M <--> RA1.ethg++;
RA1.ethg++ <--> Eth100M <--> RA3.ethg++;
RC4.ethg++ <--> Eth100M <--> RC2.ethg++;
RC3.ethg++ <--> Eth100M <--> RC4.ethg++;
switch1.ethg++ <--> Eth100M <--> RA1.ethg++;
RA2.ethg++ <--> Eth100M <--> switch2.ethg++;
RA3.ethg++ <--> Eth100M <--> switch3.ethg++;
RC2.ethg++ <--> Eth100M <--> switch4.ethg++;
RC3.ethg++ <--> Eth100M <--> switch5.ethg++;
RC4.ethg++ <--> Eth100M <--> switch6.ethg++;
switch1.ethg++ <--> Eth100M <--> host0.ethg++;
switch6.ethg++ <--> Eth100M <--> host1.ethg++;
RB2.ethg++ <--> Eth100M <--> RB1.ethg++;
}
The configuration in omnetpp.ini is the following:
[Config Step4]
description = "BGP Scenario with I-BGP over directly-connected BGP speakers"
network = BGP_Topology_2
*.routingTableRecorder.logfile = "step4.rt"
*.pcapRecorder.pcapFile = "step4.pcap"
# adding default routes in RA4 and RC1 and ask OSPF to distribute it within the AS
*.configurator.config = xml("<config> \
<interface hosts='RA4' names='eth0' address='192.168.x.x' netmask='255.x.x.x'/> \
<interface hosts='RB1' names='eth0' address='192.168.x.x' netmask='255.x.x.x'/> \
\
<interface hosts='RB2' names='eth0' address='192.168.x.x' netmask='255.x.x.x'/> \
<interface hosts='RC1' names='eth2' address='192.168.x.x' netmask='255.x.x.x'/> \
\
<interface among='host0 RA*' address='10.x.x.x' netmask='255.x.x.x'/> \
<interface hosts='RA*' address='10.x.x.x' netmask='255.x.x.x'/> \
\
<interface among='RB1 RB2' address='20.x.x.x' netmask='255.x.x.x'/> \
\
<interface among='host1 RC*' address='30.x.x.x' netmask='255.x.x.x'/> \
<interface hosts='RC*' address='30.x.x.x' netmask='255.x.x.x'/> \
\
<route hosts='RA4' destination='*' netmask='0.0.0.0' interface='eth0' /> \
<route hosts='RC1' destination='*' netmask='0.0.0.0' interface='eth2' /> \
<route hosts='host*' destination='*' netmask='0.0.0.0' interface='eth0' /> \
</config>")
# OSPF configuration
*.RB{1,2}.hasOspf = false
*.R*.hasOspf = true
*.R*.ospf.ospfConfig = xmldoc("OSPFConfig_IBGP.xml")
*.RA4.ipv4.routingTable.routerId = "10.0.0.5"
*.RC1.ipv4.routingTable.routerId = "30.0.0.5"
# BGP configuration
*.RA4.hasBgp = true
*.RB1.hasBgp = true
*.RB2.hasBgp = true
*.RC1.hasBgp = true
*.R*.bgp.bgpConfig = xmldoc("BGPConfig_IBGP.xml")
# enable OSPF redistribution
*.RA4.bgp.redistributeOspf = "O IA"
*.RC1.bgp.redistributeOspf = "O IA"
The BGP configuration:
<?xml version="1.0" encoding="ISO-8859-1"?>
<BGPConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="BGP.xsd">
<TimerParams>
<connectRetryTime> 120 </connectRetryTime>
<holdTime> 180 </holdTime>
<keepAliveTime> 60 </keepAliveTime>
<startDelay> 60 </startDelay>
</TimerParams>
<AS id="64500">
<!--router RA4-->
<Router interAddr="10.0.0.1" />
</AS>
<AS id="64600">
<!--router RB1-->
<Router interAddr="20.0.0.2" >
<Network address='20.0.0.0' />
</Router>
<!--router RB2-->
<Router interAddr="20.0.0.1" >
<Network address='20.0.0.0' />
</Router>
</AS>
<AS id="64700">
<!--router RC1-->
<Router interAddr="30.0.0.1" />
</AS>
<!--bi-directional E-BGP session between RA4 and RB1-->
<Session id="1">
<Router exterAddr="192.168.0.6"/>
<Router exterAddr="192.168.0.5"/>
</Session>
<!--bi-directional E-BGP session between RB2 and RC1-->
<Session id="2">
<Router exterAddr="192.168.0.1"/>
<Router exterAddr="192.168.0.2"/>
</Session>
</BGPConfig>
Results¶
Running the simulation reveals an important BGP constraint. When an E-BGP router
(like RB1) learns a route and advertises it to an I-BGP peer (like RB2), it does
not change the NEXT_HOP attribute of the route by default.
Observations in step4.rt:
RB1 learns RA’s network (10.0.0.0/30) and correctly installs it with RA4 as the next hop.
RB1 passes this advertisement to RB2 via their I-BGP session.
RB2 receives the route but does not install it.
The reason for this is that the next hop for the RA routes remains RA4’s interface address (192.168.0.6). Since RB2 belongs to AS 64600 and has no interior route to the RA4-RB1 external subnet, the next hop is considered unreachable. For a BGP route to be installed in the IP routing table, its next hop must be resolvable via the existing routing table.
Sources: BGP_Topology_2.ned,
omnetpp.ini,
OSPFConfig_IBGP.xml,
BGPConfig_IBGP.xml
Discussion¶
Use this page in the GitHub issue tracker for commenting on this tutorial.