Newsgroup: it.comp.os.linux.sys
Titolo: Routing su due gateway

Ciao a tutti,
il (mio) compito per fine settimana ï¿œ questo:
ho il "classico" firewall (su squeeze) con
- due NIC una lato LAN una lato WAN (ADSL),
- iptables
- ipsec
- openvpn
- pptp
- ssh
Tutto funziona da diversi mesi ok.
Ora il cliente ha acquistato un'altra linea ADSL (altro provider) e vuole fare 
questo:
- tutto il traffico ipsec su una linea ADSL (quella attuale)
- tutto il resto (web,ftp,openvpn,pptp ecc.) sulla nuova linea ADSL
Oltre ad aggiungere una nuova NIC ho cercato una possibile soluzione.
Ho trovato, ad esempio:
http://lartc.org/howto/lartc.rpdb.multiple-links.html#AEN267
 
ed il seguente paragrafo 4.2.2. Load balancing
Pensavo poi di fare qualcosa del genere:
 
ip rule add fwmark 0x65 lookup $T1
ip rule add fwmark 0x66 lookup $T2
 
iptables -t mangle -I INPUT -d $REMOTE_NET -j MARK --set-mark 0x66
iptables -t mangle -I INPUT ! -d $REMOTE_NET -j MARK --set-mark 0x65
 
$REMOTE_NET ï¿œ la rete locale remota coinvolta da ipsec.
 
Ho detto pensavo, poichï¿œ non ho ancora fatto niente, sono in fase di studio.
Poi ho qualche dubbio sulle interfacce tun0 e ppp+, come le gestisco ?
Ora la domanda:
- ï¿œ una fesseria questo che dico sopra ?
- C'ï¿œ un sistema diverso ?
Tenendo presente che NON ho bisogno di bilanciamento di carico, ma come ho
detto: ipsec da una parte e tutto il resto dall'altra, forse la soluzione
appropriata non ï¿œ quella che ho ipotizzato sopra.
 
Idee migliori ? Link da leggere ?
Ringrazio in anticipo.
fulvio

 appropriata non è quella che ho ipotizzato sopra.
 
Mi pare di aver capito che tu non abbia affatto bisogno di due default gateway, dato lo scenario, quindi
non ti servono neanche tabelle di routing multiple.
Se chiamiamo IFa l'interfaccia sulla quale hai la connettività internet originaria, gwIFa il gateway, IFb
la nuova interfaccia e gwIfb il nuovo gateway, potrebbe bastare impostare come default gateway gwIfb
 
ip route add default via $gwIfb dev $IFb
(ip route change default via $gwIfb dev $IFb se lo fai mentre hai già un default precedentemente impostato, ovviamente)
 
e impostare come gateway, per ogni host con il quale chiudi un tunnel ipsec, gwIfa
 
ip route add a.b.c.d via $gwIfa dev $IFa


 
Eh già, è proprio così.
Stavo annegando in un bicchiere d'acqua........
oppure come si dice "Volevo sparare ad un coniglio con un cannone".
 
Grazie mille
fulvio
 
 

 Grazie mille
 
Figurati, è solo questione di pratica.
Ciao.

 Eh già, è proprio così.
.........
 
Ho cantato vittoria troppo presto, ho fatto le prove questa notte.
Se faccio come sopra succede questo: tutto il traffico diverso da ipsec
transita dalla nuova rotta correttamente attraverso il default gw nuovo, ok.
Ma, sull'altra interfaccia, il tunnel ipsec non va "su".
L'interfaccia di ipsec è l'IP di $IFa, se scrivo:
ip route add a.b.c.d via $gwIfa dev $IFa
il tunnel non "parte".
Mi manca di sicuro qualcosa (studiarmi ip route più a fondo.....)
Preciso: ho già una regola di iptables che NON maschera il traffico ipsec
verso l'esterno in questo modo:
iptables -t nat -A POSTROUTING -s $LAN_NET ! -d $REMOTE_NET -j MASQUERADE
 
fulvio

 fulvio
 
Io sto lavorando su una situazione simile (OpenVP, IpSEC lan2lan .. )
magari dai un occhiata a questo:
 
------------------------------------
#!/bin/sh
### BEGIN INIT INFO
# Provides:      firewall
# Required-Start:   $network $remote_fs $syslog
# Required-Stop:
# Default-Start:   S
# Default-Stop:
# Short-Description:   Activate iptables.
### END INIT INFO
 
 
 
case "$1" in
   start)
     echo "STRATING FIREWALL"
 
 
                 PATH='/sbin'
 
                 ## INIT
 
                 # Flush previous rules, delete chains and reset counters
                 iptables -F
                 iptables -X
                 iptables -Z
                 iptables -t nat -F
 
                 # Default policies
                 iptables -P INPUT   DROP
                 iptables -P OUTPUT  ACCEPT
                 iptables -P FORWARD ACCEPT
 
                 echo -n '1' > /proc/sys/net/ipv4/ip_forward
                 echo -n '0' > 
/proc/sys/net/ipv4/conf/all/accept_source_route
 
 
                 # Openvpn
                 iptables -A INPUT -i tun0 -j ACCEPT
                 iptables -A FORWARD -i tun0 -j ACCEPT
                 iptables -A INPUT -i tun+ -j ACCEPT
                 iptables -A FORWARD -i tun+ -j ACCEPT
                 iptables -A INPUT -i tap+ -j ACCEPT
                 iptables -A FORWARD -i tap+ -j ACCEPT
 
                 # Enable loopback traffic
                 iptables -A INPUT  -i lo -j ACCEPT
                 iptables -A OUTPUT -o lo -j ACCEPT
 
                 # Enable statefull rules (after that, only need to 
allow NEW conections)
                 iptables -A INPUT   -m conntrack --ctstate 
ESTABLISHED,RELATED -j ACCEPT
                 iptables -A OUTPUT  -m conntrack --ctstate 
ESTABLISHED,RELATED -j ACCEPT
                 iptables -A FORWARD -m conntrack --ctstate 
ESTABLISHED,RELATED -j ACCEPT
 
                 # Drop invalid state packets
                 iptables -A INPUT   -m conntrack --ctstate INVALID -j 
ACCEPT
                 iptables -A OUTPUT  -m conntrack --ctstate INVALID -j 
ACCEPT
                 iptables -A FORWARD -m conntrack --ctstate INVALID -j 
ACCEPT
 
 
                 ## INPUT
 
                 # SSH
                 iptables -A INPUT -p tcp --dport 22 -j ACCEPT
 
                 ## OUTPUT
 
                 # Enable al outgoing traffic to internet
                 iptables -A OUTPUT -o eth0 -d 
0.0.0.0/0
      -j ACCEPT
                 iptables -A OUTPUT -o eth1 -d 
0.0.0.0/0
      -j ACCEPT
 
 
 
############################################################################
                                 ## ipSEC
                                 # IKE traffic
                                 iptables -A INPUT -p udp --dport 500 
--j ACCEPT
 
                                 # NAT-T
                                 iptables -A INPUT -p udp --dport 4500 
--j ACCEPT
 
                                 # Abilito protocollo ESP
                                 iptables -A INPUT -p esp -j ACCEPT
 
                                 # Abilito protocollo AH
                                 iptables -A INPUT -p ah  -j ACCEPT
 
                                 ## NAT
                                 iptables -t nat -I POSTROUTING 1 -p 50 
-j ACCEPT
                                 iptables -t nat -I POSTROUTING 1 -p 51 
-j ACCEPT
 
 
                                 # Loggare ipSEC
                                 # iptables --append INPUT 
--in-interface eth1 --match policy --pol ipsec --dir in --jump LOG 
--log-level debug --log-prefix "IPSec "
 
############################################################################ 
 
 
                 ## NAT
                 ## SENZA IpSec # iptables --table nat --append 
POSTROUTING --out-interface eth1 -j MASQUERADE
                 iptables -t nat -A POSTROUTING -o eth1 -s 
10.129.108.0/24
 ! -d  
192.168.46.0/23
 -j MASQUERADE
				## 10.128.109.0 rete remota - 
192.168.46.0/23
 Rete Locale LAN
 
                 iptables --append FORWARD --in-interface eth0 -j ACCEPT
 
 
                 ## LOGGING
 
                 #iptables -A INPUT   -j LOG --log-level DEBUG 
--log-prefix '[FW INPUT]:    '
                 #iptables -A OUTPUT  -j LOG --log-level DEBUG 
--log-prefix '[FW OUTPUT]:   '
                 #iptables -A FORWARD -j LOG --log-level DEBUG 
--log-prefix '[FW FORWARD ]: '
 
     ;;
   stop)
     echo "Stopping FIREWALL Flush previous rules, delete chains and 
reset counters"
 
                 # Flush previous rules, delete chains and reset counters
                 iptables -F
                 iptables -X
                 iptables -Z
                 iptables -t nat -F
 
                 # Default policies
                 iptables -P INPUT   ACCEPT
                 iptables -P OUTPUT  ACCEPT
                 iptables -P FORWARD ACCEPT
 
     echo "FIREWALL STOPPED"
     iptables -L
         iptables -t nat -L -nv
 
     ;;
   restart)
     echo "Restarting Firewall"
         /etc/init.d/firewall stop;
         /etc/init.d/firewall start;
     ;;
   status)
         iptables -L -x -v -n --line-numbers
         iptables -L -x -v -n -t nat --line-numbers
     ;;
   *)
     echo "Usage: /etc/init.dfirewall {start|stop}"
     exit 1
     ;;
esac
 
exit 0
-----------------------------------------------------------------
iptables -P OUTPUT  ACCEPT  -> è temporaneo ..
 
 
Per l'isec uso strongswan..
 
-- Yena --
 

 il tunnel non "parte".
 
a.b.c.d è l'indirizzo del peer pubblico con il quale vuoi chiudere il tunnel, giusto?
 
Sezionare i problemi, sempre.
 
Partiamo dal routing..
 
Due shell, sull'host linux con una fai
tcpdump -n -i $IFa host a.b.c.d
nell'altra
ping a.b.c.d
 
Se vedi uscire i pacchetti dal IFa con l'indirizzo pubblico, passerei a controllare che in ipsec-tools.conf
o quel che usi per setkey, ci siano gli indirizzi corretti.
 
I log di racoon che ti dicono?

 fulvio
 
Devi routare sul gateway ipsec anche il traffico verso la rete remota.
 
Supponendo che la subnet dall'altra parte del tunnel sia 
172.16.1.0/24
:
ip route add 
172.16.1.0/24
 via $gwIfa dev $IFa

 tunnel, giusto?
 
Ecco, qui avevo capito male e sbagliato tutto:
come a.b.c.d  avevo messo la rete remota PRIVATA non l'IP pubblico remoto
(bestiaccia....)
 
Ora funziona tutto alla grande.
Un'altra volta grazie
fulvio

 ip route add 
172.16.1.0/24
 via $gwIfa dev $IFa
 
Grazie Cristian,
ho risposto sopra a whiplash; la route che dici qui sopra c'è l'ho, ma avevo 
solo questa e non basta, occorre anche l'altra con l'IP pubblico.
fulvio
 

 remota - 
192.168.46.0/23
 Rete Locale LAN
<zac>
 
Ciao Yena,
qui sopra è proprio come dici, oppure nel commento hai invertito locale con 
remoto ?
 
O forse sono io che sono stanco (probabilissimo).
 
 
 
 
 
 


Si nel commneto li ho invertiti sorry
 
-- Yena --