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:
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
List current ns (none)
$ ip netns [list] $
Check for /var/run/netns/
.
$ 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 $
ip link set <device> netns <namespace>
So:
$ sudo ip link set enp0s20f0u5u1 netns ns1
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.
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.
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