lets say you want to run some performance benchmarks between two local network interfaces on a linux machine. if you assign an ip address to each of them and then run your benchmarks, your traffic will not go ghrough the cable but will be routed locally. It does not help to specify a listening interface or anything, you can also play with routes etc. you traffic will still be routed locally.
earlyer on the only solution was a rather complex setup with iptables and nat and then keeping both your interfaces in a different subnet in order to force traffic through the cable. however, now that we have the
ip command we can do this using namespaces.
once a namespace is assigned to a network interface, your regular tools won't see it anymore.
ip link will not list it anymore, it is only accessible if you prefix your command with
ip netns exec <namespace> <command>. so
ip netns exec mynamespace ip link will show your interfaces in
mynamepsace which are otherwise not visible.
so let's use this to our advantage to run our benchmark. Our two netowrk interfaces are
eth5 they are connected throught a direct link between them:
first we create the namespace:
ip netns add ns_server ip netns add ns_client
now we assign each interface to its namespace
ip link set eth1 netns ns_server ip link set eth5 netns ns_client
now it's time to assign an ip to each interface. the two IP's should be in the same subnet.
ip netns exec ns_server ip addr add dev eth1 10.0.0.1/24 ip netns exec ns_server ip link set dev eth1 up ip netns exec ns_client ip addr add dev eth5 10.0.0.2/24 ip netns exec ns_client ip link set dev eth5 up
you will now see that
eth5 disappeared from your system. they can only be used via the ip namespace command. so let create some traffic and see if the traffic really goes across the network:
in one terminal start:
ip netns exec ns_server nc -l 1234 > /dev/null
in the second start:
ip netns exec ns_client nc 10.0.0.1 1234 < /dev/zero
in a third terminal, use some tool like
ethtool -S or in my case
iftop to see if traffic is going across our interface.
ip netns exec ns_server iftop
you should see your full bandwidth being used by the one netcat process in
or you can run
iperf if thats available to you to stress-test your network card with parallel transfers etc.:
ip netns exec ns_server iperf -s
and for the client:
ip netns exec ns_client iperf -c 10.0.0.1 -d -P 20 -t 99999
-d uses bidirectional transfers,
-P 20 runs 20 processes in parallel and
-t 99999 runs for 99999 seconds
once you are done, simply run
ip netns del ns_server ip netns del ns_client
and all your settings including the ip addresses etc. are gone. your interfaces will be back in the default namespace