pebkac routing problem

Martin P. Hellwig mhellwig at xs4all.nl
Fri Oct 7 13:19:53 PDT 2005


Martin P. Hellwig wrote:
<cut problem>
Thanks to hints from Matt I solved my routing problem concerning 
multiple gateways on non routing uplinks using IPFW, I scribbled my 
progress down and like to share that with you guys.

Here you go:

Description:
The limitation of a single default gateway in combination with a multi 
homed computer on non routing networks will prevent the other connection 
from working correctly.

The problem is that when a IP traffic is initiated from an outside 
source via the other route, the reply is still done over the default 
gateway.
All correctly configured gateways on a non routing network will filter 
these packages out because the gateway has no knowledge that these 
originating IP addresses are not spoofed.

The solution is to use the gateway related to the IP address/network 
where your packages is coming from.
There are different ways to achieve this most of them rely on a package 
filter/manager, others on multiple routing tables.

On my DragonFlyBSD system IPFW is suitable to do this task, for FreeBSD 
it should be the same.

First I need to configure my system to use IPFW:

% echo 'firewall_enable="YES"'>> /etc/rc.conf
% echo 'firewall_script="/etc/rc.firewall"' >> /etc/rc.conf
% echo 'firewall_type="OPEN"' >> /etc/rc.conf
The last line prevents me from logging myself out permantly and lets the 
machine behave as if there is no firewall. In /etc/rc.firewall "Open" is 
define with a couple of (indirect) rule sets.
Although the machine is within immidialty physical reach (as it should 
if you're doing network adaption) I administrate it over a secure remote 
shell.

If you have a machine doing NAT you probably have a recompiled kernel 
with built in IPFW and "options IPDIVERT", thus IPFW is already present 
on your system and you don't need to configure the above part. If you 
have other firewall/nat configuration, this explanation might do you 
more harm then good.

starting IPFW if it's not already started:
% /etc/rc.d/ipfw start
At this point all network connections are dropped and I have to relogon.
Let's see what the current "Open" IPFW rules are:
% ipfw list
00100 allow ip from any to any via lo0
00200 deny ip from any to 127.0.0.0/8
00300 deny ip from 127.0.0.0/8 to any
65000 allow ip from any to any
65535 deny ip from any to any
Now I have to add a rule that when my 'other' IP address sends a package 
back that it does that over the 'other' gateway except when it's a 
address on the local bus. But first I need to configure my second IP 
address and get some info from my existing configuration.

My configuration for my default (and first) network:
IP and netmask 145.103.249.189/27 with gateway 145.103.249.190
The other network I like to add:
213.126.48.226/24 with gateway 213.126.48.1
Both networks are directly reachable from one network card (fxp0) i.e. 
the same physical network, so I added a alias:
% ifconfig fxp0 alias 213.126.48.226/24
At this moment all machines can reach my machine over the added IP 
address and only machines on 213.126.48.0/24 receive my reply 
originating from the added alias.
If you have your second network on a separate physical network, 
configure your NIC as usual.

With this information the rules I created and executed are:
% ipfw add 110 fwd 213.126.48.1 ip from 213.126.48.226 to not 
213.126.48.0/24
% ipfw add 120 fwd 145.103.249.190 ip from 145.103.249.189 to not 
145.103.249.160/27

Strictly speaking the last rule is not (yet) necessary because thats the 
behavior of the default gateway however in my case, my default gateway 
will change so I included the rule already now.
Do notice that this is an unnecessary system burden although probably 
not too much!

At this moment my machine does exactly what I want, however if I reboot 
it, all configurations are lost, to make it permantly:
echo 'ifconfig_fxp0_alias0="inet 213.126.48.226/24"' >> /etc/rc.conf

Then open /etc/rc.conf in a editor and searched for the definition of 
"Open".
I found it at:
case ${firewall_type} in
    [Oo][Pp][Ee][Nn])
        allow_loopback
        deny_spoof
        divert_nat
        allow_rest
    ;;

I added the below rules under "allow_rest":
${fwcmd} add 110 fwd 213.126.48.1 ip from 213.126.48.226 to not 
213.126.48.0/24
${fwcmd} add 120 fwd 145.103.249.190 ip from 145.103.249.189 to not 
145.103.249.160/27

So that the configuration is now:
case ${firewall_type} in
    [Oo][Pp][Ee][Nn])
        allow_loopback
        deny_spoof
        divert_nat
        allow_rest
        ${fwcmd} add 110 fwd 213.126.48.1 ip from 213.126.48.226 to not 
213.126.48.0/24
        ${fwcmd} add 120 fwd 145.103.249.190 ip from 145.103.249.189 to 
not 145.103.249.160/27
    ;;

--
mph




More information about the Users mailing list