netns
24/12/2018A network namespace is logically copy of the network stack, with its own routes, firewall rules, and network devices.
commands
# 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