Re: Routing / forwarding in user space?

Grant Taylor <[email protected]> Thu, 31 Dec 2020 20:39:38 +0000
Newsgroups org.kernel.vger.lartc
Message-ID <[email protected]>
Pre-Script:  I need to give some history of time keeping and clock 
making before I tell you what time it is.

On 12/31/20 12:49 PM, Grant Taylor wrote:
> Absolutely.  I've got nine of these ""containers running on the system 
> that I'm typing this reply on.

Here are some more details on what I'm doing in case you want to try 
something similar.

I have allocated the RFC 6598 Shared Address Space[1] to my workstation 
test VLANs, currently on my workstation.  My home network has routes to 
100.64.0.0/10 via my workstation's LAN IP.

100.64.0.0/24 is the core / backbone / area 0 of these lab VLANs.

Each lab VLAN has a separate /24 therein.
    Lab 1 = 100.64.1.0/24
    Lab 2 = 100.64.2.0/24
    Lab 3 = 100.64.3.0/24
    ...

My workstation has routes to the lab subnets via each ""container 
(network namespace) that is doing the very type of routing that I think 
you're asking about.

    100.64.1.0/24 via 100.64.0.1
    100.64.2.0/24 via 100.64.0.2
    100.64.3.0/24 via 100.64.0.3
    ...

I am using logical (vEth) interfaces between all the network namespaces 
/ ""containers.  --  I do tuck most of them away in another network 
namespace / ""container so that I don't see a bunch of ... unsighly 
interfaces when running "ip" / "ifconfig" / et al. in my host / root / 
unnamed network namespace.

I have a vEth from the host into what I call lab0.  Each of the other 
routing network namespaces / ""contianers have a vEth to lab0 and to the 
host.  lab0 bridges all of the vEths therein to create one broadcast 
domain that connects the host and all of the lab network namespaces / 
""containers.

This means that each network namespace / "" container can route between 
it's vEth that connects to the bridge and the vEth that connects back to 
the host.

    lab1 routes between 100.64.0.1/24 and 100.64.1.254/24
    lab2 routes between 100.64.0.2/24 and 100.64.2.254/24
    lab3 routes between 100.64.0.3/24 and 100.64.3.254/24
    ...

The purpose for these routing network namespace / ""containers is so 
that I can mess around with various things in VirtualBox (et al.) on the 
host and have access to 11 different networks (home LAN, virtual 
backbone, and each lab network).  This enables me to play with various 
things using network namespaces / "" containers as routers.

I have had as many as 100 of these running on my system at one time with 
no ill effect.  (Obviously the VMs connected to them have an effect. 
But that's not the network namespaces / "" containers.)

/*
** What time is it?
*/

I create all of this with a 25 line shell script.

1)  I create the directories (transient b/c of tmpfs) that are needed.
     A)  "ip netns" uses /run/netns so I create it and mountns & utsns 
following suit.
         # sudo mkdir -p /run/{mount,net,uts}ns
     B)  Network namespaces / ""containers use their own mount point.
         # sudo touch /run/{mount,net,uts}ns/lab0
2)  I create / instantiate the first network namespace / ""container.
         # unshare -mount=/run/mountns/lab0 --net=/run/netns/lab0 
--uts=/run/utsns/lab0 /bin/hostname lab0

Aside:  unshare creates / instantiates the network namespace / 
""container to run the /bin/hostname command.  It does not destroy the 
namespace / "" container -- which is default -- because of the 
mountpoints.  See the man page for more details.

3)  I create the vEth pair to connect from the host to lab0
         # sudo ip link add lab0 type veth peer name $HOSTNAME netns lab0
         # sudo ip link set lab0 up
         # sudo ip netns exec lab0 ip link set lo up
         # sudo ip netns exec lab0 ip link add bri0 type bridge
         # sudo ip netns exec lab0 ip link set bri0 up
         # sudo ip netns exec lab0 ip link $HOSTNAME master bri0
         # sudo ip netns exec lab0 ip link $HOSTNAME up

Steps 1-3 create the central netns.

4)  I create / instantiate and configure the network on the other lab 
network namespaces / ""containers all at the same time via a loop.
         # for l in {1..9}; do
         #    sudo touch /run/{mount,net,uts}ns/lab${l}
         #    sudo unshare -mount=/run/mountns/lab${l} 
--net=/run/netns/lab${l} --uts=/run/utsns/lab${l} /bin/hostname lab${l}
         #    sudo ip link add lab${l} type veth peer name lab${l}i 
netns lab${l}
         #    sudo ip link set lab${l} up
         #    sudo sysctl -q net.ipv6.conf.lab${l}.disable_ipv6=1 > 
/dev/null
         #    sudo ip netns exec lab${l} ip link set lo up
         #    sudo ip netns exec lab${l} ip link set lab${l}o up
         #    sudo ip netns exec lab${l} ip addr add 100.64.0.${l}/24 
dev lab${l}o
         #    sudo ip netns exec lab${l} ip link set lab${l}i up
         #    sudo ip netns exec lab${l} ip addr add 100.64.${l}.254/24 
dev lab${l}i
         # done

Note:  I manually retyped this, so there may be typos.

Aside:  I've not yet configured IPv6 in the labs, so I disable it.  (My 
home LAN is IPv6 enabled.)

This provides nine L2 lab# interfaces on the host so that I can connect 
VMs to them.  The host does /not/ have IP addresses in these lab VLANs. 
The host must route through the lab# network namespaces / ""containers 
to get to attached VMs.  Said VMs must do similar to access the host and 
the Internet.

I believe these network namespaces / ""containers are exactly what 
you're wanting to do; e.g. routing between network inside of a network 
namespace / ""container.

[1] Yes, I know the danger of conflict with ISPs that do Carrier Grade 
NAT.  Mine does not.  So I choose to use this space to avoid typical RFC 
1918 Address Space.



-- 
Grant. . . .
unix || die
smime.p7s (application/pkcs7-signature, 3.9 KB) - not displayed