Static routing vs Dynamic Routing (Quagga: RIPv2)

[topology]

p.s.

1. In ubuntu, you can use “sudo apt-get install traceroute” to install traceroute.

2. In dynamic routing, r1, r2, r3 is a docker node (So you need to use Containernet to run this example) Use “docker pull kathara/quagga” to download the quagga image for r1,r2,and r3.

 

[Static routing]

#!/usr/bin/env python

 

from containernet.cli import CLI

from containernet.link import TCLink,Link

from containernet.net import Containernet

 

if '__main__' == __name__:

  net = Containernet(link=TCLink)

  h1 = net.addHost('h1')

  h2 = net.addHost('h2')

  r1 = net.addHost('r1')

  r2 = net.addHost('r2')

  r3 = net.addHost('r3')

  Link(h1, r1)

  Link(h2, r2)

  Link(r1, r2)

  Link(r1, r3)

  Link(r2, r3)

  net.build()

 

  r1.cmd("echo 1 > /proc/sys/net/ipv4/ip_forward")

  r2.cmd("echo 1 > /proc/sys/net/ipv4/ip_forward")

  r3.cmd("echo 1 > /proc/sys/net/ipv4/ip_forward")

  r1.cmd("ifconfig r1-eth0 0")

  r1.cmd("ifconfig r1-eth1 0")

  r1.cmd("ifconfig r1-eth2 0")

  r2.cmd("ifconfig r2-eth0 0")

  r2.cmd("ifconfig r2-eth1 0")

  r2.cmd("ifconfig r2-eth2 0")

  r3.cmd("ifconfig r3-eth0 0")

  r3.cmd("ifconfig r3-eth1 0")

  r1.cmd("ip addr add 192.168.1.254/24 brd + dev r1-eth0")

  r1.cmd("ip addr add 12.1.1.1/24 brd + dev r1-eth1")

  r1.cmd("ip addr add 13.1.1.1/24 brd + dev r1-eth2")

  r2.cmd("ip addr add 192.168.2.254/24 brd + dev r2-eth0")

  r2.cmd("ip addr add 12.1.1.2/24 brd + dev r2-eth1")

  r2.cmd("ip addr add 23.1.1.2/24 brd + dev r2-eth2")

  r3.cmd("ip addr add 13.1.1.3/24 brd + dev r3-eth0")

  r3.cmd("ip addr add 23.1.1.3/24 brd + dev r3-eth1")

  r1.cmd("ip route add 192.168.2.0/24 via 12.1.1.2")

  r2.cmd("ip route add 192.168.1.0/24 via 12.1.1.1")

 

  h1.cmd("ifconfig h1-eth0 0")

  h1.cmd("ip address add 192.168.1.1/24 dev h1-eth0")

  h1.cmd("ip route add default via 192.168.1.254 dev h1-eth0")

  h2.cmd("ifconfig h2-eth0 0")

  h2.cmd("ip address add 192.168.2.1/24 dev h2-eth0")

  h2.cmd("ip route add default via 192.168.2.254 dev h2-eth0")

  CLI(net)

  net.stop()

 

[Dynamic Routing]

#!/usr/bin/env python

 

from containernet.cli import CLI

from containernet.link import TCLink,Link

from containernet.net import Containernet

 

if '__main__' == __name__:

  net = Containernet(link=TCLink)

  h1 = net.addHost('h1')

  h2 = net.addHost('h2')

  r1 = net.addDocker('r1', dimage="kathara/quagga:latest")

  r2 = net.addDocker('r2', dimage="kathara/quagga:latest")

  r3 = net.addDocker('r3', dimage="kathara/quagga:latest")

  Link(h1, r1)

  Link(h2, r2)

  Link(r1, r2)

  Link(r1, r3)

  Link(r2, r3)

  net.build()

 

  r1.cmd("ifconfig r1-eth0 0")

  r1.cmd("ifconfig r1-eth1 0")

  r1.cmd("ifconfig r1-eth2 0")

  r2.cmd("ifconfig r2-eth0 0")

  r2.cmd("ifconfig r2-eth1 0")

  r2.cmd("ifconfig r2-eth2 0")

  r3.cmd("ifconfig r3-eth0 0")

  r3.cmd("ifconfig r3-eth1 0")

  r1.cmd("ip addr add 192.168.1.254/24 brd + dev r1-eth0")

  r1.cmd("ip addr add 12.1.1.1/24 brd + dev r1-eth1")

  r1.cmd("ip addr add 13.1.1.1/24 brd + dev r1-eth2")

  r2.cmd("ip addr add 192.168.2.254/24 brd + dev r2-eth0")

  r2.cmd("ip addr add 12.1.1.2/24 brd + dev r2-eth1")

  r2.cmd("ip addr add 23.1.1.2/24 brd + dev r2-eth2")

  r3.cmd("ip addr add 13.1.1.3/24 brd + dev r3-eth0")

  r3.cmd("ip addr add 23.1.1.3/24 brd + dev r3-eth1")

 

  h1.cmd("ifconfig h1-eth0 0")

  h1.cmd("ip address add 192.168.1.1/24 dev h1-eth0")

  h1.cmd("ip route add default via 192.168.1.254 dev h1-eth0")

  h2.cmd("ifconfig h2-eth0 0")

  h2.cmd("ip address add 192.168.2.1/24 dev h2-eth0")

  h2.cmd("ip route add default via 192.168.2.254 dev h2-eth0")

  CLI(net)

  net.stop()

 

[Execution]

(static routing)

 

(dynamic routing: ripv2)

Run the script

 

Open three terminals for r1, r2, and r3.

 

Modiy the /etc/quagga/daemons for r1, r2, and r3 (the same setting for r2 and r3)

 

Modify the /etc/quagga/zebra.conf for r1, r2, and r3

 

 

Modify the /etc/quagga/ripd.conf for r1, r2, and r3

 

 

 

Start the quagga daemon for r1,r2, and r3

 

You can log in to r1 to show the ip routing tables. (password is “zebra”)   From the following figure, we can see that r1 can learn 192.168.2.0/24 and23.1.1.0/24 through RIPv2.

 

Ping and traceroute test

 

 

Dr. Chih-Heng Ke (smallko@gmail.com)

Department of Computer Science and Information Engineering,

National Quemoy University, Kinmen, Taiwan.