I have two Linux (RH v9) routers connected to the Internet (separate DSL
connections), each with two EtherNet cards.
Router #1 has static IP address "a.a.a.1" for the internal LAN, and
static IP address "x.x.x.x" for the Internet connection; 
here''s what the "route command shows:
Kernel IP routing table
Destination  Gateway  Genmask         Flags Metric Ref    Use Iface
x.x.x.0      0.0.0.0  255.255.255.0   U     0      0        0 eth1
a.a.a.0      0.0.0.0  255.255.255.0   U     0      0        0 eth0
169.254.0.0  0.0.0.0  255.255.0.0     U     0      0        0 eth1
127.0.0.0    0.0.0.0  255.0.0.0       U     0      0        0 lo
0.0.0.0      x.x.x.1  0.0.0.0         UG    0      0        0 eth1
Router #2 has static IP address "a.a.a.2" for the internal LAN, and
DHCP IP address "y.y.y.y" for the Internet connection; 
here''s what the "route command shows:
Kernel IP routing table
Destination  Gateway  Genmask         Flags Metric Ref    Use Iface
y.y.y.0      0.0.0.0  255.255.255.0   U     0      0        0 eth1
a.a.a.0      0.0.0.0  255.255.255.0   U     0      0        0 eth0
169.254.0.0  0.0.0.0  255.255.0.0     U     0      0        0 eth1
127.0.0.0    0.0.0.0  255.0.0.0       U     0      0        0 lo
0.0.0.0      y.y.y.1  0.0.0.0         UG    0      0        0 eth1
This works, but since router #1 has several server daemons running (HTTP, DNS,
etc), and since router #2 is the default gateway for internal hosts on the
a.a.a.0/24 network, any access to servers on router #1 goes out through router
#2 and the Internet in order to get to router #1 (and similarly to get back); 
this is a performance hit due to the (relatively) slow outbound DSL speeds
(128Kbit/s) involved.
So, I decided to add a "shortcut" route on router #2:  "route add
x.x.x.x eth0";  here''s what the "route command now shows:
Kernel IP routing table
Destination  Gateway  Genmask         Flags Metric Ref    Use Iface
x.x.x.x      0.0.0.0  255.255.255.255 UH    0      0        0 eth0
y.y.y.0      0.0.0.0  255.255.255.0   U     0      0        0 eth1
a.a.a.0      0.0.0.0  255.255.255.0   U     0      0        0 eth0
169.254.0.0  0.0.0.0  255.255.0.0     U     0      0        0 eth1
127.0.0.0    0.0.0.0  255.0.0.0       U     0      0        0 lo
0.0.0.0      y.y.y.1  0.0.0.0         UG    0      0        0 eth1
This solves the performance problem for accessing servers on router #1, BUT now
any access initiated from router #1 to router #2 fails.  I added logging entries
in the "mangle" table for "iptables", and it shows the
packets from router #2 to router #1 getting through the "PREROUTING"
stage, but no further.  If I remove the added route, access from #2 to #1 works
AND I see the packets getting beyond the "PREROUTING" stage to either
the "INPUT" or "FORWARD" stages.  Note that when testing
this, there is nothing in the "filter" or "nat" tables.
Now, I can solve this by a reciprocal "route add y.y.y.y eth0" on
router #1 (which works).  However, y.y.y.y is a DHCP address from my ISP, so
that''s only a temporary fix until the IP address changes.
My big question is to really understand what is going on.  Here is the
iptables/routing diagram I got from Rusty''s documentation:
 --->PRE--->[ROUTE]-->FWD-------->POST---->
  Conntrack    |     Mangle  ^   Mangle
  Mangle       |     Filter  |   NAT (Src)
  NAT (Dst)    |             |   Conntrack
  (QDisc)      |          [ROUTE]
               v             |
               IN Filter    OUT Conntrack
               |  Conntrack  ^  Mangle
               |  Mangle     |  NAT (Dst)
               v             |  Filter
Why is the routing code apparently dropping the packets from router #1 to router
#2 (but only for connections initiated from #1)?
-- Dean