domanda che pensavo fosse facile e invece si sta rivelando abbastanza ostica, spero qualcuno mi salvi

ho un pc con 4 schede di rete e un piccolo problem di routing da risolvere; la topologia è riportata in ascii art qui http://pastebin.com/f4LYhW19

in sostanza ho 4 schede di rete, la prima collegata su una rete in cui gira un client particolare, l'ultima collegata su una rete su cui gira un server particolare
le reti della seconda e terza interfaccia sono direttamente collegate tra loro tramite un router che effettua delle manipolazioni particolari sui pacchetti

quello che vorrei è, credo, abbastanza semplice

tutto il traffico in ingresso alla prima interfaccia deve essere dirottato sulla seconda, tutto il traffico in uscita dalla terza
interfaccia deve essere dirottato sulla quarta
specularmente tutto il traffico in arrivo sulla quarta interfaccia deve essere dirottato sulla terza e tutto il traffico in uscita dalla seconda interfaccia deve essere dirottato sulla prima

spero che l'immagine sia più chiara della descrizione a parole. vorrei che i pacchetti seguissero la linea fatta dagli asterischi. per ora se lancio un ping su una macchina connessa sulla rete 10.0.0.0 verso 10.0.4.2, questo viene direttamente intercettato dall'interfaccia eth2. idem un pacchetto diretto diretto da 10.0.0.* a 192.168.27.* viene raccolto direttamente da eth3

come devo impostare le regole di route?

per ora un mio amico mi ha suggerito di aggiungere due tabelle di routing in /etc/iproute2/rt_table

200 eth0_to_eth1
201 eth2_to_eth3

e quindi

codice:
#!/bin/sh
IPT=$(which iptables)
IPT_M="$IPT -t mangle"

$IPT_M -N MARK_FROM_ETH0
$IPT_M -N MARK_FROM_ETH2

$IPT_M -A PREROUTING -i eth0 -m state --state RELATED,ESTABLISHED -j
CONNMARK --restiore-mark
$IPT_M -A PREROUTING -i eth0 -m state --state NEW -j MARK_FROM_ETH0
$IPT_M -A MARK_FROM_ETH0 -j MARK --set-mark 10
$IPT_M -A MARK_FROM_ETH0 -j CONNMARK --save-mark

$IPT_M -A PREROUTING -i eth2 -m state --state RELATED,ESTABLISHED -j
CONNMARK --restore-mark
$IPT_M -A PREROUTING -i eth2 -m state --state NEW -j MARK_FROM_ETH2
$IPT_M -A MARK_FROM_ETH2 -j MARK --set-mark 11
$IPT_M -A MARK_FROM_ETH2 -j CONNMARK --save-mark

# setup tabella eth0_to_eth1
ip route add 127.0.0.0/8 dev lo table eth0_to_eth1
ip route add 10.0.0.0/24 dev eth0 table eth0_to_eth1
ip route add 10.0.1.0/24 dev eth1 table eth0_to_eth1
ip route add 192.168.27.0/24 via 10.0.1.z table eth0_to_eth1
# z = ip del router esterno che poi rigira i pacchetti in eth2

# setup tabella eth2_to_eth3
ip route add 127.0.0.0/8 dev lo table eth2_to_eth3
ip route add 10.0.4.0/24 dev eth2 table eth2_to_eth3
ip route add 192.168.27.0/24 dev eth3 table eth2_to_eth3

# aggancio le tabelle con il mark dei pacchetti
ip rule add from all fwmark 10 table eth0_to_eth1
ip rule add from all fwmark 11 table eth2_to_eth3
questo dovrebbe implementare le regole della sola andata, eppure funziona a metà
dalla rete 10.0.0.0/24 riesco a pingare la rete 192.168.27.0/24, ma la comunicazione non passa attraverso il percorso definito dalle regole --> tramite wireshark non vedo attività su eth1 ed eth2 ma solo su eth1/eth3

riesco invece a pingare correttamente (attraverso il giusto percorso) gli host di 10.0.1.0/24 e quelli di 10.0.4.0/24 ad eccezione di 10.0.4.2 che viene pingato direttamente...

qualche anima pia mi illumina?

grazie mille!