Pages

Monday, December 8, 2014

Connecting Mininet Hosts to Internet

While working on my project on open vswitch I had to connect mininet hosts to internet to enable some functionalities in mininet hosts. After working on it for two days, I came to realise that its just 4 easy steps. If you are struggling with the same here is the solution.

Step 1: Make sure that your guest OS ie mininet OS is connected to the internet.

In virtualbox network setting make sure that you have a NAT interface enabled that allows you to connect to internet. It will have an ip address like this : 10.0.3.15 ie a class A address
Test by pinging www.google.com to make sure you are connected to internet from the guest OS ie Mininet OS.




Step 2: Start the network

Start a mininet netowrk with a switch and a host or any topology you prefer.

sudo mn  --switch ovsk --mac --topo single,2

The above command creates a network with single switch and two hosts.
This will create a switch s1 and two hosts h1 and h2.

Step 3: Connect the guest interface(that connects to the internet) to the ovs bridge

The command used to achieve this is an ovs-vsctl command which is used for quering and configuring openvswitchd(this is a process of openvswitch).

Open an xterm window for s1 as this command does not run directly on mininet.For this you need to ssh the guest OS from the host OS. If you don't know how to do this, you can refer to my earlier post titled "Error: Cannot Connect to Display"

Check the openvswitch configuration using the command: ovs-vsctl show
My switch had the following configuration.

root@mininet-vm:~# ovs-vsctl show
d27a9060-3edf-4ee7-a4cf-09e705c93f56
    Bridge "s1"
        Controller "ptcp:6634"
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port "s1-eth1"
            Interface "s1-eth1"
        Port "s1-eth2"
            Interface "s1-eth2"
        Port "s1"
            Interface "s1"
                type: internal
    ovs_version: "2.0.1"

Now, run the following command to connect eth1 to s1: ovs-vsctl add-port s1 eth1

Check the configuration again using ovs-vsctl show. The new interface that is added has been highlighted in red.

root@mininet-vm:~# ovs-vsctl show
d27a9060-3edf-4ee7-a4cf-09e705c93f56
    Bridge "s1"
        Controller "ptcp:6634"
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port "eth1"
            Interface "eth1"
        Port "s1-eth1"
            Interface "s1-eth1"
        Port "s1-eth2"
            Interface "s1-eth2"
        Port "s1"
            Interface "s1"
                type: internal
    ovs_version: "2.0.1"

Step 4: Run dhclient on hosts.

Open  xterm windows for h1 and h2 and run the following commands. The first command removes the ip from h1-eth0,the second command gets the ip address for h1-eth0 from dhcp server. The second command shows the interface description.

root@mininet-vm:~# ifconfig h1-eth0 0
root@mininet-vm:~# dhclient h1-eth0
root@mininet-vm:~# ifconfig
h1-eth0   Link encap:Ethernet  HWaddr 00:00:00:00:00:01
          inet addr:10.0.3.16  Bcast:10.0.3.255  Mask:255.255.255.0
          inet6 addr: fe80::200:ff:fe00:1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:24 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3304 (3.3 KB)  TX bytes:1764 (1.7 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:1252 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1252 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:151432 (151.4 KB)  TX bytes:151432 (151.4 KB)

Now check the internet connectivity using ping.

root@mininet-vm:~# ping www.google.com
PING www.google.com (216.58.216.164) 56(84) bytes of data.
64 bytes from sea15s02-in-f4.1e100.net (216.58.216.164): icmp_seq=14 ttl=54 time=61.9 ms
64 bytes from sea15s02-in-f4.1e100.net (216.58.216.164): icmp_seq=15 ttl=54 time=60.7 ms
^C
--- www.google.com ping statistics ---
15 packets transmitted, 2 received, 86% packet loss, time 14065ms
rtt min/avg/max/mdev = 60.707/61.336/61.965/0.629 ms

Summary:

The command that we have used to achieve internet connectivity to hosts are:

ovs-vsctl add-port s1 eth1
ifconfig h1-eth0 0
dhclient h1-eth0

12 comments:

  1. This comment has been removed by the author.

    ReplyDelete
  2. i can ssh using the command putty.exe -ssh 192.168.56.102 but when after typing sudo mn i type xterm h1 an eror comes as cannot connect to display...plz suggest how to solve this

    ReplyDelete
  3. Hi
    Im new to mininet and sdn floodlight controller concepts.
    I could successfully connect with a single switch multiple hosts to INTERNET
    but when I’m creating multiple switches, multiple hosts connecting to INTERNET
    I see only the hosts connecting to 1st switch are able to ping to Internet, where as the hosts connected to other switches are not reachable.
    when I try to debug by sniffing the packets on the interface, I see that the all the traffic is passing through the first switch only where as I expected the other switches should push the packets to the controller.
    Am I missing something??

    ReplyDelete
  4. I followed above steps to get internet access from mininet host h1.Even after running dhclient on h1-eth0, it is not serving ip.

    ReplyDelete
    Replies
    1. It got ip in 10.0.3.x subnet but unable to access internet

      Delete
  5. If i press dhclient h1-eth0 it stucks..is there any problem? an how can i solve it?

    ReplyDelete
    Replies
    1. Many websites offer different advice, but I get stuck on the same command every time. "dhclient h1-eth0". It sticks and doesn't move. Do not know what to do.

      Delete
  6. Thank you for this tutorial. It worked perfectly for me.
    The problem that I have though is that while h1 and h2 can ping www.google.com, I don't seem to be able to ping the hosts from my laptop (which is also connected to the internet).
    When I do ping 10.0.2.17 (the IP of h2) from my laptop, 0% of the packets get received. When I ping my laptop from h2 though, it works great. Why is this a one way communication?

    ReplyDelete
  7. This works fine but to address the problem faced by Unknown above (March 1, 2017), add a second interface to the host i.e. h1-eth1 and follow the instructions above.

    Useful post.

    ReplyDelete
  8. Hi,
    Thank you for sharing useful Blog
    I would like to introduce one of Our Broadband Service Provider will give the best and high quality local www.airtelbroadbandschandigarh.com Chandigarh. With low cost if you need more details about Airtel broadband connection so please feel free to contact us.

    ReplyDelete

  9. airtelbroadbandchandigarh.co Airtel broadband Mohali providing free installation services with high speed internet connection.

    ReplyDelete
  10. Hello:
    "ovs-vsctl add-port s1 eth1"can not execute this command. error:"cannot create a port name eth1 because eth1 already exist on bridge s1"

    moreover if i do " ovs-vsctl show" I am getthing "port eth1- could not open network device eth1"



    ReplyDelete