====== 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 [[http://linux-ip.net/html/adv-multi-internet.html|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:
- **Marcare** con un **fwmark** 25 tutto il traffico che viene dalla LAN e destinato alla porta 25 (SMTP).
- **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:
- **Marca** con un **fwmark** 25 tutto il traffico generato localmente e destinato alla porta 25 (SMTP).
- 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:
* In **''/etc/shorewall/interfaces''** si indicano le due interfacce collegate alla zona **net**.
* In **''/etc/shorewall/shorewall.conf''** si imposta **ROUTE_FILTER=No**, altrimenti il traffico in uscita dalla eth2 viene filtrato come //martian source//.
* In **''/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.
* In **''/etc/shorewall/interfaces''** l'opzione **sourceroute=[0|1]** (non accetta/accetta pacchetti source routed dall'interfaccia) è importante? FIXME
**''/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