Table of Contents

Source routing con iproute2

Un server dual homed su due connessioni Internet (provider A e provider B) che abbia un solo default gateway (verso il provider A), utilizza quest'ultimo per il traffico di risposta indipendentemente dall'interfaccia su cui è stato contattato.

Questo in generale non è ciò che si desidera, inoltre il provider A potrebbe scartare il pacchetto se l'IP di origine appartiene al provider B. E’ necessario eseguire il source routing, in modo che il server contattato sull’indirizzo B risponda tramite il provider B e non sulla rotta di default.

Si risolve il problema con iproute2 creando una seconda tabella di routing.

Ricordare che sono necessarie le due opzioni del kernel: CONFIG_IP_ADVANCED_ROUTER=y e CONFIG_IP_MULTIPLE_TABLES=y.

L'interfaccia eth2 è quella che viene usata per il source routing, mentre la default route tradizionale passa per un'altra interfaccia, es. eth1.

/etc/iproute2/rt_tables

# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
1       inr.ruhep
#
# Special table for source routing.
# See /etc/network/interfaces.
102     eth2_tbl

Il file diventa operativo appena modificato.

/etc/network/interfaces

auto eth2
iface eth2 inet static
        address 217.19.150.6
        netmask 255.255.255.0
        network 217.19.150.0
        broadcast 217.19.150.255
        # gateway 217.19.150.1
        # Put a line "102 eth2_tbl" into /etc/iproute2/rt_tables
        up /sbin/ip rule add from 217.19.150.6 table eth2_tbl || true
        up /sbin/ip route add 217.19.150.0/24 dev eth2 table eth2_tbl || true
        up /sbin/ip route add default via 217.19.150.1 table eth2_tbl || true
        down /sbin/ip route del default via 217.19.150.1 table eth2_tbl || true
        down /sbin/ip route del 217.19.150.0/24 dev eth2 table eth2_tbl || true
        down /sbin/ip rule del from 217.19.150.6 table eth2_tbl || true

Per verificare lo stato della nuova tabella di routing:

ip route show table eth2_tbl
217.19.150.0/24 dev eth2  scope link
default via 217.19.150.1 dev eth2

ip rule show
0:      from all lookup local
32765:  from 217.19.150.6 lookup eth2_tbl
32766:  from all lookup main
32767:  from all lookup default

Attenzione alla priorità delle regole (rules)! Il numero più basso ha priorità maggiore, se non viene indicato il parametro priority nel comando ip rule add viene assegnato automaticamente un numero decrescente a partire da 32767 (unsigned int). Secondo questa priorità automatica quindi la regola inserita per ultima ha priorità maggiore.

Source IP con ip route

Altro sistema per selezionare un indirizzo IP sorgente diverso in base all'host di destinazione. in questo esempio si configura un IP principale 62.48.51.128 e un indirizzo IP alias 62.48.51.127, per raggiungere un host specifico si utilizza l'alias:

ifconfig eth0 62.48.51.128 netmask 255.255.255.0
route add default gw 62.48.51.1

ifconfig eth0:0 62.48.51.127 netmask 255.255.255.0
ip route add 78.47.114.234/32 via 62.48.51.1 src 62.48.51.127

Routing in base al servizio

Vedere questa pagina con informazioni abbastanza dettagliate.

Un firewall GNU/Linux con tre scehde di rete in questa la configurazione:

eth0 192.168.1.1 LAN 192.168.1.0/24
eth1 88.38.109.33 Primo accesso a internet, rotta di default
eth2 217.19.150.13 Secondo accesso a internet, per traffico SMTP

Si vuole che un il traffico di tipo SMTP prenda un routing diverso da quello di default, uscendo per eth2 mentre la rotta di default indicherebbe di passare per eth1.

Come nell'esempio precedente si crea in /etc/iproute2/rt_tables una table di nome eth2_tbl:

# Special table for source routing.
# See /etc/network/interfaces.
102     eth2_tbl

Con gli opportuni comandi ip, si aggiunge una regola di routing per i pacchetti marcati fwmark 25 (numero intero arbitrario) e una rotta di default, solo per questa tabella, verso il gateway eth2.

ip rule add fwmark 25 table eth2_tbl
ip route add default via 217.19.150.1 table eth2_tbl

Queste istruzioni possono essere abbinate alla configurazione di eth2 in /etc/network/interfaces (sistema Debian GNU/Linux):

iface eth2 inet static
        address 217.19.150.13
        netmask 255.255.255.0
        broadcast 217.19.150.255
        up /sbin/ip rule add fwmark 25 table eth2_tbl || true
        up /sbin/ip route add default via 217.19.150.1 table eth2_tbl || true
        down /sbin/ip rule del fwmark 25 table eth2_tbl || true
        down /sbin/ip route del default via 217.19.150.1 table eth2_tbl || true

Poi si sistema la cosa a livello di FORWARD dall LAN (eth0) verso internet. Si vuole anche che il traffico sia mascherato (SNAT) da eth2, in modo analogo a quanto avviene su eth1.

iptables -A PREROUTING -t mangle -s 192.168.1.0/24 -i eth0 --protocol tcp --dport 25 -j MARK --set-mark 25
iptables -A POSTROUTING -t nat   -s 192.168.1.0/24 -o eth2 -j MASQUERADE

Con queste due regole si dice:

  1. Marcare con un fwmark 25 tutto il traffico che viene dalla LAN e destinato alla porta 25 (SMTP).
  2. Mascherare il traffico proveniente dall LAN che esce da eth2

Infine si deve instradare in modo simile il traffico generato localmente dal firewall:

iptables -A OUTPUT -t mangle   -s 88.38.109.33 --protocol tcp --dport 25 -j MARK --set-mark 25
iptables -A POSTROUTING -t nat -s 88.38.109.33 -o eth2 -j SNAT --to-source 217.19.150.13

Con queste regole si ottiene che il firewall:

  1. Marca con un fwmark 25 tutto il traffico generato localmente e destinato alla porta 25 (SMTP).
  2. Modifica SNAT l'IP sorgente predefinito con quello di eth2.

Come si nota l'indirizzo IP di origine del traffico locale sarebbe quello associato alla rotta di default, si deve pertanto effettuare SNAT.

Firewall dual homed e source routing con Shorewall

Esempio: collegamento a internet con due interfacce, eth0 (217.58.174.226, ADSL) e eth2 (94.94.64.138, HDSL). La rotta predefinita è su eth0, parte del traffico viene dirottato su eth2 tramite regole di iptables. La LAN 10.22.20.0/24 è collegata su eth1.

Queste le accortezze da utilizzare:

/etc/iproute2/rt_tables

# Special table for source routing.
# See /etc/network/interfaces.
102     eth2_tbl

/etc/network/interfaces

auto eth2
iface eth2 inet static
        address 94.94.64.138
        netmask 255.255.255.248
        broadcast 94.94.64.143
        # gateway 94.94.64.137
        up /sbin/ip rule add from 94.94.64.138 table eth2_tbl || true
        up /sbin/ip rule add fwmark 102 table eth2_tbl || true
        up /sbin/ip route add 94.94.64.136/29 dev eth2 table eth2_tbl || true
        up /sbin/ip route add default via 94.94.64.137 table eth2_tbl || true
        down /sbin/ip route del default via 94.94.64.137 table eth2_tbl || true
        down /sbin/ip route del 94.94.64.136/29 dev eth2 table eth2_tbl || true
        down /sbin/ip rule del fwmark 102 table eth2_tbl || true
        down /sbin/ip rule del from 94.94.64.138 table eth2_tbl || true

/etc/shorewall/snat (per il nuovo Shorewall v.5)

SNAT(217.58.174.226)    192.168.1.0/24   eth0    # LAN to internet via HDSL
SNAT(94.94.64.138)      192.168.1.0/24   eth2    # LAN to internet via ADSL

/etc/shorewall/masq (per il vecchio Shorewall v.4)

eth0    10.22.20.0/24       # LAN to internet via HDSL
eth2    10.22.20.0/24       # LAN to internet via ADSL

/etc/shorewall/start

# Packets source-routed via eth2 must use eth2 source address,
# otherwise source address for default gateway is used.
iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 94.94.64.138

# For connections originating from eth1 LAN.
iptables -A PREROUTING -t mangle -i eth1 --proto tcp --dport 22  -j MARK --set-mark 102
iptables -A PREROUTING -t mangle -i eth1 --proto tcp --dport 80  -j MARK --set-mark 102

# For locally geneated connections.
iptables -A OUTPUT -t mangle --proto tcp --dport 22 -j MARK --set-mark 102

Multirouting

In generale siamo abituati ad avere una sola tabella di routing, visualizzabile con il comando route -n:

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.12.1     0.0.0.0         255.255.255.255 UH    0      0        0 tun2
88.57.16.24     0.0.0.0         255.255.255.252 U     0      0        0 eth1
10.0.1.0        172.16.12.1     255.255.255.0   UG    0      0        0 tun2
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         88.57.16.25     0.0.0.0         UG    0      0        0 eth1

Quando si inizia a lavorare con tabelle di routing multiple bisogna dimenticarsi del comando route ed iniziare ad usare il comando ip. Si dovranno gestire tabelle di routing multiple e regole di routing che selezionano la tabella da usare.

L'equivalente dell'unica vecchia tabella di routing è la main routing table, visualizzabile in questo modo:

ip route show table main
172.16.12.1 dev tun2  proto kernel  scope link  src 172.16.12.2
88.57.16.24/30 dev eth1  proto kernel  scope link  src 88.57.16.26
10.0.1.0/24 via 172.16.12.1 dev tun2
192.168.2.0/24 dev eth0  proto kernel  scope link  src 192.168.2.2
default via 88.57.16.25 dev eth1

Ogni tabella di routing è identificata da un indice numerico (1-255), ad esempio la main ha indice 254. Eventuali nomi associati all'id numerico sono scritti nel file /etc/iproute2/rt_tables come visto in precedenza.

Come si vedono le tabelle esistenti?

Per vedere il contenuto di una specifica tabella di routing:

ip route show table 202
default via 83.211.224.145 dev eth2  proto static  src 83.211.224.146
prohibit default  proto static  metric 1

Le decisioni di routing vengono prese analizzando le regole di routing in ordine di priorità. Quando una regola combacia, viene scelta la tabella di routing da applicare. Per vedere le regole esistenti si usa ip rule show:

$ ip rule show
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default