Linux - NETNS

This Bash script creates three separate Linux network namespaces (instance1, instance2, and instance3), assigns a specific physical interface to each, configures their IPv4/IPv6 addresses and default routes, and sets custom DNS resolvers for each namespace.

/usr/local/share/instances-netns.sh
#!/bin/bash
ip netns add instance1
ip link set enp5s0 netns instance1
ip netns exec instance1 ip link set enp5s0 up
ip netns exec instance1 ip -4 addr add 192.168.1.63/31 dev enp5s0
ip netns exec instance1 ip -4 route add 0.0.0.0/0 via 192.168.1.62 dev enp5s0
ip netns exec instance1 ip -6 addr add 2001:db8:742:c01:151:8888:0:a/96 dev enp5s0
ip netns exec instance1 ip -6 route add ::/0 via 2001:db8:742:c01:151:8888:0:1 dev enp5s0
mkdir -p /etc/netns/instance1
echo -e "nameserver 8.8.8.8\nnameserver 8.8.4.4" | sudo tee /etc/netns/instance1/resolv.conf > /dev/null

ip netns add instance2
ip link set enp6s0 netns instance2
ip netns exec instance2 ip link set enp6s0 up
ip netns exec instance2 ip -4 addr add 192.168.1.65/31 dev enp6s0
ip netns exec instance2 ip -4 route add 0.0.0.0/0 via 192.168.1.64 dev enp6s0
ip netns exec instance2 ip -6 addr add 2001:db8:742:c01:152:8888:0:a/96 dev enp6s0
ip netns exec instance2 ip -6 route add ::/0 via 2001:db8:742:c01:152:8888:0:1 dev enp6s0
mkdir -p /etc/netns/instance2
echo -e "nameserver 8.8.8.8\nnameserver 8.8.4.4" | sudo tee /etc/netns/instance2/resolv.conf > /dev/null


ip netns add instance3
ip link set enp7s0 netns instance3
ip netns exec instance3 ip link set enp7s0 up
ip netns exec instance3 ip -4 addr add 192.168.1.67/31 dev enp7s0
ip netns exec instance3 ip -4 route add 0.0.0.0/0 via 192.168.1.66 dev enp7s0
ip netns exec instance3 ip -6 addr add 2001:db8:742:c01:153:8888:0:a/96 dev enp7s0
ip netns exec instance3 ip -6 route add ::/0 via 2001:db8:742:c01:153:8888:0:1 dev enp7s0
mkdir -p /etc/netns/instance3
echo -e "nameserver 8.8.8.8\nnameserver 8.8.4.4" | sudo tee /etc/netns/instance3/resolv.conf > /dev/null


This Bash script displays the network interface details, IPv4/IPv6 addresses, and routing tables for three network namespaces (instance1, instance2, and instance3) in a formatted, sectioned output.

show-netns-settings.sh
#!/bin/bash
echo " "
echo "#################instance1#################"
sudo ip netns exec instance1 ip link show
echo " "
sudo ip netns exec instance1 ip -4 addr show
echo " "
sudo ip netns exec instance1 ip -4 route show
echo " "
sudo ip netns exec instance1 ip -6 addr show
echo " "
sudo ip netns exec instance1 ip -6 route show
echo "################################################"
echo " "
echo " "
echo "#################instance2#################"
sudo ip netns exec instance2 ip link show
echo " "
sudo ip netns exec instance2 ip -4 addr show
echo " "
sudo ip netns exec instance2 ip -4 route show
echo " "
sudo ip netns exec instance2 ip -6 addr show
echo " "
sudo ip netns exec instance2 ip -6 route show
echo "################################################"
echo " "
echo " "
echo "#################instance3#################"
sudo ip netns exec instance3 ip link show
echo " "
sudo ip netns exec instance3 ip -4 addr show
echo " "
sudo ip netns exec instance3 ip -4 route show
echo " "
sudo ip netns exec instance3 ip -6 addr show
echo " "
sudo ip netns exec instance3 ip -6 route show
echo "################################################"


This script opens firefox-esr in three different network namespaces (instance1, instance2, instance3), each using its own browser profile and with proxy settings disabled.

netns-firefox.sh
#####Note that it isn't compatible with Firefox snap version. The firefox-esr must be installed.#####
sudo /usr/sbin/ip netns exec instance1 env http_proxy="" https_proxy="" \
sudo -u $USER \
env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY firefox-esr --new-instance --profile $HOME/.mozilla/instance1

sudo /usr/sbin/ip netns exec instance2 env http_proxy="" https_proxy="" \
sudo -u $USER \
env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY firefox-esr --new-instance --profile $HOME/.mozilla/instance2

sudo /usr/sbin/ip netns exec instance3 env http_proxy="" https_proxy="" \
sudo -u $USER \
env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY firefox-esr --new-instance --profile $HOME/.mozilla/instance3


This script runs speedtest-cli inside three network namespaces (instance1, instance2, instance3) with proxy variables cleared, allowing separate network speed tests for each namespace.

netns-speedtest.sh
#!/bin/bash
sudo /usr/sbin/ip netns exec instance1 env http_proxy="" https_proxy="" \
sudo -u $USER \ speedtest-cli

sudo /usr/sbin/ip netns exec instance2 env http_proxy="" https_proxy="" \
sudo -u $USER \ speedtest-cli

sudo /usr/sbin/ip netns exec instance3 env http_proxy="" https_proxy="" \
sudo -u $USER \ speedtest-cli


This systemd unit file defines a one-shot service that runs the /usr/local/share/instances-netns.sh script at boot after the network is up and remains marked active after execution.

/etc/systemd/system/instances-netns.service
[Unit]
Description=Run CPE Netns Script at Boot
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/share/instances-netns.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target


These commands reload systemd to recognize new or changed units, enable the instances-netns.service to start at boot, and start the service immediately.

Activate the new service
sudo systemctl daemon-reload
sudo systemctl enable instances-netns.service
sudo systemctl start instances-netns.service