Newsgroup: it.comp.os.linux.sys
Titolo: Uso di due default gateway

Riposto la domanda: ci abbiamo lavorato in tre e non se ne esce...
Ho una macchina con due schede di rete con indirizzi su subnet diverse, che
deve uscire su due gateway diversi a seconda della scheda da cui origina il
pacchetto.
La mia tabella di routing include queste due righe:
default         10.0.0.254      0.0.0.0         UG    0      0        0 eth0
default         194.[...].1    0.0.0.0         UG    0      0        0 eth1
Che a me sembra corretto, ma alla macchina non piace. Il router 10.0.0.254
esegue un NAT statico degli indirizzi della HDSL, e se e' l'unico default
gateway funziona; L'altro router e' pubblico, e se e' l'unico default
gatewai funziona.
Se sono attivi tutti e due, da qualunque interfaccia provenga il pacchetto
viene sempre instradato sul primo default gateway trovato.
Distro Red Hat 8, kernel 2.4.18-14.
Idee?
TIA,
*

 
Beh, la cosa piu' semplice è utilizzare iproute2 e iptables, in ordine
inverso si intende.
Per prima cosa crei due due tabelle di routing. Copio ed incollo da una
mia configurazione in azienda, dove abbiamo fastweb e dsl:
echo Adding $TABLE_FW
ip route add $NET_FW dev $IF_FW src $IP_FW table $TABLE_FW
ip route add default via $ROUTER_FW dev $IF_FW table $TABLE_FW
echo Adding $TABLE_DSL
ip route add $NET_DSL dev $IF_DSL src $IP_DSL table $TABLE_DSL
ip route add default via $ROUTER_DSL dev $IF_DSL table $TABLE_DSL
dove $TABLE_* è un nome mnemonico, $IF_* il nome dell'interfaccia, $IP_*
l'ip associato, $ROUTER_* l'ip del router e $NET_* la rete.
a questo punto, ad esempio, marchi i pacchetti di un certo tipo come
"1":
echo Add special rules for ssh,smtp,pop3,telnet,imap,https
iptables --table mangle --append PREROUTING --source $IP_LAN/24 --destination ! $IP_LAN/16 -m multiport -p tcp --dport 22,23,25,53,110,143,443,993,995 -j MARK --set-mark 1
ed altri come pacchetti di tipo "2":
echo Add special rules for http,ftp,nntp,tunnel,irc
iptables --table mangle --append PREROUTING --source $IP_LAN/24 --destination ! $IP_LAN/16 -m multiport --protocol tcp --dport 80,8080,20,21,119,3306,33306,6666,6667 -j MARK --set-mark 2
il tipo di regola per cui marcarli è differente da caso a caso, ma
iptables è flessibilissimo. A questo punto:
echo Activate rules
ip rule delete fwmark 1 lookup $TABLE_DSL 2> /dev/null
ip rule delete fwmark 2 lookup $TABLE_FW 2> /dev/null
ip rule add fwmark 1 lookup $TABLE_DSL
ip rule add fwmark 2 lookup $TABLE_FW
così i pacchetti marcati come 1 seguono una routing table, quelli con 2
un'altra. Tutto cio che non è marcato andrà nel default gateway "di
sistema", quello definito da:
ip route add default etc. etc.
questo per quanto riguarda il filtrare i pacchetti, inutile dire che poi
bisogna attivare il masquerade se necessario etc.etc. ma questo penso
sia "assunto".
Salumi,
Angelo


In teoria va tutto, senonche'...
# traceroute 213.[...].135 -s 194.[...].34
traceroute to 213.[...].135 (213.[...].135) from 194.[...].34, 30 hops max,
38 byte packets
 1  10.0.0.254 (10.0.0.254)  44.175 ms  46.014 ms  44.619 ms
 2  10.0.0.254 (10.0.0.254)  45.070 ms !X
Sta cosa non mi quaglia...
Sbaglio qualcosa di evidente e non lo vedo o e' tutto giusto pero' non
funziona?
TIA,
*

 funziona?
Trasporto != ICMP cosa ti dicono? Non so, un accesso HTTP od SSH ad un
server remoto?

 server remoto?
Il tcptraceroute funziona... Il traceroute (quindi UDP) no.
Mmm, non ricordo a che protocolli si agganci per default iptables: non vorrei
che marcasse solo i pacchetti tcp.
Domani provo a cambiare le regole specificando -p any (o quello che e', non ho
voglia di guardare il manuale ora :P).
Ciaotutti,
*

 server remoto?
Il tcptraceroute funziona... Il traceroute (quindi UDP) no.


 typed:
(Microsoft Outlook: cosa vuoi postare postare postare oggi?)
Allora, ecco la situazione in breve:
# iptables -L -t mangle
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
MARK       all  --  
10.0.0.0/8
           anywhere           MARK set 0x1
MARK       all  --  194.[...].0/24       anywhere           MARK set 0x2
[Tutte le catene su ACCEPT, nessuna regola attiva]
# ip rule
0:      from all lookup local
32764:  from all fwmark 0x2 lookup 2
32765:  from all fwmark 0x1 lookup 1
32766:  from all lookup main
32767:  from all lookup 253
# ip route
194.[...].0 dev eth0  scope link  src 10.0.0.20
194.[...].0/24 dev eth1  scope link
192.168.1.0/24
 dev eth0  scope link
10.0.0.0/8
 dev eth0  proto kernel  scope link  src 10.0.0.20
[Questa non mi e' chiara, ma e' la tabella di default quindi non dovrebbe
mai essere consultata...]
# ip route list table 1
10.0.0.0 dev eth0  scope link  src 10.0.0.20
default via 10.0.0.254 dev eth0
# ip route list table 2
194.[...].0 dev eth1  scope link  src 194.[...].33
default via 194.[...].1 dev eth1
A parte la prima riga della ip route che mi sa di strano, in teoria dovrebbe
andare...
Ma con questa configurazione mi dice network unreachable su qualunque
tentativo di uscita (perche' non ha un default gateway che non sia
agganciato a un forward mark).
Posto anche l'ifconfig che non si sa mai:
# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:C0:6C:60:24:8E
          inet addr:192.168.1.103  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:700935 errors:0 dropped:0 overruns:0 frame:0
          TX packets:62365 errors:0 dropped:0 overruns:0 carrier:0
          collisions:457 txqueuelen:100
          RX bytes:67337033 (64.2 Mb)  TX bytes:22723124 (21.6 Mb)
          Interrupt:11 Base address:0x220
eth0:0    Link encap:Ethernet  HWaddr 00:C0:6C:60:24:8E
          inet addr:10.0.0.20  Bcast:10.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:11 Base address:0x220
eth1      Link encap:Ethernet  HWaddr 00:50:FC:79:DF:D2
          inet addr:194.[...].33  Bcast:194.[...].255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:256545 errors:0 dropped:0 overruns:0 frame:0
          TX packets:508845 errors:0 dropped:0 overruns:9 carrier:0
          collisions:312 txqueuelen:100
          RX bytes:27750411 (26.4 Mb)  TX bytes:648849453 (618.7 Mb)
          Interrupt:10 Base address:0xf000
eth1:0    Link encap:Ethernet  HWaddr 00:50:FC:79:DF:D2
          inet addr:194.[...].34  Bcast:194.[...].255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:10 Base address:0xf000
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1324 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1324 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:366043 (357.4 Kb)  TX bytes:366043 (357.4 Kb)
Continuo a non capire dove sia l'errore...
Ciaotutti,
*

 viene sempre instradato sul primo default gateway trovato.
Scusa ma perche` usare anche iptables? Basterebbe solo il soruce routing.
-- 
Vincenzo

 Aeh... A sapere come :)
1) Ti credi una tabella custom con qualcosa del tipo
# echo 200 ALT >> /etc/iproute2/rt_tables
2) Imposti le politiche di routing con
GW1="10.0.0.254"
NET1="
10.0.0.0/8
"
IF1="eth0"
GW2="194.[...].1"
NET2="194.[...].0/24"
IF2="eth1"
route add default gw $GW1 dev $IF1
ip rule add from $NET2 table ALT
ip route add default via $GW2 dev $IF2 table ALT
ip route flush cache
-- 
Vincenzo

 ip route flush cache
E non funziona.
Se gli passo ALT scritto come ALT, ip rule si rompe perche' ALT non gli
piace, se gli passo l'id di ALT (200) invece non si rompe, ma non va
comunque.
Unica differenza: io non uso
route add default gw $GW1 dev $IF1
perche' la macchina non ha bisogno di alcuna default route per gli indirizzi
che non siano segnati nelle tabelle custom.
E infatti mi da' un network unreachable perche' non trova un default gateway
applicabile.
Non capisco...
*

 route add default gw $GW1 dev $IF1
E allora non ti potra` mai funzionare. Il concetto era` di stabilire un
default gateway su un router e di indirizzare i pacchetti provenienti
dall'altra sottorete sull'altro router. In pratica questo ti evita di
duplicare le policy di source routing.
Questa configurazione io la uso in genere quando ho un collegamento hdsl 
e uno adsl che fanno capo alla stessa linux/box che funge da firewall
e funziona senza nessun problema.
-- 
Vincenzo

 firewall e funziona senza nessun problema.
Mmm, a 'sto punto mi vien da pensare che il kernel non abbia l'opzione
attiva. San Google non mi ha aiutato moltissimo in questo senso (anche se
temo di aver sbagliato io la preghierina...): come faccio a verificare?
TIA,
*

 temo di aver sbagliato io la preghierina...): come faccio a verificare?
Descrivi il messaggio di errore esatto che ti ritorna il sistema quando
esegui il comando:
ip rule add from $NET2 table ALT
avendo nel file '/etc/iproute2/rt_tables' la entry
200 ALT
-- 
Vincenzo

 200 ALT
Mmm... In effetti nessuno.
Stamattina ho riprovato e gli e' piaciuto - solo che non avevo cambiato il
file da ieri... Mi sono limitato a rieseguire il comando.
Oddio, ieri sera avevo scaricato iptables (con rmmod) ma non credo faccia
differenza...
Poi mi son dovuto dedicare a lavori un po' meno raffinati (tipo ghostare un
disco mezzo in chiesa su un'altro piu' nuovo e robe cosi') e la mattinata e'
andata, ma alla fine son riuscito a riconfigurare le tabelle di routing ed
ecco il risultato:
# cat /etc/iproute2/rt_tables
100     INET
200     HDSL
# ip rule
0:      from all lookup local
32764:  from 10.0.0.0 lookup HDSL
32765:  from 194.[...].0 lookup INET
32766:  from all lookup main
32767:  from all lookup 253
# ip route
194.[...].0 dev eth0  scope link  src 10.0.0.20
194.[...].0/24 dev eth1  scope link
192.168.1.0/24
 dev eth0  scope link
10.0.0.0/8
 dev eth0  proto kernel  scope link  src 10.0.0.20
# ip route list table INET
194.[...].0 dev eth1  scope link  src 194.[...].33
default via 194.[...].1 dev eth1
# ip route list table HDSL
10.0.0.0 dev eth0  scope link  src 10.0.0.20
default via 10.0.0.254 dev eth0
# ping 
www.microsoft.com
 -I 10.0.0.20
PING 
www.microsoft.akadns.net
 (207.46.134.222) from 10.0.0.20 : 56(84) bytes
of data.
ping: sendmsg: Network is unreachable
ping: sendmsg: Network is unreachable
ping: sendmsg: Network is unreachable
ping: sendmsg: Network is unreachable
Ciaotutti,
*

 
10.0.0.0/8
 dev eth0  proto kernel  scope link  src 10.0.0.20
Qui, invece, mi sembra ci sia qualcosa che non va. Prova ad utilizzare 
il seguente script per gestire il routing:
GW1="10.0.0.254"
NET1="
10.0.0.0/8
"
IF1="eth0"
GW2="194.[...].1"
NET2="194.[...].0/24"
IF2="eth1"
ip rule add from $NET1 table HDSL
ip route add default via $GW1 dev $IF1 table HDSL
ip rule add from $NET2 table INET
ip route add default via $GW2 dev $IF2 table INET


 ip route flush cache
Quello che uso (l'ho chiamato setroute) e':
TABLE_HDSL=HDSL
NET_HDSL=
10.0.0.0/8
IF_HDSL=eth0
IP_HDSL=10.0.0.20
ROUTER_HDSL=10.0.0.254
TABLE_INET=INET
NET_INET=194.[...].0/24
IF_INET=eth1
IP_INET_1=194.[...].33
IP_INET_2=194.[...].34 # Non usato
ROUTER_INET=194.[...].1
echo Adding $TABLE_HDSL
ip route add $NET_HDSL dev $IF_HDSL src $IP_HDSL table $TABLE_HDSL
ip route add default via $ROUTER_HDSL dev $IF_HDSL table $TABLE_HDSL
echo Adding $TABLE_INET
ip route add $NET_INET dev $IF_INET src $IP_INET_1 table $TABLE_INET
ip route add default via $ROUTER_INET dev $IF_INET table $TABLE_INET
ip rule del from $NET_INET table $TABLE_INET > /dev/null
ip rule del from $NET_HDSL table $TABLE_HDSL > /dev/null
ip rule add from $NET_INET table $TABLE_INET
ip rule add from $NET_HDSL table $TABLE_HDSL
ip route flush cache
E ho scoperto che avevo scazzato l'indirizzo di rete non aggiungendo la
classe.
Ho anche scommentato alcune linee dall'rt_tables, per avere i nomi corretti:
# cat /etc/iproute2/rt_tables
# reserved values
#
255     local
254     main
253     default
#0      unspec
#
# local
#
#1      inr.ruhep
100     INET
200     HDSL
A questo punto ho pulito tutto il giro che avevo fatto cancellando le
regole, ed ho rilanciato lo script.
Ecco il nuovo risultato:
# ip route flush all;ifdown eth0;ifup eth0;ifdown eth1;ifup eth1
# ./setroute
Adding HDSL
Adding INET
# ip rule
0:      from all lookup local
32764:  from 10.0.0.0 lookup HDSL
32765:  from 194.[...].0 lookup INET
32766:  from all lookup main
32767:  from all lookup 253
# ip route
194.[...].0 dev eth0  scope link  src 10.0.0.20
194.[...].0/24 dev eth1  scope link
192.168.1.0/24
 dev eth0  scope link
10.0.0.0/8
 dev eth0  proto kernel  scope link  src 10.0.0.20
# ip route list table HDSL
10.0.0.0 dev eth0  scope link  src 10.0.0.20
default via 10.0.0.254 dev eth0
# ip route list table INET
194.[...].0 dev eth1  scope link  src 194.[...].33
default via 194.[...].1 dev eth1
# ping -d 
news.dfncis.de
 -I 194.[...].33
PING 
news.dfncis.de
 (130.133.1.4) from 194.[...].33 : 56(84) bytes of data.
64 bytes from 
news.fu-berlin.de
 (130.133.1.4): icmp_seq=1 ttl=234 time=121
ms
64 bytes from 
news.fu-berlin.de
 (130.133.1.4): icmp_seq=2 ttl=234 time=123
ms
64 bytes from 
news.fu-berlin.de
 (130.133.1.4): icmp_seq=3 ttl=234 time=120
ms
--- 
news.dfncis.de
 ping statistics ---
3 packets transmitted, 3 received, 0% loss, time 2001ms
rtt min/avg/max/mdev = 120.096/121.529/123.023/1.229 ms
# ping -d 
news.dfncis.de
 -I 10.0.0.20
PING 
news.dfncis.de
 (130.133.1.4) from 10.0.0.20 : 56(84) bytes of data.
64 bytes from 
news.fu-berlin.de
 (130.133.1.4): icmp_seq=1 ttl=241 time=45.0
ms
64 bytes from 
news.fu-berlin.de
 (130.133.1.4): icmp_seq=2 ttl=241 time=31.7
ms
64 bytes from 
news.fu-berlin.de
 (130.133.1.4): icmp_seq=3 ttl=241 time=29.9
ms
64 bytes from 
news.fu-berlin.de
 (130.133.1.4): icmp_seq=4 ttl=241 time=29.1
ms
--- 
news.dfncis.de
 ping statistics ---
4 packets transmitted, 4 received, 0% loss, time 3008ms
rtt min/avg/max/mdev = 29.185/33.981/45.088/6.480 ms
Qui ero gia' pronto a urlare "EUREKA", ma prima ho lanciato l'ultimo
controllo, perche' fidarsi e' Male:
# tcptraceroute 
news.dfncis.de
 -s 194.[...].33
connect: Network is unreachable
# traceroute 
news.dfncis.de
 -s 194.[...].33
connect: Network is unreachable
# tcptraceroute 
news.dfncis.de
 -s 10.0.0.20
connect: Network is unreachable
# traceroute 
news.dfncis.de
 -s 10.0.0.20
connect: Network is unreachable
E ci capisco sempre meno... L'ICMP ora viene routato, quindi mi sa che era
colpa della classe di rete mancante se non funzionava (forse).
Ma perche' l'ICMP si' e il TCP no!? Gli sta' antipatico??
Riporto anche la routing table perche' c'e' una cosa strana:
# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use
Iface
194.[...].0    *               255.255.255.255 UH    0      0        0 eth0
194.[...].0    *               255.255.255.0   U     0      0        0 eth1
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
10.0.0.0        *               255.0.0.0       U     0      0        0 eth0
La prima linea non mi e' chiara: perche' l'*host* 195.[...].0 (notare lo 0)
e' parte della mia tabella di routing su un'interfaccia che non ha indirizzi
su quella rete?
Ciaotutti,
*

 typed:
Errata corrige: il risultato di ip rule e':
0:      from all lookup local
32762:  from 
10.0.0.0/8
 lookup HDSL
32763:  from 194.[...].0/24 lookup INET
32766:  from all lookup main
32767:  from all lookup default
Ciaotutti,
*

Un'ultima cosa: mentre dall'interno il tcptraceroute non esce, e' degno di
nota che *dall'esterno* il sito hostato sulla macchina si veda su tutti e tre
gli indirizzi.
Vai a capire... Comunque mi va (abbastanza) bene cosi', grazie per l'aiuto :)
Ciaotutti,
*

 194.[...].0    *               255.255.255.255 UH    0      0        0 eth0
Effettivamente un .0 visto come host e` segno che c'e` qualcosa da mettere a 
posto.
-- 
Vincenzo

 mettere a posto.
E' che questo giro strano lo fa da solo, non ho configurato nessuna route in
quel senso.
Ciaotutti,
*