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.
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
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:
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:
Come si nota l'indirizzo IP di origine del traffico locale sarebbe quello associato alla rotta di default, si deve pertanto effettuare SNAT.
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/shorewall/interfaces
si indicano le due interfacce collegate alla zona net./etc/shorewall/shorewall.conf
si imposta ROUTE_FILTER=No, altrimenti il traffico in uscita dalla eth2 viene filtrato come martian source./etc/shorewall/interfaces
NON ci deve essere l'opzione routefilter=1 (misura anti-spoofing), per lo stesso motivo di cui sopra. ATTENZIONE: Se in shorewall.conf
c'è l'opzione ROUTE_FILTER=Yes
, impostare qui routefilter=0
non è sufficiente./etc/shorewall/interfaces
l'opzione sourceroute=[0|1] (non accetta/accetta pacchetti source routed dall'interfaccia) è importante?
/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
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