ooooo        ooooo ooooo      ooo ooooo     ooo ooooooo  ooooo   .oooooo.   ooooooooo.   
     `888'        `888' `888b.     `8' `888'     `8'  `8888    d8'   d8P'  `Y8b  `888   `Y88. 
      888          888   8 `88b.    8   888       8     Y888..8P    888      888  888   .d88' 
      888          888   8   `88b.  8   888       8      `8888'     888      888  888ooo88P'  
      888          888   8     `88b.8   888       8     .8PY888.    888      888  888`88b.    
      888       o  888   8       `888   `88.    .8'    d8'  `888b   `88b    d88'  888  `88b.  
     o888ooooood8 o888o o8o        `8     `YbodP'    o888o  o88888o  `Y8bood8P'  o888o  o888o 

2016 - Linux NET Namespace - Prepojenie dvoch sieťových menných priestorov (ns1, ns2) - pomocou 2 párov veth adaptérov a distribuovaného prepínača OVS (openvswitch)

FILE: 2016-linuxnamespace-net-ns-veth-ovs-veth-ns.md
DATE: 11/2016
UPDATED:
AUTHOR: Ladislav Hajzer -> lala (at) linuxor (dot) sk
VERSION: 1

======================================================================================================================
 [1] NET namespace - Prepojenie dvoch sietovych mennych priestorov (ns1, ns2) - pomocou 2 parov veth adapterov a 
                     distribuovaneho prepinaca OVS (openvswitch)
======================================================================================================================

     +------------------+                 +-------------------------------+                 +------------------+
     | ns1        veth1 |======kabel======| veth1-ovs   ovs0    veth2-ovs |======kabel======| veth2        ns2 |
     +------------------+                 +-------------------------------+                 +------------------+
       namespace "ns1"                     hostitelsky system (openvswitch)                    namespace "ns2"

    Prvy  ethernet kabel (medzi mennym priestorom "ns1" a OVS prepinacom "ovs0"): veth1====veth1-ovs
    Druhy ethernet kabel (medzi mennym priestorom "ns2" a OVS prepinacom "ovs0"): veth2====veth2-ovs

    Na tieto testovacie scenare je pouzity RedHat Linux 7.3, ktory sice obsahuje modul jadra pre Openvswitch, ale
    uz neobsahuje uzivatelske nastroje pre administraciu openvswitch (ovs-vsctl). Tieto uzivatelske nastroje su
    obsiahnute v inych Redhat produktoch ako je napriklad Red Hat Openstack Platform a podobne. V tejto chvili nam
    neostava nic ine ako nainstalovat si Openvswitch zo zdrojovych suborov, vid. [1.0.X].

    [1.0.1] Pre uspesnu instalaciu distribuovaneho prepinaca Openvswitch je potrebne mat nastroje na kompilaciu a 
            kniznice, ktore Openvswitch vyuziva.
    ----------------------------------------------------------------------------------------------------------------
    # yum install gcc make python-devel openssl-devel kernel-devel graphviz kernel-debug-devel autoconf automake \
      rpm-build redhat-rpm-config libtool checkpolicy selinux-policy-devel python-six
    ----------------------------------------------------------------------------------------------------------------

    [1.0.2] - Vytvorime adresar pre build RPM balicka zo zdrojovych suborov a stiahneme aktualny zdrojovy balicek 
              pre Openvswitch.
    ----------------------------------------------------------------------------------------------------------------
    # mkdir -p /root/rpmbuild/SOURCES
    # cd /root/rpmbuild/SOURCES
    # wget http://openvswitch.org/releases/openvswitch-2.6.1.tar.gz
    ----------------------------------------------------------------------------------------------------------------

    [1.0.3] - Balicek so zdrojovymi subormi rozbalime a spustime kompilaciu a vytvorenie RPM balicka
              V adresari "/root/rpmbuild/RPMS/x86_64/" vzniknu RPM balicky pre Openvswitch
    ----------------------------------------------------------------------------------------------------------------
    # cd /root/rpmbuild/SOURCES/
    # tar -xvf ./openvswitch-2.6.1.tar.gz
    # sed 's/openvswitch-kmod, //g' openvswitch-2.6.1/rhel/openvswitch.spec > openvswitch-2.6.1/rhel/openvswitch_no_kmod.spec
    # rpmbuild -bb --nocheck openvswitch-2.6.1/rhel/openvswitch_no_kmod.spec
    ----------------------------------------------------------------------------------------------------------------

    [1.0.4] - Nainstalujeme RPM balicek s Openvswitch
    ----------------------------------------------------------------------------------------------------------------
    # cd /root/rpmbuild/RPMS/x86_64/
    # yum localinstall ./openvswitch-2.6.1-1.x86_64.rpm
    ----------------------------------------------------------------------------------------------------------------

    [1.1] - Odstranime (ak existuju) sietove menne priestory "ns1" a "ns2".
    [1.2] - Vytvorime dva ("ns1" a "ns2") sietove (NET) menne priestory.
    ----------------------------------------------------------------------------------------------------------------
    [1.1]# ip netns del ns1 &>/dev/null
    [1.1]# ip netns del ns2 &>/dev/null
    [1.2]# ip netns add ns1
    [1.2]# ip netns add ns2
    ----------------------------------------------------------------------------------------------------------------

    [1.3] - V hostitelskom systeme spustime Openvswitch a 
    [1.3] - vytvorime distribuovany (openvswitch) ethernet prepinac/bridge s menom "ovs0".
    ----------------------------------------------------------------------------------------------------------------
    [1.3]# /etc/init.d/openvswitch start
    [1.3]# ovs-vsctl add-br ovs0
    ----------------------------------------------------------------------------------------------------------------

    [1.4]TERM1 - V sietovom mennom priestore "ns1" spustime (exec) prikaz "bash".
    [1.5]TERM2 - V sietovom mennom priestore "ns2" spustime (exec) prikaz "bash".
    ----------------------------------------------------------------------------------------------------------------
    [1.4]TERM1# ip netns exec ns1 bash
    [1.5]TERM2# ip netns exec ns2 bash
    ----------------------------------------------------------------------------------------------------------------

    [1.6]  - Vytvorime par virtualnych Ethernet zariadeni, ktore budu predstavovat sietovy kabel s dvoma RJ45 
             koncovkami, pricom nasledne jednu stranu (veth1) umiestnime do menneho priestoru "ns1" a druhu stranu 
             (veth1-ovs) umiestnime do distribuovaneho ethernet prepinaca "ovs0".
    [1.7]  - Virtualny ethernet adapter "veth1" umiestnime do sietoveho menneho priestoru "ns1".
    [1.8]  - Virtualny ethernet adapter "veth1-ovs" pripojime do distribuovaneho ethernet prepinaca "ovs0".

    [1.9]  - Vytvorime par virtualnych Ethernet zariadeni, ktore budu predstavovat sietovy kabel s dvoma RJ45 
             koncovkami, pricom nasledne jednu stranu (veth2) umiestnime do menneho priestoru "ns2" a druhu stranu 
             (veth2-ovs) umiestnime do distribuovaneho ethernet prepinaca "ovs0".
    [1.10] - Virtualny ethernet adapter "veth2" umiestnime do sietoveho menneho priestoru "ns2".
    [1.11] - Virtualny ethernet adapter "veth2-ovs" pripojime do distribuovaneho ethernet prepinaca "ovs0".
    ----------------------------------------------------------------------------------------------------------------
    [1.6] # ip link add veth1 type veth peer name veth1-ovs
    [1.7] # ip link set veth1 netns ns1
    [1.8] # ovs-vsctl add-port ovs0 veth1-ovs

    [1.9] # ip link add veth2 type veth peer name veth2-ovs
    [1.10]# ip link set veth2 netns ns2
    [1.11]# ovs-vsctl add-port ovs0 veth2-ovs
    ----------------------------------------------------------------------------------------------------------------

    [1.12] - Zapneme sietovy adapter "veth1" v mennom priestore "ns1" a nastavime na nom IP adresu "10.0.0.1".
    [1.13] - Zapneme sietovy adapter/port "veth1-ovs" na distribuovanom prepinaci "ovs0".

    [1.14] - Zapneme sietovy adapter "veth2" v mennom priestore "ns2" a nastavime na nom IP adresu "10.0.0.2".
    [1.15] - Zapneme sietovy adapter/port "veth2-ovs" na distribuovanom prepinaci "ovs0".

    [1.16] - Zo sietoveho menneho priestoru "ns1" otestujeme sietovu komunikaciu so sietovym mennym priestorom "ns2".
    [1.17] - Zo sietoveho menneho priestoru "ns2" otestujeme sietovu komunikaciu so sietovym mennym priestorom "ns1".
    ----------------------------------------------------------------------------------------------------------------
    [1.12]# ip netns exec ns1 ifconfig veth1 10.0.0.1/24 up
    [1.13]# ip link set dev veth1-ovs up

    [1.14]# ip netns exec ns2 ifconfig veth2 10.0.0.2/24 up
    [1.15]# ip link set dev veth2-ovs up

    [1.16]# ip netns exec ns1 ping 10.0.0.2
    [1.17]# ip netns exec ns2 ping 10.0.0.1
    ----------------------------------------------------------------------------------------------------------------