Using Linux GRE tunnels to connect two Mininet networks
January 25, 2014 10 Comments
I’ve had a few posts about how to use Open vSwitch’s built in GRE tunnel support to connect two Mininet networks. As many that have tried to use my scripts, I’ve also found it a pain to get going. Sometimes it works, sometimes it doesn’t. Then I saw a post in the Mininet mailing list from Felix Wallaschek about how he uses Linux GRE tunnels to connect separate Mininet networks in a program he setup called Maxinet. I decided to take a look at how his application did it and try using that same method.
Below is an example of the commands to run on one of the systems running Mininet. You would need to setup this tunnel before you can bind it into your switch in Mininet using the Intf(name, node) method like the example in mininet/examples/hwintf.py.
sudo ip link add s1-gre1 type gretap remote 192.168.56.103 local 192.168.56.102 ttl 64 sudo ip link set dev s1-gre1 up
A few notes. I am using Ubuntu 12.04. The version of Open vSwitch that comes with this version of Ubuntu does not play nicely with the Linux GRE tunnels. But when I upgraded to Open vSwitch 2.0, everything worked much better. So below are the scripts that I had in my previous post, but changed to setup and use Linux GRE tunnels.
Script for VM1(192.168.56.102):
#!/usr/bin/python from mininet.net import Mininet from mininet.node import Controller, RemoteController, Node from mininet.cli import CLI from mininet.log import setLogLevel, info from mininet.link import Link, Intf def emptyNet(): NODE1_IP='192.168.56.102' NODE2_IP='192.168.56.103' CONTROLLER_IP='192.168.56.103' net = Mininet( topo=None, build=False) net.addController( 'c0', controller=RemoteController, ip=CONTROLLER_IP, port=6633) h1 = net.addHost( 'h1', ip='10.0.0.1' ) h2 = net.addHost( 'h2', ip='10.0.0.2' ) s1 = net.addSwitch( 's1' ) net.addLink( h1, s1 ) net.addLink( h2, s1 ) # Delete old tunnel if still exists s1.cmd('ip tun del s1-gre1') # Create GRE tunnel s1.cmd('ip li ad s1-gre1 type gretap local '+NODE1_IP+' remote '+NODE2_IP+' ttl 64') s1.cmd('ip li se dev s1-gre1 up') Intf( 's1-gre1', node=s1 ) net.start() CLI( net ) net.stop() if __name__ == '__main__': setLogLevel( 'info' ) emptyNet()
Script for VM2(192.168.56.103):
#!/usr/bin/python from mininet.net import Mininet from mininet.node import Controller, RemoteController from mininet.cli import CLI from mininet.log import setLogLevel, info from mininet.link import Link, Intf def emptyNet(): NODE1_IP='192.168.56.102' NODE2_IP='192.168.56.103' CONTROLLER_IP='192.168.56.103' net = Mininet( topo=None, build=False) net.addController( 'c0', controller=RemoteController, ip=CONTROLLER_IP, port=6633) h3 = net.addHost( 'h3', ip='10.0.0.3' ) h4 = net.addHost( 'h4', ip='10.0.0.4' ) s2 = net.addSwitch( 's2' ) net.addLink( h3, s2 ) net.addLink( h4, s2 ) # Delete old tunnel if still exists s2.cmd('ip tun del s2-gre1') # Create GRE tunnel s2.cmd('ip li ad s2-gre1 type gretap local '+NODE2_IP+' remote '+NODE1_IP+' ttl 64') s2.cmd('ip li se dev s2-gre1 up') Intf( 's2-gre1', node=s2 ) net.start() CLI( net ) net.stop() if __name__ == '__main__': setLogLevel( 'info' ) emptyNet()
I just run the above script on the appropriate VM and then test it. Below shows me having h1 on the VM1 Mininet ping h3 on the VM2 Mininet.
mininet> h1 ping -c 1 10.0.0.3 PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data. 64 bytes from 10.0.0.3: icmp_req=1 ttl=64 time=7.97 ms --- 10.0.0.3 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 7.972/7.972/7.972/0.000 ms
One other thing to note, the above is a point to point network. If you are going to have more than two Mininet networks, you will also need to add the ‘key’ parameter to tunnel creation command.
Thanks again Felix for showing us how to use Linux GRE tunnels with Mininet.
This post ‘Using Linux GRE tunnels to connect two Mininet networks’ first appeared on https://gregorygee.wordpress.com/.