[Firehol-devs] Testing and emulation with network namespaces
Phil Whineray
phil at sanewall.org
Tue Mar 31 22:49:18 BST 2015
Hi
I've been on a bit of a mission trying to work out the best way of dealing
with mixed router/bridge configurations which took me down the path of
wanting to emulate complex network setups.
Since linux 2.6.24 there has been support for network namespaces. These
are used in the firehol unit tests just to prevent messing with your normal
firewall set.
Much more can be done though, see https://lwn.net/Articles/580893/
for some info. I now have a script which can take a setup file with
a simple format and automate the setup of a virtual network of hosts
and switches of arbitrary complexity. See below for a complete setup.
There is currenly no attempt to connect to the root namespace (and
hence the outside world) - that will need to be done manually if you
really need it.
The question I have - is it useful enough to include in the firehol
tree, either as a testing helping tool or even main script? Also, has
anyone got a good name for it?
Cheers
Phil
# This definition sets up a network according to the diagram below which
# covers a multitude of possible scenarios.
#
# Key:
# hostname
# [device] (hosts have just a [veth0] unless otherwise noted)
# (switch)
#
# host21 +- host01 host41
# | | |
# | host22 +- host02 | host42
# | | | (sw0) | |
# | | . . . . . . . . | . . . . . . . . . | |
# | | . [veth0] . | |
# +-----+----[vbr0eth2] | [vbr1eth4]----+-----+
# (sw2) . | | fw | . (sw4)
# . + [vbr0]--+---[vbr1] + .
# (sw3) . | | | . (sw5)
# +-----+----[vbr0eth3] | [vbr1eth5]----+-----+
# | | . [veth1] . | |
# | | . . . . . . . . | . . . . . . . . . | |
# | | | (<direct>) | |
# | host31 [veth0] | host52
# | gw |
# host32 [veth1] [veth2] host51
# (<direct>) / \ (<direct>)
# host11 host12
#
# A network namespace is created for each host and switch to keep everything
# isolated. The name of the host or switch is the name used for the namespace
# making it easy to use "ip netns exec" to specify where commands should run.
#
# Examples:
# Tcpdump traffic passing through a switch
# sudo ip netns exec sw0 tcpdump -i switch -w capfile
# Tcpdump traffic seen by a device on a host
# sudo ip netns exec host12 tcpdump -i veth0 -w capfile
# Ping "from" host01 (10.0.0.1) to host12 via switch sw0 and hosts fw and gw:
# sudo ip netns exec host01 ping 192.168.2.12
# Start netcat on port 23 of host52 to receive telnet:
# sudo ip netns exec host52 nc -l -p 23
# telnet "from" host21 (10.0.0.1) to host52 via fw, switches and bridges:
# sudo ip netns exec host21 telnet 10.45.45.52
# Panic firehol in fw host namespace (now previous commands are blocked):
# sudo ip netns exec fw sbin/firehol.in panic
#
# Note that there are no virtual machines in use, all processing is done
# on the host but with separate views of what the network looks like.
#
host fw
dev veth0 10.0.0.254/24
dev veth1 10.1.1.254/24
dev vbr0eth2
dev vbr0eth3
dev vbr1eth4
dev vbr1eth5
bridgedev vbr0 vbr0eth2 vbr0eth3 10.23.23.254/24
bridgedev vbr1 vbr1eth4 vbr1eth5 10.45.45.254/24
route default via 10.1.1.253
exec echo 1 > /proc/sys/net/ipv4/ip_forward
host gw
dev veth0 fw/veth1 10.1.1.253/24
dev veth1 192.168.1.254/24
dev veth2 192.168.2.254/24
route default via 10.1.1.254
exec echo 1 > /proc/sys/net/ipv4/ip_forward
host host01
dev veth0 10.0.0.1/24
route default via 10.0.0.254
host host02
dev veth0 10.0.0.2/24
route default via 10.0.0.254
host host11
dev veth0 gw/veth1 192.168.1.11/24
route default via 192.168.1.254
host host12
dev veth0 gw/veth2 192.168.2.12/24
route default via 192.168.2.254
host host21
dev veth0 10.23.23.21/24
route default via 10.23.23.254
host host22
dev veth0 10.23.23.22/24
route default via 10.23.23.254
host host31
dev veth0 10.23.23.31/24
route default via 10.23.23.254
host host32
dev veth0 10.23.23.32/24
route default via 10.23.23.254
host host41
dev veth0 10.45.45.41/24
route default via 10.45.45.254
host host42
dev veth0 10.45.45.42/24
route default via 10.45.45.254
host host51
dev veth0 10.45.45.51/24
route default via 10.45.45.254
host host52
dev veth0 10.45.45.52/24
route default via 10.45.45.254
switch sw0
dev d01 fw/veth0
dev d02 host01/veth0
dev d03 host02/veth0
switch sw2
dev d01 fw/vbr0eth2
dev d02 host21/veth0
dev d03 host22/veth0
switch sw3
dev d01 fw/vbr0eth3
dev d02 host31/veth0
dev d03 host32/veth0
switch sw4
dev d01 fw/vbr1eth4
dev d02 host41/veth0
dev d03 host42/veth0
switch sw5
dev d01 fw/vbr1eth5
dev d02 host51/veth0
dev d03 host52/veth0
More information about the Firehol-devs
mailing list