Want to create a really interesting virtual network on your own host and test it with ordinary applications? Great! Here is how.
We will make the address 192.168.100.1 act like 127.0.0.1 but route packets through a custom network topology before processing them.
First start with any custom topology. In this example: west and east are endpoints with an Open vSwitch bridge ovs in between. (This would be great for applying OpenFlow rules to packets sent between local applications.)
1 2 3 4 5 6 7 8 9 10 | |
Now assign addresses and routes for these interfaces. Packets sent to 192.168.100.1 should first be routed into interface west then switched via ovs and finally delivered to east for processing.
1 2 3 4 5 | |
The ingredients are in place but they don’t work yet. If you ping 192.168.100.1 then the packets are sent to lo instead of being routed through the bridge.
And that brings us to the trick: Policy Routing.
First make Linux globally “forget” that these addresses are local.
1 2 | |
Now packets sent to 192.168.100.1 do get routed down the right path. They are not processed at the other end though, because Linux does not remember they are local. We are half way there.
Next create separate routing tables strictly for when packets are received after they have traversed the switch. These tables remember that the addresses are local.
1 2 3 4 5 6 7 | |
Now we are done!
If you connect to 192.168.100.1 then your packets will first traverse the bridge and then be processed locally. The setup is symmetric so that return traffic will be routed back through the bridge too. This will work with all your favourite programs like ping, curl, apache, etc. Check it out by running tcpdump on west or east.
Go ahead and create interesting virtual networks on your own machine.