netns

A network namespace is logically copy of the network stack, with its own routes, firewall rules, and network devices.


Commandes


# les interfaces
$ sudo ip link add toto type dummy

# les liensn veth: virtual ethernet, 2 extrémités veth et veth peer
$ sudo ip link add veth0 type veth peer name veth1

# les switches
$ sudo ovs-vsctl add-br mon_switch
$ sudo ovs-vsctl add-port mon_switch veth1

# le routeur
$ sudo sysctl -w net.ipv4.conf.all.forwarding=1 # activer fonction de routage
$ sudo iptables -t net -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE # firewall pour activer le NAT

Création h1———switch—h2

# passe en administrateur
sudo -s

# créer les namespaces pour les hôtes
ip netns add h1
ip netns add h2

# créer le switch
ovs-vsctl add-br s1 #1

# créer les liens
ip link add h1-eth0 type veth peer name s1-h1 
ip link add h2-eth0 type veth peer name s1-h2
ip link show #3

# accrocher les liens aux namespaces
ip link set h1-eth0 netns h1
ip link set h2-eth0 netns h2

# afficher le lien depuis le namespace
ip netns exec h1 ip link show #4
ip netns exec h2 ip link show

# connecter les liens au switch
ovs-vsctl add-port s1 s1-h1 #2
ovs-vsctl add-port s1 s1-h2
ovs-vsctl show

# activer les interfaces du namespace root #5
ip link set dev s1-h1 up
ip link set dev s1-h2 up

# activer les interfaces  des namespaces h1 et h2 #6
ip netns exec h1 ip link set dev h1-eth0 up
ip netns exec h2 ip link set dev h2-eth0 up
# changer adresse MAC d'une interface
$ sudo ip link set dev eth0 address 01:02:03:04:05:06

Vérification de la config. du switch, couche niveau 2, link layer

$ sudo ovs-ofctl show s1
$ sudo ovs-vsctl show

Config de la couche 3, network

# config IP pour h1 et h2
$ sudo ip netns exec h1 ip addr add dev h1-eth0 10.0.0.1/24
$ sudo ip netns exec h2 ip addr add dev h2-eth0 10.0.0.2/24

# tester
$ sudo ip netns exec h2 ping -c 1 10.0.0.1

# écoute trafique directement sur interface d'un netns
$ sudo tcpdump -l -i s1-h1

# changer prompt et indique le netns du shell courant
$ cat change_prompt
INTERFACE=$(ip l | awk -F"[ -]" '/eth0/ { print "[" $2 "]" }')
PS1="$INTERFACE$PS1"
#PS1="h1:\w "

$ source change_prompt
[h1]root@cube:~#

Aller plus loin dans les netns

# remplacer fichier de conf dans un netns, ex: resolv.conf
$ mount --bind /home/rezo/resolv.conf /etc/resolv.conf

$ more /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
# Ne marche que pour le shell qui a exécuté la commande : une fois le shell fermé le point de montage n’existe plus.
# utiliser un shell dans un netns
$ ip netns exec h2 sudo -u pef bash
#!/bin/bash
# conf example
# create namespaces
ip netns add h1
ip netns add h2
ip netns add r1

# create switch 
ovs-vsctl add-br s1 
ovs-vsctl add-br s2

# create link
ip link add h1-eth0 type veth peer name s1-h1
ip link add h2-eth0 type veth peer name s2-h2

ip link add r1-eth0 type veth peer name s1-r1
ip link add r1-eth1 type veth peer name internet-r1

# connect links to namespaces
ip link set h1-eth0 netns h1
ip link set h2-eth0 netns h2
ip link set r1-eth0 netns r1
ip link set r1-eth1 netns r1

# connect switch link
ovs-vsctl add-port s1 s1-h1 
ovs-vsctl add-port s1 s1-r1
ovs-vsctl add-port s2 s2-h2 
ovs-vsctl add-port s2 s2-r2

# enable root namespace interfaces
ip link set dev s1-h1 up
ip link set dev s2-h2 up
ip link set dev s1-r1 up
ip link set dev s2-r1 up

# enable interfaces of h1 and h2 
ip netns exec h1 ip link set dev h1-eth0 up
ip netns exec h2 ip link set dev h2-eth0 up
ip netns exec h1 ip link set dev lo up
ip netns exec h2 ip link set dev lo up

# enable interfaces of r1
ip netns exec r1 ip link set dev r1-eth0 up
ip netns exec r1 ip link set dev r1-eth1 up
ip netns exec r1 ip link set dev lo up

# configure s1 and s2 network
ip netns exec r1 ip addr add dev r1-eth0 192.168.10.254/24
ip netns exec h1 ip addr add dev h1-eth0 192.168.10.1/24
ip netns exec r1 ip a add dev r1-eth1 10.0.0.1/24
ip netns exec h2 ip addr add dev h2-eth0 10.0.0.126/24

# configur r1 routes
ip netns exec r1 ip r add 192.168.20.0/24 via 10.0.0.2

# configur default route on h1 and h2
ip netns exec h1 ip r add default via 192.168.10.254
ip netns exec h2 ip r add default via 192.168.20.254

# enable forwarding in r1
ip netns exec r1 sudo sysctl net.ipv4.conf.all.forwarding=1

##############################

# display all netns
$ sudo ip --all netns

# execute cmd in h1 netns
$ sudo ip netns exec h1 ip link

# start bash with root user in h1 netns
$ sudo ip netns exec h1 bash

# start bash with adel user in h1 netns
$ sudo ip netns exec h1 sudo -u adel bash

# know mac address
$ sudo ip neighbor

# launch tcp server socket
$ socat tcp-listen:6789 -

# connect to tcp socket
$ socat - tcp:10.0.0.12:6789

# show tcp streams
$ conntrack -L

# exec app in netns
$ sudo ip netns exec h1 firefox
$ sudo ip netns exec h1 sudo -u adel firefox

# debit test
$ iperf -s # start server
$ iperf -c 10.0.0.12 # test

# start dnsmasq, dhcp server on netork
$ dnsmasq -d -z -i eth0 -F 192.168.10.100,192.168.10.150,255.255.255.0

# client
$ dhclient
# obtient, addr ip, prefixe, et route pa défaut passant par le routeur