This is an old revision of the document!
Overview
How to use network namespaces and ip netns to tie two ports together in order to ping out one port and to the other.
Links:
man ip-netns
NAME
ip-netns - process network namespace management
SYNOPSIS
ip [ OPTIONS ] netns { COMMAND | help }
ip netns [ list ]
ip netns add NETNSNAME
ip [-all] netns del [ NETNSNAME ]
ip netns set NETNSNAME NETNSID
ip netns identify [ PID ]
ip netns pids NETNSNAME
ip [-all] netns exec [ NETNSNAME ] command...
ip netns monitor
ip netns list-id
Basics
List current ns (none)
$ ip netns [list] $
Check for /var/run/netns/.
Add and delete
$ sudo ip netns add ns1 $ sudo ip netns add ns1 $ ip netns list ns2 ns1 $
Also:
$ tree /var/run/netns /var/run/netns ├── ns1 └── ns2 0 directories, 2 files $
Assigning an interface to a namespace
ip link set <device> netns <namespace>
So:
$ sudo ip link set enp0s20f0u5u1 netns ns1
netdev mailing list
Andrew Lunn
Namespaces is a good solution. Something like this should work:
ip netns add ns1
ip netns add ns2
ip link set eth1 netns ns1
ip link set eth2 netns ns2
ip netns exec ns1 \
ip addr add 10.42.42.42/24 dev eth1
ip netns exec ns1 \
ip link set eth1 up
ip netns exec ns2 \
ip addr add 10.42.42.24/24 dev eth2
ip netns exec ns2 \
ip link set eth2 up
ip netns exec ns1 \
ping 10.42.42.24
You might also want to consider iperf3 for stress testing, depending
on the sort of stress you need.
Willy Tarreau
FWIW I have a setup somewhere involving ip rule + ip route which achieves the same without involving namespaces. It's a bit hackish but sometimes convenient. I can dig if someone is interested.
Roman Mashak
I used this in the past to test dual-port NIC over loopback cable, you
will need to ajust the script:
#!/bin/bash -x
ip="sudo $HOME/bin/ip"
eth1=192.168.2.100
eth2=192.168.2.101
dev1=eth1
dev2=eth2
dev1mac=00:1b:21:9b:24:b4
dev2mac=00:1b:21:9b:24:b5
# fake client interfaces and addresses
dev=dummy0
dev_mac=00:00:00:00:00:11
# max fake clients supported for simulation
maxusers=3
## Create dummy device
## Accepted parameters:
## $1 - devname
## $2 - devmac
## $3 - subnet (e.g. 10.10.10)
## $4 - max number of IP addresses to create on interface
setup_dummy()
{
# sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
# Enable tc hardware offload
# ethtool -K $SGW_DEV hw-tc-offload on
$ip link add $1 address $2 type dummy
$ip link set $1 up
for i in `seq 1 $4`;
do
$ip addr add $3.$i/32 dev $1
done
}
## Delete dummy device
## Accepted parameters:
## $1 - devname
delete_dummy()
{
$ip link del $1 type dummy
}
setup_network()
{
# Send traffic eth3 <-> eth4 over loopback cable, where both interfaces
# eth3 and eth4 are in the same subnet.
#
# We assume that NetworkManager is not running and eth3/eth4 are configured
# via /etc/network/interfaces:
#
# 192.168.1.100/32 dev eth3
# 192.168.1.101/32 dev eth4
#
# Specify source IP address when sending the traffic:
# ping -I 192.168.1.100 192.168.1.101
#
#
$ip neigh add $eth2 lladdr $dev2mac nud permanent dev $dev1
$ip neigh add $eth1 lladdr $dev1mac nud permanent dev $dev2
$ip route add table main $eth1 dev $dev2
$ip route add table main $eth2 dev $dev1
$ip rule add from all lookup local pref 100
$ip rule del pref 0
$ip rule add from $eth2 to $eth1 iif $dev1 lookup local pref 1
$ip rule add from $eth1 to $eth2 iif $dev2 lookup local pref 2
$ip rule add from $eth2 to $eth1 lookup main pref 3
$ip rule add from $eth1 to $eth2 lookup main pref 4
# $ip rule add from 10.10.10.0/24 to $eth1 iif $dev1 lookup local pref 5
# $ip rule add from 10.10.10.0/24 to $eth2 iif $dev2 lookup local pref 6
# $ip rule add from $eth1 to 10.10.10.0/24 iif $dev2 lookup local pref 7
# $ip rule add from $eth2 to 10.10.10.0/24 iif $dev1 lookup local pref 8
}
restore_network()
{
# FIX: hangs connections
$ip rule flush
$ip rule add priority 32767 lookup default
}
#delete_dummy dummy0
#delete_dummy dummy1
#setup_dummy dummy0 00:00:00:00:00:11 10.10.10 3
#setup_dummy dummy1 00:00:00:00:00:22 20.20.20 3
setup_network