Skip to content

Instantly share code, notes, and snippets.

@zimmcl
Last active June 24, 2020 10:00
Show Gist options
  • Save zimmcl/66db05182e47bdbf4f3aaad8cf2052c9 to your computer and use it in GitHub Desktop.
Save zimmcl/66db05182e47bdbf4f3aaad8cf2052c9 to your computer and use it in GitHub Desktop.
IPv4 NETWORK TOPOLOGY IN LINUX NAMESPACES
#!/usr/bin/env bash
EXIT_OK=0
ARG=$1
autor()
{
echo -e "\n\e[1m\e[34m === IPv4 NETWORK TOPOLOGY IN LINUX NAMESPACES ===\e[22m\e[24m\e[39m\n"
echo -e " Original Author: \e[1mTOMATTIS Natasha\e[22m\e[24m."
echo -e " https://gist.github.com/natitomattis/be26889063203c0b33b33fa25c75a5b6"
echo -e " Editing By: \e[1mZIMMEL Ezequiel\e[22m\e[24m."
echo -e " https://gist.github.com/zimmcl/66db05182e47bdbf4f3aaad8cf2052c9"
}
#Show options
show_options()
{
echo -e "\n Opciones:"
echo -e " -h List of options"
echo -e " -c Network topology configuration"
echo -e " -r Clean set up environment"
}
# Create resources
create_resources()
{
echo -e "\e[1m\e[32mCreating network namespace resources\e[22m\e[24m\e[39m"
ip netns add h1
ip netns add h2
ip netns add h3
ip netns add r1
ip netns add dhcp_server
ip netns ls
echo -e "\e[1m\e[32mCreating virtual ethernet interfaces\e[22m\e[24m\e[39m"
ip link add name veth1 type veth peer name vpeer1
ip link add name veth2 type veth peer name vpeer2
ip link add name veth3 type veth peer name vpeer3
ip link add name veth-router type veth peer name vpeer-router
ip link add name veth-dhcp type veth peer name vpeer-dhcp
ip link show | grep -E 'veth|vpeer'
echo -e "\e[1m\e[32mAdding new bridge\e[22m\e[24m\e[39m"
brctl addbr sw1
brctl show | grep sw1
}
# Set peer link up
set_peer_link_up()
{
echo -e "\e[1m\e[32mUp Virtual ethernet interface\e[22m\e[24m\e[39m"
ip link set veth1 up
ip link set veth2 up
ip link set veth3 up
ip link set veth-router up
ip link set veth-dhcp up
ip link set sw1 up
ip link show | grep -E 'veth'
}
# Assign interfaces to namespaces
assign_iface_NS()
{
echo -e "\e[1m\e[32mAssigning interfaces to namespaces\e[22m\e[24m\e[39m"
ip link set dev vpeer1 netns h1
ip link set dev vpeer2 netns h2
ip link set dev vpeer3 netns h3
ip link set dev vpeer-dhcp netns dhcp_server
ip link set dev vpeer-router netns r1
ip link set dev veth1 netns r1
ip link show | grep -E 'vpeer|veth'
}
# Connect veth to bridge
connect_to_bridge()
{
echo -e "\e[1m\e[32mConnecting veth to bridge\e[22m\e[24m\e[39m"
brctl addif sw1 veth2
brctl addif sw1 veth3
brctl addif sw1 veth-router
brctl addif sw1 veth-dhcp
brctl show
}
# Configure router as router
conf_router()
{
echo -e "\e[1m\e[32mEnabling IPv4 forwarding\e[22m\e[24m\e[39m"
ip netns exec r1 sysctl -w net.ipv4.conf.all.forwarding=1
}
# Configure IP addresses
conf_ip_addr()
{
echo -e "\e[1m\e[32mConfiguring static IPv4 addresses\e[22m\e[24m\e[39m"
ip netns exec r1 ip addr add 192.168.2.12/24 dev vpeer-router
ip netns exec r1 ip a | grep vpeer-router
ip netns exec r1 ip addr add 192.168.1.11/24 dev veth1
ip netns exec r1 ip a | grep veth1
ip netns exec h1 ip addr add 192.168.1.10/24 dev vpeer1
ip netns exec h1 ip a | grep vpeer1
ip netns exec dhcp_server ip addr add 192.168.2.10/24 dev vpeer-dhcp
ip netns exec dhcp_server ip a | grep vpeer-dhcp
}
# Set Up interfaces
set_up_iface()
{
echo -e "\e[1m\e[32mSet up interfaces\e[22m\e[24m\e[39m"
ip netns exec h1 ip link set lo up
ip netns exec h2 ip link set lo up
ip netns exec h3 ip link set lo up
ip netns exec r1 ip link set lo up
ip netns exec dhcp_server ip link set lo up
ip netns exec h1 ip link set vpeer1 up
ip netns exec h2 ip link set vpeer2 up
ip netns exec h3 ip link set vpeer3 up
ip netns exec r1 ip link set veth1 up
ip netns exec r1 ip link set vpeer-router up
ip netns exec dhcp_server ip link set vpeer-dhcp up
}
# Configure Default Gateway
conf_gateway()
{
echo -e "\e[1m\e[32mConfiguring Default Gateway\e[22m\e[24m\e[39m"
ip netns exec h1 route del default
ip netns exec h1 route add default gw 192.168.1.11
ip netns exec h1 route -n
#ip netns exec dhcp_server route del default
ip netns exec dhcp_server route add default gw 192.168.2.12
ip netns exec dhcp_server route -n
}
# Init DHCP server
dhcp_server()
{
echo -e "\e[1m\e[32mInitializing DHCP server\e[22m\e[24m\e[39m"
ip netns exec dhcp_server dnsmasq --port=0 --dhcp-range=vpeer-dhcp,192.168.2.1,192.168.2.11,255.255.255.0,10m --dhcp-range=vpeer-dhcp,192.168.2.13,192.168.2.254,255.255.255.0,10m --dhcp-option=3,192.168.2.12 --no-daemon
#ip netns exec h2 dhclient
#ip netns exec h2 route del default
#ip netns exec h2 route add default gw 192.168.2.12
#ip netns exec h3 dhclient
#ip netns exec h3 route del default
#ip netns exec h3 route add default gw 192.168.2.12
}
#Clear environment
clear_env()
{
echo -e "\e[1m\e[32mCleaning environment\e[22m\e[24m\e[39m"
#ip link delete veth1
ip link delete veth2
ip link delete veth3
ip link delete veth-router
ip link delete veth-dhcp
ip netns delete h1
ip netns delete h2
ip netns delete h3
ip netns delete r1
ip netns delete dhcp_server
ip link set sw1 down
brctl delbr sw1
}
#---------------------------------------------#
if [[ $ARG == "" ]];
then
autor
show_options
fi
if [[ $ARG == "-c" ]];
then
autor
echo -e " \n\e[1m=== -------------------------------------------- ===\e[22m\e[24m\n"
echo -e "\n\e[1m\e[32m --- Configuring Network Topology --- \n\e[22m\e[24m"
create_resources
set_peer_link_up
assign_iface_NS
connect_to_bridge
conf_router
conf_ip_addr
set_up_iface
conf_gateway
dhcp_server
exit $EXIT_OK
fi
if [[ $ARG == "-r" ]];
then
clear_env
fi
if [[ $ARG == "-h" ]];
then
show_options
fi
#---------------------------------------------#
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment