Connecting two Mininet networks with GRE tunnel – Part 2

Update: Find another post about how I used Linux GRE tunnels to do the same.

—-

This is a followup to an older post about connecting two MiniNet sessions with a GRE tunnel. I’ve made up some new scripts to help test the functionality plus I’ll provide a little more information on checking if the GRE tunnel is actually registered. The one problem I have run into a few times using Open vSwitch was trying to get the GRE tunnel interface on each switch to register with the controller. If it doesn’t register, then you aren’t going to see any traffic flow across. For this example, both MiniNet sessions will connect to a remote controller. This will also help show if the GRE registered.

The following in the MiniNet python script that you will run on the your first VM.

#!/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

def emptyNet():

    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 )
    net.start()

    # Configure the GRE tunnel
    s1.cmd('ovs-vsctl add-port s1 s1-gre1 -- set interface s1-gre1 type=gre options:remote_ip='+NODE2_IP)
    s1.cmdPrint('ovs-vsctl show')

    CLI( net )
    net.stop()

if __name__ == '__main__':
    setLogLevel( 'info' )
    emptyNet()

This next MiniNet python script will be run on another VM.

#!/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

def emptyNet():

    NODE1_IP='192.168.56.102'
    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 )
    net.start()

    # Configure the GRE tunnel
    s2.cmd('ovs-vsctl add-port s2 s2-gre1 -- set interface s2-gre1 type=gre options:remote_ip='+NODE1_IP)
    s2.cmdPrint('ovs-vsctl show')

    CLI( net )
    net.stop()

if __name__ == '__main__':
    setLogLevel( 'info' )
    emptyNet()

You will need to modify the scripts to set the IP addresses at the top to the appropriate values for your environment. Once the scripts are ready, we’ll start them up. Don’t worry about the message about not being able to contact the controller. We’ll start it up after. Also, I’ve configured the scripts to automatically create the GRE tunnel to the other MiniNets.

On VM1.

mininet@mininet21:~$ sudo ./greTest-1.py
Unable to contact the remote controller at 192.168.56.103:6633
*** Configuring hosts
h1 h2
*** Starting controller
*** Starting 1 switches
s1
*** s1 : ('ovs-vsctl show',)
007a537b-9138-4ee9-b0dd-77182c3b4cea
    Bridge "s1"
        Controller "tcp:192.168.56.103:6633"
        fail_mode: secure
        Port "s1-eth1"
            Interface "s1-eth1"
        Port "s1-eth2"
            Interface "s1-eth2"
        Port "s1-gre1"
            Interface "s1-gre1"
                type: gre
                options: {remote_ip="192.168.56.103"}
        Port "s1"
            Interface "s1"
                type: internal
    ovs_version: "1.4.0+build0"
*** Starting CLI:
mininet>

On VM2:

mininet@mininet21:~$ sudo ./greTest-2.py
*** Configuring hosts
h3 h4
*** Starting controller
*** Starting 1 switches
s2
*** s2 : ('ovs-vsctl show',)
ef39063c-46be-44e3-b89c-faaf7ffcf351
    Bridge "s2"
        Controller "tcp:192.168.56.103:6633"
        fail_mode: secure
        Port "s2-gre1"
            Interface "s2-gre1"
                type: gre
                options: {remote_ip="192.168.56.102"}
        Port "s2-eth1"
            Interface "s2-eth1"
        Port "s2-eth2"
            Interface "s2-eth2"
        Port "s2"
            Interface "s2"
                type: internal
    ovs_version: "1.4.0+build0"
*** Starting CLI:
mininet>

Now start the controller. For this test, I’m just going to use the OpenFlow reference controller.

mininet@mininet21:~$ controller -v ptcp:6633

The above will start printing a lot of messages as soon at the switches start connecting to the controller. But here is where you want to watch closely as the switches register. You want to look for the following message.

Jan 20 21:24:10|00009|vconn|DBG|tcp:192.168.56.102:41173: received: features_reply (xid=0x9ba82531): ver:0x1, dpid:1
n_tables:255, n_buffers:256
features: capabilities:0xc7, actions:0xfff
 1(s1-eth1): addr:ca:06:71:62:79:85, config: 0, state:0
     current:    10GB-FD COPPER
 2(s1-eth2): addr:72:89:9d:be:6f:1f, config: 0, state:0
     current:    10GB-FD COPPER
 3(s1-gre1): addr:fe:d4:30:b3:b9:e0, config: 0, state:0
 LOCAL(s1): addr:9a:a3:5c:e3:01:40, config: 0x1, state:0x1

Jan 20 21:24:11|00017|vconn|DBG|tcp:192.168.56.103:36309: received: features_reply (xid=0x9a4c5b0d): ver:0x1, dpid:2
n_tables:255, n_buffers:256
features: capabilities:0xc7, actions:0xfff
 1(s2-eth1): addr:72:52:76:ea:d6:90, config: 0, state:0
     current:    10GB-FD COPPER
 2(s2-eth2): addr:d2:80:1b:4b:89:43, config: 0, state:0
     current:    10GB-FD COPPER
 3(s2-gre1): addr:6e:ad:4b:5c:e6:be, config: 0, state:0
 LOCAL(s2): addr:ae:49:99:96:c7:4e, config: 0x1, state:0x1

The above two messages that got printed out are what is important. Make sure you see your GRE interface listed for each switch. If it isn’t there, then something is wrong with your configuration or with the Open vSwitch that you have installed. If all looks good, then the last step is to verify with some traffic.

In MiniNet on VM1:

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=0.613 ms

--- 10.0.0.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.613/0.613/0.613/0.000 ms

There you go. I sent a ping from h1 on VM1 to h3 on VM2 over the GRE tunnel. In the above example I use the reference controller. You can use whatever controller you wish and it might give you more details on the interfaces and connection. Just update the CONTROLLER_IP with the IP address where your controller is running.

Hope these new scripts and extra info help you in your journey.

This post ‘Connecting two Mininet networks with GRE tunnel – Part 2’ first appeared on https://gregorygee.wordpress.com/.

MiniEdit 2.1.0.7

This is a quick small release.  It contains a bug fix and a feature that I originally dropped from the last release.

  • Bug fix in the Export not exporting controller information correctly.
  • You can import one of the MiniNet named topologies on startup.
    • sudo ./miniedit-2.1.0.7.py --topo linear,3
  • You can import a custom topology on startup.
    • sudo ./miniedit-2.1.0.7.py --custom mininet/custom/topo-2sw-2host.py --topo mytopo

Be warned that the import of the topology is pretty crude and will be limiting.  I don’t have any fancy auto layout features to nicely place icons on the screen.  Currently, I just create rows of icons.  You will need to lay them out yourself.  If someone knows of some python code that can do this autolayout, I’d be glad to hear from you.

Download MiniEdit 2.1.0.7 here.

MiniEdit 2.1.0.6

Another week, another MiniEdit drop.  One main thing is that you should be able to run this against MiniNet 2.0 now without modifying the code.  I’ve had some emails related to this.  The full feature list is below.

  • Supports running against MiniNet 2.0 systems.
  • Enable sFlow reporting.
  • Enable NetFlow reporting.
  • Bug fix in canvas scrollbar not increasing when dragging node off canvas

For sFlow and NetFlow reporting, you setup your profiles in the application preferences and then just enable sFlow and/or NetFlow on each individual switch that you want to use it for.

flow collector

If you want to try it out, I’ve been testing with these free/limited versions of collectors.

http://www.solarwinds.com/products/freetools/netflow-analyzer.aspx
http://www.inmon.com/products/sFlowTrend.php

If there are an features you’d like to see, please leave some feedback.  In a way, I’m running out of ideas for good features.  I’m sure there are some out there.

Download MiniEdit 2.1.0.6 here.